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 062178df..7a5486a9 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 @@ -622,110 +622,109 @@ public class PrinterServiceImpl implements PrinterService { } userPhotoListByOrderId.forEach(item -> { PrinterEntity printer = printerMapper.getById(item.getPrinterId()); - if (item.getSourceId() == null) { - return; - } - // 水印处理逻辑 + // 水印处理逻辑(仅当sourceId不为空时执行) String printUrl = item.getCropUrl(); - try { - ScenicConfigManager scenicConfig = scenicRepository.getScenicConfigManager(item.getScenicId()); - String printWatermarkType = scenicConfig.getString("print_watermark_type"); + if (item.getSourceId() != null) { + try { + ScenicConfigManager scenicConfig = scenicRepository.getScenicConfigManager(item.getScenicId()); + String printWatermarkType = scenicConfig.getString("print_watermark_type"); - if (StringUtils.isNotBlank(printWatermarkType)) { - ImageWatermarkOperatorEnum watermarkType = ImageWatermarkOperatorEnum.getByCode(printWatermarkType); - if (watermarkType != null) { - // 准备存储适配器 - IStorageAdapter adapter; - 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"); - } - - // 准备水印处理器 - IOperator operator = ImageWatermarkFactory.get(watermarkType); - - // 生成唯一的处理标识符,避免多线程环境下的文件冲突 - String processId = item.getId() + "_" + UUID.randomUUID().toString(); - // 下载原图 - File originalFile = new File("print_" + processId + ".jpg"); - File watermarkedFile = new File("print_" + processId + "_" + watermarkType.getType() + "." + watermarkType.getPreferFileType()); - File rotatedOriginalFile = null; - File rotatedWatermarkedFile = null; - boolean needRotation = false; - - try { - HttpUtil.downloadFile(item.getCropUrl().replace("oss.zhentuai.com", "frametour-assets.oss-cn-shanghai-internal.aliyuncs.com"), originalFile); - - // 判断图片方向并处理旋转 - boolean isLandscape = ImageUtils.isLandscape(originalFile); - log.info("打印照片方向检测,照片ID: {}, 是否为横图: {}", item.getId(), isLandscape); - - if (!isLandscape) { - // 竖图需要旋转为横图 - needRotation = true; - rotatedOriginalFile = new File("print_" + processId + "_rotated.jpg"); - ImageUtils.rotateImage90(originalFile, rotatedOriginalFile); - log.info("竖图已旋转为横图,照片ID: {}", item.getId()); + if (StringUtils.isNotBlank(printWatermarkType)) { + ImageWatermarkOperatorEnum watermarkType = ImageWatermarkOperatorEnum.getByCode(printWatermarkType); + if (watermarkType != null) { + // 准备存储适配器 + IStorageAdapter adapter; + 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"); } - // 处理水印 - WatermarkInfo watermarkInfo = new WatermarkInfo(); - watermarkInfo.setScenicLine(scenicConfig.getString("watermark_scenic_text")); - watermarkInfo.setOriginalFile(needRotation ? rotatedOriginalFile : originalFile); - watermarkInfo.setWatermarkedFile(watermarkedFile); - watermarkInfo.setQrcodeFile(qrCodeFile); - watermarkInfo.setDatetime(new Date()); - watermarkInfo.setDtFormat("yyyy.MM.dd"); + // 准备水印处理器 + IOperator operator = ImageWatermarkFactory.get(watermarkType); - operator.process(watermarkInfo); + // 生成唯一的处理标识符,避免多线程环境下的文件冲突 + String processId = item.getId() + "_" + UUID.randomUUID().toString(); + // 下载原图 + File originalFile = new File("print_" + processId + ".jpg"); + File watermarkedFile = new File("print_" + processId + "_" + watermarkType.getType() + "." + watermarkType.getPreferFileType()); + File rotatedOriginalFile = null; + File rotatedWatermarkedFile = null; + boolean needRotation = false; - // 如果之前旋转了,需要将水印图片旋转回去 - if (needRotation) { - rotatedWatermarkedFile = new File("print_" + processId + "_final_" + watermarkType.getType() + "." + watermarkType.getPreferFileType()); - ImageUtils.rotateImage270(watermarkedFile, rotatedWatermarkedFile); - log.info("水印图片已旋转回竖图,照片ID: {}", item.getId()); - // 删除中间的横图水印文件 - if (watermarkedFile.exists()) { + try { + HttpUtil.downloadFile(item.getCropUrl().replace("oss.zhentuai.com", "frametour-assets.oss-cn-shanghai-internal.aliyuncs.com"), originalFile); + + // 判断图片方向并处理旋转 + boolean isLandscape = ImageUtils.isLandscape(originalFile); + log.info("打印照片方向检测,照片ID: {}, 是否为横图: {}", item.getId(), isLandscape); + + if (!isLandscape) { + // 竖图需要旋转为横图 + needRotation = true; + rotatedOriginalFile = new File("print_" + processId + "_rotated.jpg"); + ImageUtils.rotateImage90(originalFile, rotatedOriginalFile); + log.info("竖图已旋转为横图,照片ID: {}", item.getId()); + } + + // 处理水印 + WatermarkInfo watermarkInfo = new WatermarkInfo(); + watermarkInfo.setScenicLine(scenicConfig.getString("watermark_scenic_text")); + watermarkInfo.setOriginalFile(needRotation ? rotatedOriginalFile : originalFile); + watermarkInfo.setWatermarkedFile(watermarkedFile); + watermarkInfo.setQrcodeFile(qrCodeFile); + watermarkInfo.setDatetime(new Date()); + watermarkInfo.setDtFormat("yyyy.MM.dd"); + + operator.process(watermarkInfo); + + // 如果之前旋转了,需要将水印图片旋转回去 + if (needRotation) { + rotatedWatermarkedFile = new File("print_" + processId + "_final_" + watermarkType.getType() + "." + watermarkType.getPreferFileType()); + ImageUtils.rotateImage270(watermarkedFile, rotatedWatermarkedFile); + log.info("水印图片已旋转回竖图,照片ID: {}", item.getId()); + // 删除中间的横图水印文件 + if (watermarkedFile.exists()) { + watermarkedFile.delete(); + } + // 将最终的竖图水印文件赋值给watermarkedFile + watermarkedFile = rotatedWatermarkedFile; + } + + // 上传水印图片 + String watermarkedUrl = adapter.uploadFile(null, watermarkedFile, StorageConstant.PHOTO_WATERMARKED_PATH, watermarkedFile.getName()); + adapter.setAcl(StorageAcl.PUBLIC_READ, StorageConstant.PHOTO_WATERMARKED_PATH, watermarkedFile.getName()); + + printUrl = watermarkedUrl; + log.info("水印处理成功,打印照片ID: {}, 水印URL: {}", item.getId(), watermarkedUrl); + + } catch (Exception e) { + log.error("水印处理失败,使用原始照片进行打印。照片ID: {}", item.getId(), e); + } finally { + // 清理临时文件 + if (originalFile != null && originalFile.exists()) { + originalFile.delete(); + } + if (rotatedOriginalFile != null && rotatedOriginalFile.exists()) { + rotatedOriginalFile.delete(); + } + if (watermarkedFile != null && watermarkedFile.exists()) { watermarkedFile.delete(); } - // 将最终的竖图水印文件赋值给watermarkedFile - watermarkedFile = rotatedWatermarkedFile; - } - - // 上传水印图片 - String watermarkedUrl = adapter.uploadFile(null, watermarkedFile, StorageConstant.PHOTO_WATERMARKED_PATH, watermarkedFile.getName()); - adapter.setAcl(StorageAcl.PUBLIC_READ, StorageConstant.PHOTO_WATERMARKED_PATH, watermarkedFile.getName()); - - printUrl = watermarkedUrl; - log.info("水印处理成功,打印照片ID: {}, 水印URL: {}", item.getId(), watermarkedUrl); - - } catch (Exception e) { - log.error("水印处理失败,使用原始照片进行打印。照片ID: {}", item.getId(), e); - } finally { - // 清理临时文件 - if (originalFile != null && originalFile.exists()) { - originalFile.delete(); - } - if (rotatedOriginalFile != null && rotatedOriginalFile.exists()) { - rotatedOriginalFile.delete(); - } - if (watermarkedFile != null && watermarkedFile.exists()) { - watermarkedFile.delete(); - } - if (rotatedWatermarkedFile != null && rotatedWatermarkedFile.exists()) { - rotatedWatermarkedFile.delete(); + if (rotatedWatermarkedFile != null && rotatedWatermarkedFile.exists()) { + rotatedWatermarkedFile.delete(); + } } } } + } catch (Exception e) { + log.error("获取景区配置失败,使用原始照片进行打印。景区ID: {}, 照片ID: {}", item.getScenicId(), item.getId(), e); } - } catch (Exception e) { - log.error("获取景区配置失败,使用原始照片进行打印。景区ID: {}, 照片ID: {}", item.getScenicId(), item.getId(), e); } // 根据数量创建多个打印任务 @@ -808,8 +807,13 @@ public class PrinterServiceImpl implements PrinterService { resp.setUrl(faceUrl); resp.setFaceId(faceId); resp.setScenicId(scenicId); - faceService.matchFaceId(faceId); - autoAddPhotosToPreferPrint(faceId); + try { + faceService.matchFaceId(faceId); + autoAddPhotosToPreferPrint(faceId); + } catch (Exception e) { + // 人脸匹配失败不可以阻止正常流程 + log.error("人脸匹配失败", e); + } if (sourceEntity != null) { List userPhotoList = getUserPhotoList(userId, scenicId, faceId); boolean noneMatch = userPhotoList.stream()