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 LEICA -> new LeicaWatermarkOperator();
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 LEICA -> LeicaWatermarkTemplateBuilder.STYLE;
case PRINTER_DEFAULT -> PrinterDefaultWatermarkTemplateBuilder.STYLE;
case PUZZLE_PRINT -> PuzzlePrintWatermarkTemplateBuilder.STYLE;
};
}

View File

@@ -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;

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.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<PhotoProcessContext> createPuzzlePipeline() {
return new PipelineBuilder<PhotoProcessContext>("PuzzlePipeline")
private Pipeline<PhotoProcessContext> createPuzzlePrintPipeline(WatermarkConfig watermarkConfig) {
return new PipelineBuilder<PhotoProcessContext>("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获取配置