From aa2611d369e318b537fd84191f5f65541a2b1374 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Sat, 17 Jan 2026 01:55:37 +0800 Subject: [PATCH] =?UTF-8?q?feat(printer):=20=E6=B7=BB=E5=8A=A0=E6=8B=BC?= =?UTF-8?q?=E5=9B=BE=E6=89=93=E5=8D=B0=E5=8A=9F=E8=83=BD=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在ImageWatermarkOperatorEnum中新增PUZZLE_PRINT类型 - 在WatermarkEdgeService中添加PuzzlePrint水印模板支持 - 修改ImageWatermarkFactory对PUZZLE_PRINT类型的处理逻辑 - 移除PuzzleBorderStage并创建专用的拼图打印处理管线 - 实现createPuzzlePrintPipeline方法用于拼图水印处理 - 添加preparePuzzleWatermarkConfig方法准备拼图专用水印配置 - 更新打印机服务中的拼图处理流程以使用新的水印配置 --- .../watermark/ImageWatermarkFactory.java | 2 + .../watermark/edge/WatermarkEdgeService.java | 1 + .../enums/ImageWatermarkOperatorEnum.java | 3 +- .../printer/impl/PrinterServiceImpl.java | 46 ++++++++++++++++--- 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ycwl/basic/image/watermark/ImageWatermarkFactory.java b/src/main/java/com/ycwl/basic/image/watermark/ImageWatermarkFactory.java index eaab9752..2c546475 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/ImageWatermarkFactory.java +++ b/src/main/java/com/ycwl/basic/image/watermark/ImageWatermarkFactory.java @@ -20,6 +20,8 @@ public class ImageWatermarkFactory { case NORMAL -> new NormalWatermarkOperator(); case LEICA -> new LeicaWatermarkOperator(); case PRINTER_DEFAULT -> new PrinterDefaultWatermarkOperator(); + case PUZZLE_PRINT -> throw new ImageWatermarkUnsupportedException( + "PUZZLE_PRINT 仅支持边缘端处理,请使用 WatermarkEdgeService"); }; } } diff --git a/src/main/java/com/ycwl/basic/image/watermark/edge/WatermarkEdgeService.java b/src/main/java/com/ycwl/basic/image/watermark/edge/WatermarkEdgeService.java index 1ed3781f..648ebc59 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/edge/WatermarkEdgeService.java +++ b/src/main/java/com/ycwl/basic/image/watermark/edge/WatermarkEdgeService.java @@ -290,6 +290,7 @@ public class WatermarkEdgeService { case NORMAL -> NormalWatermarkTemplateBuilder.STYLE; case LEICA -> LeicaWatermarkTemplateBuilder.STYLE; case PRINTER_DEFAULT -> PrinterDefaultWatermarkTemplateBuilder.STYLE; + case PUZZLE_PRINT -> PuzzlePrintWatermarkTemplateBuilder.STYLE; }; } diff --git a/src/main/java/com/ycwl/basic/image/watermark/enums/ImageWatermarkOperatorEnum.java b/src/main/java/com/ycwl/basic/image/watermark/enums/ImageWatermarkOperatorEnum.java index ba611e56..43c3b45d 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/enums/ImageWatermarkOperatorEnum.java +++ b/src/main/java/com/ycwl/basic/image/watermark/enums/ImageWatermarkOperatorEnum.java @@ -6,7 +6,8 @@ import lombok.Getter; public enum ImageWatermarkOperatorEnum { LEICA("leica", "jpg"), NORMAL("normal", "jpg"), - PRINTER_DEFAULT("pDefault", "jpg"); + PRINTER_DEFAULT("pDefault", "jpg"), + PUZZLE_PRINT("puzzle_print", "jpg"); private final String type; private final String preferFileType; 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 63947f05..8ca9b63d 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 @@ -16,7 +16,6 @@ import com.ycwl.basic.image.pipeline.stages.ImageEnhanceStage; import com.ycwl.basic.image.pipeline.stages.ImageOrientationStage; import com.ycwl.basic.image.pipeline.stages.ImageResizeStage; import com.ycwl.basic.image.pipeline.stages.ImageSRStage; -import com.ycwl.basic.image.pipeline.stages.PuzzleBorderStage; import com.ycwl.basic.image.pipeline.stages.RestoreOrientationStage; import com.ycwl.basic.image.pipeline.stages.UpdateMemberPrintStage; import com.ycwl.basic.image.pipeline.stages.UploadStage; @@ -896,12 +895,14 @@ public class PrinterServiceImpl implements PrinterService { } /** - * 创建拼图处理管线 + * 创建拼图打印处理管线(带专用水印) + * + * @param watermarkConfig 水印配置 */ - private Pipeline createPuzzlePipeline() { - return new PipelineBuilder("PuzzlePipeline") + private Pipeline createPuzzlePrintPipeline(WatermarkConfig watermarkConfig) { + return new PipelineBuilder("PuzzlePrintPipeline") .addStage(new DownloadStage()) - .addStage(new PuzzleBorderStage()) + .addStage(new WatermarkStage(watermarkConfig)) .addStage(new UploadStage()) .addStage(new CleanupStage()) .build(); @@ -1002,9 +1003,10 @@ public class PrinterServiceImpl implements PrinterService { prepareStorageAdapter(context); pipeline = createNormalPhotoPipeline(watermarkConfig); } else { - // 拼图处理流程 + // 拼图处理流程(使用专用水印) + WatermarkConfig watermarkConfig = preparePuzzleWatermarkConfig(context, qrCodeFile); prepareStorageAdapter(context); - pipeline = createPuzzlePipeline(); + pipeline = createPuzzlePrintPipeline(watermarkConfig); } boolean success = pipeline.execute(context); @@ -1064,6 +1066,36 @@ public class PrinterServiceImpl implements PrinterService { .build(); } + /** + * 准备拼图打印的水印配置 + * 使用拼图专用水印模板 + * + * @param context 照片处理上下文 + * @param qrCodeFile 二维码文件 + * @return WatermarkConfig + */ + private WatermarkConfig preparePuzzleWatermarkConfig(PhotoProcessContext context, File qrCodeFile) { + ScenicConfigManager scenicConfig = context.getScenicConfigManager(); + + String scenicText = scenicConfig != null + ? scenicConfig.getString("print_watermark_scenic_text", "") + : ""; + String dateFormat = scenicConfig != null + ? scenicConfig.getString("print_watermark_dt_format", "yyyy.MM.dd") + : "yyyy.MM.dd"; + + return WatermarkConfig.builder() + .watermarkType(ImageWatermarkOperatorEnum.PUZZLE_PRINT) + .scenicText(scenicText) + .dateFormat(dateFormat) + .edgeService(watermarkEdgeService) + .storageAdapter(StorageFactory.use()) + .edgeEnabled(true) + .qrcodeFile(qrCodeFile) + .scale(1.0) + .build(); + } + /** * 准备存储适配器 * 从context中的scenicConfigManager获取配置