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

@@ -1,7 +1,6 @@
package com.ycwl.basic.controller.mobile;
import com.ycwl.basic.biz.OrderBiz;
import com.ycwl.basic.constant.SourceType;
import com.ycwl.basic.model.mobile.order.IsBuyRespVO;
import com.ycwl.basic.model.mobile.scenic.content.ContentPageVO;
import com.ycwl.basic.model.pc.face.entity.FaceEntity;
@@ -11,7 +10,7 @@ import com.ycwl.basic.pricing.dto.ProductItem;
import com.ycwl.basic.pricing.enums.ProductType;
import com.ycwl.basic.pricing.service.IPriceCalculationService;
import com.ycwl.basic.puzzle.entity.PuzzleGenerationRecordEntity;
import com.ycwl.basic.puzzle.mapper.PuzzleGenerationRecordMapper;
import com.ycwl.basic.puzzle.repository.PuzzleRepository;
import com.ycwl.basic.repository.FaceRepository;
import com.ycwl.basic.service.printer.PrinterService;
import com.ycwl.basic.utils.ApiResponse;
@@ -32,7 +31,7 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
public class AppPuzzleController {
private final PuzzleGenerationRecordMapper recordMapper;
private final PuzzleRepository puzzleRepository;
private final FaceRepository faceRepository;
private final IPriceCalculationService iPriceCalculationService;
private final PrinterService printerService;
@@ -46,7 +45,7 @@ public class AppPuzzleController {
if (faceId == null) {
return ApiResponse.fail("faceId不能为空");
}
int count = recordMapper.countByFaceId(faceId);
int count = puzzleRepository.countRecordsByFaceId(faceId);
return ApiResponse.success(count);
}
@@ -58,7 +57,7 @@ public class AppPuzzleController {
if (faceId == null) {
return ApiResponse.fail("faceId不能为空");
}
List<PuzzleGenerationRecordEntity> records = recordMapper.listByFaceId(faceId);
List<PuzzleGenerationRecordEntity> records = puzzleRepository.getRecordsByFaceId(faceId);
List<ContentPageVO> result = records.stream()
.map(this::convertToContentPageVO)
.collect(Collectors.toList());
@@ -73,7 +72,7 @@ public class AppPuzzleController {
if (recordId == null) {
return ApiResponse.fail("recordId不能为空");
}
PuzzleGenerationRecordEntity record = recordMapper.getById(recordId);
PuzzleGenerationRecordEntity record = puzzleRepository.getRecordById(recordId);
if (record == null) {
return ApiResponse.fail("未找到对应的拼图记录");
}
@@ -89,7 +88,7 @@ public class AppPuzzleController {
if (recordId == null) {
return ApiResponse.fail("recordId不能为空");
}
PuzzleGenerationRecordEntity record = recordMapper.getById(recordId);
PuzzleGenerationRecordEntity record = puzzleRepository.getRecordById(recordId);
if (record == null) {
return ApiResponse.fail("未找到对应的拼图记录");
}
@@ -108,7 +107,7 @@ public class AppPuzzleController {
if (recordId == null) {
return ApiResponse.fail("recordId不能为空");
}
PuzzleGenerationRecordEntity record = recordMapper.getById(recordId);
PuzzleGenerationRecordEntity record = puzzleRepository.getRecordById(recordId);
if (record == null) {
return ApiResponse.fail("未找到对应的拼图记录");
}
@@ -142,7 +141,7 @@ public class AppPuzzleController {
}
// 查询拼图记录
PuzzleGenerationRecordEntity record = recordMapper.getById(recordId);
PuzzleGenerationRecordEntity record = puzzleRepository.getRecordById(recordId);
if (record == null) {
return ApiResponse.fail("未找到对应的拼图记录");
}