From 4a82ee6c4dc615679c071fc0f9a2cf718eb3ae35 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 5 Dec 2025 16:54:47 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai):=20=E5=AE=9E=E7=8E=B0AI=E7=9B=B8?= =?UTF-8?q?=E6=9C=BA=E4=BA=BA=E8=84=B8=E8=AF=86=E5=88=AB=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入DeviceRepository以获取景区内所有AI相机设备 - 修改searchAndLog方法逻辑,遍历所有AI相机设备进行人脸搜索 - 新增searchDeviceAndLog私有方法处理单个设备的人脸识别与日志记录 - 更新FaceDetectLogAiCamService接口定义,移除deviceId参数 - 在FaceServiceImpl中调用新的日志记录服务 - 删除不再使用的DeviceConfigManager和FaceRecoveryStrategy依赖 - 调整日志记录中的字段名称及异常处理逻辑 --- .../service/pc/FaceDetectLogAiCamService.java | 5 ++-- .../impl/FaceDetectLogAiCamServiceImpl.java | 28 ++++++++++++++----- .../service/pc/impl/FaceServiceImpl.java | 8 ++++-- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/ycwl/basic/service/pc/FaceDetectLogAiCamService.java b/src/main/java/com/ycwl/basic/service/pc/FaceDetectLogAiCamService.java index 903a1ed0..36ac2614 100644 --- a/src/main/java/com/ycwl/basic/service/pc/FaceDetectLogAiCamService.java +++ b/src/main/java/com/ycwl/basic/service/pc/FaceDetectLogAiCamService.java @@ -11,11 +11,10 @@ public interface FaceDetectLogAiCamService { /** * 搜索人脸库并保存日志 * @param scenicId 景区ID - * @param deviceId 设备ID - * @param faceSampleId 人脸样本ID + * @param faceId 人脸样本ID * @param faceUrl 人脸URL * @param adapter 人脸适配器 * @return 搜索结果 */ - SearchFaceResp searchAndLog(Long scenicId, Long deviceId, Long faceSampleId, String faceUrl, IFaceBodyAdapter adapter); + void searchAndLog(Long scenicId, Long faceId, String faceUrl, IFaceBodyAdapter adapter); } diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/FaceDetectLogAiCamServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/FaceDetectLogAiCamServiceImpl.java index 0d22dc29..1531358e 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/FaceDetectLogAiCamServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/FaceDetectLogAiCamServiceImpl.java @@ -2,8 +2,10 @@ package com.ycwl.basic.service.pc.impl; import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; import com.ycwl.basic.facebody.entity.SearchFaceResp; +import com.ycwl.basic.integration.device.dto.device.DeviceV2DTO; import com.ycwl.basic.mapper.FaceDetectLogAiCamMapper; import com.ycwl.basic.model.pc.faceDetectLog.entity.FaceDetectLogAiCamEntity; +import com.ycwl.basic.repository.DeviceRepository; import com.ycwl.basic.service.pc.FaceDetectLogAiCamService; import com.ycwl.basic.utils.JacksonUtil; import lombok.RequiredArgsConstructor; @@ -11,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Date; +import java.util.List; @Slf4j @Service @@ -18,17 +21,28 @@ import java.util.Date; public class FaceDetectLogAiCamServiceImpl implements FaceDetectLogAiCamService { private final FaceDetectLogAiCamMapper faceDetectLogAiCamMapper; + private final DeviceRepository deviceRepository; @Override - public SearchFaceResp searchAndLog(Long scenicId, Long deviceId, Long faceSampleId, String faceUrl, IFaceBodyAdapter adapter) { + public void searchAndLog(Long scenicId, Long faceId, String faceUrl, IFaceBodyAdapter adapter) { + List devices = deviceRepository.getAllDeviceByScenicId(scenicId); + for (DeviceV2DTO device : devices) { + if (!device.getType().equals("AI_CAM")) { + continue; + } + searchDeviceAndLog(scenicId, device.getId(), faceId, faceUrl, adapter); + } + } + + private SearchFaceResp searchDeviceAndLog(Long scenicId, Long deviceId, Long faceId, String faceUrl, IFaceBodyAdapter adapter) { String dbName = "AiCam" + deviceId; - + SearchFaceResp resp = null; try { // 调用适配器搜索人脸 resp = adapter.searchFace(dbName, faceUrl); } catch (Exception e) { - log.error("AI相机人脸搜索异常: scenicId={}, deviceId={}, faceSampleId={}", scenicId, deviceId, faceSampleId, e); + log.error("AI相机人脸搜索异常: scenicId={}, deviceId={}, faceSampleId={}", scenicId, deviceId, faceId, e); // 发生异常时记录空结果或错误信息,视业务需求而定。这里暂不中断流程,继续记录日志 } @@ -37,7 +51,7 @@ public class FaceDetectLogAiCamServiceImpl implements FaceDetectLogAiCamService FaceDetectLogAiCamEntity logEntity = new FaceDetectLogAiCamEntity(); logEntity.setScenicId(scenicId); logEntity.setDeviceId(deviceId); - logEntity.setFaceId(faceSampleId); + logEntity.setFaceId(faceId); logEntity.setDbName(dbName); logEntity.setFaceUrl(faceUrl); logEntity.setCreateTime(new Date()); @@ -47,17 +61,17 @@ public class FaceDetectLogAiCamServiceImpl implements FaceDetectLogAiCamService // SearchFaceResp 的 getOriginalFaceScore 通常是图片质量分,getFirstMatchRate 是最佳匹配分 // 需根据 SearchFaceResp 定义确认。假设 getFirstMatchRate() 是匹配分 // 实际上 searchFace 返回的是匹配列表。 - + // 记录原始响应 logEntity.setMatchRawResult(JacksonUtil.toJSONString(resp)); } else { - logEntity.setMatchRawResult("{\"error\": \"search failed or exception\"}"); + logEntity.setMatchRawResult("{\"error\": \"search failed or exception\"}"); } faceDetectLogAiCamMapper.add(logEntity); } catch (Exception e) { - log.error("保存AI相机人脸识别日志失败: faceSampleId={}", faceSampleId, e); + log.error("保存AI相机人脸识别日志失败: faceSampleId={}", faceId, e); } return resp; 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 2a89ee0f..8294205d 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 @@ -9,7 +9,6 @@ import com.ycwl.basic.constant.BaseContextHandler; import com.ycwl.basic.exception.BaseException; import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; import com.ycwl.basic.facebody.entity.SearchFaceResultItem; -import com.ycwl.basic.integration.common.manager.DeviceConfigManager; import com.ycwl.basic.mapper.FaceSampleMapper; import com.ycwl.basic.mapper.ProjectMapper; import com.ycwl.basic.mapper.SourceMapper; @@ -62,6 +61,7 @@ import com.ycwl.basic.repository.TemplateRepository; import com.ycwl.basic.repository.VideoRepository; import com.ycwl.basic.repository.VideoTaskRepository; import com.ycwl.basic.service.mobile.GoodsService; +import com.ycwl.basic.service.pc.FaceDetectLogAiCamService; import com.ycwl.basic.service.pc.FaceService; import com.ycwl.basic.service.pc.ScenicService; import com.ycwl.basic.constant.SourceType; @@ -71,7 +71,6 @@ import com.ycwl.basic.service.pc.helper.SearchResultMerger; import com.ycwl.basic.service.pc.helper.ScenicConfigFacade; import com.ycwl.basic.service.pc.orchestrator.FaceMatchingOrchestrator; import com.ycwl.basic.service.pc.processor.BuyStatusProcessor; -import com.ycwl.basic.service.pc.processor.FaceRecoveryStrategy; import com.ycwl.basic.service.pc.processor.SourceRelationProcessor; import com.ycwl.basic.service.pc.processor.VideoRecreationHandler; import com.ycwl.basic.service.pc.strategy.RematchContext; @@ -193,6 +192,8 @@ public class FaceServiceImpl implements FaceService { private IPriceCalculationService iPriceCalculationService; @Autowired private PuzzleTemplateMapper puzzleTemplateMapper; + @Autowired + private FaceDetectLogAiCamService faceDetectLogAiCamService; @Override public ApiResponse> pageQuery(FaceReqQuery faceReqQuery) { @@ -319,6 +320,9 @@ public class FaceServiceImpl implements FaceService { } } + if (org.apache.commons.lang3.Strings.CI.equals("aiCam", scene)) { + faceDetectLogAiCamService.searchAndLog(scenicId, newFaceId, faceUrl, faceBodyAdapter); + } return resp; }