Files
biz_xfj_cloud/lib/common/services/database/dao/face_dao.dart
T
2026-08-31 15:09:38 +08:00

148 lines
3.9 KiB
Dart

import 'package:floor/floor.dart';
import 'package:pj_supermarket_cloud/common/index.dart';
// face
@dao
abstract class FaceDao {
/// 保存一条已完成文件和原生特征校验的人脸记录。
@insert
Future<int?> save(FaceEntity entity);
@insert
Future<void> batchSave(List<FaceEntity> entitys);
@delete
Future<void> del(FaceEntity entity);
@Query(""" DELETE FROM face """)
Future<void> delAll();
@Query('''
DELETE FROM face WHERE id = :id
''')
Future<void> delById(int id);
@Query('''
DELETE FROM face WHERE userId = :userId
''')
Future<void> delByUserId(String userId);
@Query('''
DELETE FROM face WHERE sampleId = :sampleId
''')
Future<void> delBySampleId(String sampleId);
@delete
Future<void> batchDel(List<FaceEntity> entitys);
@update
Future<void> edit(FaceEntity entity);
@update
Future<void> batchEdit(List<FaceEntity> entitys);
@Query("""
SELECT DISTINCT COUNT(0) FROM face
WHERE
(:userName = '-1' OR userName LIKE '%' || :userName || '%')
""")
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
''')
Future<FaceEntity?> getById(int id);
@Query('''
SELECT * FROM face WHERE sampleId = :sampleId
''')
Future<FaceEntity?> findBySampleId(String sampleId);
@Query('''
SELECT * FROM face WHERE userId = :userId
''')
Future<List<FaceEntity>?> findByUserId(String userId);
@Query('''
SELECT * FROM face
WHERE
(:userName = '-1' OR userName LIKE '%' || :userName || '%')
LIMIT :pageSize OFFSET :offset
''')
Future<List<FaceEntity>> findAll(
String userName,
int pageSize,
int offset,
);
/// 查询本机全部人脸,用于完整部门快照计算集合差异。
@Query('''
SELECT * FROM face ORDER BY sampleId ASC
''')
Future<List<FaceEntity>> getAll();
@Query('''
SELECT DISTINCT a.deptId FROM face a WHERE a.deptId IS NOT NULL
''')
Future<List<String>> findAllUserIds();
@Query('''
SELECT * FROM face WHERE faceModel = '' OR faceModel IS NULL
''')
Future<List<FaceEntity>?> getEmptyFaceList();
}