feat(puzzle): 添加拼图素材版本缓存优化重复生成

- 新增 puzzleSourceVersionCache 缓存用于记录拼图素材版本
- 实现 isPuzzleSourceChanged 方法判断素材是否变化
- 添加 markPuzzleSourceVersion 方法标记当前素材版本
- 实现 invalidatePuzzleSourceVersion 方法清除指定人脸缓存
- 在人脸关系变更时自动清除相关拼图素材版本缓存
- 重构 AppPuzzleController 使用 PuzzleRepository 替代直接访问 Mapper
- 添加生成记录缓存机制,包括按人脸ID和记录ID的缓存
- 实现素材版本缓存命中时复用历史记录功能
- 优化重复内容检测逻辑,添加缓存标记机制
- 在各种生成流程中添加缓存清除逻辑确保数据一致性
This commit is contained in:
2026-01-07 12:57:46 +08:00
parent 286062a81a
commit 54cdee333d
13 changed files with 364 additions and 10 deletions

View File

@@ -207,6 +207,8 @@ public class FaceServiceImpl implements FaceService {
private FaceDetectLogAiCamService faceDetectLogAiCamService;
@Autowired
private OrderRepository orderRepository;
@Autowired
private com.ycwl.basic.biz.FaceStatusManager faceStatusManager;
@Override
public ApiResponse<PageInfo<FaceRespVO>> pageQuery(FaceReqQuery faceReqQuery) {
@@ -994,6 +996,7 @@ public class FaceServiceImpl implements FaceService {
sourceMapper.deleteNotBuyFaceRelation(face.getMemberId(), faceId);
videoMapper.deleteNotBuyFaceRelations(face.getMemberId(), faceId);
memberRelationRepository.clearSCacheByFace(faceId);
faceStatusManager.invalidatePuzzleSourceVersion(faceId);
log.debug("人脸旧关系数据删除完成:faceId={}", faceId);
List<MemberSourceEntity> memberSourceEntityList = sourceRelationProcessor.processMemberSources(sampleListIds, face);
@@ -1016,6 +1019,7 @@ public class FaceServiceImpl implements FaceService {
log.warn("没有有效的关联关系可创建: faceId={}, 原始数量={}", faceId, memberSourceEntityList.size());
}
memberRelationRepository.clearSCacheByFace(faceId);
faceStatusManager.invalidatePuzzleSourceVersion(faceId);
taskTaskService.autoCreateTaskByFaceId(faceId);
log.info("自定义人脸匹配完成:faceId={}, 匹配样本数={}, 关联源文件数={}, 免费数={}",

View File

@@ -341,6 +341,7 @@ public class FaceMatchingOrchestrator {
// 清除缓存
memberRelationRepository.clearSCacheByFace(faceId);
faceStatusManager.invalidatePuzzleSourceVersion(faceId);
}
/**

View File

@@ -92,6 +92,8 @@ public class TaskFaceServiceImpl implements TaskFaceService {
private ScenicService scenicService;
@Autowired
private MemberRelationRepository memberRelationRepository;
@Autowired
private com.ycwl.basic.biz.FaceStatusManager faceStatusManager;
private IAcsClient getClient() {
AliFaceBodyAdapter use = (AliFaceBodyAdapter) FaceBodyFactory.use();
@@ -172,6 +174,7 @@ public class TaskFaceServiceImpl implements TaskFaceService {
log.warn("没有有效的关联关系可创建: faceId={}, 原始数量={}", faceId, memberSourceEntityList.size());
}
memberRelationRepository.clearSCacheByFace(faceId);
faceStatusManager.invalidatePuzzleSourceVersion(faceId);
List<FaceSampleEntity> faceSampleList = faceRepository.getFaceSampleList(faceId);
List<Long> faceSampleIds = faceSampleList.stream()
.sorted(Comparator.comparing(FaceSampleEntity::getCreateAt).reversed())