diff --git a/src/main/java/com/ycwl/basic/constant/FaceConstant.java b/src/main/java/com/ycwl/basic/constant/FaceConstant.java index 88107c28..d96b6684 100644 --- a/src/main/java/com/ycwl/basic/constant/FaceConstant.java +++ b/src/main/java/com/ycwl/basic/constant/FaceConstant.java @@ -5,5 +5,6 @@ public class FaceConstant { public static final String USER_FACE_DB_NAME="userFace"; public static final String FACE_USER_URL_PFX="face:user:url:"; public static final String FACE_RECOGNITION_COUNT_PFX="face:recognition:count:"; + public static final String FACE_CUSTOM_MATCH_COUNT_PFX="face:custom:match:count:"; public static final String FACE_LOW_THRESHOLD_PFX="face:low:threshold:"; } 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 17419bb2..dcbdc3f1 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 @@ -83,6 +83,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; +import static com.ycwl.basic.constant.FaceConstant.FACE_CUSTOM_MATCH_COUNT_PFX; import static com.ycwl.basic.constant.FaceConstant.FACE_LOW_THRESHOLD_PFX; import static com.ycwl.basic.constant.FaceConstant.FACE_RECOGNITION_COUNT_PFX; import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME; @@ -987,6 +988,36 @@ public class FaceServiceImpl implements FaceService { return false; } ScenicConfigManager scenicConfig = scenicRepository.getScenicConfigManager(face.getScenicId()); + + String recognitionKey = FACE_RECOGNITION_COUNT_PFX + faceId; + String recognitionCountStr = redisTemplate.opsForValue().get(recognitionKey); + long recognitionCount = 0L; + if (recognitionCountStr != null) { + try { + recognitionCount = Long.parseLong(recognitionCountStr); + } catch (NumberFormatException e) { + log.warn("识别次数解析失败,faceId={}, count={}", faceId, recognitionCountStr); + } + } + + String customMatchKey = FACE_CUSTOM_MATCH_COUNT_PFX + faceId; + String customMatchCountStr = redisTemplate.opsForValue().get(customMatchKey); + long customMatchCount = 0L; + if (customMatchCountStr != null) { + try { + customMatchCount = Long.parseLong(customMatchCountStr); + } catch (NumberFormatException e) { + log.warn("自定义匹配次数解析失败,faceId={}, count={}", faceId, customMatchCountStr); + } + } + + Integer faceSelectMaxCount = scenicConfig.getInteger("face_select_max_count"); + if (faceSelectMaxCount != null && faceSelectMaxCount > 0 && customMatchCount > faceSelectMaxCount) { + log.debug("自定义人脸匹配次数超过限制:faceId={}, customMatchCount={}, limit={}", + faceId, customMatchCount, faceSelectMaxCount); + return false; + } + Integer maxTourTime = scenicConfig.getInteger("tour_time"); Integer minTourTime = scenicConfig.getInteger("tour_min_time"); boolean tourMatch = false; @@ -1015,16 +1046,6 @@ public class FaceServiceImpl implements FaceService { } } } - String countKey = FACE_RECOGNITION_COUNT_PFX + faceId; - String countStr = redisTemplate.opsForValue().get(countKey); - long recognitionCount = 0L; - if (countStr != null) { - try { - recognitionCount = Long.parseLong(countStr); - } catch (NumberFormatException e) { - log.warn("识别次数解析失败,faceId={}, count={}", faceId, countStr); - } - } int ruleMatched = 0; if (recognitionCount > 1) { ruleMatched++; @@ -1086,6 +1107,9 @@ public class FaceServiceImpl implements FaceService { } log.debug("开始自定义人脸匹配:faceId={}, faceSampleIds={}", faceId, faceSampleIds); + + // 记录自定义匹配调用次数,便于监控调用频率 + recordCustomMatchCount(faceId); try { // 1. 获取基础数据 @@ -1234,6 +1258,28 @@ public class FaceServiceImpl implements FaceService { return mergedResult; } + /** + * 记录自定义人脸匹配次数到Redis + * + * @param faceId 人脸ID + */ + private void recordCustomMatchCount(Long faceId) { + if (faceId == null) { + return; + } + + try { + String redisKey = FACE_CUSTOM_MATCH_COUNT_PFX + faceId; + + Long count = redisTemplate.opsForValue().increment(redisKey); + redisTemplate.expire(redisKey, 2, TimeUnit.DAYS); + + log.debug("自定义人脸匹配计数更新:faceId={}, count={}", faceId, count); + } catch (Exception e) { + log.error("记录自定义人脸匹配次数失败:faceId={}", faceId, e); + } + } + /** * 记录人脸识别次数到Redis *