From 18bf51487d2e577ddc46d93a5e2e2cd5f384c48c Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 21 Nov 2025 23:25:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(printer):=20=E4=BC=98=E5=8C=96=E6=8B=BC?= =?UTF-8?q?=E5=9B=BE=E6=89=93=E5=8D=B0=E9=80=BB=E8=BE=91=E5=B9=B6=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=97=A5=E6=9C=9F=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 调整AppPuzzleController中recordId参数为固定值0L - 修改FaceMatchingOrchestrator中的日期格式为"yyyy.MM.dd" - 完善PrinterServiceImpl水印处理条件判断 - 新增针对sourceId为0时的拼图照片偏移处理逻辑 - 修复重复打印检查逻辑,使用resultImageUrl代替puzzleRecordId比较 - 增强异常处理和日志记录,提升系统稳定性 --- .../mobile/AppPuzzleController.java | 2 +- .../FaceMatchingOrchestrator.java | 2 +- .../printer/impl/PrinterServiceImpl.java | 55 ++++++++++++++++++- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppPuzzleController.java b/src/main/java/com/ycwl/basic/controller/mobile/AppPuzzleController.java index c5e98700..2319c95a 100644 --- a/src/main/java/com/ycwl/basic/controller/mobile/AppPuzzleController.java +++ b/src/main/java/com/ycwl/basic/controller/mobile/AppPuzzleController.java @@ -165,7 +165,7 @@ public class AppPuzzleController { face.getScenicId(), record.getFaceId(), resultImageUrl, - recordId + 0L // 打印特有 ); if (memberPrintId == null) { diff --git a/src/main/java/com/ycwl/basic/service/pc/orchestrator/FaceMatchingOrchestrator.java b/src/main/java/com/ycwl/basic/service/pc/orchestrator/FaceMatchingOrchestrator.java index b8903ecb..6c21cacf 100644 --- a/src/main/java/com/ycwl/basic/service/pc/orchestrator/FaceMatchingOrchestrator.java +++ b/src/main/java/com/ycwl/basic/service/pc/orchestrator/FaceMatchingOrchestrator.java @@ -388,7 +388,7 @@ public class FaceMatchingOrchestrator { baseDynamicData.put("faceId", String.valueOf(faceId)); baseDynamicData.put("scenicName", scenicBasic.getName()); baseDynamicData.put("scenicText", scenicBasic.getName()); - baseDynamicData.put("dateStr", DateUtil.format(new Date(), "yyyy-MM-dd")); + baseDynamicData.put("dateStr", DateUtil.format(new Date(), "yyyy.MM.dd")); // 遍历所有模板,逐个生成 int successCount = 0; diff --git a/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java b/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java index 7bc201c8..20294d37 100644 --- a/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java @@ -755,7 +755,7 @@ public class PrinterServiceImpl implements PrinterService { PrinterEntity printer = printerMapper.getById(item.getPrinterId()); // 水印处理逻辑(仅当sourceId不为空时执行) String printUrl = item.getCropUrl(); - if (item.getSourceId() != null) { + if (item.getSourceId() != null && item.getSourceId() > 0) { try { ScenicConfigManager scenicConfig = scenicRepository.getScenicConfigManager(item.getScenicId()); String printWatermarkType = scenicConfig.getString("print_watermark_type"); @@ -863,6 +863,55 @@ public class PrinterServiceImpl implements PrinterService { } catch (Exception e) { log.error("获取景区配置失败,使用原始照片进行打印。景区ID: {}, 照片ID: {}", item.getScenicId(), item.getId(), e); } + } else if (item.getSourceId() != null && item.getSourceId() == 0) { + // 拼图:向上移动40像素以避免打印机偏移 + try { + // 生成唯一的处理标识符,避免多线程环境下的文件冲突 + String processId = item.getId() + "_" + UUID.randomUUID().toString(); + File originalFile = new File("puzzle_" + processId + ".png"); + File shiftedFile = new File("puzzle_" + processId + "_shifted.png"); + + try { + // 下载原图 + HttpUtil.downloadFile(item.getCropUrl(), originalFile); + + // 向上偏移40像素 + ImageUtils.shiftImageUp(originalFile, shiftedFile, 40); + + // 上传处理后的图片 + IStorageAdapter adapter; + ScenicConfigManager scenicConfig = scenicRepository.getScenicConfigManager(item.getScenicId()); + String storeType = scenicConfig.getString("store_type"); + if (storeType != null) { + adapter = StorageFactory.get(storeType); + String storeConfigJson = scenicConfig.getString("store_config_json"); + if (StringUtils.isNotBlank(storeConfigJson)) { + adapter.loadConfig(JacksonUtil.parseObject(storeConfigJson, Map.class)); + } + } else { + adapter = StorageFactory.use("assets-ext"); + } + + String shiftedUrl = adapter.uploadFile(null, shiftedFile, StorageConstant.PHOTO_WATERMARKED_PATH, shiftedFile.getName()); + adapter.setAcl(StorageAcl.PUBLIC_READ, StorageConstant.PHOTO_WATERMARKED_PATH, shiftedFile.getName()); + + printUrl = shiftedUrl; + log.info("拼图照片向上偏移40像素成功,照片ID: {}, 新URL: {}", item.getId(), shiftedUrl); + + } catch (Exception e) { + log.error("拼图照片向上偏移处理失败,使用原始照片进行打印。照片ID: {}", item.getId(), e); + } finally { + // 清理临时文件 + if (originalFile != null && originalFile.exists()) { + originalFile.delete(); + } + if (shiftedFile != null && shiftedFile.exists()) { + shiftedFile.delete(); + } + } + } catch (Exception e) { + log.error("拼图照片处理失败,使用原始照片进行打印。照片ID: {}", item.getId(), e); + } } // 根据数量创建多个打印任务 @@ -1222,11 +1271,11 @@ public class PrinterServiceImpl implements PrinterService { if (existingPhotos != null && !existingPhotos.isEmpty()) { for (MemberPrintResp photo : existingPhotos) { // 检查是否是同一个拼图记录且状态为0(未打印) - if (photo.getSourceId() != null && photo.getSourceId().equals(puzzleRecordId) + if (photo.getOrigUrl() != null && photo.getOrigUrl().equals(resultImageUrl) && photo.getStatus() != null && photo.getStatus() == 0) { log.info("拼图照片已存在于打印列表中,直接返回: memberId={}, scenicId={}, puzzleRecordId={}, memberPrintId={}", memberId, scenicId, puzzleRecordId, photo.getId()); - return photo.getId().intValue(); + return photo.getId(); } } }