diff --git a/src/main/java/com/ycwl/basic/controller/printer/PrinterTvController.java b/src/main/java/com/ycwl/basic/controller/printer/PrinterTvController.java index ed1c3346..fdb02a00 100644 --- a/src/main/java/com/ycwl/basic/controller/printer/PrinterTvController.java +++ b/src/main/java/com/ycwl/basic/controller/printer/PrinterTvController.java @@ -1,36 +1,21 @@ package com.ycwl.basic.controller.printer; -import cn.hutool.core.date.DateUtil; -import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; -import com.ycwl.basic.mapper.FaceMapper; -import com.ycwl.basic.model.pc.device.entity.DeviceEntity; -import com.ycwl.basic.model.pc.face.entity.FaceEntity; -import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; -import com.ycwl.basic.model.task.resp.SearchFaceRespVo; -import com.ycwl.basic.repository.MemberRelationRepository; -import com.ycwl.basic.repository.SourceRepository; -import com.ycwl.basic.service.printer.PrinterService; -import com.ycwl.basic.service.task.TaskFaceService; -import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.annotation.IgnoreToken; -import com.ycwl.basic.storage.StorageFactory; import com.ycwl.basic.integration.device.dto.device.DeviceV2DTO; import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.mapper.SourceMapper; +import com.ycwl.basic.model.mobile.face.FaceRecognizeResp; +import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; import com.ycwl.basic.model.pc.mp.MpConfigEntity; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.model.pc.source.entity.SourceEntity; -import com.ycwl.basic.model.printer.FaceRecognizeWithSourcesResp; import com.ycwl.basic.repository.DeviceRepository; import com.ycwl.basic.repository.FaceRepository; import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.service.pc.FaceService; -import com.ycwl.basic.service.pc.ScenicService; -import com.ycwl.basic.storage.utils.StorageUtil; import com.ycwl.basic.utils.ApiResponse; -import com.ycwl.basic.utils.SnowFlakeUtil; import com.ycwl.basic.utils.WxMpUtil; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -45,13 +30,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Date; import java.util.List; -import java.util.Map; -import java.util.UUID; - -import static com.ycwl.basic.constant.StorageConstant.USER_FACE; @IgnoreToken // 打印机大屏对接接口 @@ -65,10 +44,6 @@ public class PrinterTvController { private final FaceRepository faceRepository; private final FaceService pcFaceService; private final SourceMapper sourceMapper; - private final FaceMapper faceMapper; - private final MemberRelationRepository memberRelationRepository; - private final SourceRepository sourceRepository; - private final PrinterService printerService; /** * 获取景区列表 @@ -204,71 +179,23 @@ public class PrinterTvController { /** * 打印机大屏人脸识别 - * 上传照片,在景区人脸库中搜索匹配的人脸样本,返回识别结果和匹配到的图像素材 + * 上传照片,在景区人脸库中搜索匹配的人脸样本,返回识别结果 + * + * 使用 USER_FACE_DB_NAME+scenicId 对人脸进行去重检测: + * - 如果已存在相同人脸(打印机大屏用户,memberId=0),则返回已存在的 faceId + * - 否则创建新的人脸记录并添加到人脸库 * * @param file 人脸照片文件 * @param scenicId 景区ID - * @return 人脸识别结果和匹配的source列表 + * @return 人脸识别结果 */ @PostMapping("/{scenicId}/faceRecognize") - public ApiResponse faceRecognize( + public ApiResponse faceRecognize( @RequestParam("file") MultipartFile file, - @PathVariable Long scenicId) throws Exception { - - // 1. 上传人脸照片到存储 - IStorageAdapter adapter = StorageFactory.use("faces"); - String filePath = StorageUtil.joinPath(USER_FACE, DateUtil.format(new Date(), "yyyy-MM-dd")); - String originalFilename = file.getOriginalFilename(); - String suffix = originalFilename.split("\\.", 2)[1]; - String fileName = UUID.randomUUID() + "." + suffix; - String faceUrl = adapter.uploadFile(file, filePath, fileName); - - // 2. 保存人脸数据到数据库 - Long faceId = SnowFlakeUtil.getLongId(); - FaceEntity faceEntity = new FaceEntity(); - faceEntity.setId(faceId); - faceEntity.setScenicId(scenicId); - faceEntity.setFaceUrl(faceUrl); - faceEntity.setCreateAt(new Date()); - faceEntity.setMemberId(0L); // 打印机大屏端没有用户ID - faceMapper.add(faceEntity); - - // 3. 在景区人脸库中搜索(注意:这里使用scenicId作为数据库名,搜索的是景区内的人脸样本) - pcFaceService.matchFaceId(faceId); - - // 4. 自动添加照片到打印列表,并获取添加成功的照片列表 - List addedSources = printerService.autoAddPhotosToPreferPrint(faceId); - - // 5. 根据自动添加结果决定返回的sources - List sources; - if (addedSources != null && !addedSources.isEmpty()) { - // 如果自动添加成功,返回添加的照片列表 - sources = addedSources; - } else { - // 如果自动添加为空,按原逻辑查询匹配到的图像素材(type=2) - sources = new ArrayList<>(); - List memberSourceEntities = memberRelationRepository.listSourceByFaceRelation(faceId, 2); - for (MemberSourceEntity memberSourceEntity : memberSourceEntities) { - SourceEntity source = sourceRepository.getSource(memberSourceEntity.getSourceId()); - if (source != null) { - sources.add(source); - } - } - } - - // 6. 构造响应 - FaceRecognizeWithSourcesResp resp = new FaceRecognizeWithSourcesResp(); - resp.setUrl(faceUrl); - resp.setFaceId(faceId); - resp.setScenicId(scenicId); - resp.setSources(sources); - // 只有当添加了照片时才返回二维码URL - //if (addedSources != null && !addedSources.isEmpty()) { - //resp.setQrcodeUrl("https://zhentuai.com/printer/v1/tv/face/" + faceId + "/qrcode"); - //} else { - resp.setQrcodeUrl(null); - //} - + @PathVariable Long scenicId) { + // 复用 faceUpload 方法的去重逻辑 + // memberId=0L 表示打印机大屏用户,scene="print" 会触发自动添加打印逻辑并等待完成 + FaceRecognizeResp resp = pcFaceService.faceUpload(file, scenicId, 0L, "print"); return ApiResponse.success(resp); }