diff --git a/lib/app/core/models/sync_status.dart b/lib/app/core/models/sync_status.dart index 8e3f56c..5e8b334 100644 --- a/lib/app/core/models/sync_status.dart +++ b/lib/app/core/models/sync_status.dart @@ -62,5 +62,6 @@ extension SyncStatusExtension on SyncStatus { abstract class SyncableEntity { String get id; SyncStatus get syncStatus; - DateTime get lastModifiedTime; // 同步时通常需要最后修改时间 + DateTime get lastModifiedTime; + String get lastModifierId; } diff --git a/lib/app/features/enterprise/data/datasources/enterprise_remote_data_source.dart b/lib/app/features/enterprise/data/datasources/enterprise_remote_data_source.dart index afe01a5..6729df4 100644 --- a/lib/app/features/enterprise/data/datasources/enterprise_remote_data_source.dart +++ b/lib/app/features/enterprise/data/datasources/enterprise_remote_data_source.dart @@ -5,16 +5,17 @@ import 'package:problem_check_system/app/features/enterprise/data/model/enterpri /// 远程数据源的抽象接口 /// 定义了所有与企业相关的网络 API 调用 abstract class EnterpriseRemoteDataSource { - /// 调用 API 创建一个新的企业 - /// - /// 成功时无返回,失败时应抛出异常 (如 DioException) + /// 创建企业 Future createEnterprise(EnterpriseModel enterprise); - /// 调用 API 更新一个已有的企业 + /// 更新企业 Future updateEnterprise(EnterpriseModel enterprise); - /// 调用 API 删除一个企业 + /// 删除企业 Future deleteEnterprise(String enterpriseId); + + /// 查询企业列表 + Future> getEnterprises(); } class EnterpriseRemoteDataSourceImpl implements EnterpriseRemoteDataSource { @@ -53,4 +54,16 @@ class EnterpriseRemoteDataSourceImpl implements EnterpriseRemoteDataSource { rethrow; } } + + @override + Future> getEnterprises() async { + try { + final response = await http.get(enterprisesEndpoint); + return (response.data as List) + .map((json) => EnterpriseDto.fromJson(json)) + .toList(); + } catch (e) { + rethrow; + } + } } diff --git a/lib/app/features/enterprise/data/model/enterprise_dto.dart b/lib/app/features/enterprise/data/model/enterprise_dto.dart index 9aebea0..37333cf 100644 --- a/lib/app/features/enterprise/data/model/enterprise_dto.dart +++ b/lib/app/features/enterprise/data/model/enterprise_dto.dart @@ -6,17 +6,27 @@ import 'package:problem_check_system/app/features/enterprise/data/model/enterpri /// 这个模型专门用于与远程 API 进行数据交互。 /// 它的字段和结构【严格匹配】服务器 API 定义的 JSON 格式。 class EnterpriseDto { + final String id; + final DateTime creationTime; + final String creatorId; + final DateTime lastModificationTime; + final String lastModifierId; final String companyName; final String companyType; final String? companyScope; final String? mainPrincipalName; final String? mainPrincipalPhone; - final String? securityPrincipalName; // API 中没有,但最好加上以保持对称 - final String? securityPrincipalPhone; // API 中没有,但最好加上以保持对称 + final String? securityPrincipalName; + final String? securityPrincipalPhone; final String? companyAddress; - final String? detail; // 对应 majorHazardsDescription + final String? detail; const EnterpriseDto({ + required this.id, + required this.creationTime, + required this.creatorId, + required this.lastModificationTime, + required this.lastModifierId, required this.companyName, required this.companyType, this.companyScope, @@ -33,6 +43,11 @@ class EnterpriseDto { /// 这个转换逻辑是这个类的核心职责。 factory EnterpriseDto.fromModel(EnterpriseModel model) { return EnterpriseDto( + id: model.id, + creationTime: model.creationTime, + creatorId: "", //todo 需要在企业模型中添加创建时间 + lastModificationTime: model.lastModifiedTime, + lastModifierId: "", // todo需要在企业模型中添修改用户id companyName: model.name, companyType: model.type, companyScope: model.scale, @@ -43,9 +58,48 @@ class EnterpriseDto { ); } - /// 将 DTO 对象转换为可以发送给服务器的 JSON (Map) 格式。 + // ======================================================================= + // 新增方法 + // ======================================================================= + + /// [新增] fromJson 工厂构造函数:从 JSON Map 创建 EnterpriseDto 实例。 + /// + /// 当从服务器接收到 JSON 数据时,调用此方法将其转换为 Dart 对象。 + factory EnterpriseDto.fromJson(Map json) { + return EnterpriseDto( + // 必须存在的字段 + id: json['id'] as String, + creationTime: DateTime.parse(json['creationTime'] as String), + creatorId: json['creatorId'] as String, + lastModificationTime: DateTime.parse( + json['lastModificationTime'] as String, + ), + lastModifierId: json['lastModifierId'] as String, + companyName: json['companyName'] as String, + companyType: json['companyType'] as String, + + // 可选字段 + companyScope: json['companyScope'] as String?, + mainPrincipalName: json['mainPrincipalName'] as String?, + mainPrincipalPhone: json['mainPrincipalPhone'] as String?, + securityPrincipalName: json['securityPrincipalName'] as String?, + securityPrincipalPhone: json['securityPrincipalPhone'] as String?, + companyAddress: json['companyAddress'] as String?, + detail: json['detail'] as String?, + ); + } + + /// [新增] toJson 方法:将 EnterpriseDto 实例转换为 JSON Map。 + /// + /// 当需要将数据发送到服务器时,调用此方法将其转换为 JSON 格式。 Map toJson() { - final originalMap = { + final jsonMap = { + 'id': id, + // 使用 toIso8601String() 是将 DateTime 转换为标准化字符串的最佳实践 + 'creationTime': creationTime.toIso8601String(), + 'creatorId': creatorId, + 'lastModificationTime': lastModificationTime.toIso8601String(), + 'lastModifierId': lastModifierId, 'companyName': companyName, 'companyType': companyType, 'companyScope': companyScope, @@ -56,6 +110,6 @@ class EnterpriseDto { 'companyAddress': companyAddress, 'detail': detail, }; - return originalMap.withoutNullOrEmptyValues; + return jsonMap.withoutNullOrEmptyValues; } } diff --git a/lib/app/features/enterprise/data/model/enterprise_model.dart b/lib/app/features/enterprise/data/model/enterprise_model.dart index a8ef1aa..7811319 100644 --- a/lib/app/features/enterprise/data/model/enterprise_model.dart +++ b/lib/app/features/enterprise/data/model/enterprise_model.dart @@ -10,7 +10,9 @@ class EnterpriseModel extends Enterprise { required super.id, required super.syncStatus, required super.lastModifiedTime, + required super.lastModifierId, required super.creationTime, + required super.creatorId, required super.name, required super.type, super.address, @@ -29,7 +31,9 @@ class EnterpriseModel extends Enterprise { id: entity.id, syncStatus: entity.syncStatus, lastModifiedTime: entity.lastModifiedTime, + lastModifierId: entity.lastModifierId, creationTime: entity.creationTime, + creatorId: entity.creatorId, name: entity.name, type: entity.type, address: entity.address, @@ -54,10 +58,12 @@ class EnterpriseModel extends Enterprise { map['lastModifiedTime'] as int, isUtc: true, ), + lastModifierId: map['lastModifierId'] as String, creationTime: DateTime.fromMillisecondsSinceEpoch( map['creationTime'] as int, isUtc: true, ), + creatorId: map['creatorId'] as String, name: map['name'] as String, type: map['type'] as String, address: map['address'] as String?, @@ -79,7 +85,9 @@ class EnterpriseModel extends Enterprise { 'syncStatus': syncStatus.index, // 将 DateTime 转换为 UTC 毫秒时间戳进行存储 'lastModifiedTime': lastModifiedTime.toUtc().millisecondsSinceEpoch, + 'lastModifierId': lastModifierId, 'creationTime': creationTime.toUtc().millisecondsSinceEpoch, + 'creatorId': creatorId, 'name': name, 'type': type, 'address': address, @@ -97,7 +105,9 @@ class EnterpriseModel extends Enterprise { id: id, syncStatus: syncStatus, lastModifiedTime: lastModifiedTime, + lastModifierId: lastModifierId, creationTime: creationTime, + creatorId: creatorId, name: name, type: type, address: address, diff --git a/lib/app/features/enterprise/domain/entities/enterprise.dart b/lib/app/features/enterprise/domain/entities/enterprise.dart index 3f374aa..2568513 100644 --- a/lib/app/features/enterprise/domain/entities/enterprise.dart +++ b/lib/app/features/enterprise/domain/entities/enterprise.dart @@ -10,6 +10,8 @@ class Enterprise extends Equatable implements SyncableEntity { final SyncStatus syncStatus; @override final DateTime lastModifiedTime; + @override + final String lastModifierId; final String name; final String type; final String? address; @@ -17,6 +19,7 @@ class Enterprise extends Equatable implements SyncableEntity { final String? contactPerson; final String? contactPhone; final String? majorHazardsDescription; + final String creatorId; final DateTime creationTime; const Enterprise({ @@ -29,7 +32,9 @@ class Enterprise extends Equatable implements SyncableEntity { this.contactPhone, this.majorHazardsDescription, required this.lastModifiedTime, + required this.lastModifierId, required this.creationTime, + required this.creatorId, required this.syncStatus, }); @@ -37,6 +42,7 @@ class Enterprise extends Equatable implements SyncableEntity { String? id, SyncStatus? syncStatus, DateTime? lastModifiedTime, + String? lastModifierId, String? name, String? type, String? address, @@ -45,11 +51,13 @@ class Enterprise extends Equatable implements SyncableEntity { String? contactPhone, String? majorHazardsDescription, DateTime? creationTime, + String? creatorId, }) { return Enterprise( id: id ?? this.id, syncStatus: syncStatus ?? this.syncStatus, lastModifiedTime: lastModifiedTime ?? this.lastModifiedTime, + lastModifierId: lastModifierId ?? this.lastModifierId, name: name ?? this.name, type: type ?? this.type, address: address ?? this.address, @@ -59,6 +67,7 @@ class Enterprise extends Equatable implements SyncableEntity { majorHazardsDescription: majorHazardsDescription ?? this.majorHazardsDescription, creationTime: creationTime ?? this.creationTime, + creatorId: creatorId ?? this.creatorId, ); } diff --git a/lib/app/features/enterprise/domain/usecases/add_enterprise_usecase.dart b/lib/app/features/enterprise/domain/usecases/add_enterprise_usecase.dart index 9befd31..bf3a4a3 100644 --- a/lib/app/features/enterprise/domain/usecases/add_enterprise_usecase.dart +++ b/lib/app/features/enterprise/domain/usecases/add_enterprise_usecase.dart @@ -1,13 +1,19 @@ import 'package:problem_check_system/app/core/models/sync_status.dart'; +import 'package:problem_check_system/app/core/repositories/auth_repository.dart'; import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart'; import 'package:problem_check_system/app/features/enterprise/domain/repositories/enterprise_repository.dart'; import 'package:uuid/uuid.dart'; class AddEnterpriseUsecase { final EnterpriseRepository repository; + final AuthRepository authRepository; final Uuid uuid; - AddEnterpriseUsecase({required this.repository, required this.uuid}); + AddEnterpriseUsecase({ + required this.repository, + required this.authRepository, + required this.uuid, + }); Future call({ required String name, @@ -28,7 +34,9 @@ class AddEnterpriseUsecase { contactPhone: contactPhone, majorHazardsDescription: majorHazardsDescription, lastModifiedTime: DateTime.now(), + lastModifierId: authRepository.getUserId()!, creationTime: DateTime.now(), + creatorId: authRepository.getUserId()!, syncStatus: SyncStatus.pendingCreate, ); await repository.addEnterprise(enterprise); diff --git a/lib/app/features/enterprise/domain/usecases/editor_enterprise_usecase.dart b/lib/app/features/enterprise/domain/usecases/editor_enterprise_usecase.dart index 0e49b49..9bff134 100644 --- a/lib/app/features/enterprise/domain/usecases/editor_enterprise_usecase.dart +++ b/lib/app/features/enterprise/domain/usecases/editor_enterprise_usecase.dart @@ -1,11 +1,15 @@ import 'package:problem_check_system/app/core/models/sync_status.dart'; +import 'package:problem_check_system/app/core/repositories/auth_repository.dart'; import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart'; import 'package:problem_check_system/app/features/enterprise/domain/repositories/enterprise_repository.dart'; class EditEnterpriseUsecase { final EnterpriseRepository repository; - - EditEnterpriseUsecase({required this.repository}); + final AuthRepository authRepository; + EditEnterpriseUsecase({ + required this.repository, + required this.authRepository, + }); /// [核心] 这个 Usecase 的业务逻辑 /// 它接收一个已经修改过的 Enterprise 对象 @@ -13,6 +17,7 @@ class EditEnterpriseUsecase { // 1. 业务规则:更新“最后修改时间” final enterpriseToSave = updatedEnterprise.copyWith( lastModifiedTime: DateTime.now(), + lastModifierId: authRepository.getUserId(), // 2. 业务规则:将同步状态标记为“待更新” // 我们需要先判断它原始的状态,避免覆盖“待创建” syncStatus: updatedEnterprise.syncStatus == SyncStatus.pendingCreate diff --git a/lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart b/lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart index 7140243..df0952b 100644 --- a/lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart +++ b/lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart @@ -25,10 +25,17 @@ class EnterpriseFormBinding extends Bindings { )), ); Get.lazyPut( - () => AddEnterpriseUsecase(repository: Get.find(), uuid: Get.find()), + () => AddEnterpriseUsecase( + repository: Get.find(), + authRepository: Get.find(), + uuid: Get.find(), + ), ); Get.lazyPut( - () => EditEnterpriseUsecase(repository: Get.find()), + () => EditEnterpriseUsecase( + repository: Get.find(), + authRepository: Get.find(), + ), ); // 2. 将获取到的参数(可能为 null)传递给 Controller 的构造函数。