From c9db8d83bc5fcdd6e61aa96b5538f85f0199ea61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=8C=AF=E5=8D=87?= <359059686@qq.com> Date: Fri, 24 Oct 2025 17:57:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enterprise_local_data_source.dart | 50 +++++++++++++++++-- .../data/model/enterprise_model.dart | 18 +++++++ .../enterprise_repository_impl.dart | 7 +++ .../repositories/enterprise_repository.dart | 3 ++ .../get_unsynced_enterprises_usecase.dart | 10 ++++ 5 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 lib/app/features/enterprise/domain/usecases/get_unsynced_enterprises_usecase.dart diff --git a/lib/app/features/enterprise/data/datasources/enterprise_local_data_source.dart b/lib/app/features/enterprise/data/datasources/enterprise_local_data_source.dart index 4beaa21..fb43d42 100644 --- a/lib/app/features/enterprise/data/datasources/enterprise_local_data_source.dart +++ b/lib/app/features/enterprise/data/datasources/enterprise_local_data_source.dart @@ -15,6 +15,8 @@ abstract class EnterpriseLocalDataSource { DateTime? endDate, }); + Future> getUnsyncedEnterprises(); + /// 查询企业列表 } @@ -25,11 +27,13 @@ class EnterpriseLocalDataSourceImpl implements EnterpriseLocalDataSource { required DatabaseService databaseService, }) : _databaseService = databaseService; + static const String _tableName = 'enterprises'; + @override Future addEnterprise(EnterpriseModel enterprise) async { final db = await _databaseService.database; await db.insert( - "enterprises", + _tableName, enterprise.toMap(), // conflictAlgorithm 用于定义当主键 (id) 冲突时的处理策略。 // ConflictAlgorithm.replace 表示如果 ID 已存在,则用新数据替换旧数据。 @@ -42,7 +46,7 @@ class EnterpriseLocalDataSourceImpl implements EnterpriseLocalDataSource { Future updateEnterprise(EnterpriseModel enterprise) async { final db = await _databaseService.database; await db.update( - 'enterprises', + _tableName, enterprise.toMap(), where: 'id = ?', // 关键:通过 ID 找到要更新的行 whereArgs: [enterprise.id], @@ -113,7 +117,7 @@ class EnterpriseLocalDataSourceImpl implements EnterpriseLocalDataSource { COUNT(CASE WHEN p.syncStatus != $pendingCreateIndex THEN 1 ELSE NULL END) AS uploadedProblems, COUNT(CASE WHEN p.syncStatus == $pendingCreateIndex THEN 1 ELSE NULL END) AS pendingProblems FROM - enterprises e + $_tableName e LEFT JOIN problems p ON e.id = p.enterpriseId $whereString @@ -133,4 +137,44 @@ class EnterpriseLocalDataSourceImpl implements EnterpriseLocalDataSource { return EnterpriseListItemModel.fromMap(maps[i]); }); } + + @override + Future> getUnsyncedEnterprises() async { + final db = await _databaseService.database; + + // 1. [修正] 定义需要查询的状态列表,使用枚举本身,而不是字符串。 + // 根据您的 SyncStatus 定义,这些状态都代表需要与服务器同步。 + const List unsyncedStatuses = [ + SyncStatus.pendingCreate, + SyncStatus.pendingUpdate, + SyncStatus.pendingDelete, + ]; + + // 2. [修正] 将枚举列表转换为整数索引列表,以匹配数据库中的存储方式。 + // 这是最关键的修正点。 + final List statusIndexes = unsyncedStatuses + .map((status) => status.index) + .toList(); + + // 3. [完善] 动态生成 SQL 查询中的 '?' 占位符。 + // 这样即使未来 unsyncedStatuses 列表长度变化,代码也无需修改。 + final String placeholders = List.filled( + statusIndexes.length, + '?', + ).join(','); + + // 4. 执行查询 + final List> maps = await db.query( + _tableName, + where: 'syncStatus IN ($placeholders)', // e.g., 'syncStatus IN (?,?,?)' + whereArgs: statusIndexes, // e.g., [2, 3, 4] + ); + + if (maps.isEmpty) { + return []; + } + + // 5. [修正] 使用正确的 fromMap 工厂构造函数来转换数据。 + return maps.map((map) => EnterpriseModel.fromMap(map)).toList(); + } } diff --git a/lib/app/features/enterprise/data/model/enterprise_model.dart b/lib/app/features/enterprise/data/model/enterprise_model.dart index 4236585..a8ef1aa 100644 --- a/lib/app/features/enterprise/data/model/enterprise_model.dart +++ b/lib/app/features/enterprise/data/model/enterprise_model.dart @@ -89,4 +89,22 @@ class EnterpriseModel extends Enterprise { 'majorHazardsDescription': majorHazardsDescription, }; } + + Enterprise toEntity() { + // 因为 EnterpriseModel 继承自 Enterprise,它拥有所有必需的属性。 + // 我们在这里创建一个新的、纯净的 Enterprise 实例。 + return Enterprise( + id: id, + syncStatus: syncStatus, + lastModifiedTime: lastModifiedTime, + creationTime: creationTime, + name: name, + type: type, + address: address, + scale: scale, + contactPerson: contactPerson, + contactPhone: contactPhone, + majorHazardsDescription: majorHazardsDescription, + ); + } } diff --git a/lib/app/features/enterprise/data/repositories_impl/enterprise_repository_impl.dart b/lib/app/features/enterprise/data/repositories_impl/enterprise_repository_impl.dart index f83d0bf..22177b4 100644 --- a/lib/app/features/enterprise/data/repositories_impl/enterprise_repository_impl.dart +++ b/lib/app/features/enterprise/data/repositories_impl/enterprise_repository_impl.dart @@ -72,4 +72,11 @@ class EnterpriseRepositoryImpl implements EnterpriseRepository { // 调用数据源执行操作 await localDataSource.updateEnterprise(enterpriseModel); } + + @override + Future> getUnsyncedEnterprises() async { + final List enterpriseModels = await localDataSource + .getUnsyncedEnterprises(); + return enterpriseModels.map((model) => model.toEntity()).toList(); + } } diff --git a/lib/app/features/enterprise/domain/repositories/enterprise_repository.dart b/lib/app/features/enterprise/domain/repositories/enterprise_repository.dart index c961883..c7cbdbf 100644 --- a/lib/app/features/enterprise/domain/repositories/enterprise_repository.dart +++ b/lib/app/features/enterprise/domain/repositories/enterprise_repository.dart @@ -17,4 +17,7 @@ abstract class EnterpriseRepository implements SyncableRepository { DateTime? startDate, DateTime? endDate, }); + + /// 获取所有未同步的企业列表 + Future> getUnsyncedEnterprises(); } diff --git a/lib/app/features/enterprise/domain/usecases/get_unsynced_enterprises_usecase.dart b/lib/app/features/enterprise/domain/usecases/get_unsynced_enterprises_usecase.dart new file mode 100644 index 0000000..f31796f --- /dev/null +++ b/lib/app/features/enterprise/domain/usecases/get_unsynced_enterprises_usecase.dart @@ -0,0 +1,10 @@ +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 GetUnsyncedEnterprisesUsecase { + final EnterpriseRepository enterpriseRepository; + const GetUnsyncedEnterprisesUsecase({required this.enterpriseRepository}); + Future> call() async { + return await enterpriseRepository.getUnsyncedEnterprises(); + } +}