refactor(printer): 优化人脸素材查询逻辑

- 移除不必要的MemberSourceEntity和相关Repository依赖
- 将数据查询逻辑从Repository层迁移到Mapper层
- 添加type参数支持素材类型过滤
- 修复方法注释中的人脸ID描述错误
- 直接返回SourceEntity列表避免额外的转换操作
This commit is contained in:
2026-01-03 23:46:52 +08:00
parent 21d8c56e82
commit 32297dc29c
3 changed files with 26 additions and 13 deletions

View File

@@ -4,18 +4,16 @@ package com.ycwl.basic.controller.printer;
import com.ycwl.basic.annotation.IgnoreToken; import com.ycwl.basic.annotation.IgnoreToken;
import com.ycwl.basic.integration.device.dto.device.DeviceV2DTO; import com.ycwl.basic.integration.device.dto.device.DeviceV2DTO;
import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; 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.mobile.face.FaceRecognizeResp;
import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.pc.face.entity.FaceEntity;
import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity;
import com.ycwl.basic.model.pc.mp.MpConfigEntity; import com.ycwl.basic.model.pc.mp.MpConfigEntity;
import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery;
import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity;
import com.ycwl.basic.model.pc.source.entity.SourceEntity; import com.ycwl.basic.model.pc.source.entity.SourceEntity;
import com.ycwl.basic.repository.DeviceRepository; import com.ycwl.basic.repository.DeviceRepository;
import com.ycwl.basic.repository.FaceRepository; import com.ycwl.basic.repository.FaceRepository;
import com.ycwl.basic.repository.MemberRelationRepository;
import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.repository.ScenicRepository;
import com.ycwl.basic.repository.SourceRepository;
import com.ycwl.basic.service.pc.FaceService; import com.ycwl.basic.service.pc.FaceService;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
import com.ycwl.basic.utils.WxMpUtil; import com.ycwl.basic.utils.WxMpUtil;
@@ -32,7 +30,6 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Collections;
import java.util.List; import java.util.List;
@IgnoreToken @IgnoreToken
@@ -46,8 +43,7 @@ public class PrinterTvController {
private final ScenicRepository scenicRepository; private final ScenicRepository scenicRepository;
private final FaceRepository faceRepository; private final FaceRepository faceRepository;
private final FaceService pcFaceService; private final FaceService pcFaceService;
private final MemberRelationRepository memberRelationRepository; private final SourceMapper sourceMapper;
private final SourceRepository sourceRepository;
/** /**
* 获取景区列表 * 获取景区列表
@@ -167,18 +163,16 @@ public class PrinterTvController {
} }
/** /**
* 根据人脸样本ID查询图像素材 * 根据人脸ID查询图像素材
* *
* @param faceId 人脸样本ID * @param faceId 人脸ID
* @param type 素材类型(默认为2-图片)
* @return 匹配的source记录 * @return 匹配的source记录
*/ */
@GetMapping("/{faceId}/source") @GetMapping("/{faceId}/source")
public ApiResponse<List<SourceEntity>> getSourceByFaceId(@PathVariable Long faceId, @RequestParam(name = "type", required = false, defaultValue = "2") Integer type) { public ApiResponse<List<SourceEntity>> getSourceByFaceId(@PathVariable Long faceId, @RequestParam(name = "type", required = false, defaultValue = "2") Integer type) {
List<MemberSourceEntity> source = memberRelationRepository.listSourceByFaceRelation(faceId, type); List<SourceEntity> sources = sourceMapper.listSourceByFaceRelation(faceId, type);
if (source == null) { return ApiResponse.success(sources);
return ApiResponse.success(Collections.emptyList());
}
return ApiResponse.success(source.stream().map(item -> sourceRepository.getSource(item.getSourceId())).toList());
} }
/** /**

View File

@@ -173,4 +173,12 @@ public interface SourceMapper {
* @return 免费记录数 * @return 免费记录数
*/ */
int countFreeRelationsByFaceIdAndType(Long faceId, Integer type); int countFreeRelationsByFaceIdAndType(Long faceId, Integer type);
/**
* 根据faceId和type直接查询关联的source列表(避免N+1查询)
* @param faceId 人脸ID
* @param type 素材类型
* @return source实体列表
*/
List<SourceEntity> listSourceByFaceRelation(Long faceId, Integer type);
} }

View File

@@ -512,4 +512,15 @@
SELECT COUNT(*) FROM member_source SELECT COUNT(*) FROM member_source
WHERE face_id = #{faceId} AND `type` = #{type} AND is_free = 1 WHERE face_id = #{faceId} AND `type` = #{type} AND is_free = 1
</select> </select>
<select id="listSourceByFaceRelation" resultType="com.ycwl.basic.model.pc.source.entity.SourceEntity">
SELECT s.*
FROM member_source ms
INNER JOIN source s ON ms.source_id = s.id
WHERE ms.face_id = #{faceId}
<if test="type != null">
AND ms.type = #{type}
</if>
ORDER BY s.create_time DESC
</select>
</mapper> </mapper>