feat: 2.6.0
1. 查询DAG详情
This commit is contained in:
parent
71a7f14339
commit
da2bc50b9b
@ -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() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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<NodeInfo> 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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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<Long> 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<WorkflowNode> workflowNodes = workflowNodeMapper.selectList(new LambdaQueryWrapper<WorkflowNode>()
|
||||
.eq(WorkflowNode::getDeleted, 0)
|
||||
.eq(WorkflowNode::getWorkflowId, id));
|
||||
|
||||
Map<Long, WorkflowNode> workflowNodeMap = workflowNodes.stream().collect(Collectors.toMap(WorkflowNode::getId, i -> i));
|
||||
|
||||
String flowInfo = workflow.getFlowInfo();
|
||||
// 反序列化构建图
|
||||
MutableGraph<Long> graph = GraphBuilder.directed().allowsSelfLoops(false).build();
|
||||
Set<Long> successors = graph.successors(root);
|
||||
for (Long nodeId : successors) {
|
||||
WorkflowNode workflowNode = workflowNodeMap.get(nodeId);
|
||||
nodeConfig.setNodeType(workflowNode.getNodeType());
|
||||
List<WorkflowDetailResponseVO.NodeInfo> nodeInfos = Optional.ofNullable(nodeConfig.getConditionNodes()).orElse(Lists.newArrayList());
|
||||
nodeInfos.add(WorkflowConverter.INSTANCE.toNodeInfo(workflowNode));
|
||||
nodeConfig.setConditionNodes(nodeInfos);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private Map<Long, Iterable<Long>> convertGraphToAdjacencyList(MutableGraph<Long> graph) {
|
||||
Map<Long, Iterable<Long>> 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) {
|
||||
|
Loading…
Reference in New Issue
Block a user