diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppFaceController.java b/src/main/java/com/ycwl/basic/controller/mobile/AppFaceController.java index ae188d07..96f15361 100644 --- a/src/main/java/com/ycwl/basic/controller/mobile/AppFaceController.java +++ b/src/main/java/com/ycwl/basic/controller/mobile/AppFaceController.java @@ -111,10 +111,11 @@ public class AppFaceController { } @PutMapping("/{faceId}/recognition") - public ApiResponse updateRecognition(@PathVariable Long faceId, + public ApiResponse updateRecognition(@PathVariable Long faceId, @RequestBody FaceRecognitionUpdateReq req) { req.setFaceId(faceId); - return ApiResponse.success(faceService.updateRecognition(req)); + faceService.updateRecognition(req); + return ApiResponse.success("OK"); } @GetMapping("/{faceId}/recognition/detail") diff --git a/src/main/java/com/ycwl/basic/model/mobile/face/FaceRecognitionSampleVO.java b/src/main/java/com/ycwl/basic/model/mobile/face/FaceRecognitionSampleVO.java index 6bf5d62f..a81bdea1 100644 --- a/src/main/java/com/ycwl/basic/model/mobile/face/FaceRecognitionSampleVO.java +++ b/src/main/java/com/ycwl/basic/model/mobile/face/FaceRecognitionSampleVO.java @@ -17,9 +17,7 @@ public class FaceRecognitionSampleVO { private Boolean accepted; private Long sourceId; - private Integer sourceType; private String sourceUrl; - private String faceUrl; private Long deviceId; private String deviceName; @@ -27,16 +25,4 @@ public class FaceRecognitionSampleVO { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date shotAt; - private Integer isFree; - private Integer isBuy; - - /** - * 过滤原因列表,用于提示用户样本被过滤的原因。 - */ - private List filterReasons; - - /** - * 过滤原因的描述集合,方便前端直接展示。 - */ - private List filterReasonTexts; } diff --git a/src/main/java/com/ycwl/basic/service/pc/FaceService.java b/src/main/java/com/ycwl/basic/service/pc/FaceService.java index 381b6d4e..0f6e824a 100644 --- a/src/main/java/com/ycwl/basic/service/pc/FaceService.java +++ b/src/main/java/com/ycwl/basic/service/pc/FaceService.java @@ -53,7 +53,7 @@ public interface FaceService { void matchCustomFaceId(Long faceId, List faceSampleIds); - FaceRecognitionDetailVO updateRecognition(FaceRecognitionUpdateReq req); + void updateRecognition(FaceRecognitionUpdateReq req); FaceRecognitionDetailVO getRecognitionDetail(Long faceId); } diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java index 283153c1..cb1d42f9 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java @@ -27,7 +27,6 @@ import com.ycwl.basic.model.mobile.scenic.content.ContentPageVO; import com.ycwl.basic.model.mobile.statistic.req.StatisticsRecordAddReq; import com.ycwl.basic.model.pc.device.entity.DeviceEntity; import com.ycwl.basic.model.pc.face.entity.FaceEntity; -import com.ycwl.basic.model.pc.face.enums.FaceRecognitionFilterReason; import com.ycwl.basic.model.mobile.face.FaceRecognitionUpdateReq; import com.ycwl.basic.model.pc.face.req.FaceReqQuery; import com.ycwl.basic.model.mobile.face.FaceRecognitionDetailVO; @@ -80,7 +79,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; -import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -1264,7 +1262,7 @@ public class FaceServiceImpl implements FaceService { } @Override - public FaceRecognitionDetailVO updateRecognition(FaceRecognitionUpdateReq req) { + public void updateRecognition(FaceRecognitionUpdateReq req) { if (req == null || req.getFaceId() == null) { throw new IllegalArgumentException("faceId 不能为空"); } @@ -1308,8 +1306,6 @@ public class FaceServiceImpl implements FaceService { if (Strings.isNotBlank(req.getRemark())) { log.info("人脸识别人工调整备注:faceId={}, remark={}", faceId, req.getRemark()); } - - return getRecognitionDetail(faceId); } @Override @@ -1363,52 +1359,12 @@ public class FaceServiceImpl implements FaceService { return detail; } - List allSamples = faceSampleMapper.listByIds(allSampleIds); - Map sampleEntityMap = allSamples.stream() - .collect(Collectors.toMap(FaceSampleEntity::getId, Function.identity(), (a, b) -> a, LinkedHashMap::new)); - List sourceEntities = sourceMapper.listBySampleIds(allSampleIds); Map sourceBySampleId = sourceEntities.stream() .collect(Collectors.toMap(SourceEntity::getFaceSampleId, Function.identity(), (a, b) -> a, LinkedHashMap::new)); Map sourceById = sourceEntities.stream() .collect(Collectors.toMap(SourceEntity::getId, Function.identity(), (a, b) -> a)); - ScenicConfigManager scenicConfig = scenicRepository.getScenicConfigManager(face.getScenicId()); - Float thresholdConfig = scenicConfig != null ? scenicConfig.getFloat("face_score_threshold") : null; - float threshold = thresholdConfig != null ? thresholdConfig / 100F : 0F; - - List initialAcceptedIds = allSampleIds.stream() - .filter(id -> { - SearchFaceResultItem item = itemBySampleId.get(id); - return item != null && item.getScore() != null && item.getScore() > threshold; - }) - .collect(Collectors.toList()); - - List orderedSampleList = allSampleIds.stream() - .map(sampleEntityMap::get) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - - SampleFilterTrace filterTrace = faceService.applySampleFiltersWithTrace(initialAcceptedIds, orderedSampleList, scenicConfig); - List systemAcceptedIds = filterTrace.getAcceptedSampleIds() == null - ? Collections.emptyList() - : filterTrace.getAcceptedSampleIds(); - - Set initialAcceptedSet = new HashSet<>(initialAcceptedIds); - for (Long sampleId : allSampleIds) { - if (!initialAcceptedSet.contains(sampleId) && !systemAcceptedIds.contains(sampleId)) { - filterTrace.addReason(sampleId, FaceRecognitionFilterReason.SCORE_BELOW_THRESHOLD); - } - } - - Set systemAcceptedSet = new HashSet<>(systemAcceptedIds); - Set persistedAcceptedSet = new HashSet<>(persistedAcceptedIds); - for (Long sampleId : systemAcceptedSet) { - if (!persistedAcceptedSet.contains(sampleId)) { - filterTrace.addReason(sampleId, FaceRecognitionFilterReason.MANUAL_REJECTED); - } - } - List relations = new ArrayList<>(); List videoRelations = memberRelationRepository.listSourceByFaceRelation(faceId, 1); if (videoRelations != null) { @@ -1426,9 +1382,9 @@ public class FaceServiceImpl implements FaceService { } } - Map> reasonMap = filterTrace.getFilteredReasonMap(); Map deviceCache = new HashMap<>(); + Set persistedAcceptedSet = new LinkedHashSet<>(persistedAcceptedIds); List acceptedOrdered = new ArrayList<>(); for (Long sampleId : allSampleIds) { if (persistedAcceptedSet.contains(sampleId)) { @@ -1446,32 +1402,25 @@ public class FaceServiceImpl implements FaceService { sampleId, true, itemBySampleId.get(sampleId), - sampleEntityMap.get(sampleId), sourceBySampleId.get(sampleId), - relationBySampleId.get(sampleId), - deviceCache, - Collections.emptyList())) + deviceCache)) .collect(Collectors.toList()); - Set acceptedSet = new HashSet<>(acceptedOrdered); + Set acceptedSet = new LinkedHashSet<>(acceptedOrdered); List filteredSamples = new ArrayList<>(); for (Long sampleId : allSampleIds) { if (acceptedSet.contains(sampleId)) { continue; } - EnumSet reasons = reasonMap.get(sampleId); - List reasonList = reasons == null - ? Collections.emptyList() - : new ArrayList<>(reasons); - filteredSamples.add(buildSampleVO( + FaceRecognitionSampleVO sampleVO = buildSampleVO( sampleId, false, itemBySampleId.get(sampleId), - sampleEntityMap.get(sampleId), sourceBySampleId.get(sampleId), - relationBySampleId.get(sampleId), - deviceCache, - reasonList)); + deviceCache); + if (sampleVO.getSourceId() != null) { + filteredSamples.add(sampleVO); + } } detail.setAcceptedSamples(acceptedSamples); @@ -1508,44 +1457,26 @@ public class FaceServiceImpl implements FaceService { private FaceRecognitionSampleVO buildSampleVO(Long sampleId, boolean accepted, SearchFaceResultItem resultItem, - FaceSampleEntity sampleEntity, SourceEntity sourceEntity, - MemberSourceEntity relation, - Map deviceCache, - List reasons) { + Map deviceCache) { FaceRecognitionSampleVO vo = new FaceRecognitionSampleVO(); vo.setSampleId(sampleId); vo.setAccepted(accepted); if (resultItem != null) { vo.setScore(resultItem.getScore()); } - if (sampleEntity != null) { - vo.setFaceUrl(sampleEntity.getFaceUrl()); - vo.setDeviceId(sampleEntity.getDeviceId()); - vo.setShotAt(sampleEntity.getCreateAt()); - DeviceEntity device = getDeviceCached(sampleEntity.getDeviceId(), deviceCache); - if (device != null) { - vo.setDeviceName(device.getName()); - } - } if (sourceEntity != null) { + if (sourceEntity.getDeviceId() != null) { + vo.setDeviceId(sourceEntity.getDeviceId()); + vo.setShotAt(sourceEntity.getCreateTime()); + DeviceEntity device = getDeviceCached(sourceEntity.getDeviceId(), deviceCache); + if (device != null) { + vo.setDeviceName(device.getName()); + } + } vo.setSourceId(sourceEntity.getId()); - vo.setSourceType(sourceEntity.getType()); vo.setSourceUrl(resolveSourceUrl(sourceEntity)); } - if (relation != null) { - vo.setIsFree(relation.getIsFree()); - vo.setIsBuy(relation.getIsBuy()); - } - if (reasons != null && !reasons.isEmpty()) { - vo.setFilterReasons(new ArrayList<>(reasons)); - vo.setFilterReasonTexts(reasons.stream() - .map(FaceRecognitionFilterReason::getDescription) - .collect(Collectors.toList())); - } else { - vo.setFilterReasons(Collections.emptyList()); - vo.setFilterReasonTexts(Collections.emptyList()); - } return vo; } @@ -1565,15 +1496,12 @@ public class FaceServiceImpl implements FaceService { if (sourceEntity == null) { return null; } - if (!Strings.isBlank(sourceEntity.getUrl())) { - return sourceEntity.getUrl(); - } - if (!Strings.isBlank(sourceEntity.getVideoUrl())) { - return sourceEntity.getVideoUrl(); - } if (!Strings.isBlank(sourceEntity.getThumbUrl())) { return sourceEntity.getThumbUrl(); } + if (!Strings.isBlank(sourceEntity.getUrl())) { + return sourceEntity.getUrl(); + } return null; }