From a08f4adf2d3100758d13653911bfbfc2909d02b6 Mon Sep 17 00:00:00 2001
From: Jerry Yan <792602257@qq.com>
Date: Tue, 25 Mar 2025 12:43:27 +0800
Subject: [PATCH] =?UTF-8?q?=E6=97=B6=E9=97=B4=E7=BA=BF=E5=85=9C=E5=BA=95?=
 =?UTF-8?q?=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../faceDetectLog/resp/MatchLocalRecord.java  |  1 +
 .../ycwl/basic/repository/FaceRepository.java |  8 +-
 .../task/impl/TaskFaceServiceImpl.java        | 83 ++++++++++++-------
 3 files changed, 55 insertions(+), 37 deletions(-)

diff --git a/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/resp/MatchLocalRecord.java b/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/resp/MatchLocalRecord.java
index 0c305eb..0886ca2 100644
--- a/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/resp/MatchLocalRecord.java
+++ b/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/resp/MatchLocalRecord.java
@@ -14,4 +14,5 @@ public class MatchLocalRecord {
     private String idStr;
     private Date shotDate;
     private Boolean matched;
+    private Boolean accept;
 }
diff --git a/src/main/java/com/ycwl/basic/repository/FaceRepository.java b/src/main/java/com/ycwl/basic/repository/FaceRepository.java
index 2b2617f..b6b3061 100644
--- a/src/main/java/com/ycwl/basic/repository/FaceRepository.java
+++ b/src/main/java/com/ycwl/basic/repository/FaceRepository.java
@@ -26,7 +26,7 @@ public class FaceRepository {
     private FaceSampleMapper faceSampleMapper;
 
     public static final String FACE_CACHE_KEY = "face:%s";
-    public static final String FACE_SAMPLE_CACHE_KEY = "face:%s:sample";
+    public static final String FACE_SAMPLE_CACHE_KEY = "face:sample:%s";
 
     public FaceEntity getFace(Long id) {
         if (redisTemplate.hasKey(String.format(FACE_CACHE_KEY, id))) {
@@ -40,9 +40,6 @@ public class FaceRepository {
     }
 
     public List<FaceSampleEntity> getFaceSampleList(Long faceId) {
-//        if (redisTemplate.hasKey(String.format(FACE_SAMPLE_CACHE_KEY, faceId))) {
-//            return JSONObject.parseArray(redisTemplate.opsForValue().get(String.format(FACE_SAMPLE_CACHE_KEY, faceId)), FaceSampleEntity.class);
-//        }
         FaceEntity face = getFace(faceId);
         if (face == null) {
             return Collections.emptyList();
@@ -51,9 +48,6 @@ public class FaceRepository {
             return Collections.emptyList();
         }
         List<FaceSampleEntity> list = faceSampleMapper.listByIds(Arrays.stream(face.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
-//        if (!list.isEmpty()) {
-//            redisTemplate.opsForValue().set(String.format(FACE_SAMPLE_CACHE_KEY, faceId), JSONObject.toJSONString(list));
-//        }
         return list;
     }
 
diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java
index 6c9e71b..1b29ba4 100644
--- a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java
@@ -2,6 +2,7 @@ package com.ycwl.basic.service.task.impl;
 
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.aliyuncs.exceptions.ClientException;
 import com.aliyuncs.facebody.model.v20191230.AddFaceEntityRequest;
 import com.aliyuncs.facebody.model.v20191230.AddFaceRequest;
@@ -64,6 +65,7 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import java.util.Random;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -71,6 +73,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME;
 
@@ -197,7 +200,7 @@ public class TaskFaceServiceImpl implements TaskFaceService {
         SearchFaceRequest request = new SearchFaceRequest();
         request.setDbName(dbName);
         request.setImageUrl(faceUrl);
-        request.setLimit(100);
+        request.setLimit(200);
 //        request.setQualityScoreThreshold(60f);
         FaceDetectLog log = FaceDetectLog.quickCreate(reason, request);
         try {
@@ -205,15 +208,21 @@ public class TaskFaceServiceImpl implements TaskFaceService {
         } catch (InterruptedException ignored) {
         }
         float threshold = 0.525F;
+        int tourMinutes = -1;
         if (StringUtils.isNumeric(dbName)) {
             ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(Long.valueOf(dbName));
             if (scenicConfig != null) {
                 if (scenicConfig.getFaceScoreThreshold() != null) {
                     threshold = scenicConfig.getFaceScoreThreshold() / 100F;
                 }
+                if (scenicConfig.getTourTime() != null) {
+                    tourMinutes = scenicConfig.getTourTime();
+                }
             }
         }
         final float _threshold = threshold;
+        List<Long> reject = new ArrayList<>();
+        List<Long> faceSampleIds = new ArrayList<>();
         try {
             SearchFaceResponse response = client.getAcsResponse(request);
             log.fillResponse(response);
@@ -229,12 +238,53 @@ public class TaskFaceServiceImpl implements TaskFaceService {
             }
             List<SearchFaceResponse.Data.MatchListItem.FaceItemsItem> records = matchList.get(0).getFaceItems();
             log.setMatchRawRecord(records);
-            List<Long> faceSampleIds = records.stream()
+            faceSampleIds = records.stream()
                     .filter(record -> record.getScore() > _threshold)
                     .map(SearchFaceResponse.Data.MatchListItem.FaceItemsItem::getExtraData)
                     .filter(StringUtils::isNumeric)
                     .map(Long::valueOf)
                     .collect(Collectors.toList());
+            List<FaceSampleEntity> faceSampleList = new ArrayList<>();
+            if (StringUtils.isNumeric(dbName)) {
+                faceSampleList = faceSampleMapper.listByIds(faceSampleIds);
+                Long firstFaceSampleId = faceSampleIds.get(0);
+                Optional<FaceSampleEntity> firstFaceSample = faceSampleList.stream().filter(faceSample -> faceSample.getId().equals(firstFaceSampleId)).findAny();
+                if (firstFaceSample.isPresent()) {
+                    if (tourMinutes > 0) {
+                        Date startDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), -tourMinutes/2);
+                        Date endDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), tourMinutes/2);
+                        faceSampleIds = faceSampleList.stream()
+                                .filter(faceSample -> faceSample.getCreateAt().after(startDate) && faceSample.getCreateAt().before(endDate))
+                                .map(FaceSampleEntity::getId)
+                                .collect(Collectors.toList());
+                    }
+                }
+            }
+            List<MatchLocalRecord> collect = new ArrayList<>();
+            for (SearchFaceResponse.Data.MatchListItem.FaceItemsItem item : records) {
+                MatchLocalRecord record = new MatchLocalRecord();
+                record.setIdStr(item.getExtraData());
+                record.setFaceSampleId(Long.parseLong(item.getExtraData()));
+                if (StringUtils.isNumeric(item.getDbName())) {
+                    Optional<FaceSampleEntity> optionalFse = faceSampleList.stream().filter(face -> face.getId().equals(Long.parseLong(item.getExtraData()))).findAny();
+                    if (optionalFse.isPresent()) {
+                        DeviceEntity device = deviceRepository.getDevice(optionalFse.get().getDeviceId());
+                        if (device != null) {
+                            record.setDeviceName(device.getName());
+                        }
+                        record.setMatched(item.getScore() > _threshold);
+                        record.setAccept(faceSampleIds.contains(optionalFse.get().getId()));
+                        record.setFaceUrl(optionalFse.get().getFaceUrl());
+                        record.setShotDate(optionalFse.get().getCreateAt());
+                    }
+                } else {
+                    record.setFaceUrl(getFaceUrl(record.getFaceSampleId()));
+                }
+                record.setScore(item.getScore());
+                record.setConfidence(item.getConfidence());
+                collect.add(record);
+            }
+            log.setMatchLocalRecord(JSONObject.toJSONString(collect));
             respVo.setFirstMatchRate(matchList.get(0).getFaceItems().get(0).getScore());
             respVo.setSampleListIds(faceSampleIds);
             return respVo;
@@ -242,34 +292,7 @@ public class TaskFaceServiceImpl implements TaskFaceService {
             log.setMatchRawResult("识别错误,错误为:["+e.getLocalizedMessage()+"]");
             throw new BaseException(e.getMessage());
         } finally {
-            executor.execute(() -> {
-                if (log.getMatchRawRecord() != null) {
-                    List<MatchLocalRecord> collect = log.getMatchRawRecord().parallelStream().map(item -> {
-                        MatchLocalRecord record = new MatchLocalRecord();
-                        record.setIdStr(item.getExtraData());
-                        record.setFaceSampleId(Long.parseLong(item.getExtraData()));
-                        if (StringUtils.isNumeric(item.getDbName())) {
-                            FaceSampleEntity faceSample = faceRepository.getFaceSample(record.getFaceSampleId());
-                            if (faceSample != null) {
-                                DeviceEntity device = deviceRepository.getDevice(faceSample.getDeviceId());
-                                if (device != null) {
-                                    record.setDeviceName(device.getName());
-                                }
-                                record.setMatched(item.getScore() > _threshold);
-                                record.setFaceUrl(faceSample.getFaceUrl());
-                                record.setShotDate(faceSample.getCreateAt());
-                            }
-                        } else {
-                            record.setFaceUrl(getFaceUrl(record.getFaceSampleId()));
-                        }
-                        record.setScore(item.getScore());
-                        record.setConfidence(item.getConfidence());
-                        return record;
-                    }).collect(Collectors.toList());
-                    log.setMatchLocalRecord(JSON.toJSONString(collect));
-                }
-                logMapper.insert(log);
-            });
+            logMapper.insert(log);
         }
     }