From a9ae00d58058617dece0ea12a27ad5e540852019 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Mon, 5 Jan 2026 16:02:28 +0800 Subject: [PATCH] =?UTF-8?q?refactor(puzzle):=20=E9=87=8D=E6=9E=84=E6=8B=BC?= =?UTF-8?q?=E5=9B=BE=E5=90=8C=E6=AD=A5=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加详细的方法执行日志记录 - 实现参数校验和模板查询验证 - 增加元素排序和动态数据构建 - 集成重复图片检测机制 - 添加内容去重检测和历史记录复用 - 实现边缘渲染任务创建和 --- .../impl/PuzzleGenerateServiceImpl.java | 108 +++++++++++++++++- 1 file changed, 107 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ycwl/basic/puzzle/service/impl/PuzzleGenerateServiceImpl.java b/src/main/java/com/ycwl/basic/puzzle/service/impl/PuzzleGenerateServiceImpl.java index 91738c8c..aa2333c8 100644 --- a/src/main/java/com/ycwl/basic/puzzle/service/impl/PuzzleGenerateServiceImpl.java +++ b/src/main/java/com/ycwl/basic/puzzle/service/impl/PuzzleGenerateServiceImpl.java @@ -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 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 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