From ed0309f45ccc069788f32fd7ae33110e7ebb46b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=9A=E8=BE=B0=E5=85=88=E7=94=9F?= Date: Sun, 8 Dec 2024 17:29:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=AF=E6=AD=A3=E5=B8=B8=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=EF=BC=8C=E5=B7=A5=E4=BD=9C=E6=B5=81=E5=8F=AF=E4=BB=A5=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E8=BF=90=E8=A1=8C=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E8=8A=82=E7=82=B9=EF=BC=8C=E4=BD=86=E6=98=AF?= =?UTF-8?q?=E8=BF=98=E6=B2=A1=E8=BF=90=E8=A1=8C=E8=BF=87=EF=BC=8C=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E6=97=A0=E9=94=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/workflow/dto/NodeTypeDTO.java | 4 +- .../workflow/dto/query/NodeTypeQuery.java | 4 +- .../engine/DefaultWorkflowEngine.java | 4 +- .../engine/config/WorkflowEngineConfig.java | 2 +- .../engine/executor/GatewayCondition.java | 22 --- .../engine/executor/GatewayConfig.java | 38 ----- .../engine/executor/GatewayNodeExecutor.java | 158 ------------------ .../gateway/BranchConvergeConfig.java | 35 ++++ .../gateway/ConditionalGatewayConfig.java | 46 +++++ .../gateway/ExclusiveGatewayConfig.java | 41 +++++ .../executor/gateway/GatewayConfig.java | 41 +++++ .../executor/gateway/GatewayNodeExecutor.java | 59 +++++++ .../gateway/InclusiveGatewayConfig.java | 51 ++++++ .../gateway/ParallelGatewayConfig.java | 51 ++++++ .../node/AbstractNodeExecutor.java | 3 +- .../node}/EndNodeExecutor.java | 3 +- .../executor/{ => node}/NodeExecutor.java | 2 +- .../node}/ScriptNodeExecutor.java | 5 +- .../node}/ShellNodeExecutor.java | 5 +- .../node}/StartNodeExecutor.java | 3 +- .../executor/{ => node}/TaskNodeExecutor.java | 3 +- .../node/config}/ApprovalNodeConfig.java | 2 +- .../node/config}/ConditionNodeConfig.java | 2 +- .../node/config}/GitNodeConfig.java | 2 +- .../node/config}/HttpNodeConfig.java | 2 +- .../node/config}/JenkinsNodeConfig.java | 2 +- .../node/config}/NacosNodeConfig.java | 2 +- .../node/config}/NodeConfig.java | 5 +- .../node/config}/NotifyNodeConfig.java | 2 +- .../node/config}/ParallelNodeConfig.java | 2 +- .../node/config}/ScriptNodeConfig.java | 2 +- .../node/config}/ShellNodeConfig.java | 2 +- .../executor/{ => task}/TaskConfig.java | 5 +- .../workflow/engine/node/NodeType.java | 27 --- .../backend/workflow/entity/NodeType.java | 4 +- .../GatewayTypeEnum.java} | 4 +- ...odeCategory.java => NodeCategoryEnum.java} | 4 +- .../backend/workflow/enums/NodeTypeEnum.java | 7 +- .../TaskType.java => enums/TaskTypeEnum.java} | 4 +- .../IWorkflowVariableRepository.java | 11 +- .../service/impl/NodeTypeServiceImpl.java | 4 +- .../engine/DefaultWorkflowEngineTest.java | 4 +- .../executor/StartNodeExecutorTest.java | 1 + 43 files changed, 384 insertions(+), 296 deletions(-) delete mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayCondition.java delete mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayConfig.java delete mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayNodeExecutor.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/BranchConvergeConfig.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/ConditionalGatewayConfig.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/ExclusiveGatewayConfig.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/GatewayConfig.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/GatewayNodeExecutor.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/InclusiveGatewayConfig.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/ParallelGatewayConfig.java rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{ => executor}/node/AbstractNodeExecutor.java (97%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node/executor => executor/node}/EndNodeExecutor.java (92%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/{ => node}/NodeExecutor.java (92%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node/executor => executor/node}/ScriptNodeExecutor.java (97%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node/executor => executor/node}/ShellNodeExecutor.java (97%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node/executor => executor/node}/StartNodeExecutor.java (93%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/{ => node}/TaskNodeExecutor.java (96%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node => executor/node/config}/ApprovalNodeConfig.java (90%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node => executor/node/config}/ConditionNodeConfig.java (91%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node => executor/node/config}/GitNodeConfig.java (91%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node => executor/node/config}/HttpNodeConfig.java (92%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node => executor/node/config}/JenkinsNodeConfig.java (91%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node => executor/node/config}/NacosNodeConfig.java (92%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node => executor/node/config}/NodeConfig.java (90%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node => executor/node/config}/NotifyNodeConfig.java (92%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node => executor/node/config}/ParallelNodeConfig.java (92%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node => executor/node/config}/ScriptNodeConfig.java (94%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/{node => executor/node/config}/ShellNodeConfig.java (93%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/{ => task}/TaskConfig.java (78%) delete mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NodeType.java rename backend/src/main/java/com/qqchen/deploy/backend/workflow/{engine/executor/GatewayType.java => enums/GatewayTypeEnum.java} (77%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/{NodeCategory.java => NodeCategoryEnum.java} (89%) rename backend/src/main/java/com/qqchen/deploy/backend/workflow/{engine/executor/TaskType.java => enums/TaskTypeEnum.java} (72%) diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/NodeTypeDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/NodeTypeDTO.java index b76ca169..c267f704 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/NodeTypeDTO.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/NodeTypeDTO.java @@ -2,7 +2,7 @@ package com.qqchen.deploy.backend.workflow.dto; import com.qqchen.deploy.backend.framework.dto.BaseDTO; import com.qqchen.deploy.backend.workflow.engine.definition.TaskExecutorDefinition; -import com.qqchen.deploy.backend.workflow.enums.NodeCategory; +import com.qqchen.deploy.backend.workflow.enums.NodeCategoryEnum; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -39,7 +39,7 @@ public class NodeTypeDTO extends BaseDTO { * 节点类型分类 */ @NotNull(message = "节点类型分类不能为空") - private NodeCategory category; + private NodeCategoryEnum category; /** * 节点图标 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/query/NodeTypeQuery.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/query/NodeTypeQuery.java index fd22c266..e96f2ae2 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/query/NodeTypeQuery.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/query/NodeTypeQuery.java @@ -3,7 +3,7 @@ package com.qqchen.deploy.backend.workflow.dto.query; import com.qqchen.deploy.backend.framework.annotation.QueryField; import com.qqchen.deploy.backend.framework.enums.QueryType; import com.qqchen.deploy.backend.framework.query.BaseQuery; -import com.qqchen.deploy.backend.workflow.enums.NodeCategory; +import com.qqchen.deploy.backend.workflow.enums.NodeCategoryEnum; import lombok.Data; import lombok.EqualsAndHashCode; @@ -30,5 +30,5 @@ public class NodeTypeQuery extends BaseQuery { * 节点类型分类 */ @QueryField(field = "category") - private NodeCategory category; + private NodeCategoryEnum category; } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/DefaultWorkflowEngine.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/DefaultWorkflowEngine.java index 4225bbaa..5adc9f51 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/DefaultWorkflowEngine.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/DefaultWorkflowEngine.java @@ -6,7 +6,7 @@ import com.qqchen.deploy.backend.framework.enums.ResponseCode; import com.qqchen.deploy.backend.workflow.engine.context.DefaultWorkflowContext; import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; import com.qqchen.deploy.backend.workflow.engine.exception.WorkflowEngineException; -import com.qqchen.deploy.backend.workflow.engine.executor.NodeExecutor; +import com.qqchen.deploy.backend.workflow.engine.executor.node.NodeExecutor; import com.qqchen.deploy.backend.workflow.engine.parser.WorkflowDefinitionParser; import com.qqchen.deploy.backend.workflow.entity.NodeConfig; import com.qqchen.deploy.backend.workflow.entity.NodeInstance; @@ -27,8 +27,6 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/config/WorkflowEngineConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/config/WorkflowEngineConfig.java index 467c7225..8dd81bb8 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/config/WorkflowEngineConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/config/WorkflowEngineConfig.java @@ -1,6 +1,6 @@ package com.qqchen.deploy.backend.workflow.engine.config; -import com.qqchen.deploy.backend.workflow.engine.executor.NodeExecutor; +import com.qqchen.deploy.backend.workflow.engine.executor.node.NodeExecutor; import com.qqchen.deploy.backend.workflow.engine.executor.task.TaskExecutor; import com.qqchen.deploy.backend.workflow.enums.NodeTypeEnum; import org.springframework.context.annotation.Bean; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayCondition.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayCondition.java deleted file mode 100644 index ee6f28a6..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayCondition.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.qqchen.deploy.backend.workflow.engine.executor; - -import lombok.Data; - -@Data -public class GatewayCondition { - - /** - * 条件表达式(SpEL表达式) - */ - private String expression; - - /** - * 下一个节点ID - */ - private String nextNodeId; - - /** - * 条件描述 - */ - private String description; -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayConfig.java deleted file mode 100644 index 5cb80ad8..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayConfig.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.qqchen.deploy.backend.workflow.engine.executor; - -import lombok.Data; -import java.util.List; - -@Data -public class GatewayConfig { - - /** - * 网关类型 - */ - private GatewayType type; - - /** - * 网关名称 - */ - private String name; - - /** - * 网关描述 - */ - private String description; - - /** - * 条件列表(排他网关和包容网关使用) - */ - private List conditions; - - /** - * 默认节点ID(排他网关使用) - */ - private String defaultNodeId; - - /** - * 并行节点ID列表(并行网关使用) - */ - private List parallelNodeIds; -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayNodeExecutor.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayNodeExecutor.java deleted file mode 100644 index ac8d4bec..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayNodeExecutor.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.qqchen.deploy.backend.workflow.engine.executor; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.qqchen.deploy.backend.framework.enums.ResponseCode; -import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; -import com.qqchen.deploy.backend.workflow.engine.exception.WorkflowEngineException; -import com.qqchen.deploy.backend.workflow.entity.NodeInstance; -import com.qqchen.deploy.backend.workflow.enums.NodeTypeEnum; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.springframework.expression.Expression; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.StandardEvaluationContext; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; - - -@Slf4j -@Component -public class GatewayNodeExecutor implements NodeExecutor { - - private final ObjectMapper objectMapper = new ObjectMapper(); - private final ExpressionParser expressionParser = new SpelExpressionParser(); - - @Override - public NodeTypeEnum getNodeType() { - return NodeTypeEnum.GATEWAY; - } - - @Override - public void execute(NodeInstance nodeInstance, WorkflowContextOperations context) { - try { - GatewayConfig config = objectMapper.readValue(nodeInstance.getConfig(), GatewayConfig.class); - - if (config.getType() == null) { - throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_CONFIG_ERROR); - } - - switch (config.getType()) { - case PARALLEL: - handleParallelGateway(nodeInstance, context, config); - break; - case EXCLUSIVE: - handleExclusiveGateway(nodeInstance, context, config); - break; - case INCLUSIVE: - handleInclusiveGateway(nodeInstance, context, config); - break; - default: - throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_CONFIG_ERROR); - } - } catch (Exception e) { - throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_EXECUTION_FAILED, e); - } - } - - private void handleExclusiveGateway(NodeInstance nodeInstance, WorkflowContextOperations context, GatewayConfig config) { - try { - for (GatewayCondition condition : config.getConditions()) { - if (evaluateCondition(condition.getExpression(), context)) { - nodeInstance.setOutput(objectMapper.createObjectNode() - .put("nextNodeId", condition.getNextNodeId()) - .toString()); - return; - } - } - throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_EXECUTION_FAILED); - } catch (Exception e) { - throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_EXECUTION_FAILED, e); - } - } - - private void handleParallelGateway(NodeInstance nodeInstance, WorkflowContextOperations context, GatewayConfig config) { - try { - List nextNodeIds = new ArrayList<>(); - for (GatewayCondition condition : config.getConditions()) { - nextNodeIds.add(condition.getNextNodeId()); - } - nodeInstance.setOutput(objectMapper.createObjectNode() - .put("nextNodeIds", String.join(",", nextNodeIds)) - .toString()); - } catch (Exception e) { - throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_EXECUTION_FAILED, e); - } - } - - private void handleInclusiveGateway(NodeInstance nodeInstance, WorkflowContextOperations context, GatewayConfig config) { - try { - List nextNodeIds = new ArrayList<>(); - for (GatewayCondition condition : config.getConditions()) { - if (evaluateCondition(condition.getExpression(), context)) { - nextNodeIds.add(condition.getNextNodeId()); - } - } - if (nextNodeIds.isEmpty()) { - throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_EXECUTION_FAILED); - } - nodeInstance.setOutput(objectMapper.createObjectNode() - .put("nextNodeIds", String.join(",", nextNodeIds)) - .toString()); - } catch (Exception e) { - throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_EXECUTION_FAILED, e); - } - } - - private boolean evaluateCondition(String expression, WorkflowContextOperations context) { - try { - StandardEvaluationContext evaluationContext = new StandardEvaluationContext(); - evaluationContext.setVariables(context.getVariables()); - Expression exp = expressionParser.parseExpression(expression); - return exp.getValue(evaluationContext, Boolean.class); - } catch (Exception e) { - throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_EXECUTION_FAILED, e); - } - } - - @Override - public void validate(String config) { - try { - GatewayConfig gatewayConfig = objectMapper.readValue(config, GatewayConfig.class); - if (gatewayConfig.getType() == null) { - throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_CONFIG_ERROR); - } - // 验证条件表达式 - if (gatewayConfig.getConditions() != null) { - for (GatewayCondition condition : gatewayConfig.getConditions()) { - try { - expressionParser.parseExpression(condition.getExpression()); - } catch (Exception e) { - throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_CONFIG_ERROR); - } - } - } - } catch (Exception e) { - throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_CONFIG_ERROR); - } - } - - @Override - public void terminate(NodeInstance nodeInstance, WorkflowContextOperations context) { - // Gateway nodes are instant operations, no need to terminate - } - - @Data - public static class GatewayConfig { - private GatewayType type; // 网关类型:PARALLEL, EXCLUSIVE, INCLUSIVE - private List conditions; // 网关条件 - } - - @Data - public static class GatewayCondition { - private String expression; // 条件表达式 - private String nextNodeId; // 下一个节点ID - } -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/BranchConvergeConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/BranchConvergeConfig.java new file mode 100644 index 00000000..2650bc36 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/BranchConvergeConfig.java @@ -0,0 +1,35 @@ +package com.qqchen.deploy.backend.workflow.engine.executor.gateway; + +import lombok.Data; + +/** + * 分支汇聚配置 + */ +@Data +public class BranchConvergeConfig { + /** + * 汇聚策略 + */ + private ConvergeStrategy strategy; + + /** + * 需要完成的分支数量(N个完成时使用) + */ + private Integer requiredCount; + + public enum ConvergeStrategy { + ALL("全部完成"), + ANY("任一完成"), + N("N个完成"); + + private final String description; + + ConvergeStrategy(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } + } +} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/ConditionalGatewayConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/ConditionalGatewayConfig.java new file mode 100644 index 00000000..e26ca0bb --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/ConditionalGatewayConfig.java @@ -0,0 +1,46 @@ +package com.qqchen.deploy.backend.workflow.engine.executor.gateway; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 基于条件的网关配置基类 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public abstract class ConditionalGatewayConfig extends GatewayConfig { + /** + * 条件分支列表 + */ + private List branches; + + /** + * 默认分支节点ID + */ + private String defaultNodeId; + + @Data + public static class ConditionalBranch { + /** + * 分支名称 + */ + private String name; + + /** + * 条件表达式 + */ + private String condition; + + /** + * 目标节点ID + */ + private String targetNodeId; + + /** + * 分支描述 + */ + private String description; + } +} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/ExclusiveGatewayConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/ExclusiveGatewayConfig.java new file mode 100644 index 00000000..d1c92929 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/ExclusiveGatewayConfig.java @@ -0,0 +1,41 @@ +package com.qqchen.deploy.backend.workflow.engine.executor.gateway; + +import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.util.Collections; +import java.util.List; + +/** + * 排他网关配置 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ExclusiveGatewayConfig extends ConditionalGatewayConfig { + private final ExpressionParser expressionParser = new SpelExpressionParser(); + + @Override + public List getNextNodeIds(WorkflowContextOperations context) { + // 返回第一个满足条件的分支的targetNodeId + for (ConditionalBranch branch : getBranches()) { + if (evaluateCondition(branch.getCondition(), context)) { + return Collections.singletonList(branch.getTargetNodeId()); + } + } + return Collections.singletonList(getDefaultNodeId()); + } + + private boolean evaluateCondition(String condition, WorkflowContextOperations context) { + try { + StandardEvaluationContext evaluationContext = new StandardEvaluationContext(context); + return Boolean.TRUE.equals(expressionParser.parseExpression(condition) + .getValue(evaluationContext, Boolean.class)); + } catch (Exception e) { + return false; + } + } +} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/GatewayConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/GatewayConfig.java new file mode 100644 index 00000000..86a905f2 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/GatewayConfig.java @@ -0,0 +1,41 @@ +package com.qqchen.deploy.backend.workflow.engine.executor.gateway; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; +import com.qqchen.deploy.backend.workflow.enums.GatewayTypeEnum; +import lombok.Data; + +import java.util.List; + +/** + * 网关配置基类 + */ +@Data +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type") +@JsonSubTypes({ + @JsonSubTypes.Type(value = ExclusiveGatewayConfig.class, name = "EXCLUSIVE"), + @JsonSubTypes.Type(value = ParallelGatewayConfig.class, name = "PARALLEL"), + @JsonSubTypes.Type(value = InclusiveGatewayConfig.class, name = "INCLUSIVE") +}) +public abstract class GatewayConfig { + /** + * 网关类型 + */ + private GatewayTypeEnum type; + + /** + * 网关名称 + */ + private String name; + + /** + * 网关描述 + */ + private String description; + + /** + * 获取下一个节点IDs + */ + public abstract List getNextNodeIds(WorkflowContextOperations context); +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/GatewayNodeExecutor.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/GatewayNodeExecutor.java new file mode 100644 index 00000000..6754167d --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/GatewayNodeExecutor.java @@ -0,0 +1,59 @@ +package com.qqchen.deploy.backend.workflow.engine.executor.gateway; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.qqchen.deploy.backend.framework.enums.ResponseCode; +import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; +import com.qqchen.deploy.backend.workflow.engine.exception.WorkflowEngineException; +import com.qqchen.deploy.backend.workflow.engine.executor.node.NodeExecutor; +import com.qqchen.deploy.backend.workflow.entity.NodeInstance; +import com.qqchen.deploy.backend.workflow.enums.NodeTypeEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Slf4j +@Component +public class GatewayNodeExecutor implements NodeExecutor { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public NodeTypeEnum getNodeType() { + return NodeTypeEnum.GATEWAY; + } + + @Override + public void execute(NodeInstance nodeInstance, WorkflowContextOperations context) { + try { + // 解析网关配置 + GatewayConfig config = objectMapper.readValue(nodeInstance.getConfig(), GatewayConfig.class); + + // 获取下一个节点IDs + List nextNodeIds = config.getNextNodeIds(context); + + // 设置输出 + nodeInstance.setOutput(objectMapper.createObjectNode() + .put("nextNodeIds", String.join(",", nextNodeIds)) + .toString()); + + } catch (Exception e) { + log.error("Gateway node execution failed", e); + throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_EXECUTION_FAILED, e); + } + } + + @Override + public void validate(String config) { + try { + objectMapper.readValue(config, GatewayConfig.class); + } catch (Exception e) { + throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_CONFIG_ERROR); + } + } + + @Override + public void terminate(NodeInstance nodeInstance, WorkflowContextOperations context) { + // Gateway nodes are instant operations, no need to terminate + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/InclusiveGatewayConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/InclusiveGatewayConfig.java new file mode 100644 index 00000000..1f70365b --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/InclusiveGatewayConfig.java @@ -0,0 +1,51 @@ +package com.qqchen.deploy.backend.workflow.engine.executor.gateway; + +import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 包容网关配置 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class InclusiveGatewayConfig extends ConditionalGatewayConfig { + /** + * 汇聚配置 + */ + private BranchConvergeConfig convergeConfig; + + private final ExpressionParser expressionParser = new SpelExpressionParser(); + + @Override + public List getNextNodeIds(WorkflowContextOperations context) { + // 返回所有满足条件的分支的targetNodeId + List nextNodeIds = getBranches().stream() + .filter(branch -> evaluateCondition(branch.getCondition(), context)) + .map(ConditionalBranch::getTargetNodeId) + .collect(Collectors.toList()); + + // 如果没有满足条件的分支,使用默认分支 + if (nextNodeIds.isEmpty() && getDefaultNodeId() != null) { + nextNodeIds.add(getDefaultNodeId()); + } + + return nextNodeIds; + } + + private boolean evaluateCondition(String condition, WorkflowContextOperations context) { + try { + StandardEvaluationContext evaluationContext = new StandardEvaluationContext(context); + return Boolean.TRUE.equals(expressionParser.parseExpression(condition) + .getValue(evaluationContext, Boolean.class)); + } catch (Exception e) { + return false; + } + } +} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/ParallelGatewayConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/ParallelGatewayConfig.java new file mode 100644 index 00000000..c552f71f --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/gateway/ParallelGatewayConfig.java @@ -0,0 +1,51 @@ +package com.qqchen.deploy.backend.workflow.engine.executor.gateway; + +import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 并行网关配置 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ParallelGatewayConfig extends GatewayConfig { + /** + * 并行分支列表 + */ + private List branches; + + /** + * 汇聚配置 + */ + private BranchConvergeConfig convergeConfig; + + @Data + public static class ParallelBranch { + /** + * 分支名称 + */ + private String name; + + /** + * 目标节点ID + */ + private String targetNodeId; + + /** + * 分支描述 + */ + private String description; + } + + @Override + public List getNextNodeIds(WorkflowContextOperations context) { + // 返回所有分支的targetNodeId + return branches.stream() + .map(ParallelBranch::getTargetNodeId) + .collect(Collectors.toList()); + } +} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/AbstractNodeExecutor.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/AbstractNodeExecutor.java similarity index 97% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/AbstractNodeExecutor.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/AbstractNodeExecutor.java index cc3fa813..3a480c2d 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/AbstractNodeExecutor.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/AbstractNodeExecutor.java @@ -1,10 +1,9 @@ -package com.qqchen.deploy.backend.workflow.engine.node; +package com.qqchen.deploy.backend.workflow.engine.executor.node; import com.qqchen.deploy.backend.framework.enums.ResponseCode; import com.qqchen.deploy.backend.system.enums.LogLevelEnum; import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; import com.qqchen.deploy.backend.workflow.engine.exception.WorkflowEngineException; -import com.qqchen.deploy.backend.workflow.engine.executor.NodeExecutor; import com.qqchen.deploy.backend.workflow.entity.NodeInstance; import com.qqchen.deploy.backend.workflow.enums.NodeStatusEnum; import com.qqchen.deploy.backend.workflow.repository.INodeInstanceRepository; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/executor/EndNodeExecutor.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/EndNodeExecutor.java similarity index 92% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/executor/EndNodeExecutor.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/EndNodeExecutor.java index 226a6c59..51084f93 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/executor/EndNodeExecutor.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/EndNodeExecutor.java @@ -1,8 +1,7 @@ -package com.qqchen.deploy.backend.workflow.engine.node.executor; +package com.qqchen.deploy.backend.workflow.engine.executor.node; import com.qqchen.deploy.backend.system.enums.LogLevelEnum; import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; -import com.qqchen.deploy.backend.workflow.engine.node.AbstractNodeExecutor; import com.qqchen.deploy.backend.workflow.entity.NodeInstance; import com.qqchen.deploy.backend.workflow.entity.WorkflowInstance; import com.qqchen.deploy.backend.workflow.enums.NodeTypeEnum; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/NodeExecutor.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/NodeExecutor.java similarity index 92% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/NodeExecutor.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/NodeExecutor.java index b769fc67..d5d05b60 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/NodeExecutor.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/NodeExecutor.java @@ -1,4 +1,4 @@ -package com.qqchen.deploy.backend.workflow.engine.executor; +package com.qqchen.deploy.backend.workflow.engine.executor.node; import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; import com.qqchen.deploy.backend.workflow.entity.NodeInstance; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/executor/ScriptNodeExecutor.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/ScriptNodeExecutor.java similarity index 97% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/executor/ScriptNodeExecutor.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/ScriptNodeExecutor.java index fdf30f64..cee632e5 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/executor/ScriptNodeExecutor.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/ScriptNodeExecutor.java @@ -1,12 +1,11 @@ -package com.qqchen.deploy.backend.workflow.engine.node.executor; +package com.qqchen.deploy.backend.workflow.engine.executor.node; import com.fasterxml.jackson.databind.ObjectMapper; import com.qqchen.deploy.backend.system.enums.LogLevelEnum; import com.qqchen.deploy.backend.framework.enums.ResponseCode; import com.qqchen.deploy.backend.workflow.engine.exception.WorkflowEngineException; import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; -import com.qqchen.deploy.backend.workflow.engine.node.AbstractNodeExecutor; -import com.qqchen.deploy.backend.workflow.engine.node.ScriptNodeConfig; +import com.qqchen.deploy.backend.workflow.engine.executor.node.config.ScriptNodeConfig; import com.qqchen.deploy.backend.workflow.entity.NodeInstance; import com.qqchen.deploy.backend.workflow.enums.NodeTypeEnum; import com.qqchen.deploy.backend.workflow.service.WorkflowVariableOperations; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/executor/ShellNodeExecutor.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/ShellNodeExecutor.java similarity index 97% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/executor/ShellNodeExecutor.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/ShellNodeExecutor.java index a4d98a45..3e15b8a2 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/executor/ShellNodeExecutor.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/ShellNodeExecutor.java @@ -1,12 +1,11 @@ -package com.qqchen.deploy.backend.workflow.engine.node.executor; +package com.qqchen.deploy.backend.workflow.engine.executor.node; import com.fasterxml.jackson.databind.ObjectMapper; import com.qqchen.deploy.backend.system.enums.LogLevelEnum; import com.qqchen.deploy.backend.framework.enums.ResponseCode; import com.qqchen.deploy.backend.workflow.engine.exception.WorkflowEngineException; import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; -import com.qqchen.deploy.backend.workflow.engine.node.AbstractNodeExecutor; -import com.qqchen.deploy.backend.workflow.engine.node.ShellNodeConfig; +import com.qqchen.deploy.backend.workflow.engine.executor.node.config.ShellNodeConfig; import com.qqchen.deploy.backend.workflow.entity.NodeInstance; import com.qqchen.deploy.backend.workflow.enums.NodeTypeEnum; import com.qqchen.deploy.backend.workflow.service.WorkflowVariableOperations; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/executor/StartNodeExecutor.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/StartNodeExecutor.java similarity index 93% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/executor/StartNodeExecutor.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/StartNodeExecutor.java index ce1468d0..5a15acc5 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/executor/StartNodeExecutor.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/StartNodeExecutor.java @@ -1,8 +1,7 @@ -package com.qqchen.deploy.backend.workflow.engine.node.executor; +package com.qqchen.deploy.backend.workflow.engine.executor.node; import com.qqchen.deploy.backend.system.enums.LogLevelEnum; import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; -import com.qqchen.deploy.backend.workflow.engine.node.AbstractNodeExecutor; import com.qqchen.deploy.backend.workflow.entity.NodeInstance; import com.qqchen.deploy.backend.workflow.entity.WorkflowInstance; import com.qqchen.deploy.backend.workflow.enums.NodeTypeEnum; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/TaskNodeExecutor.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/TaskNodeExecutor.java similarity index 96% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/TaskNodeExecutor.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/TaskNodeExecutor.java index c43e0796..0f7649d5 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/TaskNodeExecutor.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/TaskNodeExecutor.java @@ -1,10 +1,11 @@ -package com.qqchen.deploy.backend.workflow.engine.executor; +package com.qqchen.deploy.backend.workflow.engine.executor.node; import com.fasterxml.jackson.databind.ObjectMapper; import com.qqchen.deploy.backend.system.enums.LogLevelEnum; import com.qqchen.deploy.backend.framework.enums.ResponseCode; import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContextOperations; import com.qqchen.deploy.backend.workflow.engine.exception.WorkflowEngineException; +import com.qqchen.deploy.backend.workflow.engine.executor.task.TaskConfig; import com.qqchen.deploy.backend.workflow.entity.NodeInstance; import com.qqchen.deploy.backend.workflow.enums.NodeStatusEnum; import com.qqchen.deploy.backend.workflow.enums.NodeTypeEnum; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ApprovalNodeConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ApprovalNodeConfig.java similarity index 90% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ApprovalNodeConfig.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ApprovalNodeConfig.java index 0afc317e..36c879da 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ApprovalNodeConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ApprovalNodeConfig.java @@ -1,4 +1,4 @@ -package com.qqchen.deploy.backend.workflow.engine.node; +package com.qqchen.deploy.backend.workflow.engine.executor.node.config; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ConditionNodeConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ConditionNodeConfig.java similarity index 91% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ConditionNodeConfig.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ConditionNodeConfig.java index 55e2394f..58e12285 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ConditionNodeConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ConditionNodeConfig.java @@ -1,4 +1,4 @@ -package com.qqchen.deploy.backend.workflow.engine.node; +package com.qqchen.deploy.backend.workflow.engine.executor.node.config; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/GitNodeConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/GitNodeConfig.java similarity index 91% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/GitNodeConfig.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/GitNodeConfig.java index a67ec11c..14ceabeb 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/GitNodeConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/GitNodeConfig.java @@ -1,4 +1,4 @@ -package com.qqchen.deploy.backend.workflow.engine.node; +package com.qqchen.deploy.backend.workflow.engine.executor.node.config; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/HttpNodeConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/HttpNodeConfig.java similarity index 92% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/HttpNodeConfig.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/HttpNodeConfig.java index b9dd461d..05df8417 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/HttpNodeConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/HttpNodeConfig.java @@ -1,4 +1,4 @@ -package com.qqchen.deploy.backend.workflow.engine.node; +package com.qqchen.deploy.backend.workflow.engine.executor.node.config; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/JenkinsNodeConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/JenkinsNodeConfig.java similarity index 91% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/JenkinsNodeConfig.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/JenkinsNodeConfig.java index d3624dd6..8167ee5e 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/JenkinsNodeConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/JenkinsNodeConfig.java @@ -1,4 +1,4 @@ -package com.qqchen.deploy.backend.workflow.engine.node; +package com.qqchen.deploy.backend.workflow.engine.executor.node.config; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NacosNodeConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/NacosNodeConfig.java similarity index 92% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NacosNodeConfig.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/NacosNodeConfig.java index 98c0025c..cf9a06f3 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NacosNodeConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/NacosNodeConfig.java @@ -1,4 +1,4 @@ -package com.qqchen.deploy.backend.workflow.engine.node; +package com.qqchen.deploy.backend.workflow.engine.executor.node.config; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NodeConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/NodeConfig.java similarity index 90% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NodeConfig.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/NodeConfig.java index 68ae8a93..d1302650 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NodeConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/NodeConfig.java @@ -1,7 +1,8 @@ -package com.qqchen.deploy.backend.workflow.engine.node; +package com.qqchen.deploy.backend.workflow.engine.executor.node.config; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.qqchen.deploy.backend.workflow.enums.NodeTypeEnum; import lombok.Data; /** @@ -36,7 +37,7 @@ public abstract class NodeConfig { /** * 节点类型 */ - private NodeType type; + private NodeTypeEnum type; /** * 超时时间(分钟) diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NotifyNodeConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/NotifyNodeConfig.java similarity index 92% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NotifyNodeConfig.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/NotifyNodeConfig.java index 628aad74..833335ef 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NotifyNodeConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/NotifyNodeConfig.java @@ -1,4 +1,4 @@ -package com.qqchen.deploy.backend.workflow.engine.node; +package com.qqchen.deploy.backend.workflow.engine.executor.node.config; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ParallelNodeConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ParallelNodeConfig.java similarity index 92% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ParallelNodeConfig.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ParallelNodeConfig.java index a24838ad..92d0b926 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ParallelNodeConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ParallelNodeConfig.java @@ -1,4 +1,4 @@ -package com.qqchen.deploy.backend.workflow.engine.node; +package com.qqchen.deploy.backend.workflow.engine.executor.node.config; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ScriptNodeConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ScriptNodeConfig.java similarity index 94% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ScriptNodeConfig.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ScriptNodeConfig.java index ca82a3dc..2d2a2fe0 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ScriptNodeConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ScriptNodeConfig.java @@ -1,4 +1,4 @@ -package com.qqchen.deploy.backend.workflow.engine.node; +package com.qqchen.deploy.backend.workflow.engine.executor.node.config; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ShellNodeConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ShellNodeConfig.java similarity index 93% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ShellNodeConfig.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ShellNodeConfig.java index aa4fa076..53c7a51c 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/ShellNodeConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/node/config/ShellNodeConfig.java @@ -1,4 +1,4 @@ -package com.qqchen.deploy.backend.workflow.engine.node; +package com.qqchen.deploy.backend.workflow.engine.executor.node.config; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/TaskConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/task/TaskConfig.java similarity index 78% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/TaskConfig.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/task/TaskConfig.java index b0c0a17e..68e9fa25 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/TaskConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/task/TaskConfig.java @@ -1,5 +1,6 @@ -package com.qqchen.deploy.backend.workflow.engine.executor; +package com.qqchen.deploy.backend.workflow.engine.executor.task; +import com.qqchen.deploy.backend.workflow.enums.TaskTypeEnum; import lombok.Data; import java.util.Map; @@ -10,7 +11,7 @@ public class TaskConfig { /** * 任务类型 */ - private TaskType type; + private TaskTypeEnum type; /** * 任务名称 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NodeType.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NodeType.java deleted file mode 100644 index f11c66e3..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/node/NodeType.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.qqchen.deploy.backend.workflow.engine.node; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 节点类型枚举 - */ -@Getter -@AllArgsConstructor -public enum NodeType { - - START("START", "开始节点"), - END("END", "结束节点"), - APPROVAL("APPROVAL", "审批节点"), - SCRIPT("SCRIPT", "脚本节点"), - JENKINS("JENKINS", "Jenkins构建节点"), - GIT("GIT", "Git操作节点"), - CONDITION("CONDITION", "条件节点"), - PARALLEL("PARALLEL", "并行节点"), - NACOS("NACOS", "Nacos配置节点"), - HTTP("HTTP", "HTTP请求节点"), - NOTIFY("NOTIFY", "通知节点"); - - private final String code; - private final String description; -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/NodeType.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/NodeType.java index c2e80cc0..1c1d0374 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/NodeType.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/NodeType.java @@ -2,7 +2,7 @@ package com.qqchen.deploy.backend.workflow.entity; import com.qqchen.deploy.backend.framework.annotation.LogicDelete; import com.qqchen.deploy.backend.framework.domain.Entity; -import com.qqchen.deploy.backend.workflow.enums.NodeCategory; +import com.qqchen.deploy.backend.workflow.enums.NodeCategoryEnum; import jakarta.persistence.Column; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; @@ -43,7 +43,7 @@ public class NodeType extends Entity { */ @Enumerated(EnumType.STRING) @Column(nullable = false) - private NodeCategory category; + private NodeCategoryEnum category; /** * 节点图标 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayType.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/GatewayTypeEnum.java similarity index 77% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayType.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/GatewayTypeEnum.java index a7c9b19a..0a987fa5 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/GatewayType.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/GatewayTypeEnum.java @@ -1,11 +1,11 @@ -package com.qqchen.deploy.backend.workflow.engine.executor; +package com.qqchen.deploy.backend.workflow.enums; import lombok.AllArgsConstructor; import lombok.Getter; @Getter @AllArgsConstructor -public enum GatewayType { +public enum GatewayTypeEnum { EXCLUSIVE("EXCLUSIVE", "排他网关"), PARALLEL("PARALLEL", "并行网关"), diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeCategory.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeCategoryEnum.java similarity index 89% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeCategory.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeCategoryEnum.java index bc0d4e17..8e7522a7 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeCategory.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeCategoryEnum.java @@ -6,7 +6,7 @@ import lombok.Getter; * 节点分类枚举 */ @Getter -public enum NodeCategory { +public enum NodeCategoryEnum { /** * 基础节点(如开始、结束节点) */ @@ -32,7 +32,7 @@ public enum NodeCategory { */ private final String name; - NodeCategory(String name) { + NodeCategoryEnum(String name) { this.name = name; } } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeTypeEnum.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeTypeEnum.java index 0629ea4e..6dd054b8 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeTypeEnum.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeTypeEnum.java @@ -19,7 +19,12 @@ public enum NodeTypeEnum { SCRIPT(6, "SCRIPT", "脚本节点"), APPROVAL(7, "APPROVAL", "审批节点"), JENKINS(8, "JENKINS", "Jenkins任务节点"), - GIT(9, "GIT", "Git操作节点"); + GIT(9, "GIT", "Git操作节点"), + CONDITION(10, "CONDITION", "条件节点"), + PARALLEL(11, "PARALLEL", "并行节点"), + NACOS(12, "NACOS", "Nacos配置节点"), + HTTP(13, "HTTP", "HTTP请求节点"), + NOTIFY(14, "NOTIFY", "通知节点"); private final int value; private final String code; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/TaskType.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/TaskTypeEnum.java similarity index 72% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/TaskType.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/TaskTypeEnum.java index 0e02ac1a..fbe0a246 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/executor/TaskType.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/TaskTypeEnum.java @@ -1,11 +1,11 @@ -package com.qqchen.deploy.backend.workflow.engine.executor; +package com.qqchen.deploy.backend.workflow.enums; import lombok.AllArgsConstructor; import lombok.Getter; @Getter @AllArgsConstructor -public enum TaskType { +public enum TaskTypeEnum { HTTP("HTTP", "HTTP请求"), JAVA("JAVA", "Java方法"); diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowVariableRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowVariableRepository.java index e9f59002..0122f70c 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowVariableRepository.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowVariableRepository.java @@ -4,6 +4,7 @@ import com.qqchen.deploy.backend.framework.repository.IBaseRepository; import com.qqchen.deploy.backend.workflow.entity.WorkflowInstance; import com.qqchen.deploy.backend.workflow.entity.WorkflowVariable; import com.qqchen.deploy.backend.workflow.enums.VariableScopeEnum; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -79,10 +80,18 @@ public interface IWorkflowVariableRepository extends IBaseRepository new BusinessException(ResponseCode.WORKFLOW_NODE_TYPE_NOT_FOUND)); // 2. 检查节点类型是否为任务节点 - if (!NodeCategory.TASK.equals(nodeType.getCategory())) { + if (!NodeCategoryEnum.TASK.equals(nodeType.getCategory())) { // 非任务节点没有执行器列表 return Collections.emptyList(); } diff --git a/backend/src/test/java/com/qqchen/deploy/backend/workflow/engine/DefaultWorkflowEngineTest.java b/backend/src/test/java/com/qqchen/deploy/backend/workflow/engine/DefaultWorkflowEngineTest.java index 9a089728..466a1a09 100644 --- a/backend/src/test/java/com/qqchen/deploy/backend/workflow/engine/DefaultWorkflowEngineTest.java +++ b/backend/src/test/java/com/qqchen/deploy/backend/workflow/engine/DefaultWorkflowEngineTest.java @@ -4,7 +4,7 @@ import com.qqchen.deploy.backend.framework.enums.ResponseCode; import com.qqchen.deploy.backend.workflow.engine.context.DefaultWorkflowContext; import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContext; import com.qqchen.deploy.backend.workflow.engine.exception.WorkflowEngineException; -import com.qqchen.deploy.backend.workflow.engine.executor.NodeExecutor; +import com.qqchen.deploy.backend.workflow.engine.executor.node.NodeExecutor; import com.qqchen.deploy.backend.workflow.entity.NodeInstance; import com.qqchen.deploy.backend.workflow.entity.WorkflowDefinition; import com.qqchen.deploy.backend.workflow.entity.WorkflowInstance; @@ -21,9 +21,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.time.LocalDateTime; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Optional; diff --git a/backend/src/test/java/com/qqchen/deploy/backend/workflow/engine/executor/StartNodeExecutorTest.java b/backend/src/test/java/com/qqchen/deploy/backend/workflow/engine/executor/StartNodeExecutorTest.java index 46967681..7e737661 100644 --- a/backend/src/test/java/com/qqchen/deploy/backend/workflow/engine/executor/StartNodeExecutorTest.java +++ b/backend/src/test/java/com/qqchen/deploy/backend/workflow/engine/executor/StartNodeExecutorTest.java @@ -2,6 +2,7 @@ package com.qqchen.deploy.backend.workflow.engine.executor; import com.qqchen.deploy.backend.system.enums.LogLevelEnum; import com.qqchen.deploy.backend.workflow.engine.context.WorkflowContext; +import com.qqchen.deploy.backend.workflow.engine.executor.node.StartNodeExecutor; import com.qqchen.deploy.backend.workflow.entity.NodeInstance; import com.qqchen.deploy.backend.workflow.enums.NodeStatusEnum; import com.qqchen.deploy.backend.workflow.enums.NodeTypeEnum;