feat(printer): 添加拼图打印功能支持

- 在ImageWatermarkOperatorEnum中新增PUZZLE_PRINT类型
- 在WatermarkEdgeService中添加PuzzlePrint水印模板支持
- 修改ImageWatermarkFactory对PUZZLE_PRINT类型的处理逻辑
- 移除PuzzleBorderStage并创建专用的拼图打印处理管线
- 实现createPuzzlePrintPipeline方法用于拼图水印处理
- 添加preparePuzzleWatermarkConfig方法准备拼图专用水印配置
- 更新打印机服务中的拼图处理流程以使用新的水印配置
This commit is contained in:
2026-01-17 01:55:37 +08:00
parent 6a8f679540
commit aa2611d369
4 changed files with 44 additions and 8 deletions

View File

@@ -20,6 +20,8 @@ public class ImageWatermarkFactory {
case NORMAL -> new NormalWatermarkOperator(); case NORMAL -> new NormalWatermarkOperator();
case LEICA -> new LeicaWatermarkOperator(); case LEICA -> new LeicaWatermarkOperator();
case PRINTER_DEFAULT -> new PrinterDefaultWatermarkOperator(); case PRINTER_DEFAULT -> new PrinterDefaultWatermarkOperator();
case PUZZLE_PRINT -> throw new ImageWatermarkUnsupportedException(
"PUZZLE_PRINT 仅支持边缘端处理,请使用 WatermarkEdgeService");
}; };
} }
} }

View File

@@ -290,6 +290,7 @@ public class WatermarkEdgeService {
case NORMAL -> NormalWatermarkTemplateBuilder.STYLE; case NORMAL -> NormalWatermarkTemplateBuilder.STYLE;
case LEICA -> LeicaWatermarkTemplateBuilder.STYLE; case LEICA -> LeicaWatermarkTemplateBuilder.STYLE;
case PRINTER_DEFAULT -> PrinterDefaultWatermarkTemplateBuilder.STYLE; case PRINTER_DEFAULT -> PrinterDefaultWatermarkTemplateBuilder.STYLE;
case PUZZLE_PRINT -> PuzzlePrintWatermarkTemplateBuilder.STYLE;
}; };
} }

View File

@@ -6,7 +6,8 @@ import lombok.Getter;
public enum ImageWatermarkOperatorEnum { public enum ImageWatermarkOperatorEnum {
LEICA("leica", "jpg"), LEICA("leica", "jpg"),
NORMAL("normal", "jpg"), NORMAL("normal", "jpg"),
PRINTER_DEFAULT("pDefault", "jpg"); PRINTER_DEFAULT("pDefault", "jpg"),
PUZZLE_PRINT("puzzle_print", "jpg");
private final String type; private final String type;
private final String preferFileType; private final String preferFileType;

View File

@@ -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.ImageOrientationStage;
import com.ycwl.basic.image.pipeline.stages.ImageResizeStage; import com.ycwl.basic.image.pipeline.stages.ImageResizeStage;
import com.ycwl.basic.image.pipeline.stages.ImageSRStage; 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.RestoreOrientationStage;
import com.ycwl.basic.image.pipeline.stages.UpdateMemberPrintStage; import com.ycwl.basic.image.pipeline.stages.UpdateMemberPrintStage;
import com.ycwl.basic.image.pipeline.stages.UploadStage; import com.ycwl.basic.image.pipeline.stages.UploadStage;
@@ -896,12 +895,14 @@ public class PrinterServiceImpl implements PrinterService {
} }
/** /**
* 创建拼图处理管线 * 创建拼图打印处理管线(带专用水印)
*
* @param watermarkConfig 水印配置
*/ */
private Pipeline<PhotoProcessContext> createPuzzlePipeline() { private Pipeline<PhotoProcessContext> createPuzzlePrintPipeline(WatermarkConfig watermarkConfig) {
return new PipelineBuilder<PhotoProcessContext>("PuzzlePipeline") return new PipelineBuilder<PhotoProcessContext>("PuzzlePrintPipeline")
.addStage(new DownloadStage()) .addStage(new DownloadStage())
.addStage(new PuzzleBorderStage()) .addStage(new WatermarkStage(watermarkConfig))
.addStage(new UploadStage()) .addStage(new UploadStage())
.addStage(new CleanupStage()) .addStage(new CleanupStage())
.build(); .build();
@@ -1002,9 +1003,10 @@ public class PrinterServiceImpl implements PrinterService {
prepareStorageAdapter(context); prepareStorageAdapter(context);
pipeline = createNormalPhotoPipeline(watermarkConfig); pipeline = createNormalPhotoPipeline(watermarkConfig);
} else { } else {
// 拼图处理流程 // 拼图处理流程(使用专用水印)
WatermarkConfig watermarkConfig = preparePuzzleWatermarkConfig(context, qrCodeFile);
prepareStorageAdapter(context); prepareStorageAdapter(context);
pipeline = createPuzzlePipeline(); pipeline = createPuzzlePrintPipeline(watermarkConfig);
} }
boolean success = pipeline.execute(context); boolean success = pipeline.execute(context);
@@ -1064,6 +1066,36 @@ public class PrinterServiceImpl implements PrinterService {
.build(); .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获取配置 * 从context中的scenicConfigManager获取配置