11
This commit is contained in:
1 parent
f6b37348c4
commit
917f03bc58
61 files changed
+4233
-367
No files matched your search
@@ -49,6 +49,59 @@ abstract class FaceDao {
|
||||
""")
|
||||
Future<int?> findCount(String userName);
|
||||
|
||||
/// 统计已完成质量检测且低于指定阈值的人脸数量,阈值不写入样本以支持即时重分类。
|
||||
@Query('''
|
||||
SELECT COUNT(0) FROM face
|
||||
WHERE qualityStatus = 'detected'
|
||||
AND qualityScore IS NOT NULL
|
||||
AND qualityScore < :threshold
|
||||
AND (:userName = '-1' OR userName LIKE '%' || :userName || '%')
|
||||
''')
|
||||
Future<int?> findLowQualityCount(String userName, double threshold);
|
||||
|
||||
/// 分页查询已检测且低于阈值的人脸,结果按本地自增编号稳定排序。
|
||||
@Query('''
|
||||
SELECT * FROM face
|
||||
WHERE qualityStatus = 'detected'
|
||||
AND qualityScore IS NOT NULL
|
||||
AND qualityScore < :threshold
|
||||
AND (:userName = '-1' OR userName LIKE '%' || :userName || '%')
|
||||
ORDER BY id ASC
|
||||
LIMIT :pageSize OFFSET :offset
|
||||
''')
|
||||
Future<List<FaceEntity>> findLowQuality(
|
||||
String userName,
|
||||
double threshold,
|
||||
int pageSize,
|
||||
int offset,
|
||||
);
|
||||
|
||||
/// 查询全部已检测且低于阈值的人脸,用于一键删除前获取完整服务端删除集合。
|
||||
@Query('''
|
||||
SELECT * FROM face
|
||||
WHERE qualityStatus = 'detected'
|
||||
AND qualityScore IS NOT NULL
|
||||
AND qualityScore < :threshold
|
||||
ORDER BY id ASC
|
||||
''')
|
||||
Future<List<FaceEntity>> findAllLowQuality(double threshold);
|
||||
|
||||
/// 统计尚未完成质量检测的历史样本数量。
|
||||
@Query("SELECT COUNT(0) FROM face WHERE qualityStatus = 'pending'")
|
||||
Future<int?> findPendingQualityCount();
|
||||
|
||||
/// 统计最近一次质量检测失败的样本数量。
|
||||
@Query("SELECT COUNT(0) FROM face WHERE qualityStatus = 'failed'")
|
||||
Future<int?> findFailedQualityCount();
|
||||
|
||||
/// 查询待检测或失败后重试的本地样本,按编号稳定排序。
|
||||
@Query("""
|
||||
SELECT * FROM face
|
||||
WHERE qualityStatus IN ('pending', 'failed')
|
||||
ORDER BY id ASC
|
||||
""")
|
||||
Future<List<FaceEntity>> findQualityAuditCandidates();
|
||||
|
||||
@Query('''
|
||||
SELECT * FROM face WHERE id = :id
|
||||
''')
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:floor/floor.dart';
|
||||
import 'package:pj_supermarket_cloud/common/index.dart';
|
||||
@@ -49,7 +48,7 @@ const typeConverters = <Type>[
|
||||
];
|
||||
|
||||
/// 收银终端共享 SQLite 数据库入口,统一暴露各业务 DAO 和带迁移的建库方法。
|
||||
@Database(version: 11, entities: entities)
|
||||
@Database(version: 12, entities: entities)
|
||||
@TypeConverters(typeConverters)
|
||||
abstract class AppDatabase extends FloorDatabase {
|
||||
/// 取餐广播队列 DAO。
|
||||
|
||||
@@ -112,7 +112,7 @@ class _$AppDatabase extends AppDatabase {
|
||||
Callback? callback,
|
||||
]) async {
|
||||
final databaseOptions = sqflite.OpenDatabaseOptions(
|
||||
version: 11,
|
||||
version: 12,
|
||||
onConfigure: (database) async {
|
||||
await database.execute('PRAGMA foreign_keys = ON');
|
||||
await callback?.onConfigure?.call(database);
|
||||
@@ -152,7 +152,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)');
|
||||
'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)');
|
||||
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(
|
||||
@@ -1864,7 +1864,12 @@ class _$FaceDao extends FaceDao {
|
||||
'path': item.path,
|
||||
'faceModel': _listIntConverter.encode(item.faceModel),
|
||||
'createTime': _dateTimeEmptyConverter.encode(item.createTime),
|
||||
'updateTime': _dateTimeEmptyConverter.encode(item.updateTime)
|
||||
'updateTime': _dateTimeEmptyConverter.encode(item.updateTime),
|
||||
'qualityScore': item.qualityScore,
|
||||
'qualityStatus': item.qualityStatus,
|
||||
'qualityCheckedAt':
|
||||
_dateTimeEmptyConverter.encode(item.qualityCheckedAt),
|
||||
'qualityErrorCode': item.qualityErrorCode
|
||||
}),
|
||||
_faceEntityUpdateAdapter = UpdateAdapter(
|
||||
database,
|
||||
@@ -1881,7 +1886,12 @@ class _$FaceDao extends FaceDao {
|
||||
'path': item.path,
|
||||
'faceModel': _listIntConverter.encode(item.faceModel),
|
||||
'createTime': _dateTimeEmptyConverter.encode(item.createTime),
|
||||
'updateTime': _dateTimeEmptyConverter.encode(item.updateTime)
|
||||
'updateTime': _dateTimeEmptyConverter.encode(item.updateTime),
|
||||
'qualityScore': item.qualityScore,
|
||||
'qualityStatus': item.qualityStatus,
|
||||
'qualityCheckedAt':
|
||||
_dateTimeEmptyConverter.encode(item.qualityCheckedAt),
|
||||
'qualityErrorCode': item.qualityErrorCode
|
||||
}),
|
||||
_faceEntityDeletionAdapter = DeletionAdapter(
|
||||
database,
|
||||
@@ -1898,7 +1908,12 @@ class _$FaceDao extends FaceDao {
|
||||
'path': item.path,
|
||||
'faceModel': _listIntConverter.encode(item.faceModel),
|
||||
'createTime': _dateTimeEmptyConverter.encode(item.createTime),
|
||||
'updateTime': _dateTimeEmptyConverter.encode(item.updateTime)
|
||||
'updateTime': _dateTimeEmptyConverter.encode(item.updateTime),
|
||||
'qualityScore': item.qualityScore,
|
||||
'qualityStatus': item.qualityStatus,
|
||||
'qualityCheckedAt':
|
||||
_dateTimeEmptyConverter.encode(item.qualityCheckedAt),
|
||||
'qualityErrorCode': item.qualityErrorCode
|
||||
});
|
||||
|
||||
final sqflite.DatabaseExecutor database;
|
||||
@@ -1944,6 +1959,77 @@ class _$FaceDao extends FaceDao {
|
||||
arguments: [userName]);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int?> findLowQualityCount(
|
||||
String userName,
|
||||
double threshold,
|
||||
) async {
|
||||
return _queryAdapter.query(
|
||||
'SELECT COUNT(0) FROM face WHERE qualityStatus = \'detected\' AND qualityScore IS NOT NULL AND qualityScore < ?2 AND (?1 = \'-1\' OR userName LIKE \'%\' || ?1 || \'%\')',
|
||||
mapper: (Map<String, Object?> row) => row.values.first as int,
|
||||
arguments: [userName, threshold]);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<FaceEntity>> findLowQuality(
|
||||
String userName,
|
||||
double threshold,
|
||||
int pageSize,
|
||||
int offset,
|
||||
) 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?),
|
||||
arguments: [userName, threshold, pageSize, offset]);
|
||||
}
|
||||
|
||||
@override
|
||||
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?),
|
||||
arguments: [threshold]);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int?> findPendingQualityCount() async {
|
||||
return _queryAdapter.query(
|
||||
'SELECT COUNT(0) FROM face WHERE qualityStatus = \'pending\'',
|
||||
mapper: (Map<String, Object?> row) => row.values.first as int);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int?> findFailedQualityCount() async {
|
||||
return _queryAdapter.query(
|
||||
'SELECT COUNT(0) FROM face WHERE qualityStatus = \'failed\'',
|
||||
mapper: (Map<String, Object?> row) => row.values.first as int);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<FaceEntity>> findQualityAuditCandidates() async {
|
||||
return _queryAdapter.queryList(
|
||||
'SELECT * FROM face WHERE qualityStatus IN (\'pending\', \'failed\') 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?));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<FaceEntity?> getById(int id) async {
|
||||
return _queryAdapter.query('SELECT * FROM face WHERE id = ?1',
|
||||
@@ -1960,7 +2046,12 @@ class _$FaceDao extends FaceDao {
|
||||
createTime:
|
||||
_dateTimeEmptyConverter.decode(row['createTime'] as String),
|
||||
updateTime:
|
||||
_dateTimeEmptyConverter.decode(row['updateTime'] as String)),
|
||||
_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?),
|
||||
arguments: [id]);
|
||||
}
|
||||
|
||||
@@ -1980,7 +2071,12 @@ class _$FaceDao extends FaceDao {
|
||||
createTime:
|
||||
_dateTimeEmptyConverter.decode(row['createTime'] as String),
|
||||
updateTime:
|
||||
_dateTimeEmptyConverter.decode(row['updateTime'] as String)),
|
||||
_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?),
|
||||
arguments: [sampleId]);
|
||||
}
|
||||
|
||||
@@ -2000,7 +2096,12 @@ class _$FaceDao extends FaceDao {
|
||||
createTime:
|
||||
_dateTimeEmptyConverter.decode(row['createTime'] as String),
|
||||
updateTime:
|
||||
_dateTimeEmptyConverter.decode(row['updateTime'] as String)),
|
||||
_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?),
|
||||
arguments: [userId]);
|
||||
}
|
||||
|
||||
@@ -2012,7 +2113,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)),
|
||||
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?),
|
||||
arguments: [userName, pageSize, offset]);
|
||||
}
|
||||
|
||||
@@ -2032,7 +2133,12 @@ class _$FaceDao extends FaceDao {
|
||||
createTime:
|
||||
_dateTimeEmptyConverter.decode(row['createTime'] as String),
|
||||
updateTime:
|
||||
_dateTimeEmptyConverter.decode(row['updateTime'] as String)));
|
||||
_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?));
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -2059,7 +2165,12 @@ class _$FaceDao extends FaceDao {
|
||||
createTime:
|
||||
_dateTimeEmptyConverter.decode(row['createTime'] as String),
|
||||
updateTime:
|
||||
_dateTimeEmptyConverter.decode(row['updateTime'] as String)));
|
||||
_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?));
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -351,6 +351,41 @@ abstract class DatabaseMigration {
|
||||
}
|
||||
});
|
||||
|
||||
/// 版本12为本地人脸增加质量诊断结果;全部字段可空或带默认值,不影响历史识别数据。
|
||||
static Migration migration11To12 = Migration(11, 12, (database) async {
|
||||
final columns = await database.rawQuery('PRAGMA table_info(face)');
|
||||
final names = columns.map((column) => column['name']).toSet();
|
||||
if (!names.contains('qualityScore')) {
|
||||
await database.execute('ALTER TABLE face ADD COLUMN qualityScore REAL');
|
||||
}
|
||||
if (!names.contains('qualityStatus')) {
|
||||
await database.execute(
|
||||
"ALTER TABLE face ADD COLUMN qualityStatus TEXT NOT NULL DEFAULT 'pending'",
|
||||
);
|
||||
}
|
||||
if (!names.contains('qualityCheckedAt')) {
|
||||
await database.execute(
|
||||
'ALTER TABLE face ADD COLUMN qualityCheckedAt TEXT',
|
||||
);
|
||||
}
|
||||
if (!names.contains('qualityErrorCode')) {
|
||||
await database.execute(
|
||||
'ALTER TABLE face ADD COLUMN qualityErrorCode INTEGER',
|
||||
);
|
||||
}
|
||||
await database.execute(
|
||||
"UPDATE face SET qualityStatus = 'pending' WHERE qualityStatus IS NULL OR qualityStatus NOT IN ('pending', 'detected', 'failed')",
|
||||
);
|
||||
// 项目现有 DateTimeEmptyConverter 以空字符串表示业务空值;迁移旧记录时同步规范化,
|
||||
// 避免 Floor 生成代码把 SQLite NULL 强转为 String 后读取失败。
|
||||
await database.execute(
|
||||
"UPDATE face SET qualityCheckedAt = '' WHERE qualityCheckedAt IS NULL",
|
||||
);
|
||||
await database.execute(
|
||||
'CREATE INDEX IF NOT EXISTS index_face_qualityStatus_qualityScore ON face(qualityStatus, qualityScore)',
|
||||
);
|
||||
});
|
||||
|
||||
/// 按起始版本升序返回全部迁移,Floor 打开旧数据库时据此连续升级到当前版本。
|
||||
static List<Migration> getDatabaseMigrations() {
|
||||
return [
|
||||
@@ -364,6 +399,7 @@ abstract class DatabaseMigration {
|
||||
migration8To9,
|
||||
migration9To10,
|
||||
migration10To11,
|
||||
migration11To12,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -41,6 +41,18 @@ class FaceEntity extends Equatable {
|
||||
/// 同步时间
|
||||
DateTime? updateTime;
|
||||
|
||||
/// 最近一次在库图片质量分,范围为0到1;未检测或检测失败时为空。
|
||||
double? qualityScore;
|
||||
|
||||
/// 质量检测状态,持久化值为pending、detected或failed。
|
||||
String qualityStatus;
|
||||
|
||||
/// 最近一次质量检测完成时间;从未检测时为空。
|
||||
DateTime? qualityCheckedAt;
|
||||
|
||||
/// 最近一次质量检测的虹软或插件错误码;成功时为空。
|
||||
int? qualityErrorCode;
|
||||
|
||||
FaceEntity({
|
||||
this.id,
|
||||
required this.userId,
|
||||
@@ -53,6 +65,10 @@ class FaceEntity extends Equatable {
|
||||
this.faceModel,
|
||||
this.createTime,
|
||||
this.updateTime,
|
||||
this.qualityScore,
|
||||
this.qualityStatus = 'pending',
|
||||
this.qualityCheckedAt,
|
||||
this.qualityErrorCode,
|
||||
});
|
||||
|
||||
factory FaceEntity.fromJson(Map<String, dynamic> json) =>
|
||||
|
||||
@@ -22,6 +22,12 @@ FaceEntity _$FaceEntityFromJson(Map<String, dynamic> json) => FaceEntity(
|
||||
updateTime: json['updateTime'] == null
|
||||
? null
|
||||
: DateTime.parse(json['updateTime'] as String),
|
||||
qualityScore: (json['qualityScore'] as num?)?.toDouble(),
|
||||
qualityStatus: json['qualityStatus'] as String? ?? 'pending',
|
||||
qualityCheckedAt: json['qualityCheckedAt'] == null
|
||||
? null
|
||||
: DateTime.parse(json['qualityCheckedAt'] as String),
|
||||
qualityErrorCode: (json['qualityErrorCode'] as num?)?.toInt(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$FaceEntityToJson(FaceEntity instance) =>
|
||||
@@ -37,4 +43,8 @@ Map<String, dynamic> _$FaceEntityToJson(FaceEntity instance) =>
|
||||
'faceModel': instance.faceModel,
|
||||
'createTime': instance.createTime?.toIso8601String(),
|
||||
'updateTime': instance.updateTime?.toIso8601String(),
|
||||
'qualityScore': instance.qualityScore,
|
||||
'qualityStatus': instance.qualityStatus,
|
||||
'qualityCheckedAt': instance.qualityCheckedAt?.toIso8601String(),
|
||||
'qualityErrorCode': instance.qualityErrorCode,
|
||||
};
|
||||
Reference in new issue
Block a user