|
|
|
|
@ -15,6 +15,8 @@ abstract class EnterpriseLocalDataSource {
|
|
|
|
|
DateTime? endDate, |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
Future<List<EnterpriseModel>> getUnsyncedEnterprises(); |
|
|
|
|
|
|
|
|
|
/// 查询企业列表 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -25,11 +27,13 @@ class EnterpriseLocalDataSourceImpl implements EnterpriseLocalDataSource {
|
|
|
|
|
required DatabaseService databaseService, |
|
|
|
|
}) : _databaseService = databaseService; |
|
|
|
|
|
|
|
|
|
static const String _tableName = 'enterprises'; |
|
|
|
|
|
|
|
|
|
@override |
|
|
|
|
Future<void> 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<void> 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<List<EnterpriseModel>> getUnsyncedEnterprises() async { |
|
|
|
|
final db = await _databaseService.database; |
|
|
|
|
|
|
|
|
|
// 1. [修正] 定义需要查询的状态列表,使用枚举本身,而不是字符串。 |
|
|
|
|
// 根据您的 SyncStatus 定义,这些状态都代表需要与服务器同步。 |
|
|
|
|
const List<SyncStatus> unsyncedStatuses = [ |
|
|
|
|
SyncStatus.pendingCreate, |
|
|
|
|
SyncStatus.pendingUpdate, |
|
|
|
|
SyncStatus.pendingDelete, |
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
// 2. [修正] 将枚举列表转换为整数索引列表,以匹配数据库中的存储方式。 |
|
|
|
|
// 这是最关键的修正点。 |
|
|
|
|
final List<int> statusIndexes = unsyncedStatuses |
|
|
|
|
.map((status) => status.index) |
|
|
|
|
.toList(); |
|
|
|
|
|
|
|
|
|
// 3. [完善] 动态生成 SQL 查询中的 '?' 占位符。 |
|
|
|
|
// 这样即使未来 unsyncedStatuses 列表长度变化,代码也无需修改。 |
|
|
|
|
final String placeholders = List.filled( |
|
|
|
|
statusIndexes.length, |
|
|
|
|
'?', |
|
|
|
|
).join(','); |
|
|
|
|
|
|
|
|
|
// 4. 执行查询 |
|
|
|
|
final List<Map<String, dynamic>> 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(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|