From da2bc50b9b1529e201d2c5cdcb13eda0b3f24843 Mon Sep 17 00:00:00 2001 From: byteblogs168 <598092184@qq.com> Date: Thu, 14 Dec 2023 23:32:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=202.6.0=201.=20=E6=9F=A5=E8=AF=A2DAG?= =?UTF-8?q?=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/WorkflowController.java | 10 +- .../response/WorkflowDetailResponseVO.java | 121 ++++++++++++++++++ .../server/web/service/WorkflowService.java | 3 + .../service/convert/WorkflowConverter.java | 4 + .../web/service/impl/WorkflowServiceImpl.java | 46 ++++++- 5 files changed, 173 insertions(+), 11 deletions(-) create mode 100644 easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/response/WorkflowDetailResponseVO.java diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/WorkflowController.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/WorkflowController.java index a35272c3a..0b26c9c07 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/WorkflowController.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/WorkflowController.java @@ -1,9 +1,9 @@ package com.aizuda.easy.retry.server.web.controller; import com.aizuda.easy.retry.server.web.model.request.WorkflowRequestVO; +import com.aizuda.easy.retry.server.web.model.response.WorkflowDetailResponseVO; import com.aizuda.easy.retry.server.web.service.WorkflowService; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -29,6 +29,11 @@ public class WorkflowController { } + @GetMapping("{id}") + public WorkflowDetailResponseVO getWorkflowDetail(@PathVariable("id") Long id) { + return workflowService.getWorkflowDetail(id); + } + @PostMapping("/start") public void startWorkflow() { @@ -49,8 +54,5 @@ public class WorkflowController { } - public void getWorkflowDetail() { - - } } diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/response/WorkflowDetailResponseVO.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/response/WorkflowDetailResponseVO.java new file mode 100644 index 000000000..13a7fe58b --- /dev/null +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/response/WorkflowDetailResponseVO.java @@ -0,0 +1,121 @@ +package com.aizuda.easy.retry.server.web.model.response; + +import lombok.Data; + +import java.util.List; + +/** + * @author xiaowoniu + * @date 2023-12-14 22:59:33 + * @since 2.6.0 + */ +@Data +public class WorkflowDetailResponseVO { + + /** + * 工作流ID + */ + private Long id; + + /** + * 组名称 + */ + private String groupName; + + /** + * 触发类型 + */ + private Integer triggerType; + + /** + * 触发间隔 + */ + private String triggerInterval; + + /** + * 超时时间 + */ + private Integer executorTimeout; + + /** + * 0、关闭、1、开启 + */ + private Integer workflowStatus; + + /** + * DAG节点配置 + */ + private NodeConfig nodeConfig; + + @Data + public static class NodeConfig { + + /** + * 1、任务节点 2、条件节点 3、回调节点 + */ + private Integer nodeType; + + /** + * 节点信息 + */ + private List conditionNodes; + + /** + * 子节点 + */ + private NodeConfig childNode; + + } + + @Data + public static class NodeInfo { + + /** + * 节点ID + */ + private Long id; + + /** + * 节点名称 + */ + private String nodeName; + + /** + * 优先级 + */ + private Integer priorityLevel; + + /** + * 任务ID + */ + private Long jobId; + + /** + * 表达式类型 1、SpEl、2、Aviator 3、QL + */ + private Integer expressionType; + + /** + * 条件节点表达式 + */ + private String nodeExpression; + + /** + * 1、跳过 2、阻塞 + */ + private Integer failStrategy; + + /** + * 工作流状态 0、关闭、1、开启 + */ + private Integer workflowNodeStatus; + + /** + * 子节点 + */ + private NodeConfig childNode; + + } + + +} diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/WorkflowService.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/WorkflowService.java index 76b3c1bee..86f99a262 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/WorkflowService.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/WorkflowService.java @@ -1,6 +1,7 @@ package com.aizuda.easy.retry.server.web.service; import com.aizuda.easy.retry.server.web.model.request.WorkflowRequestVO; +import com.aizuda.easy.retry.server.web.model.response.WorkflowDetailResponseVO; /** * @author xiaowoniu @@ -10,4 +11,6 @@ import com.aizuda.easy.retry.server.web.model.request.WorkflowRequestVO; public interface WorkflowService { boolean saveWorkflow(WorkflowRequestVO workflowRequestVO); + + WorkflowDetailResponseVO getWorkflowDetail(Long id); } diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/convert/WorkflowConverter.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/convert/WorkflowConverter.java index 2fe6e2df8..f425e4ae6 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/convert/WorkflowConverter.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/convert/WorkflowConverter.java @@ -1,6 +1,7 @@ package com.aizuda.easy.retry.server.web.service.convert; import com.aizuda.easy.retry.server.web.model.request.WorkflowRequestVO; +import com.aizuda.easy.retry.server.web.model.response.WorkflowDetailResponseVO; import com.aizuda.easy.retry.template.datasource.persistence.po.Workflow; import com.aizuda.easy.retry.template.datasource.persistence.po.WorkflowNode; import org.mapstruct.Mapper; @@ -22,4 +23,7 @@ public interface WorkflowConverter { WorkflowNode toWorkflowNode(WorkflowRequestVO.NodeInfo nodeInfo); + WorkflowDetailResponseVO toWorkflowDetailResponseVO(Workflow workflow); + + WorkflowDetailResponseVO.NodeInfo toNodeInfo(WorkflowNode workflowNode); } diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/WorkflowServiceImpl.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/WorkflowServiceImpl.java index 6a2940d54..0763ac467 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/WorkflowServiceImpl.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/WorkflowServiceImpl.java @@ -7,12 +7,14 @@ import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException; import com.aizuda.easy.retry.server.web.model.request.WorkflowRequestVO; import com.aizuda.easy.retry.server.web.model.request.WorkflowRequestVO.NodeConfig; import com.aizuda.easy.retry.server.web.model.request.WorkflowRequestVO.NodeInfo; +import com.aizuda.easy.retry.server.web.model.response.WorkflowDetailResponseVO; import com.aizuda.easy.retry.server.web.service.WorkflowService; import com.aizuda.easy.retry.server.web.service.convert.WorkflowConverter; import com.aizuda.easy.retry.template.datasource.persistence.mapper.WorkflowMapper; import com.aizuda.easy.retry.template.datasource.persistence.mapper.WorkflowNodeMapper; import com.aizuda.easy.retry.template.datasource.persistence.po.Workflow; import com.aizuda.easy.retry.template.datasource.persistence.po.WorkflowNode; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.common.collect.Lists; import com.google.common.graph.ElementOrder; import com.google.common.graph.GraphBuilder; @@ -23,10 +25,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; +import java.util.stream.Collectors; /** * @author xiaowoniu @@ -39,11 +39,12 @@ import java.util.Objects; public class WorkflowServiceImpl implements WorkflowService { private final WorkflowMapper workflowMapper; private final WorkflowNodeMapper workflowNodeMapper; + private final static long root = -1; + @Override @Transactional public boolean saveWorkflow(WorkflowRequestVO workflowRequestVO) { - Long root = -1L; MutableGraph graph = GraphBuilder.directed().allowsSelfLoops(false).build(); // 添加虚拟头节点 graph.addNode(root); @@ -51,7 +52,7 @@ public class WorkflowServiceImpl implements WorkflowService { // 组装工作流信息 Workflow workflow = WorkflowConverter.INSTANCE.toWorkflow(workflowRequestVO); workflow.setFlowInfo(StrUtil.EMPTY); - Assert.isTrue(1 == workflowMapper.insert(workflow), () -> new EasyRetryServerException("新增工作流失败")); + Assert.isTrue(1 == workflowMapper.insert(workflow), () -> new EasyRetryServerException("新增工作流失败")); // 获取DAG节点配置 NodeConfig nodeConfig = workflowRequestVO.getNodeConfig(); @@ -67,6 +68,37 @@ public class WorkflowServiceImpl implements WorkflowService { return true; } + @Override + public WorkflowDetailResponseVO getWorkflowDetail(Long id) { + + Workflow workflow = workflowMapper.selectById(id); + WorkflowDetailResponseVO responseVO = WorkflowConverter.INSTANCE.toWorkflowDetailResponseVO(workflow); + WorkflowDetailResponseVO.NodeConfig nodeConfig = new WorkflowDetailResponseVO.NodeConfig(); + responseVO.setNodeConfig(nodeConfig); + List workflowNodes = workflowNodeMapper.selectList(new LambdaQueryWrapper() + .eq(WorkflowNode::getDeleted, 0) + .eq(WorkflowNode::getWorkflowId, id)); + + Map workflowNodeMap = workflowNodes.stream().collect(Collectors.toMap(WorkflowNode::getId, i -> i)); + + String flowInfo = workflow.getFlowInfo(); + // 反序列化构建图 + MutableGraph graph = GraphBuilder.directed().allowsSelfLoops(false).build(); + Set successors = graph.successors(root); + for (Long nodeId : successors) { + WorkflowNode workflowNode = workflowNodeMap.get(nodeId); + nodeConfig.setNodeType(workflowNode.getNodeType()); + List nodeInfos = Optional.ofNullable(nodeConfig.getConditionNodes()).orElse(Lists.newArrayList()); + nodeInfos.add(WorkflowConverter.INSTANCE.toNodeInfo(workflowNode)); + nodeConfig.setConditionNodes(nodeInfos); + } + + return null; + } + + + + private Map> convertGraphToAdjacencyList(MutableGraph graph) { Map> adjacencyList = new HashMap<>(); @@ -91,7 +123,7 @@ public class WorkflowServiceImpl implements WorkflowService { WorkflowNode workflowNode = WorkflowConverter.INSTANCE.toWorkflowNode(nodeInfo); workflowNode.setWorkflowId(workflowId); workflowNode.setGroupName(groupName); - Assert.isTrue(1 == workflowNodeMapper.insert(workflowNode), () -> new EasyRetryServerException("新增工作流节点失败")); + Assert.isTrue(1 == workflowNodeMapper.insert(workflowNode), () -> new EasyRetryServerException("新增工作流节点失败")); // 添加节点 graph.addNode(workflowNode.getId()); for (final Long parentId : parentIds) {