This commit is contained in:
dzc committed 2026-09-11 15:29:06 +08:00
1 parent 58a8a1ffde
commit fdec7bed06
16 files changed
+637 -118

No files matched your search

+98 -14
View File
@@ -112,7 +112,7 @@ class _$AppDatabase extends AppDatabase {
Callback? callback,
]) async {
final databaseOptions = sqflite.OpenDatabaseOptions(
version: 10,
version: 14,
onConfigure: (database) async {
await database.execute('PRAGMA foreign_keys = ON');
await callback?.onConfigure?.call(database);
@@ -150,7 +150,7 @@ class _$AppDatabase extends AppDatabase {
await database.execute(
'CREATE TABLE IF NOT EXISTS `user_record` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `userId` TEXT NOT NULL, `nickname` TEXT NOT NULL, `mobile` TEXT, `avatar` TEXT, `walletCardNumber` TEXT, `walletId` TEXT, `walletTypeId` TEXT, `walletBalance` INTEGER, `canteenId` TEXT, `discountsList` TEXT, `discountsUpdateTime` TEXT, `createTime` TEXT, `updateTime` TEXT)');
await database.execute(
'CREATE TABLE IF NOT EXISTS `face` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `userId` TEXT NOT NULL, `sampleId` TEXT NOT NULL, `userName` TEXT NOT NULL, `deptId` TEXT, `deptName` TEXT, `imagePath` TEXT NOT NULL, `path` TEXT, `faceModel` TEXT, `createTime` TEXT, `updateTime` TEXT, `qualityScore` REAL, `qualityStatus` TEXT NOT NULL, `qualityCheckedAt` TEXT, `qualityErrorCode` INTEGER)');
'CREATE TABLE IF NOT EXISTS `face` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `userId` TEXT NOT NULL, `sampleId` TEXT NOT NULL, `userName` TEXT NOT NULL, `deptId` TEXT, `deptName` TEXT, `imagePath` TEXT NOT NULL, `path` TEXT, `faceModel` TEXT, `createTime` TEXT, `updateTime` TEXT, `qualityScore` REAL, `qualityStatus` TEXT NOT NULL, `qualityCheckedAt` TEXT, `qualityErrorCode` INTEGER, `qualityReportedAt` TEXT)');
await database.execute(
'CREATE TABLE IF NOT EXISTS `setting` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `userJson` TEXT NOT NULL, `sysJson` TEXT NOT NULL, `canteenExtraPriceConfigJson` TEXT)');
await database.execute(
@@ -1885,7 +1885,9 @@ class _$FaceDao extends FaceDao {
'qualityStatus': item.qualityStatus,
'qualityCheckedAt':
_dateTimeEmptyConverter.encode(item.qualityCheckedAt),
'qualityErrorCode': item.qualityErrorCode
'qualityErrorCode': item.qualityErrorCode,
'qualityReportedAt':
_dateTimeEmptyConverter.encode(item.qualityReportedAt)
}),
_faceEntityUpdateAdapter = UpdateAdapter(
database,
@@ -1907,7 +1909,9 @@ class _$FaceDao extends FaceDao {
'qualityStatus': item.qualityStatus,
'qualityCheckedAt':
_dateTimeEmptyConverter.encode(item.qualityCheckedAt),
'qualityErrorCode': item.qualityErrorCode
'qualityErrorCode': item.qualityErrorCode,
'qualityReportedAt':
_dateTimeEmptyConverter.encode(item.qualityReportedAt)
}),
_faceEntityDeletionAdapter = DeletionAdapter(
database,
@@ -1929,7 +1933,9 @@ class _$FaceDao extends FaceDao {
'qualityStatus': item.qualityStatus,
'qualityCheckedAt':
_dateTimeEmptyConverter.encode(item.qualityCheckedAt),
'qualityErrorCode': item.qualityErrorCode
'qualityErrorCode': item.qualityErrorCode,
'qualityReportedAt':
_dateTimeEmptyConverter.encode(item.qualityReportedAt)
});
final sqflite.DatabaseExecutor database;
@@ -1995,7 +2001,7 @@ class _$FaceDao extends FaceDao {
) async {
return _queryAdapter.queryList(
'SELECT * FROM face WHERE qualityStatus = \'detected\' AND qualityScore IS NOT NULL AND qualityScore < ?2 AND (?1 = \'-1\' OR userName LIKE \'%\' || ?1 || \'%\') ORDER BY id ASC LIMIT ?3 OFFSET ?4',
mapper: (Map<String, Object?> row) => FaceEntity(id: row['id'] as int?, userId: row['userId'] as String, sampleId: row['sampleId'] as String, userName: row['userName'] as String, deptId: row['deptId'] as String?, deptName: row['deptName'] as String?, imagePath: row['imagePath'] as String, path: row['path'] as String?, faceModel: _listIntConverter.decode(row['faceModel'] as String), createTime: _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: _dateTimeEmptyConverter.decode(row['updateTime'] as String?), qualityScore: row['qualityScore'] as double?, qualityStatus: row['qualityStatus'] as String, qualityCheckedAt: _dateTimeEmptyConverter.decode(row['qualityCheckedAt'] as String?), qualityErrorCode: row['qualityErrorCode'] as int?),
mapper: (Map<String, Object?> row) => FaceEntity(id: row['id'] as int?, userId: row['userId'] as String, sampleId: row['sampleId'] as String, userName: row['userName'] as String, deptId: row['deptId'] as String?, deptName: row['deptName'] as String?, imagePath: row['imagePath'] as String, path: row['path'] as String?, faceModel: _listIntConverter.decode(row['faceModel'] as String), createTime: _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: _dateTimeEmptyConverter.decode(row['updateTime'] as String?), qualityScore: row['qualityScore'] as double?, qualityStatus: row['qualityStatus'] as String, qualityCheckedAt: _dateTimeEmptyConverter.decode(row['qualityCheckedAt'] as String?), qualityErrorCode: row['qualityErrorCode'] as int?, qualityReportedAt: _dateTimeEmptyConverter.decode(row['qualityReportedAt'] as String?)),
arguments: [userName, threshold, pageSize, offset]);
}
@@ -2003,7 +2009,7 @@ class _$FaceDao extends FaceDao {
Future<List<FaceEntity>> findAllLowQuality(double threshold) async {
return _queryAdapter.queryList(
'SELECT * FROM face WHERE qualityStatus = \'detected\' AND qualityScore IS NOT NULL AND qualityScore < ?1 ORDER BY id ASC',
mapper: (Map<String, Object?> row) => FaceEntity(id: row['id'] as int?, userId: row['userId'] as String, sampleId: row['sampleId'] as String, userName: row['userName'] as String, deptId: row['deptId'] as String?, deptName: row['deptName'] as String?, imagePath: row['imagePath'] as String, path: row['path'] as String?, faceModel: _listIntConverter.decode(row['faceModel'] as String), createTime: _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: _dateTimeEmptyConverter.decode(row['updateTime'] as String?), qualityScore: row['qualityScore'] as double?, qualityStatus: row['qualityStatus'] as String, qualityCheckedAt: _dateTimeEmptyConverter.decode(row['qualityCheckedAt'] as String?), qualityErrorCode: row['qualityErrorCode'] as int?),
mapper: (Map<String, Object?> row) => FaceEntity(id: row['id'] as int?, userId: row['userId'] as String, sampleId: row['sampleId'] as String, userName: row['userName'] as String, deptId: row['deptId'] as String?, deptName: row['deptName'] as String?, imagePath: row['imagePath'] as String, path: row['path'] as String?, faceModel: _listIntConverter.decode(row['faceModel'] as String), createTime: _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: _dateTimeEmptyConverter.decode(row['updateTime'] as String?), qualityScore: row['qualityScore'] as double?, qualityStatus: row['qualityStatus'] as String, qualityCheckedAt: _dateTimeEmptyConverter.decode(row['qualityCheckedAt'] as String?), qualityErrorCode: row['qualityErrorCode'] as int?, qualityReportedAt: _dateTimeEmptyConverter.decode(row['qualityReportedAt'] as String?)),
arguments: [threshold]);
}
@@ -2043,7 +2049,9 @@ class _$FaceDao extends FaceDao {
qualityStatus: row['qualityStatus'] as String,
qualityCheckedAt: _dateTimeEmptyConverter
.decode(row['qualityCheckedAt'] as String?),
qualityErrorCode: row['qualityErrorCode'] as int?));
qualityErrorCode: row['qualityErrorCode'] as int?,
qualityReportedAt: _dateTimeEmptyConverter
.decode(row['qualityReportedAt'] as String?)));
}
@override
@@ -2067,7 +2075,9 @@ class _$FaceDao extends FaceDao {
qualityStatus: row['qualityStatus'] as String,
qualityCheckedAt: _dateTimeEmptyConverter
.decode(row['qualityCheckedAt'] as String?),
qualityErrorCode: row['qualityErrorCode'] as int?),
qualityErrorCode: row['qualityErrorCode'] as int?,
qualityReportedAt: _dateTimeEmptyConverter
.decode(row['qualityReportedAt'] as String?)),
arguments: [id]);
}
@@ -2092,7 +2102,9 @@ class _$FaceDao extends FaceDao {
qualityStatus: row['qualityStatus'] as String,
qualityCheckedAt: _dateTimeEmptyConverter
.decode(row['qualityCheckedAt'] as String?),
qualityErrorCode: row['qualityErrorCode'] as int?),
qualityErrorCode: row['qualityErrorCode'] as int?,
qualityReportedAt: _dateTimeEmptyConverter
.decode(row['qualityReportedAt'] as String?)),
arguments: [sampleId]);
}
@@ -2117,7 +2129,9 @@ class _$FaceDao extends FaceDao {
qualityStatus: row['qualityStatus'] as String,
qualityCheckedAt: _dateTimeEmptyConverter
.decode(row['qualityCheckedAt'] as String?),
qualityErrorCode: row['qualityErrorCode'] as int?),
qualityErrorCode: row['qualityErrorCode'] as int?,
qualityReportedAt: _dateTimeEmptyConverter
.decode(row['qualityReportedAt'] as String?)),
arguments: [userId]);
}
@@ -2129,7 +2143,7 @@ class _$FaceDao extends FaceDao {
) async {
return _queryAdapter.queryList(
'SELECT * FROM face WHERE (?1 = \'-1\' OR userName LIKE \'%\' || ?1 || \'%\') LIMIT ?2 OFFSET ?3',
mapper: (Map<String, Object?> row) => FaceEntity(id: row['id'] as int?, userId: row['userId'] as String, sampleId: row['sampleId'] as String, userName: row['userName'] as String, deptId: row['deptId'] as String?, deptName: row['deptName'] as String?, imagePath: row['imagePath'] as String, path: row['path'] as String?, faceModel: _listIntConverter.decode(row['faceModel'] as String), createTime: _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: _dateTimeEmptyConverter.decode(row['updateTime'] as String?), qualityScore: row['qualityScore'] as double?, qualityStatus: row['qualityStatus'] as String, qualityCheckedAt: _dateTimeEmptyConverter.decode(row['qualityCheckedAt'] as String?), qualityErrorCode: row['qualityErrorCode'] as int?),
mapper: (Map<String, Object?> row) => FaceEntity(id: row['id'] as int?, userId: row['userId'] as String, sampleId: row['sampleId'] as String, userName: row['userName'] as String, deptId: row['deptId'] as String?, deptName: row['deptName'] as String?, imagePath: row['imagePath'] as String, path: row['path'] as String?, faceModel: _listIntConverter.decode(row['faceModel'] as String), createTime: _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: _dateTimeEmptyConverter.decode(row['updateTime'] as String?), qualityScore: row['qualityScore'] as double?, qualityStatus: row['qualityStatus'] as String, qualityCheckedAt: _dateTimeEmptyConverter.decode(row['qualityCheckedAt'] as String?), qualityErrorCode: row['qualityErrorCode'] as int?, qualityReportedAt: _dateTimeEmptyConverter.decode(row['qualityReportedAt'] as String?)),
arguments: [userName, pageSize, offset]);
}
@@ -2154,7 +2168,75 @@ class _$FaceDao extends FaceDao {
qualityStatus: row['qualityStatus'] as String,
qualityCheckedAt: _dateTimeEmptyConverter
.decode(row['qualityCheckedAt'] as String?),
qualityErrorCode: row['qualityErrorCode'] as int?));
qualityErrorCode: row['qualityErrorCode'] as int?,
qualityReportedAt: _dateTimeEmptyConverter
.decode(row['qualityReportedAt'] as String?)));
}
@override
Future<List<FaceEntity>> getSyncProfiles() async {
return _queryAdapter.queryList(
'SELECT id, userId, sampleId, userName, deptId, deptName, imagePath, path, CASE WHEN faceModel IS NULL OR faceModel = \'\' THEN \'[]\' ELSE \'[1]\' END AS faceModel, createTime, updateTime, qualityScore, qualityStatus, qualityCheckedAt, qualityErrorCode, qualityReportedAt FROM face ORDER BY sampleId ASC',
mapper: (Map<String, Object?> row) => FaceEntity(
id: row['id'] as int?,
userId: row['userId'] as String,
sampleId: row['sampleId'] as String,
userName: row['userName'] as String,
deptId: row['deptId'] as String?,
deptName: row['deptName'] as String?,
imagePath: row['imagePath'] as String,
path: row['path'] as String?,
faceModel: _listIntConverter.decode(row['faceModel'] as String),
createTime:
_dateTimeEmptyConverter.decode(row['createTime'] as String?),
updateTime:
_dateTimeEmptyConverter.decode(row['updateTime'] as String?),
qualityScore: row['qualityScore'] as double?,
qualityStatus: row['qualityStatus'] as String,
qualityCheckedAt: _dateTimeEmptyConverter
.decode(row['qualityCheckedAt'] as String?),
qualityErrorCode: row['qualityErrorCode'] as int?,
qualityReportedAt: _dateTimeEmptyConverter
.decode(row['qualityReportedAt'] as String?)));
}
@override
Future<void> editMetadataBySampleId(
String sampleId,
String userId,
String userName,
String deptId,
String deptName,
String imagePath,
String updateTime,
) async {
await _queryAdapter.queryNoReturn(
'UPDATE face SET userId = ?2, userName = ?3, deptId = NULLIF(?4, \'\'), deptName = NULLIF(?5, \'\'), imagePath = ?6, updateTime = COALESCE(NULLIF(?7, \'\'), updateTime) WHERE sampleId = ?1',
arguments: [
sampleId,
userId,
userName,
deptId,
deptName,
imagePath,
updateTime
]);
}
@override
Future<void> markQualityReported(
List<String> sampleIds,
DateTime reportedAt,
) async {
const offset = 2;
final _sqliteVariablesForSampleIds =
Iterable<String>.generate(sampleIds.length, (i) => '?${i + offset}')
.join(',');
await _queryAdapter.queryNoReturn(
'UPDATE face SET qualityReportedAt = ?1 WHERE sampleId IN (' +
_sqliteVariablesForSampleIds +
')',
arguments: [_dateTimeConverter.encode(reportedAt), ...sampleIds]);
}
@override
@@ -2186,7 +2268,9 @@ class _$FaceDao extends FaceDao {
qualityStatus: row['qualityStatus'] as String,
qualityCheckedAt: _dateTimeEmptyConverter
.decode(row['qualityCheckedAt'] as String?),
qualityErrorCode: row['qualityErrorCode'] as int?));
qualityErrorCode: row['qualityErrorCode'] as int?,
qualityReportedAt: _dateTimeEmptyConverter
.decode(row['qualityReportedAt'] as String?)));
}
@override