From 60b4473279df4560e07cec8e17baf78f44c9e0a1 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Wed, 3 Dec 2025 21:47:43 +0800 Subject: [PATCH] =?UTF-8?q?refactor(pipeline):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E4=BA=BA=E8=84=B8=E5=8C=B9=E9=85=8D=E7=AE=A1=E7=BA=BF=E4=B8=BA?= =?UTF-8?q?=E6=A0=B8=E5=BF=83=E7=AE=A1=E7=BA=BF=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除专用人脸匹配管线实现,统一使用通用管线模块 - 更新所有Stage类继承自通用管线Stage基类 - 调整包路径引用从face.pipeline到pipeline.core - 修改上下文类实现通用管线上下文接口 - 删除冗余的人脸匹配专用注解和枚举类 - 更新工厂类引用至新的通用管线构建器 - 保持Stage功能逻辑不变仅调整继承结构 --- .../extern/AioDeviceController.java | 4 +- .../core/AbstractFaceMatchingStage.java | 97 -------------- .../pipeline/core/FaceMatchingContext.java | 5 +- .../basic/face/pipeline/core/Pipeline.java | 119 ------------------ .../face/pipeline/core/PipelineBuilder.java | 80 ------------ .../face/pipeline/core/PipelineStage.java | 50 -------- .../basic/face/pipeline/core/StageResult.java | 101 --------------- .../pipeline/enums/StageOptionalMode.java | 29 ----- .../factory/FaceMatchingPipelineFactory.java | 4 +- .../stages/BuildSourceRelationStage.java | 10 +- .../face/pipeline/stages/CreateTaskStage.java | 10 +- .../stages/CustomFaceSearchStage.java | 10 +- .../stages/DeleteOldRelationsStage.java | 10 +- .../pipeline/stages/FaceRecognitionStage.java | 10 +- .../pipeline/stages/FaceRecoveryStage.java | 10 +- .../stages/FilterByDevicePhotoLimitStage.java | 10 +- .../stages/FilterByTimeRangeStage.java | 10 +- .../pipeline/stages/GeneratePuzzleStage.java | 10 +- .../stages/HandleVideoRecreationStage.java | 10 +- .../pipeline/stages/LoadFaceSamplesStage.java | 10 +- .../stages/LoadMatchedSamplesStage.java | 10 +- .../stages/PersistRelationsStage.java | 10 +- .../pipeline/stages/PrepareContextStage.java | 10 +- .../stages/ProcessBuyStatusStage.java | 10 +- .../stages/ProcessFreeSourceStage.java | 10 +- .../stages/RecordCustomMatchMetricsStage.java | 10 +- .../pipeline/stages/RecordMetricsStage.java | 10 +- .../pipeline/stages/SetTaskStatusStage.java | 10 +- .../stages/UpdateFaceResultStage.java | 10 +- .../pipeline/annotation/StageConfig.java | 45 ------- .../pipeline/core/PhotoProcessContext.java | 6 +- .../image/pipeline/core/PipelineStage.java | 50 -------- .../pipeline/enums/StageOptionalMode.java | 35 ------ .../pipeline/exception/PipelineException.java | 15 --- .../image/pipeline/stages/CleanupStage.java | 8 +- .../stages/ConditionalRotateStage.java | 8 +- .../image/pipeline/stages/DownloadStage.java | 8 +- .../pipeline/stages/ImageEnhanceStage.java | 8 +- .../stages/ImageOrientationStage.java | 12 +- .../stages/ImageQualityCheckStage.java | 8 +- .../image/pipeline/stages/ImageSRStage.java | 8 +- .../image/pipeline/stages/NoOpStage.java | 4 +- .../pipeline/stages/PuzzleBorderStage.java | 8 +- .../stages/RestoreOrientationStage.java | 8 +- .../stages/SourcePhotoUpdateStage.java | 8 +- .../image/pipeline/stages/UploadStage.java | 8 +- .../image/pipeline/stages/WatermarkStage.java | 12 +- .../pipeline/annotation/StageConfig.java | 18 +-- .../pipeline/core/AbstractPipelineStage.java | 42 +------ .../{image => }/pipeline/core/Pipeline.java | 45 ++++--- .../pipeline/core/PipelineBuilder.java | 27 +--- .../basic/pipeline/core/PipelineContext.java | 50 ++++++++ .../basic/pipeline/core/PipelineStage.java | 38 ++++++ .../pipeline/core/StageResult.java | 38 +++--- .../pipeline/enums/StageOptionalMode.java | 22 ++++ .../pipeline/exception/PipelineException.java | 4 +- .../printer/impl/PrinterServiceImpl.java | 4 +- 57 files changed, 338 insertions(+), 898 deletions(-) delete mode 100644 src/main/java/com/ycwl/basic/face/pipeline/core/AbstractFaceMatchingStage.java delete mode 100644 src/main/java/com/ycwl/basic/face/pipeline/core/Pipeline.java delete mode 100644 src/main/java/com/ycwl/basic/face/pipeline/core/PipelineBuilder.java delete mode 100644 src/main/java/com/ycwl/basic/face/pipeline/core/PipelineStage.java delete mode 100644 src/main/java/com/ycwl/basic/face/pipeline/core/StageResult.java delete mode 100644 src/main/java/com/ycwl/basic/face/pipeline/enums/StageOptionalMode.java delete mode 100644 src/main/java/com/ycwl/basic/image/pipeline/annotation/StageConfig.java delete mode 100644 src/main/java/com/ycwl/basic/image/pipeline/core/PipelineStage.java delete mode 100644 src/main/java/com/ycwl/basic/image/pipeline/enums/StageOptionalMode.java delete mode 100644 src/main/java/com/ycwl/basic/image/pipeline/exception/PipelineException.java rename src/main/java/com/ycwl/basic/{face => }/pipeline/annotation/StageConfig.java (52%) rename src/main/java/com/ycwl/basic/{image => }/pipeline/core/AbstractPipelineStage.java (59%) rename src/main/java/com/ycwl/basic/{image => }/pipeline/core/Pipeline.java (72%) rename src/main/java/com/ycwl/basic/{image => }/pipeline/core/PipelineBuilder.java (71%) create mode 100644 src/main/java/com/ycwl/basic/pipeline/core/PipelineContext.java create mode 100644 src/main/java/com/ycwl/basic/pipeline/core/PipelineStage.java rename src/main/java/com/ycwl/basic/{image => }/pipeline/core/StageResult.java (60%) create mode 100644 src/main/java/com/ycwl/basic/pipeline/enums/StageOptionalMode.java rename src/main/java/com/ycwl/basic/{face => }/pipeline/exception/PipelineException.java (80%) diff --git a/src/main/java/com/ycwl/basic/controller/extern/AioDeviceController.java b/src/main/java/com/ycwl/basic/controller/extern/AioDeviceController.java index 5104412f..569d8cd0 100644 --- a/src/main/java/com/ycwl/basic/controller/extern/AioDeviceController.java +++ b/src/main/java/com/ycwl/basic/controller/extern/AioDeviceController.java @@ -4,14 +4,14 @@ import cn.hutool.http.HttpUtil; import com.ycwl.basic.annotation.IgnoreToken; import com.ycwl.basic.image.enhancer.adapter.BceImageEnhancer; import com.ycwl.basic.image.enhancer.entity.BceEnhancerConfig; -import com.ycwl.basic.image.pipeline.core.Pipeline; -import com.ycwl.basic.image.pipeline.core.PipelineBuilder; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; import com.ycwl.basic.image.pipeline.stages.DownloadStage; import com.ycwl.basic.image.pipeline.stages.ImageEnhanceStage; import com.ycwl.basic.image.pipeline.stages.ImageSRStage; import com.ycwl.basic.image.pipeline.stages.SourcePhotoUpdateStage; import com.ycwl.basic.image.pipeline.stages.CleanupStage; +import com.ycwl.basic.pipeline.core.Pipeline; +import com.ycwl.basic.pipeline.core.PipelineBuilder; import com.ycwl.basic.mapper.AioDeviceMapper; import com.ycwl.basic.mapper.MemberMapper; import com.ycwl.basic.model.aio.entity.AioDeviceBannerEntity; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/core/AbstractFaceMatchingStage.java b/src/main/java/com/ycwl/basic/face/pipeline/core/AbstractFaceMatchingStage.java deleted file mode 100644 index 71df3420..00000000 --- a/src/main/java/com/ycwl/basic/face/pipeline/core/AbstractFaceMatchingStage.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.ycwl.basic.face.pipeline.core; - -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; -import lombok.extern.slf4j.Slf4j; - -/** - * 人脸匹配Pipeline Stage抽象基类 - * 提供默认实现和通用逻辑 - * - * @param Context类型,必须继承FaceMatchingContext - */ -@Slf4j -public abstract class AbstractFaceMatchingStage implements PipelineStage { - - /** - * 最终的shouldExecute判断 - * 整合了外部配置控制和业务逻辑判断 - */ - @Override - public final boolean shouldExecute(C context) { - // 1. 检查Stage配置注解 - StageConfig config = getStageConfig(); - if (config != null) { - String stageId = config.stageId(); - StageOptionalMode mode = config.optionalMode(); - - // FORCE_ON:强制执行,不检查外部配置 - if (mode == StageOptionalMode.FORCE_ON) { - return shouldExecuteByBusinessLogic(context); - } - - // SUPPORT:检查外部配置 - if (mode == StageOptionalMode.SUPPORT) { - boolean externalEnabled = context.isStageEnabled(stageId, config.defaultEnabled()); - if (!externalEnabled) { - log.debug("[{}] Stage被外部配置禁用", stageId); - return false; - } - } - - // UNSUPPORT:不检查外部配置,直接走业务逻辑 - } - - // 2. 执行业务逻辑判断 - return shouldExecuteByBusinessLogic(context); - } - - /** - * 子类实现业务逻辑判断 - * 默认总是执行 - * - * 子类可以覆盖此方法实现条件性执行 - * 例如: 只有新用户才设置任务状态, 只有匹配到样本才处理源文件关联等 - */ - protected boolean shouldExecuteByBusinessLogic(C context) { - return true; - } - - /** - * 模板方法:执行Stage前的准备工作 - */ - protected void beforeExecute(C context) { - log.debug("[{}] 开始执行", getName()); - } - - /** - * 模板方法:执行Stage后的清理工作 - */ - protected void afterExecute(C context, StageResult result) { - if (result.isSuccess()) { - log.debug("[{}] 执行成功: {}", getName(), result.getMessage()); - } else if (result.isSkipped()) { - log.debug("[{}] 已跳过: {}", getName(), result.getMessage()); - } else if (result.isDegraded()) { - log.warn("[{}] 降级执行: {}", getName(), result.getMessage()); - } else { - log.error("[{}] 执行失败: {}", getName(), result.getMessage(), result.getException()); - } - } - - /** - * 子类实现具体的处理逻辑 - */ - protected abstract StageResult doExecute(C context); - - /** - * 最终执行方法(带钩子) - */ - @Override - public final StageResult execute(C context) { - beforeExecute(context); - StageResult result = doExecute(context); - afterExecute(context, result); - return result; - } -} diff --git a/src/main/java/com/ycwl/basic/face/pipeline/core/FaceMatchingContext.java b/src/main/java/com/ycwl/basic/face/pipeline/core/FaceMatchingContext.java index 85f372b5..dfb190f9 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/core/FaceMatchingContext.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/core/FaceMatchingContext.java @@ -7,6 +7,7 @@ import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; import com.ycwl.basic.model.task.resp.SearchFaceRespVo; +import com.ycwl.basic.pipeline.core.PipelineContext; import lombok.Getter; import lombok.Setter; @@ -20,7 +21,7 @@ import java.util.Map; */ @Getter @Setter -public class FaceMatchingContext { +public class FaceMatchingContext implements PipelineContext { // ==================== 核心字段(构造时必填)==================== @@ -170,6 +171,7 @@ public class FaceMatchingContext { * @param defaultEnabled 默认值(当配置未指定时使用) * @return true-启用, false-禁用 */ + @Override public boolean isStageEnabled(String stageId, boolean defaultEnabled) { return stageEnabledMap.getOrDefault(stageId, defaultEnabled); } @@ -180,6 +182,7 @@ public class FaceMatchingContext { * @param stageId Stage唯一标识 * @return true-启用, false-禁用 */ + @Override public boolean isStageEnabled(String stageId) { return stageEnabledMap.getOrDefault(stageId, false); } diff --git a/src/main/java/com/ycwl/basic/face/pipeline/core/Pipeline.java b/src/main/java/com/ycwl/basic/face/pipeline/core/Pipeline.java deleted file mode 100644 index 7e45bfb5..00000000 --- a/src/main/java/com/ycwl/basic/face/pipeline/core/Pipeline.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.ycwl.basic.face.pipeline.core; - -import com.ycwl.basic.face.pipeline.exception.PipelineException; -import lombok.extern.slf4j.Slf4j; - -import java.util.ArrayList; -import java.util.List; - -/** - * 人脸匹配管线 - * 按顺序执行一系列Stage - * - * @param Context类型,必须继承FaceMatchingContext - */ -@Slf4j -public class Pipeline { - - private final List> stages; - private final String name; - - public Pipeline(String name, List> stages) { - this.name = name; - this.stages = new ArrayList<>(stages); - } - - /** - * 执行管线 - * - * @param context 管线上下文 - * @return 执行成功返回true - * @throws PipelineException 管线执行异常 - */ - public boolean execute(C context) { - log.info("[{}] 开始执行人脸匹配管线, Stage数量: {}", name, stages.size()); - long startTime = System.currentTimeMillis(); - int maxStages = 100; // 防止无限循环 - int executedCount = 0; - - try { - for (int i = 0; i < stages.size(); i++) { - if (executedCount >= maxStages) { - log.error("[{}] Stage执行数量超过最大限制({}),可能存在循环依赖", name, maxStages); - throw new PipelineException("Stage执行数量超过最大限制,可能存在循环依赖"); - } - - PipelineStage stage = stages.get(i); - String stageName = stage.getName(); - - log.debug("[{}] [{}/{}] 准备执行Stage: {}", name, i + 1, stages.size(), stageName); - - if (!stage.shouldExecute(context)) { - log.debug("[{}] Stage {} 条件不满足,跳过执行", name, stageName); - continue; - } - - long stageStartTime = System.currentTimeMillis(); - StageResult result = stage.execute(context); - long stageDuration = System.currentTimeMillis() - stageStartTime; - executedCount++; - - logStageResult(stageName, result, stageDuration); - - // 动态添加后续Stage - if (result.getNextStages() != null && !result.getNextStages().isEmpty()) { - List> nextStages = result.getNextStages(); - log.info("[{}] Stage {} 动态添加了 {} 个后续Stage", name, stageName, nextStages.size()); - - for (int j = 0; j < nextStages.size(); j++) { - PipelineStage nextStage = nextStages.get(j); - stages.add(i + 1 + j, nextStage); - log.debug("[{}] - 插入Stage: {} 到位置 {}", name, nextStage.getName(), i + 1 + j); - } - } - - if (result.isFailed()) { - log.error("[{}] Stage {} 执行失败,管线终止", name, stageName); - return false; - } - } - - long totalDuration = System.currentTimeMillis() - startTime; - log.info("[{}] 人脸匹配管线执行完成, 总Stage数: {}, 实际执行: {}, 耗时: {}ms", - name, stages.size(), executedCount, totalDuration); - return true; - - } catch (Exception e) { - log.error("[{}] 人脸匹配管线执行异常", name, e); - throw new PipelineException("管线执行失败: " + e.getMessage(), e); - } - } - - private void logStageResult(String stageName, StageResult result, long duration) { - String statusIcon = switch (result.getStatus()) { - case SUCCESS -> "✓"; - case SKIPPED -> "○"; - case DEGRADED -> "△"; - case FAILED -> "✗"; - }; - - log.info("[{}] {} Stage {} - {} (耗时: {}ms)", - name, statusIcon, stageName, result.getStatus(), duration); - - if (result.getMessage() != null) { - log.debug("[{}] 详情: {}", name, result.getMessage()); - } - } - - public String getName() { - return name; - } - - public int getStageCount() { - return stages.size(); - } - - public List getStageNames() { - return stages.stream().map(PipelineStage::getName).toList(); - } -} diff --git a/src/main/java/com/ycwl/basic/face/pipeline/core/PipelineBuilder.java b/src/main/java/com/ycwl/basic/face/pipeline/core/PipelineBuilder.java deleted file mode 100644 index 8fd86a98..00000000 --- a/src/main/java/com/ycwl/basic/face/pipeline/core/PipelineBuilder.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.ycwl.basic.face.pipeline.core; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -/** - * Pipeline构建器 - * 使用Builder模式动态组装人脸匹配管线 - * - * @param Context类型,必须继承FaceMatchingContext - */ -public class PipelineBuilder { - - private String name = "DefaultFaceMatchingPipeline"; - private final List> stages = new ArrayList<>(); - - public PipelineBuilder() { - } - - public PipelineBuilder(String name) { - this.name = name; - } - - /** - * 设置管线名称 - */ - public PipelineBuilder name(String name) { - this.name = name; - return this; - } - - /** - * 添加Stage - */ - public PipelineBuilder addStage(PipelineStage stage) { - if (stage != null) { - this.stages.add(stage); - } - return this; - } - - /** - * 批量添加Stage - */ - public PipelineBuilder addStages(List> stages) { - if (stages != null) { - this.stages.addAll(stages); - } - return this; - } - - /** - * 条件性添加Stage - */ - public PipelineBuilder addStageIf(boolean condition, PipelineStage stage) { - if (condition && stage != null) { - this.stages.add(stage); - } - return this; - } - - /** - * 按优先级排序Stage - */ - public PipelineBuilder sortByPriority() { - this.stages.sort(Comparator.comparingInt(PipelineStage::getPriority)); - return this; - } - - /** - * 构建Pipeline - */ - public Pipeline build() { - if (stages.isEmpty()) { - throw new IllegalStateException("人脸匹配管线至少需要一个Stage"); - } - return new Pipeline<>(name, stages); - } -} diff --git a/src/main/java/com/ycwl/basic/face/pipeline/core/PipelineStage.java b/src/main/java/com/ycwl/basic/face/pipeline/core/PipelineStage.java deleted file mode 100644 index d10d2e0a..00000000 --- a/src/main/java/com/ycwl/basic/face/pipeline/core/PipelineStage.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.ycwl.basic.face.pipeline.core; - -import com.ycwl.basic.face.pipeline.annotation.StageConfig; - -/** - * 管线处理阶段接口 - * 每个Stage负责一个独立的人脸匹配处理步骤 - * - * @param Context类型,必须继承FaceMatchingContext - */ -public interface PipelineStage { - - /** - * 获取Stage名称(用于日志和监控) - */ - String getName(); - - /** - * 判断是否需要执行此Stage - * 支持条件性执行(如:只有新用户才设置任务状态) - * - * @param context 管线上下文 - * @return true-执行, false-跳过 - */ - boolean shouldExecute(C context); - - /** - * 执行Stage处理逻辑 - * - * @param context 管线上下文 - * @return 执行结果 - */ - StageResult execute(C context); - - /** - * 获取Stage的执行优先级(用于排序) - * 数值越小优先级越高,默认为100 - */ - default int getPriority() { - return 100; - } - - /** - * 获取Stage配置注解(用于反射读取可选性控制信息) - * @return Stage配置注解,如果未标注则返回null - */ - default StageConfig getStageConfig() { - return this.getClass().getAnnotation(StageConfig.class); - } -} diff --git a/src/main/java/com/ycwl/basic/face/pipeline/core/StageResult.java b/src/main/java/com/ycwl/basic/face/pipeline/core/StageResult.java deleted file mode 100644 index 7d42d0fb..00000000 --- a/src/main/java/com/ycwl/basic/face/pipeline/core/StageResult.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.ycwl.basic.face.pipeline.core; - -import lombok.Getter; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -/** - * Stage执行结果 - * - * @param Context类型,必须继承FaceMatchingContext - */ -@Getter -public class StageResult { - - public enum Status { - SUCCESS, // 执行成功 - SKIPPED, // 跳过执行 - FAILED, // 执行失败 - DEGRADED // 降级执行 - } - - private final Status status; - private final String message; - private final Throwable exception; - private final List> nextStages; - - private StageResult(Status status, String message, Throwable exception, List> nextStages) { - this.status = status; - this.message = message; - this.exception = exception; - this.nextStages = nextStages != null - ? Collections.unmodifiableList(new ArrayList<>(nextStages)) - : Collections.emptyList(); - } - - public static StageResult success() { - return new StageResult<>(Status.SUCCESS, null, null, null); - } - - public static StageResult success(String message) { - return new StageResult<>(Status.SUCCESS, message, null, null); - } - - /** - * 成功执行并动态添加后续Stage - */ - @SafeVarargs - public static StageResult successWithNext(String message, PipelineStage... stages) { - return new StageResult<>(Status.SUCCESS, message, null, Arrays.asList(stages)); - } - - /** - * 成功执行并动态添加后续Stage列表 - */ - public static StageResult successWithNext(String message, List> stages) { - return new StageResult<>(Status.SUCCESS, message, null, stages); - } - - public static StageResult skipped() { - return new StageResult<>(Status.SKIPPED, "条件不满足,跳过执行", null, null); - } - - public static StageResult skipped(String reason) { - return new StageResult<>(Status.SKIPPED, reason, null, null); - } - - public static StageResult failed(String message) { - return new StageResult<>(Status.FAILED, message, null, null); - } - - public static StageResult failed(String message, Throwable exception) { - return new StageResult<>(Status.FAILED, message, exception, null); - } - - public static StageResult degraded(String message) { - return new StageResult<>(Status.DEGRADED, message, null, null); - } - - public boolean isSuccess() { - return status == Status.SUCCESS; - } - - public boolean isSkipped() { - return status == Status.SKIPPED; - } - - public boolean isFailed() { - return status == Status.FAILED; - } - - public boolean isDegraded() { - return status == Status.DEGRADED; - } - - public boolean canContinue() { - return status == Status.SUCCESS || status == Status.SKIPPED || status == Status.DEGRADED; - } -} diff --git a/src/main/java/com/ycwl/basic/face/pipeline/enums/StageOptionalMode.java b/src/main/java/com/ycwl/basic/face/pipeline/enums/StageOptionalMode.java deleted file mode 100644 index 8f264e02..00000000 --- a/src/main/java/com/ycwl/basic/face/pipeline/enums/StageOptionalMode.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.ycwl.basic.face.pipeline.enums; - -/** - * Stage可选模式枚举 - * 控制Stage是否支持外部配置 - */ -public enum StageOptionalMode { - - /** - * 强制执行 - * 不检查外部配置,总是执行(除非业务逻辑判断跳过) - * 例如: PrepareContextStage、FaceRecognitionStage - */ - FORCE_ON, - - /** - * 支持外部控制 - * 检查外部配置来决定是否执行 - * 例如: RecordMetricsStage、FaceRecoveryStage - */ - SUPPORT, - - /** - * 不支持外部控制 - * 完全由业务逻辑控制是否执行,不检查外部配置 - * 例如: SourceRelationStage(需要sampleListIds不为空) - */ - UNSUPPORT -} diff --git a/src/main/java/com/ycwl/basic/face/pipeline/factory/FaceMatchingPipelineFactory.java b/src/main/java/com/ycwl/basic/face/pipeline/factory/FaceMatchingPipelineFactory.java index 91b0a186..b1af037d 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/factory/FaceMatchingPipelineFactory.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/factory/FaceMatchingPipelineFactory.java @@ -1,8 +1,8 @@ package com.ycwl.basic.face.pipeline.factory; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.Pipeline; -import com.ycwl.basic.face.pipeline.core.PipelineBuilder; +import com.ycwl.basic.pipeline.core.Pipeline; +import com.ycwl.basic.pipeline.core.PipelineBuilder; import com.ycwl.basic.face.pipeline.enums.FaceMatchingScene; import com.ycwl.basic.face.pipeline.stages.*; import com.ycwl.basic.service.pc.helper.ScenicConfigFacade; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/BuildSourceRelationStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/BuildSourceRelationStage.java index 013c469e..3f0966fe 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/BuildSourceRelationStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/BuildSourceRelationStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; import com.ycwl.basic.service.pc.processor.SourceRelationProcessor; import lombok.extern.slf4j.Slf4j; @@ -32,7 +32,7 @@ import java.util.List; optionalMode = StageOptionalMode.UNSUPPORT, description = "构建源文件关联关系" ) -public class BuildSourceRelationStage extends AbstractFaceMatchingStage { +public class BuildSourceRelationStage extends AbstractPipelineStage { @Autowired private SourceRelationProcessor sourceRelationProcessor; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/CreateTaskStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/CreateTaskStage.java index 5f0aed0d..e15385d6 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/CreateTaskStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/CreateTaskStage.java @@ -1,11 +1,11 @@ package com.ycwl.basic.face.pipeline.stages; import com.ycwl.basic.biz.TaskStatusBiz; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.service.pc.helper.ScenicConfigFacade; import com.ycwl.basic.service.task.TaskService; import lombok.extern.slf4j.Slf4j; @@ -28,7 +28,7 @@ import org.springframework.stereotype.Component; optionalMode = StageOptionalMode.UNSUPPORT, description = "根据配置创建视频任务" ) -public class CreateTaskStage extends AbstractFaceMatchingStage { +public class CreateTaskStage extends AbstractPipelineStage { @Autowired private ScenicConfigFacade scenicConfigFacade; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/CustomFaceSearchStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/CustomFaceSearchStage.java index 1b4504d6..0bb33551 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/CustomFaceSearchStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/CustomFaceSearchStage.java @@ -1,11 +1,11 @@ package com.ycwl.basic.face.pipeline.stages; import com.ycwl.basic.exception.BaseException; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; import com.ycwl.basic.model.task.resp.SearchFaceRespVo; import com.ycwl.basic.service.pc.helper.SearchResultMerger; @@ -34,7 +34,7 @@ import java.util.List; optionalMode = StageOptionalMode.FORCE_ON, description = "根据配置执行自定义人脸搜索" ) -public class CustomFaceSearchStage extends AbstractFaceMatchingStage { +public class CustomFaceSearchStage extends AbstractPipelineStage { @Autowired private TaskFaceService taskFaceService; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/DeleteOldRelationsStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/DeleteOldRelationsStage.java index 9690e1f7..11b12c66 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/DeleteOldRelationsStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/DeleteOldRelationsStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.mapper.SourceMapper; import com.ycwl.basic.mapper.VideoMapper; import com.ycwl.basic.repository.MemberRelationRepository; @@ -28,7 +28,7 @@ import org.springframework.stereotype.Component; optionalMode = StageOptionalMode.FORCE_ON, description = "删除人脸旧关系数据" ) -public class DeleteOldRelationsStage extends AbstractFaceMatchingStage { +public class DeleteOldRelationsStage extends AbstractPipelineStage { @Autowired private SourceMapper sourceMapper; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/FaceRecognitionStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/FaceRecognitionStage.java index a874a3e0..16e6e0ac 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/FaceRecognitionStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/FaceRecognitionStage.java @@ -1,11 +1,11 @@ package com.ycwl.basic.face.pipeline.stages; import com.ycwl.basic.exception.BaseException; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.model.task.resp.SearchFaceRespVo; import com.ycwl.basic.service.task.TaskFaceService; import lombok.extern.slf4j.Slf4j; @@ -28,7 +28,7 @@ import org.springframework.stereotype.Component; optionalMode = StageOptionalMode.FORCE_ON, description = "执行人脸识别搜索" ) -public class FaceRecognitionStage extends AbstractFaceMatchingStage { +public class FaceRecognitionStage extends AbstractPipelineStage { @Autowired private TaskFaceService taskFaceService; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/FaceRecoveryStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/FaceRecoveryStage.java index 7d4ab2da..15f5cf3a 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/FaceRecoveryStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/FaceRecoveryStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.model.task.resp.SearchFaceRespVo; import com.ycwl.basic.service.pc.processor.FaceRecoveryStrategy; import lombok.extern.slf4j.Slf4j; @@ -29,7 +29,7 @@ import org.springframework.stereotype.Component; description = "执行人脸识别补救逻辑", defaultEnabled = true ) -public class FaceRecoveryStage extends AbstractFaceMatchingStage { +public class FaceRecoveryStage extends AbstractPipelineStage { @Autowired private FaceRecoveryStrategy faceRecoveryStrategy; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/FilterByDevicePhotoLimitStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/FilterByDevicePhotoLimitStage.java index 78636ac6..19c9753a 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/FilterByDevicePhotoLimitStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/FilterByDevicePhotoLimitStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.integration.common.manager.DeviceConfigManager; import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; import com.ycwl.basic.repository.DeviceRepository; @@ -40,7 +40,7 @@ import java.util.stream.Collectors; description = "按设备照片数量限制筛选样本", defaultEnabled = true ) -public class FilterByDevicePhotoLimitStage extends AbstractFaceMatchingStage { +public class FilterByDevicePhotoLimitStage extends AbstractPipelineStage { @Autowired private DeviceRepository deviceRepository; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/FilterByTimeRangeStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/FilterByTimeRangeStage.java index 9e32ebff..b2d5b65e 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/FilterByTimeRangeStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/FilterByTimeRangeStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -37,7 +37,7 @@ import java.util.stream.Collectors; description = "按游览时间范围筛选样本", defaultEnabled = true ) -public class FilterByTimeRangeStage extends AbstractFaceMatchingStage { +public class FilterByTimeRangeStage extends AbstractPipelineStage { @Override public String getName() { diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/GeneratePuzzleStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/GeneratePuzzleStage.java index eb48d0fa..02f94380 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/GeneratePuzzleStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/GeneratePuzzleStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.face.pipeline.helper.PuzzleGenerationOrchestrator; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -32,7 +32,7 @@ import org.springframework.stereotype.Component; description = "异步生成拼图模板", defaultEnabled = true ) -public class GeneratePuzzleStage extends AbstractFaceMatchingStage { +public class GeneratePuzzleStage extends AbstractPipelineStage { @Autowired private PuzzleGenerationOrchestrator puzzleOrchestrator; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/HandleVideoRecreationStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/HandleVideoRecreationStage.java index 416c92a2..0e58bb60 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/HandleVideoRecreationStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/HandleVideoRecreationStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; import com.ycwl.basic.service.pc.processor.VideoRecreationHandler; import lombok.extern.slf4j.Slf4j; @@ -32,7 +32,7 @@ import java.util.List; description = "处理视频重切逻辑", defaultEnabled = true ) -public class HandleVideoRecreationStage extends AbstractFaceMatchingStage { +public class HandleVideoRecreationStage extends AbstractPipelineStage { @Autowired private VideoRecreationHandler videoRecreationHandler; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/LoadFaceSamplesStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/LoadFaceSamplesStage.java index dc363fd3..5f29865a 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/LoadFaceSamplesStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/LoadFaceSamplesStage.java @@ -1,11 +1,11 @@ package com.ycwl.basic.face.pipeline.stages; import com.ycwl.basic.exception.BaseException; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.mapper.FaceSampleMapper; import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; import lombok.extern.slf4j.Slf4j; @@ -30,7 +30,7 @@ import java.util.List; optionalMode = StageOptionalMode.FORCE_ON, description = "加载用户选择的人脸样本" ) -public class LoadFaceSamplesStage extends AbstractFaceMatchingStage { +public class LoadFaceSamplesStage extends AbstractPipelineStage { @Autowired private FaceSampleMapper faceSampleMapper; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/LoadMatchedSamplesStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/LoadMatchedSamplesStage.java index bfb9381e..a56a60e8 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/LoadMatchedSamplesStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/LoadMatchedSamplesStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.mapper.FaceSampleMapper; import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; import lombok.extern.slf4j.Slf4j; @@ -38,7 +38,7 @@ import java.util.List; optionalMode = StageOptionalMode.UNSUPPORT, description = "加载匹配样本实体到缓存" ) -public class LoadMatchedSamplesStage extends AbstractFaceMatchingStage { +public class LoadMatchedSamplesStage extends AbstractPipelineStage { @Autowired private FaceSampleMapper faceSampleMapper; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/PersistRelationsStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/PersistRelationsStage.java index 937f78a3..83823e82 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/PersistRelationsStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/PersistRelationsStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.mapper.SourceMapper; import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; import com.ycwl.basic.repository.MemberRelationRepository; @@ -31,7 +31,7 @@ import java.util.List; optionalMode = StageOptionalMode.FORCE_ON, description = "持久化源文件关联关系" ) -public class PersistRelationsStage extends AbstractFaceMatchingStage { +public class PersistRelationsStage extends AbstractPipelineStage { @Autowired private SourceMapper sourceMapper; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/PrepareContextStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/PrepareContextStage.java index 75b96fa4..11022f48 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/PrepareContextStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/PrepareContextStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; import com.ycwl.basic.integration.common.manager.ScenicConfigManager; import com.ycwl.basic.model.pc.face.entity.FaceEntity; @@ -32,7 +32,7 @@ import org.springframework.stereotype.Component; optionalMode = StageOptionalMode.FORCE_ON, description = "准备人脸匹配上下文数据" ) -public class PrepareContextStage extends AbstractFaceMatchingStage { +public class PrepareContextStage extends AbstractPipelineStage { @Autowired private FaceRepository faceRepository; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/ProcessBuyStatusStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/ProcessBuyStatusStage.java index 357f51b9..a8c57e57 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/ProcessBuyStatusStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/ProcessBuyStatusStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; import com.ycwl.basic.service.pc.processor.BuyStatusProcessor; import lombok.extern.slf4j.Slf4j; @@ -33,7 +33,7 @@ import java.util.List; description = "处理源文件购买状态", defaultEnabled = true ) -public class ProcessBuyStatusStage extends AbstractFaceMatchingStage { +public class ProcessBuyStatusStage extends AbstractPipelineStage { @Autowired private BuyStatusProcessor buyStatusProcessor; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/ProcessFreeSourceStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/ProcessFreeSourceStage.java index d4c93700..63c10147 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/ProcessFreeSourceStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/ProcessFreeSourceStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; import com.ycwl.basic.service.pc.processor.SourceRelationProcessor; import lombok.extern.slf4j.Slf4j; @@ -33,7 +33,7 @@ import java.util.List; description = "处理免费源文件逻辑", defaultEnabled = true ) -public class ProcessFreeSourceStage extends AbstractFaceMatchingStage { +public class ProcessFreeSourceStage extends AbstractPipelineStage { @Autowired private SourceRelationProcessor sourceRelationProcessor; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/RecordCustomMatchMetricsStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/RecordCustomMatchMetricsStage.java index 98641ae8..cb17d481 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/RecordCustomMatchMetricsStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/RecordCustomMatchMetricsStage.java @@ -1,11 +1,11 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; import com.ycwl.basic.face.pipeline.enums.FaceMatchingScene; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.service.pc.helper.FaceMetricsRecorder; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +27,7 @@ import org.springframework.stereotype.Component; description = "记录自定义匹配指标", defaultEnabled = true ) -public class RecordCustomMatchMetricsStage extends AbstractFaceMatchingStage { +public class RecordCustomMatchMetricsStage extends AbstractPipelineStage { @Autowired private FaceMetricsRecorder metricsRecorder; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/RecordMetricsStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/RecordMetricsStage.java index a26ddb40..69ce5d71 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/RecordMetricsStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/RecordMetricsStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.service.pc.helper.FaceMetricsRecorder; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +27,7 @@ import org.springframework.stereotype.Component; description = "记录人脸识别指标", defaultEnabled = true ) -public class RecordMetricsStage extends AbstractFaceMatchingStage { +public class RecordMetricsStage extends AbstractPipelineStage { @Autowired private FaceMetricsRecorder metricsRecorder; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/SetTaskStatusStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/SetTaskStatusStage.java index 0e8675c2..cd08b236 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/SetTaskStatusStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/SetTaskStatusStage.java @@ -1,11 +1,11 @@ package com.ycwl.basic.face.pipeline.stages; import com.ycwl.basic.biz.TaskStatusBiz; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -25,7 +25,7 @@ import org.springframework.stereotype.Component; optionalMode = StageOptionalMode.FORCE_ON, description = "设置新用户任务状态" ) -public class SetTaskStatusStage extends AbstractFaceMatchingStage { +public class SetTaskStatusStage extends AbstractPipelineStage { @Autowired private TaskStatusBiz taskStatusBiz; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/stages/UpdateFaceResultStage.java b/src/main/java/com/ycwl/basic/face/pipeline/stages/UpdateFaceResultStage.java index c361699e..c07fd4cf 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/stages/UpdateFaceResultStage.java +++ b/src/main/java/com/ycwl/basic/face/pipeline/stages/UpdateFaceResultStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.face.pipeline.stages; -import com.ycwl.basic.face.pipeline.annotation.StageConfig; -import com.ycwl.basic.face.pipeline.core.AbstractFaceMatchingStage; import com.ycwl.basic.face.pipeline.core.FaceMatchingContext; -import com.ycwl.basic.face.pipeline.core.StageResult; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.mapper.FaceMapper; import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.task.resp.SearchFaceRespVo; @@ -33,7 +33,7 @@ import java.util.stream.Collectors; optionalMode = StageOptionalMode.FORCE_ON, description = "更新人脸识别结果到数据库" ) -public class UpdateFaceResultStage extends AbstractFaceMatchingStage { +public class UpdateFaceResultStage extends AbstractPipelineStage { @Autowired private FaceMapper faceMapper; diff --git a/src/main/java/com/ycwl/basic/image/pipeline/annotation/StageConfig.java b/src/main/java/com/ycwl/basic/image/pipeline/annotation/StageConfig.java deleted file mode 100644 index a8cb3f9c..00000000 --- a/src/main/java/com/ycwl/basic/image/pipeline/annotation/StageConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.ycwl.basic.image.pipeline.annotation; - -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Stage配置注解 - * 用于声明Stage的元数据和可选性控制信息 - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface StageConfig { - - /** - * Stage的唯一标识 - * 用于外部配置引用该Stage - * 例如: "watermark", "download", "upload" - */ - String stageId(); - - /** - * 可选性模式 - * 默认为UNSUPPORT(不支持外部控制) - */ - StageOptionalMode optionalMode() default StageOptionalMode.UNSUPPORT; - - /** - * Stage描述信息 - * 用于文档和日志说明 - */ - String description() default ""; - - /** - * 默认是否启用 - * 仅当optionalMode=SUPPORT时有效 - * 当外部配置未明确指定时,使用此默认值 - */ - boolean defaultEnabled() default true; -} diff --git a/src/main/java/com/ycwl/basic/image/pipeline/core/PhotoProcessContext.java b/src/main/java/com/ycwl/basic/image/pipeline/core/PhotoProcessContext.java index a04a57d7..2017047e 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/core/PhotoProcessContext.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/core/PhotoProcessContext.java @@ -8,6 +8,7 @@ import com.ycwl.basic.model.Crop; import com.ycwl.basic.model.PrinterOrderItem; import com.ycwl.basic.image.pipeline.util.TempFileManager; import com.ycwl.basic.storage.adapters.IStorageAdapter; +import com.ycwl.basic.pipeline.core.PipelineContext; import lombok.Getter; import lombok.Setter; @@ -23,7 +24,7 @@ import java.util.function.Consumer; */ @Getter @Setter -public class PhotoProcessContext { +public class PhotoProcessContext implements PipelineContext { // ==================== 核心字段(构造时必填)==================== @@ -192,6 +193,7 @@ public class PhotoProcessContext { * @param defaultEnabled 默认值(当配置未指定时使用) * @return true-启用, false-禁用 */ + @Override public boolean isStageEnabled(String stageId, boolean defaultEnabled) { return stageEnabledMap.getOrDefault(stageId, defaultEnabled); } @@ -202,6 +204,7 @@ public class PhotoProcessContext { * @param stageId Stage唯一标识 * @return true-启用, false-禁用 */ + @Override public boolean isStageEnabled(String stageId) { return stageEnabledMap.getOrDefault(stageId, false); } @@ -292,6 +295,7 @@ public class PhotoProcessContext { /** * 清理所有临时文件 */ + @Override public void cleanup() { if (cleaned) { return; diff --git a/src/main/java/com/ycwl/basic/image/pipeline/core/PipelineStage.java b/src/main/java/com/ycwl/basic/image/pipeline/core/PipelineStage.java deleted file mode 100644 index 7d43ca5e..00000000 --- a/src/main/java/com/ycwl/basic/image/pipeline/core/PipelineStage.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.ycwl.basic.image.pipeline.core; - -import com.ycwl.basic.image.pipeline.annotation.StageConfig; - -/** - * 管线处理阶段接口 - * 每个Stage负责一个独立的图片处理步骤 - * - * @param Context类型 - */ -public interface PipelineStage { - - /** - * 获取Stage名称(用于日志和监控) - */ - String getName(); - - /** - * 判断是否需要执行此Stage - * 支持条件性执行(如:只有竖图才需要旋转) - * - * @param context 管线上下文 - * @return true-执行, false-跳过 - */ - boolean shouldExecute(C context); - - /** - * 执行Stage处理逻辑 - * - * @param context 管线上下文 - * @return 执行结果 - */ - StageResult execute(C context); - - /** - * 获取Stage的执行优先级(用于排序) - * 数值越小优先级越高,默认为100 - */ - default int getPriority() { - return 100; - } - - /** - * 获取Stage配置注解(用于反射读取可选性控制信息) - * @return Stage配置注解,如果未标注则返回null - */ - default StageConfig getStageConfig() { - return this.getClass().getAnnotation(StageConfig.class); - } -} diff --git a/src/main/java/com/ycwl/basic/image/pipeline/enums/StageOptionalMode.java b/src/main/java/com/ycwl/basic/image/pipeline/enums/StageOptionalMode.java deleted file mode 100644 index 6bdab5c4..00000000 --- a/src/main/java/com/ycwl/basic/image/pipeline/enums/StageOptionalMode.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.ycwl.basic.image.pipeline.enums; - -import lombok.Getter; - -/** - * Stage可选性模式枚举 - * 定义Stage是否支持外部配置控制 - */ -@Getter -public enum StageOptionalMode { - - /** - * 不支持外部控制 - * Stage的执行完全由代码中的业务逻辑决定 - */ - UNSUPPORT("不支持外部控制"), - - /** - * 支持外部控制 - * Stage可以通过景区配置或请求参数进行开启/关闭 - */ - SUPPORT("支持外部控制"), - - /** - * 强制开启 - * Stage必须执行,不允许外部配置关闭 - */ - FORCE_ON("强制开启"); - - private final String description; - - StageOptionalMode(String description) { - this.description = description; - } -} diff --git a/src/main/java/com/ycwl/basic/image/pipeline/exception/PipelineException.java b/src/main/java/com/ycwl/basic/image/pipeline/exception/PipelineException.java deleted file mode 100644 index 9a621331..00000000 --- a/src/main/java/com/ycwl/basic/image/pipeline/exception/PipelineException.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.ycwl.basic.image.pipeline.exception; - -/** - * 管线处理异常基类 - */ -public class PipelineException extends RuntimeException { - - public PipelineException(String message) { - super(message); - } - - public PipelineException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/CleanupStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/CleanupStage.java index 1ef47971..49247322 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/CleanupStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/CleanupStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.image.pipeline.stages; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import lombok.extern.slf4j.Slf4j; /** diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/ConditionalRotateStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/ConditionalRotateStage.java index a259ef76..04ac9a7c 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/ConditionalRotateStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/ConditionalRotateStage.java @@ -1,11 +1,11 @@ package com.ycwl.basic.image.pipeline.stages; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; import com.ycwl.basic.image.pipeline.enums.ImageType; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.utils.ImageUtils; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/DownloadStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/DownloadStage.java index 9e5a876f..05979d54 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/DownloadStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/DownloadStage.java @@ -1,12 +1,12 @@ package com.ycwl.basic.image.pipeline.stages; import cn.hutool.http.HttpUtil; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; import com.ycwl.basic.image.pipeline.enums.ImageType; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageEnhanceStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageEnhanceStage.java index e74cafb2..540ebd9e 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageEnhanceStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageEnhanceStage.java @@ -2,12 +2,12 @@ package com.ycwl.basic.image.pipeline.stages; import com.ycwl.basic.image.enhancer.adapter.BceImageEnhancer; import com.ycwl.basic.image.enhancer.entity.BceEnhancerConfig; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; import com.ycwl.basic.image.pipeline.enums.ImageSource; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import lombok.extern.slf4j.Slf4j; import org.springframework.web.multipart.MultipartFile; diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageOrientationStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageOrientationStage.java index 161cfa73..4b4f3998 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageOrientationStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageOrientationStage.java @@ -1,13 +1,13 @@ package com.ycwl.basic.image.pipeline.stages; -import com.ycwl.basic.image.pipeline.enums.ImageSource; -import com.ycwl.basic.model.Crop; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; +import com.ycwl.basic.image.pipeline.enums.ImageSource; import com.ycwl.basic.image.pipeline.enums.ImageType; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.model.Crop; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.utils.ImageUtils; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageQualityCheckStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageQualityCheckStage.java index f38b883f..63f2fd0a 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageQualityCheckStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageQualityCheckStage.java @@ -1,11 +1,11 @@ package com.ycwl.basic.image.pipeline.stages; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; import com.ycwl.basic.image.pipeline.enums.ImageType; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.utils.ImageUtils; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageSRStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageSRStage.java index c1bc5744..7b75e25d 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageSRStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/ImageSRStage.java @@ -2,12 +2,12 @@ package com.ycwl.basic.image.pipeline.stages; import com.ycwl.basic.image.enhancer.adapter.BceImageSR; import com.ycwl.basic.image.enhancer.entity.BceEnhancerConfig; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; import com.ycwl.basic.image.pipeline.enums.ImageSource; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import lombok.extern.slf4j.Slf4j; import org.springframework.web.multipart.MultipartFile; diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/NoOpStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/NoOpStage.java index f50ff90e..f26f667a 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/NoOpStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/NoOpStage.java @@ -1,8 +1,8 @@ package com.ycwl.basic.image.pipeline.stages; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; public class NoOpStage extends AbstractPipelineStage { @Override diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/PuzzleBorderStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/PuzzleBorderStage.java index 8289e197..a48d6d39 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/PuzzleBorderStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/PuzzleBorderStage.java @@ -1,11 +1,11 @@ package com.ycwl.basic.image.pipeline.stages; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; import com.ycwl.basic.image.pipeline.enums.ImageType; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.utils.ImageUtils; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/RestoreOrientationStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/RestoreOrientationStage.java index 436d9a5c..69d29e9e 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/RestoreOrientationStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/RestoreOrientationStage.java @@ -1,11 +1,11 @@ package com.ycwl.basic.image.pipeline.stages; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; import com.ycwl.basic.image.pipeline.enums.ImageType; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.utils.ImageUtils; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/SourcePhotoUpdateStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/SourcePhotoUpdateStage.java index c19d2784..d8315651 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/SourcePhotoUpdateStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/SourcePhotoUpdateStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.image.pipeline.stages; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.service.pc.SourceService; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/UploadStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/UploadStage.java index 9c35e9fb..ffc5d5f5 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/UploadStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/UploadStage.java @@ -1,10 +1,10 @@ package com.ycwl.basic.image.pipeline.stages; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import com.ycwl.basic.storage.StorageFactory; import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.storage.enums.StorageAcl; diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/WatermarkStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/WatermarkStage.java index 39369619..3ef6ce8e 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/WatermarkStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/WatermarkStage.java @@ -1,15 +1,15 @@ package com.ycwl.basic.image.pipeline.stages; +import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; +import com.ycwl.basic.image.pipeline.enums.ImageType; import com.ycwl.basic.image.watermark.ImageWatermarkFactory; import com.ycwl.basic.image.watermark.entity.WatermarkInfo; import com.ycwl.basic.image.watermark.enums.ImageWatermarkOperatorEnum; import com.ycwl.basic.image.watermark.operator.IOperator; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.core.AbstractPipelineStage; -import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.StageResult; -import com.ycwl.basic.image.pipeline.enums.ImageType; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.core.AbstractPipelineStage; +import com.ycwl.basic.pipeline.core.StageResult; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/com/ycwl/basic/face/pipeline/annotation/StageConfig.java b/src/main/java/com/ycwl/basic/pipeline/annotation/StageConfig.java similarity index 52% rename from src/main/java/com/ycwl/basic/face/pipeline/annotation/StageConfig.java rename to src/main/java/com/ycwl/basic/pipeline/annotation/StageConfig.java index c7d472b3..8a630092 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/annotation/StageConfig.java +++ b/src/main/java/com/ycwl/basic/pipeline/annotation/StageConfig.java @@ -1,38 +1,38 @@ -package com.ycwl.basic.face.pipeline.annotation; +package com.ycwl.basic.pipeline.annotation; -import com.ycwl.basic.face.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * Stage配置注解 - * 用于标注Stage的元数据和可选性控制 + * Stage 配置注解,统一声明 Stage 的元信息与可选性控制。 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) +@Documented public @interface StageConfig { /** - * Stage唯一标识 - * 用于外部配置控制 + * Stage 唯一标识,用于外部配置或监控引用。 */ String stageId(); /** - * 可选模式 + * 可选性模式,默认不受外部控制。 */ StageOptionalMode optionalMode() default StageOptionalMode.UNSUPPORT; /** - * 描述信息 + * 描述信息,便于文档与日志。 */ String description() default ""; /** - * 默认是否启用(当optionalMode=SUPPORT时生效) + * 默认是否启用,仅在 optionalMode=SUPPORT 时生效。 */ boolean defaultEnabled() default true; } diff --git a/src/main/java/com/ycwl/basic/image/pipeline/core/AbstractPipelineStage.java b/src/main/java/com/ycwl/basic/pipeline/core/AbstractPipelineStage.java similarity index 59% rename from src/main/java/com/ycwl/basic/image/pipeline/core/AbstractPipelineStage.java rename to src/main/java/com/ycwl/basic/pipeline/core/AbstractPipelineStage.java index 1f38c11c..40202450 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/core/AbstractPipelineStage.java +++ b/src/main/java/com/ycwl/basic/pipeline/core/AbstractPipelineStage.java @@ -1,70 +1,46 @@ -package com.ycwl.basic.image.pipeline.core; +package com.ycwl.basic.pipeline.core; -import com.ycwl.basic.image.pipeline.annotation.StageConfig; -import com.ycwl.basic.image.pipeline.enums.StageOptionalMode; +import com.ycwl.basic.pipeline.annotation.StageConfig; +import com.ycwl.basic.pipeline.enums.StageOptionalMode; import lombok.extern.slf4j.Slf4j; /** - * Pipeline Stage抽象基类 - * 提供默认实现和通用逻辑 + * 通用 Stage 抽象基类,封装可选性判断与钩子逻辑。 */ @Slf4j -public abstract class AbstractPipelineStage implements PipelineStage { +public abstract class AbstractPipelineStage implements PipelineStage { - /** - * 最终的shouldExecute判断 - * 整合了外部配置控制和业务逻辑判断 - */ @Override public final boolean shouldExecute(C context) { - // 1. 检查Stage配置注解 StageConfig config = getStageConfig(); if (config != null) { String stageId = config.stageId(); StageOptionalMode mode = config.optionalMode(); - // FORCE_ON:强制执行,不检查外部配置 if (mode == StageOptionalMode.FORCE_ON) { return shouldExecuteByBusinessLogic(context); } - // SUPPORT:检查外部配置 if (mode == StageOptionalMode.SUPPORT) { boolean externalEnabled = context.isStageEnabled(stageId, config.defaultEnabled()); if (!externalEnabled) { - log.debug("[{}] Stage被外部配置禁用", stageId); + log.debug("[{}] Stage 被外部配置禁用", stageId); return false; } } - - // UNSUPPORT:不检查外部配置,直接走业务逻辑 } - // 2. 执行业务逻辑判断 return shouldExecuteByBusinessLogic(context); } - /** - * 子类实现业务逻辑判断 - * 默认总是执行 - * - * 子类可以覆盖此方法实现条件性执行 - * 例如: 只有竖图才旋转, 只有普通照片才加水印等 - */ protected boolean shouldExecuteByBusinessLogic(C context) { return true; } - /** - * 模板方法:执行Stage前的准备工作 - */ protected void beforeExecute(C context) { log.debug("[{}] 开始执行", getName()); } - /** - * 模板方法:执行Stage后的清理工作 - */ protected void afterExecute(C context, StageResult result) { if (result.isSuccess()) { log.debug("[{}] 执行成功: {}", getName(), result.getMessage()); @@ -77,14 +53,8 @@ public abstract class AbstractPipelineStage imple } } - /** - * 子类实现具体的处理逻辑 - */ protected abstract StageResult doExecute(C context); - /** - * 最终执行方法(带钩子) - */ @Override public final StageResult execute(C context) { beforeExecute(context); diff --git a/src/main/java/com/ycwl/basic/image/pipeline/core/Pipeline.java b/src/main/java/com/ycwl/basic/pipeline/core/Pipeline.java similarity index 72% rename from src/main/java/com/ycwl/basic/image/pipeline/core/Pipeline.java rename to src/main/java/com/ycwl/basic/pipeline/core/Pipeline.java index abc6f154..bc72e077 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/core/Pipeline.java +++ b/src/main/java/com/ycwl/basic/pipeline/core/Pipeline.java @@ -1,17 +1,16 @@ -package com.ycwl.basic.image.pipeline.core; +package com.ycwl.basic.pipeline.core; -import com.ycwl.basic.image.pipeline.exception.PipelineException; +import com.ycwl.basic.pipeline.exception.PipelineException; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.List; /** - * 图片处理管线 - * 按顺序执行一系列Stage + * 通用 Pipeline 实现,负责顺序执行 Stage 并支持动态插入。 */ @Slf4j -public class Pipeline { +public class Pipeline { private final List> stages; private final String name; @@ -21,30 +20,27 @@ public class Pipeline { this.stages = new ArrayList<>(stages); } - /** - * 执行管线 - * - * @param context 管线上下文 - * @return 执行成功返回true - * @throws PipelineException 管线执行异常 - */ public boolean execute(C context) { - log.info("[{}] 开始执行管线, Stage数量: {}", name, stages.size()); + log.info("[{}] Pipeline 开始执行, Stage 数量: {}", name, stages.size()); long startTime = System.currentTimeMillis(); - int maxStages = 100; // 防止无限循环 + int maxStages = 100; int executedCount = 0; + if (context != null) { + context.beforePipeline(); + } + try { for (int i = 0; i < stages.size(); i++) { if (executedCount >= maxStages) { - log.error("[{}] Stage执行数量超过最大限制({}),可能存在循环依赖", name, maxStages); + log.error("[{}] Stage 执行数量超过最大限制({}), 可能存在循环依赖", name, maxStages); throw new PipelineException("Stage执行数量超过最大限制,可能存在循环依赖"); } PipelineStage stage = stages.get(i); String stageName = stage.getName(); - log.debug("[{}] [{}/{}] 准备执行Stage: {}", name, i + 1, stages.size(), stageName); + log.debug("[{}] [{}/{}] 准备执行 Stage: {}", name, i + 1, stages.size(), stageName); if (!stage.shouldExecute(context)) { log.debug("[{}] Stage {} 条件不满足,跳过执行", name, stageName); @@ -58,31 +54,34 @@ public class Pipeline { logStageResult(stageName, result, stageDuration); - // 动态添加后续Stage if (result.getNextStages() != null && !result.getNextStages().isEmpty()) { List> nextStages = result.getNextStages(); - log.info("[{}] Stage {} 动态添加了 {} 个后续Stage", name, stageName, nextStages.size()); + log.info("[{}] Stage {} 动态添加了 {} 个后续 Stage", name, stageName, nextStages.size()); for (int j = 0; j < nextStages.size(); j++) { PipelineStage nextStage = nextStages.get(j); stages.add(i + 1 + j, nextStage); - log.debug("[{}] - 插入Stage: {} 到位置 {}", name, nextStage.getName(), i + 1 + j); + log.debug("[{}] - 插入 Stage: {} 到位置 {}", name, nextStage.getName(), i + 1 + j); } } if (result.isFailed()) { - log.error("[{}] Stage {} 执行失败,管线终止", name, stageName); + log.error("[{}] Stage {} 执行失败, Pipeline 终止", name, stageName); return false; } } long totalDuration = System.currentTimeMillis() - startTime; - log.info("[{}] 管线执行完成, 总Stage数: {}, 实际执行: {}, 耗时: {}ms", + log.info("[{}] Pipeline 执行完成, 总 Stage 数: {}, 实际执行: {}, 耗时: {}ms", name, stages.size(), executedCount, totalDuration); + + if (context != null) { + context.afterPipeline(); + } return true; } catch (Exception e) { - log.error("[{}] 管线执行异常", name, e); + log.error("[{}] Pipeline 执行异常", name, e); throw new PipelineException("管线执行失败: " + e.getMessage(), e); } finally { safeCleanup(context); @@ -124,7 +123,7 @@ public class Pipeline { try { context.cleanup(); } catch (Exception cleanupError) { - log.warn("[{}] 管线清理失败", name, cleanupError); + log.warn("[{}] Pipeline 清理失败", name, cleanupError); } } } diff --git a/src/main/java/com/ycwl/basic/image/pipeline/core/PipelineBuilder.java b/src/main/java/com/ycwl/basic/pipeline/core/PipelineBuilder.java similarity index 71% rename from src/main/java/com/ycwl/basic/image/pipeline/core/PipelineBuilder.java rename to src/main/java/com/ycwl/basic/pipeline/core/PipelineBuilder.java index ee9ee5c1..483fb188 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/core/PipelineBuilder.java +++ b/src/main/java/com/ycwl/basic/pipeline/core/PipelineBuilder.java @@ -1,14 +1,13 @@ -package com.ycwl.basic.image.pipeline.core; +package com.ycwl.basic.pipeline.core; import java.util.ArrayList; import java.util.Comparator; import java.util.List; /** - * Pipeline构建器 - * 使用Builder模式动态组装管线 + * 通用 Pipeline 构建器。 */ -public class PipelineBuilder { +public class PipelineBuilder { private String name = "DefaultPipeline"; private final List> stages = new ArrayList<>(); @@ -20,17 +19,11 @@ public class PipelineBuilder { this.name = name; } - /** - * 设置管线名称 - */ public PipelineBuilder name(String name) { this.name = name; return this; } - /** - * 添加Stage - */ public PipelineBuilder addStage(PipelineStage stage) { if (stage != null) { this.stages.add(stage); @@ -38,9 +31,6 @@ public class PipelineBuilder { return this; } - /** - * 批量添加Stage - */ public PipelineBuilder addStages(List> stages) { if (stages != null) { this.stages.addAll(stages); @@ -48,9 +38,6 @@ public class PipelineBuilder { return this; } - /** - * 条件性添加Stage - */ public PipelineBuilder addStageIf(boolean condition, PipelineStage stage) { if (condition && stage != null) { this.stages.add(stage); @@ -58,20 +45,14 @@ public class PipelineBuilder { return this; } - /** - * 按优先级排序Stage - */ public PipelineBuilder sortByPriority() { this.stages.sort(Comparator.comparingInt(PipelineStage::getPriority)); return this; } - /** - * 构建Pipeline - */ public Pipeline build() { if (stages.isEmpty()) { - throw new IllegalStateException("管线至少需要一个Stage"); + throw new IllegalStateException("Pipeline 至少需要一个 Stage"); } return new Pipeline<>(name, stages); } diff --git a/src/main/java/com/ycwl/basic/pipeline/core/PipelineContext.java b/src/main/java/com/ycwl/basic/pipeline/core/PipelineContext.java new file mode 100644 index 00000000..8e9de2c7 --- /dev/null +++ b/src/main/java/com/ycwl/basic/pipeline/core/PipelineContext.java @@ -0,0 +1,50 @@ +package com.ycwl.basic.pipeline.core; + +/** + * 通用的 Pipeline 上下文接口。 + * 提供 Stage 开关控制与生命周期钩子,供不同业务场景复用。 + */ +public interface PipelineContext { + + /** + * 在 Pipeline 开始执行前调用,可用于埋点或预检查。 + */ + default void beforePipeline() { + // 默认无操作 + } + + /** + * 在 Pipeline 全部 Stage 执行完成且未抛出异常后调用。 + */ + default void afterPipeline() { + // 默认无操作 + } + + /** + * Pipeline 结束时的清理钩子,无论是否异常都会调用。 + */ + default void cleanup() { + // 默认无操作 + } + + /** + * 判断指定 Stage 是否启用。 + * + * @param stageId Stage 唯一标识 + * @param defaultEnabled 配置缺失时的默认值 + * @return 是否启用 + */ + default boolean isStageEnabled(String stageId, boolean defaultEnabled) { + return defaultEnabled; + } + + /** + * 判断指定 Stage 是否启用,默认关闭。 + * + * @param stageId Stage 唯一标识 + * @return 是否启用 + */ + default boolean isStageEnabled(String stageId) { + return false; + } +} diff --git a/src/main/java/com/ycwl/basic/pipeline/core/PipelineStage.java b/src/main/java/com/ycwl/basic/pipeline/core/PipelineStage.java new file mode 100644 index 00000000..02706e78 --- /dev/null +++ b/src/main/java/com/ycwl/basic/pipeline/core/PipelineStage.java @@ -0,0 +1,38 @@ +package com.ycwl.basic.pipeline.core; + +import com.ycwl.basic.pipeline.annotation.StageConfig; + +/** + * 通用 Pipeline Stage 接口,每个 Stage 负责独立处理步骤。 + */ +public interface PipelineStage { + + /** + * Stage 名称,用于日志与监控。 + */ + String getName(); + + /** + * 是否需要执行本 Stage。 + */ + boolean shouldExecute(C context); + + /** + * 执行处理逻辑。 + */ + StageResult execute(C context); + + /** + * Stage 执行优先级,值越小优先级越高。 + */ + default int getPriority() { + return 100; + } + + /** + * Stage 配置注解,便于读取元信息。 + */ + default StageConfig getStageConfig() { + return this.getClass().getAnnotation(StageConfig.class); + } +} diff --git a/src/main/java/com/ycwl/basic/image/pipeline/core/StageResult.java b/src/main/java/com/ycwl/basic/pipeline/core/StageResult.java similarity index 60% rename from src/main/java/com/ycwl/basic/image/pipeline/core/StageResult.java rename to src/main/java/com/ycwl/basic/pipeline/core/StageResult.java index 20cdef5e..93068181 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/core/StageResult.java +++ b/src/main/java/com/ycwl/basic/pipeline/core/StageResult.java @@ -1,4 +1,4 @@ -package com.ycwl.basic.image.pipeline.core; +package com.ycwl.basic.pipeline.core; import lombok.Getter; @@ -8,16 +8,16 @@ import java.util.Collections; import java.util.List; /** - * Stage执行结果 + * Stage 执行结果对象。 */ @Getter -public class StageResult { +public class StageResult { public enum Status { - SUCCESS, // 执行成功 - SKIPPED, // 跳过执行 - FAILED, // 执行失败 - DEGRADED // 降级执行 + SUCCESS, + SKIPPED, + FAILED, + DEGRADED } private final Status status; @@ -34,46 +34,40 @@ public class StageResult { : Collections.emptyList(); } - public static StageResult success() { + public static StageResult success() { return new StageResult<>(Status.SUCCESS, null, null, null); } - public static StageResult success(String message) { + public static StageResult success(String message) { return new StageResult<>(Status.SUCCESS, message, null, null); } - /** - * 成功执行并动态添加后续Stage - */ @SafeVarargs - public static StageResult successWithNext(String message, PipelineStage... stages) { + public static StageResult successWithNext(String message, PipelineStage... stages) { return new StageResult<>(Status.SUCCESS, message, null, Arrays.asList(stages)); } - /** - * 成功执行并动态添加后续Stage列表 - */ - public static StageResult successWithNext(String message, List> stages) { + public static StageResult successWithNext(String message, List> stages) { return new StageResult<>(Status.SUCCESS, message, null, stages); } - public static StageResult skipped() { + public static StageResult skipped() { return new StageResult<>(Status.SKIPPED, "条件不满足,跳过执行", null, null); } - public static StageResult skipped(String reason) { + public static StageResult skipped(String reason) { return new StageResult<>(Status.SKIPPED, reason, null, null); } - public static StageResult failed(String message) { + public static StageResult failed(String message) { return new StageResult<>(Status.FAILED, message, null, null); } - public static StageResult failed(String message, Throwable exception) { + public static StageResult failed(String message, Throwable exception) { return new StageResult<>(Status.FAILED, message, exception, null); } - public static StageResult degraded(String message) { + public static StageResult degraded(String message) { return new StageResult<>(Status.DEGRADED, message, null, null); } diff --git a/src/main/java/com/ycwl/basic/pipeline/enums/StageOptionalMode.java b/src/main/java/com/ycwl/basic/pipeline/enums/StageOptionalMode.java new file mode 100644 index 00000000..d74b2923 --- /dev/null +++ b/src/main/java/com/ycwl/basic/pipeline/enums/StageOptionalMode.java @@ -0,0 +1,22 @@ +package com.ycwl.basic.pipeline.enums; + +/** + * Stage 可选性模式,定义 Stage 是否允许受外部配置控制。 + */ +public enum StageOptionalMode { + + /** + * 不支持外部配置,完全由代码控制。 + */ + UNSUPPORT, + + /** + * 支持外部配置,可以通过开关控制启用或禁用。 + */ + SUPPORT, + + /** + * 强制开启,不允许被外部禁用。 + */ + FORCE_ON +} diff --git a/src/main/java/com/ycwl/basic/face/pipeline/exception/PipelineException.java b/src/main/java/com/ycwl/basic/pipeline/exception/PipelineException.java similarity index 80% rename from src/main/java/com/ycwl/basic/face/pipeline/exception/PipelineException.java rename to src/main/java/com/ycwl/basic/pipeline/exception/PipelineException.java index aa168a1a..71be0114 100644 --- a/src/main/java/com/ycwl/basic/face/pipeline/exception/PipelineException.java +++ b/src/main/java/com/ycwl/basic/pipeline/exception/PipelineException.java @@ -1,7 +1,7 @@ -package com.ycwl.basic.face.pipeline.exception; +package com.ycwl.basic.pipeline.exception; /** - * Pipeline执行异常 + * 通用 Pipeline 执行异常。 */ public class PipelineException extends RuntimeException { 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 76d05feb..9303ffd3 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 @@ -6,8 +6,6 @@ import com.ycwl.basic.enums.OrderStateEnum; import com.ycwl.basic.exception.BaseException; import com.ycwl.basic.image.enhancer.entity.BceEnhancerConfig; import com.ycwl.basic.image.pipeline.core.PhotoProcessContext; -import com.ycwl.basic.image.pipeline.core.Pipeline; -import com.ycwl.basic.image.pipeline.core.PipelineBuilder; import com.ycwl.basic.image.pipeline.enums.ImageSource; import com.ycwl.basic.image.pipeline.enums.ImageType; import com.ycwl.basic.image.pipeline.enums.PipelineScene; @@ -70,6 +68,8 @@ import com.ycwl.basic.service.printer.PrinterService; import com.ycwl.basic.service.printer.PrinterTaskPushService; import com.ycwl.basic.storage.StorageFactory; import com.ycwl.basic.storage.adapters.IStorageAdapter; +import com.ycwl.basic.pipeline.core.Pipeline; +import com.ycwl.basic.pipeline.core.PipelineBuilder; import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ImageUtils; import com.ycwl.basic.utils.JacksonUtil;