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(); } } }