diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserFaceTerminalQualityReportVo.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserFaceTerminalQualityReportVo.java index 62fcc5654..a99e6e490 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserFaceTerminalQualityReportVo.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserFaceTerminalQualityReportVo.java @@ -30,4 +30,10 @@ public class SysUserFaceTerminalQualityReportVo { * 请求时服务端已经不存在的样本编号,终端无需将其视为上报失败。 */ private List alreadyAbsentSampleIds; + + /** + * 未审核通过或服务端编号异常而逐条拒收的样本编号;不影响同批其他样本, + * 终端保留待下次重试,样本审核通过后即可正常写入。 + */ + private List ignoredNotApprovedSampleIds; } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java index 42f622e7b..305c9ad7a 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java @@ -477,19 +477,28 @@ public class SysUserFaceServiceImpl extends ServiceImpl candidates = baseMapper.terminalQualityCandidates( new ArrayList<>(itemBySampleId.keySet())); - boolean notApproved = candidates.stream() - .anyMatch(face -> !TaskCheckStatusEnum.RESULT.getCode().equals(face.getProcessStatus())); - if (notApproved) { - throw new RuntimeException("请求包含未审核通过的人脸"); - } - + // 逐条收集拒收样本而不是整批拒绝:终端调试全租户库可能混有待审核或 + // 历史脏编号样本,一票否决会让整批(上限500条)永远无法上报成功。 + Set ignoredNotApprovedSampleIds = new LinkedHashSet<>(); LinkedHashMap candidateBySampleId = new LinkedHashMap<>(); + Set candidateSampleIds = new HashSet<>(); for (SysUserFaceVo candidate : candidates) { String sampleId = StrUtil.trim(candidate.getAutoCode()); - if (candidate.getId() == null || StrUtil.isBlank(sampleId) - || candidateBySampleId.putIfAbsent(sampleId, candidate) != null) { - throw new RuntimeException("服务端存在重复或无效人脸样本编号"); + if (candidate.getId() == null || StrUtil.isBlank(sampleId)) { + continue; } + if (candidateSampleIds.contains(sampleId)) { + // 服务端存在重复编号:同编号的候选都不可信,整组拒收待数据修复。 + candidateBySampleId.remove(sampleId); + ignoredNotApprovedSampleIds.add(sampleId); + continue; + } + candidateSampleIds.add(sampleId); + if (!TaskCheckStatusEnum.RESULT.getCode().equals(candidate.getProcessStatus())) { + ignoredNotApprovedSampleIds.add(sampleId); + continue; + } + candidateBySampleId.put(sampleId, candidate); } // 不限制样本所属部门:生产终端经 V3 部门快照只持有本部门树人脸,跨部门样本仅出现在 @@ -500,6 +509,9 @@ public class SysUserFaceServiceImpl extends ServiceImpl entry : itemBySampleId.entrySet()) { String sampleId = entry.getKey(); SysUserFaceQualityReportItemDto item = entry.getValue(); + if (ignoredNotApprovedSampleIds.contains(sampleId)) { + continue; + } SysUserFaceVo candidate = candidateBySampleId.get(sampleId); if (candidate == null) { alreadyAbsentSampleIds.add(sampleId); @@ -556,6 +568,7 @@ public class SysUserFaceServiceImpl extends ServiceImpl(ignoredNotApprovedSampleIds)) .build(); }