mirror of
https://github.com/PowerJob/PowerJob.git
synced 2025-07-17 00:00:04 +08:00
feat: copy workflow API
This commit is contained in:
parent
bf5f6ef0db
commit
21291b34cb
@ -39,6 +39,7 @@ public class OpenAPIConstant {
|
||||
/* ************* Workflow 区 ************* */
|
||||
|
||||
public static final String SAVE_WORKFLOW = "/saveWorkflow";
|
||||
public static final String COPY_WORKFLOW = "/copyWorkflow";
|
||||
public static final String FETCH_WORKFLOW = "/fetchWorkflow";
|
||||
public static final String DISABLE_WORKFLOW = "/disableWorkflow";
|
||||
public static final String ENABLE_WORKFLOW = "/enableWorkflow";
|
||||
|
@ -32,10 +32,7 @@ import org.springframework.util.StringUtils;
|
||||
import javax.annotation.Resource;
|
||||
import javax.transaction.Transactional;
|
||||
import java.text.ParseException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Workflow 服务
|
||||
@ -102,6 +99,69 @@ public class WorkflowService {
|
||||
return newEntity.getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* 深度复制工作流
|
||||
*
|
||||
* @param wfId 工作流 ID
|
||||
* @param appId APP ID
|
||||
* @return 生成的工作流 ID
|
||||
*/
|
||||
@Transactional(rollbackOn = Exception.class)
|
||||
public long copyWorkflow(Long wfId, Long appId) {
|
||||
|
||||
WorkflowInfoDO originWorkflow = permissionCheck(wfId, appId);
|
||||
if (originWorkflow.getStatus() == SwitchableStatus.DELETED.getV()) {
|
||||
throw new IllegalStateException("can't copy the workflow which has been deleted!");
|
||||
}
|
||||
// 拷贝基础信息
|
||||
WorkflowInfoDO copyWorkflow = new WorkflowInfoDO();
|
||||
BeanUtils.copyProperties(originWorkflow, copyWorkflow);
|
||||
copyWorkflow.setId(null);
|
||||
copyWorkflow.setGmtCreate(new Date());
|
||||
copyWorkflow.setGmtModified(new Date());
|
||||
copyWorkflow.setWfName(copyWorkflow.getWfName() + "_COPY");
|
||||
// 先 save 获取 id
|
||||
copyWorkflow = workflowInfoRepository.saveAndFlush(copyWorkflow);
|
||||
|
||||
if (StringUtils.isEmpty(copyWorkflow.getPeDAG())) {
|
||||
return copyWorkflow.getId();
|
||||
}
|
||||
|
||||
PEWorkflowDAG dag = JSON.parseObject(copyWorkflow.getPeDAG(), PEWorkflowDAG.class);
|
||||
|
||||
// 拷贝节点信息,并且更新 DAG 中的节点信息
|
||||
if (!CollectionUtils.isEmpty(dag.getNodes())) {
|
||||
// originNodeId => copyNodeId
|
||||
HashMap<Long, Long> nodeIdMap = new HashMap<>(dag.getNodes().size(), 1);
|
||||
// 校正 节点信息
|
||||
for (PEWorkflowDAG.Node node : dag.getNodes()) {
|
||||
|
||||
WorkflowNodeInfoDO originNode = workflowNodeInfoRepository.findById(node.getNodeId()).orElseThrow(() -> new IllegalArgumentException("can't find workflow Node by id: " + node.getNodeId()));
|
||||
|
||||
WorkflowNodeInfoDO copyNode = new WorkflowNodeInfoDO();
|
||||
BeanUtils.copyProperties(originNode, copyNode);
|
||||
copyNode.setId(null);
|
||||
copyNode.setWorkflowId(copyWorkflow.getId());
|
||||
copyNode.setGmtCreate(new Date());
|
||||
copyNode.setGmtModified(new Date());
|
||||
|
||||
copyNode = workflowNodeInfoRepository.saveAndFlush(copyNode);
|
||||
nodeIdMap.put(originNode.getId(), copyNode.getId());
|
||||
|
||||
node.setNodeId(copyNode.getId());
|
||||
}
|
||||
// 校正 边信息
|
||||
for (PEWorkflowDAG.Edge edge : dag.getEdges()) {
|
||||
edge.setFrom(nodeIdMap.get(edge.getFrom()));
|
||||
edge.setTo(nodeIdMap.get(edge.getTo()));
|
||||
}
|
||||
}
|
||||
copyWorkflow.setPeDAG(JSON.toJSONString(dag));
|
||||
workflowInfoRepository.saveAndFlush(copyWorkflow);
|
||||
return copyWorkflow.getId();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取工作流元信息,这里获取到的 DAG 包含节点的完整信息(是否启用、是否允许失败跳过)
|
||||
*
|
||||
|
@ -151,6 +151,12 @@ public class OpenAPIController {
|
||||
return ResultDTO.success(workflowService.saveWorkflow(request));
|
||||
}
|
||||
|
||||
@PostMapping(OpenAPIConstant.COPY_WORKFLOW)
|
||||
public ResultDTO<Long> copy(Long workflowId, Long appId) {
|
||||
return ResultDTO.success(workflowService.copyWorkflow(workflowId,appId));
|
||||
}
|
||||
|
||||
|
||||
@PostMapping(OpenAPIConstant.FETCH_WORKFLOW)
|
||||
public ResultDTO<WorkflowInfoVO> fetchWorkflow(Long workflowId, Long appId) {
|
||||
return ResultDTO.success(workflowService.fetchWorkflow(workflowId, appId));
|
||||
|
@ -1,5 +1,8 @@
|
||||
package com.github.kfcfans.powerjob.server.web.controller;
|
||||
|
||||
import com.github.kfcfans.powerjob.common.request.http.AddWorkflowNodeRequest;
|
||||
import com.github.kfcfans.powerjob.common.request.http.ModifyWorkflowNodeRequest;
|
||||
import com.github.kfcfans.powerjob.common.request.http.SaveWorkflowDAGRequest;
|
||||
import com.github.kfcfans.powerjob.common.request.http.SaveWorkflowRequest;
|
||||
import com.github.kfcfans.powerjob.common.response.ResultDTO;
|
||||
import com.github.kfcfans.powerjob.server.common.constans.SwitchableStatus;
|
||||
@ -8,10 +11,7 @@ import com.github.kfcfans.powerjob.server.persistence.core.model.WorkflowInfoDO;
|
||||
import com.github.kfcfans.powerjob.server.persistence.core.model.WorkflowNodeInfoDO;
|
||||
import com.github.kfcfans.powerjob.server.persistence.core.repository.WorkflowInfoRepository;
|
||||
import com.github.kfcfans.powerjob.server.service.workflow.WorkflowService;
|
||||
import com.github.kfcfans.powerjob.common.request.http.AddWorkflowNodeRequest;
|
||||
import com.github.kfcfans.powerjob.common.request.http.ModifyWorkflowNodeRequest;
|
||||
import com.github.kfcfans.powerjob.server.web.request.QueryWorkflowInfoRequest;
|
||||
import com.github.kfcfans.powerjob.common.request.http.SaveWorkflowDAGRequest;
|
||||
import com.github.kfcfans.powerjob.server.web.response.WorkflowInfoVO;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
@ -45,6 +45,11 @@ public class WorkflowController {
|
||||
return ResultDTO.success(workflowService.saveWorkflow(req));
|
||||
}
|
||||
|
||||
@PostMapping("/copy")
|
||||
public ResultDTO<Long> copy(Long workflowId, Long appId) {
|
||||
return ResultDTO.success(workflowService.copyWorkflow(workflowId,appId));
|
||||
}
|
||||
|
||||
@GetMapping("/disable")
|
||||
public ResultDTO<Void> disableWorkflow(Long workflowId, Long appId) {
|
||||
workflowService.disableWorkflow(workflowId, appId);
|
||||
|
Loading…
x
Reference in New Issue
Block a user