feat(image): 增强图片处理流程并优化水印逻辑

- 在PhotoProcessContext中新增Stage管理相关方法,支持启用、禁用及批量设置Stage状态
- 新增ImageEnhanceStage并整合到图片处理流水线中
- 重构重打印流程,复用普通照片处理流水线
- 生成订单二维码并用于水印配置
- 移除冗余的水印配置和增强配置代码
- 优化Stage控制逻辑,支持动态启用或禁用特定处理阶段
This commit is contained in:
2025-11-27 18:17:19 +08:00
parent d483c222d0
commit d60d7d9ad8
2 changed files with 86 additions and 19 deletions

View File

@@ -1,7 +1,5 @@
package com.ycwl.basic.image.pipeline.core;
import com.ycwl.basic.image.watermark.entity.WatermarkInfo;
import com.ycwl.basic.image.watermark.enums.ImageWatermarkOperatorEnum;
import com.ycwl.basic.image.pipeline.enums.ImageSource;
import com.ycwl.basic.image.pipeline.enums.ImageType;
import com.ycwl.basic.image.pipeline.enums.PipelineScene;
@@ -198,6 +196,73 @@ public class PhotoProcessContext {
return stageEnabledMap.getOrDefault(stageId, defaultEnabled);
}
/**
* 判断指定Stage是否启用(默认为false)
*
* @param stageId Stage唯一标识
* @return true-启用, false-禁用
*/
public boolean isStageEnabled(String stageId) {
return stageEnabledMap.getOrDefault(stageId, false);
}
/**
* 设置指定Stage的启用状态
*
* @param stageId Stage唯一标识
* @param enabled 是否启用
* @return this(支持链式调用)
*/
public PhotoProcessContext setStageState(String stageId, boolean enabled) {
stageEnabledMap.put(stageId, enabled);
return this;
}
/**
* 启用指定Stage
*
* @param stageId Stage唯一标识
* @return this(支持链式调用)
*/
public PhotoProcessContext enableStage(String stageId) {
stageEnabledMap.put(stageId, true);
return this;
}
/**
* 禁用指定Stage
*
* @param stageId Stage唯一标识
* @return this(支持链式调用)
*/
public PhotoProcessContext disableStage(String stageId) {
stageEnabledMap.put(stageId, false);
return this;
}
/**
* 批量设置Stage启用状态
*
* @param stages Stage配置Map(stageId -> enabled)
* @return this(支持链式调用)
*/
public PhotoProcessContext setStages(Map<String, Boolean> stages) {
if (stages != null) {
stageEnabledMap.putAll(stages);
}
return this;
}
/**
* 清空所有Stage配置
*
* @return this(支持链式调用)
*/
public PhotoProcessContext clearStages() {
stageEnabledMap.clear();
return this;
}
/**
* 设置最终处理结果URL
*/

View File

@@ -751,10 +751,17 @@ public class PrinterServiceImpl implements PrinterService {
* @param watermarkConfig 水印配置
*/
private Pipeline<PhotoProcessContext> createNormalPhotoPipeline(WatermarkConfig watermarkConfig) {
BceEnhancerConfig config = new BceEnhancerConfig();
config.setQps(1);
config.setAppId("119554288");
config.setApiKey("OX6QoijgKio3eVtA0PiUVf7f");
config.setSecretKey("dYatXReVriPeiktTjUblhfubpcmYfuMk");
return new PipelineBuilder<PhotoProcessContext>("NormalPhotoPipeline")
.addStage(new DownloadStage())
.addStage(new ImageOrientationStage())
.addStage(new ConditionalRotateStage())
.addStage(new ImageEnhanceStage(config)) // 通过setStageState方法设置是否启用
.addStage(new WatermarkStage(watermarkConfig))
.addStage(new RestoreOrientationStage())
.addStage(new UploadStage())
@@ -1352,6 +1359,14 @@ public class PrinterServiceImpl implements PrinterService {
MemberPrintResp memberPrint = memberPrints.get(0);
File qrCodeFile = new File("qrCodeFile" + memberPrint.getOrderId() + ".png");
MpConfigEntity scenicMpConfig = scenicRepository.getScenicMpConfig(memberPrint.getScenicId());
try {
WxMpUtil.generateWXAQRCode(scenicMpConfig.getAppId(), scenicMpConfig.getAppSecret(), scenicMpConfig.getState(), "pages/my/orderDetailNew?force=1&id="+memberPrint.getOrderId(), qrCodeFile.getAbsolutePath());
} catch (Exception e) {
throw new RuntimeException(e);
}
// 3. 重新处理照片(带增强选项)
Boolean needEnhance = request.getNeedEnhance();
if (needEnhance == null) {
@@ -1361,6 +1376,7 @@ public class PrinterServiceImpl implements PrinterService {
// 3.1 创建图片处理上下文
PrinterOrderItem orderItem = PrinterOrderItem.fromMemberPrintResp(memberPrint);
PhotoProcessContext context = PhotoProcessContext.fromPrinterOrderItem(orderItem, memberPrint.getScenicId());
context.setStageState("image_enhance", needEnhance); // 通过setStageState方法设置是否启用
// 3.2 设置景区配置和场景
ScenicConfigManager scenicConfig = scenicRepository.getScenicConfigManager(memberPrint.getScenicId());
@@ -1382,26 +1398,12 @@ public class PrinterServiceImpl implements PrinterService {
try {
if (context.getImageType() == ImageType.NORMAL_PHOTO) {
// 准备水印配置(重打印需要二维码,传 null
WatermarkConfig watermarkConfig = prepareWatermarkConfig(context, null);
// 准备水印配置(重打印需要二维码)
WatermarkConfig watermarkConfig = prepareWatermarkConfig(context, qrCodeFile);
prepareStorageAdapter(context);
BceEnhancerConfig config = new BceEnhancerConfig();
config.setQps(1);
config.setAppId("119554288");
config.setApiKey("OX6QoijgKio3eVtA0PiUVf7f");
config.setSecretKey("dYatXReVriPeiktTjUblhfubpcmYfuMk");
// 创建管线,条件性添加增强 Stage
pipeline = new PipelineBuilder<PhotoProcessContext>("ReprintPipeline")
.addStage(new DownloadStage())
.addStage(new ImageOrientationStage())
.addStage(new ConditionalRotateStage())
.addStageIf(needEnhance, new ImageEnhanceStage(config))
.addStage(new WatermarkStage(watermarkConfig))
.addStage(new RestoreOrientationStage())
.addStage(new UploadStage())
.addStage(new CleanupStage())
.build();
pipeline = createNormalPhotoPipeline(watermarkConfig);
} else {
// 拼图
prepareStorageAdapter(context);