You've already forked FrameTour-BE
refactor(puzzle): 重构拼图同步生成逻辑
- 添加详细的方法执行日志记录 - 实现参数校验和模板查询验证 - 增加元素排序和动态数据构建 - 集成重复图片检测机制 - 添加内容去重检测和历史记录复用 - 实现边缘渲染任务创建和
This commit is contained in:
@@ -84,7 +84,113 @@ public class PuzzleGenerateServiceImpl implements IPuzzleGenerateService {
|
||||
|
||||
@Override
|
||||
public PuzzleGenerateResponse generateSync(PuzzleGenerateRequest request) {
|
||||
return doGenerate(request);
|
||||
long startTime = System.currentTimeMillis();
|
||||
log.info("开始同步生成拼图(边缘渲染模式): templateCode={}, userId={}, faceId={}",
|
||||
request.getTemplateCode(), request.getUserId(), request.getFaceId());
|
||||
|
||||
// 1. 参数校验
|
||||
validateRequest(request);
|
||||
|
||||
// 2. 查询模板(使用缓存)
|
||||
PuzzleTemplateEntity template = puzzleRepository.getTemplateByCode(request.getTemplateCode());
|
||||
if (template == null) {
|
||||
throw new IllegalArgumentException("模板不存在: " + request.getTemplateCode());
|
||||
}
|
||||
if (template.getStatus() != 1) {
|
||||
throw new IllegalArgumentException("模板已禁用: " + request.getTemplateCode());
|
||||
}
|
||||
Long resolvedScenicId = resolveScenicId(template, request.getScenicId());
|
||||
|
||||
// 3. 查询并排序元素
|
||||
List<PuzzleElementEntity> elements = puzzleRepository.getElementsByTemplateId(template.getId());
|
||||
if (elements.isEmpty()) {
|
||||
throw new IllegalArgumentException("模板没有配置元素: " + request.getTemplateCode());
|
||||
}
|
||||
elements.sort(Comparator.comparing(PuzzleElementEntity::getZIndex,
|
||||
Comparator.nullsFirst(Comparator.naturalOrder())));
|
||||
|
||||
// 4. 构建dynamicData
|
||||
Map<String, String> finalDynamicData = buildDynamicData(template, request, resolvedScenicId, elements);
|
||||
|
||||
// 5. 重复图片检测(可能抛出DuplicateImageException)
|
||||
duplicationDetector.detectDuplicateImages(finalDynamicData, elements);
|
||||
|
||||
// 6. 内容去重检测
|
||||
String contentHash = duplicationDetector.calculateContentHash(finalDynamicData);
|
||||
PuzzleGenerationRecordEntity duplicateRecord = duplicationDetector.findDuplicateRecord(
|
||||
template.getId(), contentHash, resolvedScenicId
|
||||
);
|
||||
if (duplicateRecord != null) {
|
||||
long duration = System.currentTimeMillis() - startTime;
|
||||
log.info("检测到重复内容,复用历史记录: recordId={}, imageUrl={}, duration={}ms",
|
||||
duplicateRecord.getId(), duplicateRecord.getResultImageUrl(), duration);
|
||||
return PuzzleGenerateResponse.success(
|
||||
duplicateRecord.getResultImageUrl(),
|
||||
duplicateRecord.getResultFileSize(),
|
||||
duplicateRecord.getResultWidth(),
|
||||
duplicateRecord.getResultHeight(),
|
||||
(int) duration,
|
||||
duplicateRecord.getId(),
|
||||
true,
|
||||
duplicateRecord.getId()
|
||||
);
|
||||
}
|
||||
|
||||
// 7. 创建生成记录
|
||||
PuzzleGenerationRecordEntity record = createRecord(template, request, resolvedScenicId);
|
||||
record.setContentHash(contentHash);
|
||||
recordMapper.insert(record);
|
||||
|
||||
// 8. 创建边缘渲染任务并等待完成
|
||||
Long taskId = puzzleEdgeRenderTaskService.createRenderTask(
|
||||
record,
|
||||
template,
|
||||
elements,
|
||||
finalDynamicData,
|
||||
request.getOutputFormat(),
|
||||
request.getQuality()
|
||||
);
|
||||
puzzleEdgeRenderTaskService.registerWait(taskId);
|
||||
|
||||
log.info("同步拼图任务已提交边缘渲染,等待完成: recordId={}, taskId={}", record.getId(), taskId);
|
||||
|
||||
// 9. 等待任务完成(30秒超时)
|
||||
PuzzleEdgeRenderTaskService.TaskWaitResult waitResult =
|
||||
puzzleEdgeRenderTaskService.waitForTask(taskId, 30_000);
|
||||
|
||||
long duration = System.currentTimeMillis() - startTime;
|
||||
|
||||
if (waitResult.isSuccess()) {
|
||||
log.info("同步拼图边缘渲染完成: recordId={}, taskId={}, imageUrl={}, duration={}ms",
|
||||
record.getId(), taskId, waitResult.getImageUrl(), duration);
|
||||
|
||||
// 重新查询记录获取完整信息(边缘渲染回调已更新)
|
||||
PuzzleGenerationRecordEntity updatedRecord = recordMapper.getById(record.getId());
|
||||
if (updatedRecord != null && updatedRecord.getResultImageUrl() != null) {
|
||||
return PuzzleGenerateResponse.success(
|
||||
updatedRecord.getResultImageUrl(),
|
||||
updatedRecord.getResultFileSize(),
|
||||
updatedRecord.getResultWidth(),
|
||||
updatedRecord.getResultHeight(),
|
||||
(int) duration,
|
||||
updatedRecord.getId()
|
||||
);
|
||||
}
|
||||
|
||||
// 回调可能还未完全写入,使用等待结果中的URL
|
||||
return PuzzleGenerateResponse.success(
|
||||
waitResult.getImageUrl(),
|
||||
null,
|
||||
template.getCanvasWidth(),
|
||||
template.getCanvasHeight(),
|
||||
(int) duration,
|
||||
record.getId()
|
||||
);
|
||||
} else {
|
||||
log.error("同步拼图边缘渲染失败: recordId={}, taskId={}, error={}, duration={}ms",
|
||||
record.getId(), taskId, waitResult.getErrorMessage(), duration);
|
||||
throw new RuntimeException("拼图生成失败: " + waitResult.getErrorMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user