From b916d6ca85017f22d3a127dbe6870f27db38361f Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 16 Apr 2026 11:28:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=BA=BA=E8=84=B8=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common/models/api/user_api_models.dart | 9 ++++- lib/common/models/api/user_api_models.g.dart | 6 ++- .../services/database/dao/face_dao.dart | 5 +++ lib/common/services/database/database.g.dart | 7 ++++ lib/common/utils/sync/sync_face_tool.dart | 37 +++++++++++++++---- .../setting/widgets/setting_baseInfo.dart | 4 +- 6 files changed, 55 insertions(+), 13 deletions(-) diff --git a/lib/common/models/api/user_api_models.dart b/lib/common/models/api/user_api_models.dart index 7349e84..5fb3f51 100644 --- a/lib/common/models/api/user_api_models.dart +++ b/lib/common/models/api/user_api_models.dart @@ -106,7 +106,7 @@ class ServiceAsyncFace { final String? username; /// 用户头像 - final String? avatar; + final String? userAvatar; /// 部门id final String? deptId; @@ -114,15 +114,20 @@ class ServiceAsyncFace { /// 部门名 final String? deptName; + /// 删除标志 + @JsonKey(fromJson: JsonTool.stringToBoolean, toJson: JsonTool.booleanToString) + final bool? delFlag; + ServiceAsyncFace({ this.id, this.autoCode, this.faceImg, this.userId, this.username, - this.avatar, + this.userAvatar, this.deptId, this.deptName, + this.delFlag, }); factory ServiceAsyncFace.fromJson(Map json) => diff --git a/lib/common/models/api/user_api_models.g.dart b/lib/common/models/api/user_api_models.g.dart index 32aaefb..af81863 100644 --- a/lib/common/models/api/user_api_models.g.dart +++ b/lib/common/models/api/user_api_models.g.dart @@ -58,9 +58,10 @@ ServiceAsyncFace _$ServiceAsyncFaceFromJson(Map json) => faceImg: json['faceImg'] as String?, userId: json['userId'] as String?, username: json['username'] as String?, - avatar: json['avatar'] as String?, + userAvatar: json['userAvatar'] as String?, deptId: json['deptId'] as String?, deptName: json['deptName'] as String?, + delFlag: JsonTool.stringToBoolean(json['delFlag'] as String?), ); Map _$ServiceAsyncFaceToJson(ServiceAsyncFace instance) => @@ -70,9 +71,10 @@ Map _$ServiceAsyncFaceToJson(ServiceAsyncFace instance) => 'faceImg': instance.faceImg, 'userId': instance.userId, 'username': instance.username, - 'avatar': instance.avatar, + 'userAvatar': instance.userAvatar, 'deptId': instance.deptId, 'deptName': instance.deptName, + 'delFlag': JsonTool.booleanToString(instance.delFlag), }; ServiceTenant _$ServiceTenantFromJson(Map json) => diff --git a/lib/common/services/database/dao/face_dao.dart b/lib/common/services/database/dao/face_dao.dart index b790cc2..c0ddae6 100644 --- a/lib/common/services/database/dao/face_dao.dart +++ b/lib/common/services/database/dao/face_dao.dart @@ -27,6 +27,11 @@ abstract class FaceDao { ''') Future delByUserId(String userId); + @Query(''' + DELETE FROM face WHERE sampleId = :sampleId + ''') + Future delBySampleId(String sampleId); + @delete Future batchDel(List entitys); diff --git a/lib/common/services/database/database.g.dart b/lib/common/services/database/database.g.dart index ae8f7ea..8db3b37 100644 --- a/lib/common/services/database/database.g.dart +++ b/lib/common/services/database/database.g.dart @@ -1752,6 +1752,12 @@ class _$FaceDao extends FaceDao { arguments: [userId]); } + @override + Future delBySampleId(String sampleId) async { + await _queryAdapter.queryNoReturn('DELETE FROM face WHERE sampleId = ?1', + arguments: [sampleId]); + } + @override Future findCount(String userName) async { return _queryAdapter.query( @@ -1979,6 +1985,7 @@ final _orderTypeConverter = OrderTypeConverter(); final _orderPayTypeConverter = OrderPayTypeConverter(); final _sysTypeConverter = SysTypeConverter(); final _printStatusConverter = PrintStatusConverter(); +final _productHourTypeConverter = ProductHourTypeConverter(); final _supermarketNatureConverter = SupermarketNatureConverter(); final _discountsTypeConverter = DiscountsTypeConverter(); final _listDiscountsConverter = ListDiscountsConverter(); diff --git a/lib/common/utils/sync/sync_face_tool.dart b/lib/common/utils/sync/sync_face_tool.dart index e83dee5..3ed722c 100644 --- a/lib/common/utils/sync/sync_face_tool.dart +++ b/lib/common/utils/sync/sync_face_tool.dart @@ -106,13 +106,36 @@ class SyncFaceTool { } } for (final v in data) { - final faceEntity = await faceDao.findBySampleId(v.autoCode!); + if (ObjectUtil.isEmpty(v.autoCode) || ObjectUtil.isEmpty(v.userId)) { + logger.e( + "|$_tag|同步人脸跳过无效数据:|autoCode=${v.autoCode}|userId=${v.userId}|deptId=${v.deptId}|username=${v.username}|", + ); + continue; + } + + final sampleId = v.autoCode!; + final userId = v.userId!; + // 删除人脸 + if (v.delFlag == true) { + // 先查询数据库是否存在 + final detail = await faceDao.findBySampleId(sampleId); + if (detail == null) { + continue; + } + if (ObjectUtil.isNotEmpty(detail.path)) { + await delFaceByStorage(filePath: detail.path!); + } + await AppFaceTool.removeFace(sampleId: sampleId); + await faceDao.delBySampleId(sampleId); + continue; + } + final faceEntity = await faceDao.findBySampleId(sampleId); if (faceEntity == null) { final add = FaceEntity( - userId: v.userId!, - sampleId: v.autoCode!, + userId: userId, + sampleId: sampleId, userName: v.username ?? "", - deptId: v.deptId!, + deptId: v.deptId, deptName: v.deptName ?? "", imagePath: v.faceImg ?? "", createTime: DateTime.now(), @@ -146,10 +169,10 @@ class SyncFaceTool { } final edit = FaceEntity( id: faceEntity.id!, - userId: v.userId!, - sampleId: v.autoCode!, + userId: userId, + sampleId: sampleId, userName: v.username ?? "", - deptId: v.deptId!, + deptId: v.deptId, deptName: v.deptName ?? "", imagePath: v.faceImg ?? "", createTime: DateTime.now(), diff --git a/lib/pages/setting/widgets/setting_baseInfo.dart b/lib/pages/setting/widgets/setting_baseInfo.dart index 1f02db1..77d0081 100644 --- a/lib/pages/setting/widgets/setting_baseInfo.dart +++ b/lib/pages/setting/widgets/setting_baseInfo.dart @@ -21,10 +21,10 @@ Future _bindServiceDialog(BuildContext context, SysSetting sys) async { // 正式环境-测试 // uniqueCodeC.text = "1896157295523049473"; // 正式环境-新县府02-主要测试 - // uniqueCodeC.text = "1887466308336488450"; + uniqueCodeC.text = "1887466308336488450"; /// 测试环境-测试设备-(食堂主要测试) - uniqueCodeC.text = "1877592554489143298"; + // uniqueCodeC.text = "1877592554489143298"; // 测试少年宫测试 // uniqueCodeC.text = "1927932460185784321"; // 测试环境-食堂-浦阳