feat:任务执行流程

This commit is contained in:
2025-12-01 16:49:19 +08:00
parent debfa7cb93
commit 3154698e07
16 changed files with 123 additions and 56 deletions

View File

@@ -7,7 +7,6 @@ import com.sdm.capability.model.entity.SimulationFlowNode;
import com.sdm.capability.service.ISimulationFlowNodeService;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.capability.FlowNodeDto;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
@@ -15,7 +14,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class ISimulationFlowNodeServiceImpl extends ServiceImpl<SimulationFlowNodeMapper, SimulationFlowNode> implements ISimulationFlowNodeService {

View File

@@ -1,4 +1,4 @@
package com.sdm.flowable.dto;
package com.sdm.common.entity.flowable.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.sdm.flowable.dto;
package com.sdm.common.entity.flowable.dto;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.sdm.flowable.dto;
package com.sdm.common.entity.flowable.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

View File

@@ -34,6 +34,9 @@ public class FlowNodeDto {
@Schema(description = "输出文件夹id")
private Long outputDirId;
@Schema(description = "节点状态:finished/active/pending")
private String nodeStatus;
@Schema(description = "创建人")
private Long creator;

View File

@@ -1,7 +1,7 @@
package com.sdm.flowable.dto.resp;
package com.sdm.common.entity.resp.flowable;
import com.sdm.flowable.dto.NodeDetailInfo;
import com.sdm.flowable.dto.ProcessInstanceInfo;
import com.sdm.common.entity.flowable.dto.NodeDetailInfo;
import com.sdm.common.entity.flowable.dto.ProcessInstanceInfo;
import lombok.Data;
import java.util.List;

View File

@@ -1,16 +1,17 @@
package com.sdm.common.feign.impl.flowable;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.flowable.dto.NodeStructureInfo;
import com.sdm.common.entity.flowable.dto.ProcessDefinitionDTO;
import com.sdm.common.entity.resp.flowable.DeployFlowableResp;
import com.sdm.common.entity.resp.flowable.ProcessInstanceDetailResponse;
import com.sdm.common.entity.resp.flowable.ProcessInstanceResp;
import com.sdm.common.feign.inter.flowable.IFlowableFeignClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
@@ -73,4 +74,30 @@ public class FlowableClientFeignClientImpl implements IFlowableFeignClient {
return SdmResponse.failed("更新流程参数的流程实例id失败");
}
}
@Override
public SdmResponse<ProcessInstanceDetailResponse> getProcessAndNodeDetailByInstanceId(String processInstanceId) {
SdmResponse<ProcessInstanceDetailResponse> response;
try {
response = flowableFeignClient.getProcessAndNodeDetailByInstanceId(processInstanceId);
log.info("查询流程状态以及节点状态:"+ response);
return response;
} catch (Exception e) {
log.error("查询流程状态以及节点状态失败", e);
return SdmResponse.failed("查询流程状态以及节点状态失败");
}
}
@Override
public SdmResponse<List<NodeStructureInfo>> listNodesByProcessDefinitionId(String processDefinitionId) {
SdmResponse<List<NodeStructureInfo>> response;
try {
response = flowableFeignClient.listNodesByProcessDefinitionId(processDefinitionId);
log.info("获取流程定义节点详细信息:"+ response);
return response;
} catch (Exception e) {
log.error("获取流程定义节点详细信息失败", e);
return SdmResponse.failed("获取流程定义节点详细信息失败");
}
}
}

View File

@@ -27,10 +27,10 @@ public interface ISimulationFlowFeignClient {
@PostMapping("/flow/node/batchUpdateSimulationFlowNode")
SdmResponse batchUpdateSimulationFlowNode(@RequestBody FlowNodeDto req);
@PostMapping("/node/listSimulationFlowNode")
@PostMapping("/flow/node/listSimulationFlowNode")
SdmResponse<List<FlowNodeDto>> listSimulationFlowNode(@RequestBody FlowNodeDto req);
@PostMapping("/node/querySimulationFlowNode")
@PostMapping("/flow/node/querySimulationFlowNode")
SdmResponse<FlowNodeDto> querySimulationFlowNode(@RequestBody FlowNodeDto req);
}

View File

@@ -1,8 +1,10 @@
package com.sdm.common.feign.inter.flowable;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.flowable.dto.NodeStructureInfo;
import com.sdm.common.entity.flowable.dto.ProcessDefinitionDTO;
import com.sdm.common.entity.resp.flowable.DeployFlowableResp;
import com.sdm.common.entity.resp.flowable.ProcessInstanceDetailResponse;
import com.sdm.common.entity.resp.flowable.ProcessInstanceResp;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@@ -10,6 +12,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
@@ -22,10 +25,16 @@ public interface IFlowableFeignClient {
@PostMapping("/process/deploy")
SdmResponse<DeployFlowableResp> deploy(@RequestBody ProcessDefinitionDTO processDTO);
@PostMapping("/saveParamsByDefinitionId")
@PostMapping("/process/saveParamsByDefinitionId")
SdmResponse saveParamsByDefinitionId(@RequestParam String processDefinitionId, @RequestParam String nodeId, @RequestBody Map<String, Object> params);
@PostMapping("/updateNodeParamProcessInstanceId")
@PostMapping("/process/updateNodeParamProcessInstanceId")
SdmResponse updateNodeParamProcessInstanceId(@RequestParam String processDefinitionId, @RequestParam String processInstanceId);
@GetMapping("/process/getProcessAndNodeDetailByInstanceId")
SdmResponse<ProcessInstanceDetailResponse> getProcessAndNodeDetailByInstanceId(@RequestParam String processInstanceId);
@GetMapping("/listNodesByProcessDefinitionId")
SdmResponse<List<NodeStructureInfo>> listNodesByProcessDefinitionId(@RequestParam String processDefinitionId);
}

View File

@@ -4,14 +4,14 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.feign.inter.flowable.IFlowableFeignClient;
import com.sdm.flowable.delegate.handler.HpcHandler;
import com.sdm.flowable.dto.NodeStructureInfo;
import com.sdm.common.entity.flowable.dto.NodeStructureInfo;
import com.sdm.common.entity.flowable.dto.ProcessDefinitionDTO;
import com.sdm.flowable.dto.req.AsyncCallbackRequest;
import com.sdm.flowable.dto.req.CompleteTaskReq;
import com.sdm.flowable.dto.req.RetryRequest;
import com.sdm.common.entity.resp.flowable.ProcessInstanceResp;
import com.sdm.common.entity.resp.flowable.DeployFlowableResp;
import com.sdm.flowable.dto.resp.ProcessInstanceDetailResponse;
import com.sdm.common.entity.resp.flowable.ProcessInstanceDetailResponse;
import com.sdm.flowable.process.ProcessService;
import com.sdm.flowable.service.IProcessNodeParamService;
import lombok.extern.slf4j.Slf4j;

View File

@@ -3,14 +3,15 @@ package com.sdm.flowable.process;
import com.sdm.common.common.SdmResponse;
import com.sdm.flowable.constants.FlowableConfig;
import com.sdm.flowable.delegate.UniversalDelegate;
import com.sdm.flowable.dto.NodeDetailInfo;
import com.sdm.flowable.dto.NodeStructureInfo;
import com.sdm.flowable.dto.ProcessInstanceInfo;
import com.sdm.common.entity.flowable.dto.NodeDetailInfo;
import com.sdm.common.entity.flowable.dto.NodeStructureInfo;
import com.sdm.common.entity.flowable.dto.ProcessInstanceInfo;
import com.sdm.common.entity.flowable.dto.ProcessDefinitionDTO;
import com.sdm.flowable.dto.req.AsyncCallbackRequest;
import com.sdm.flowable.dto.resp.ProcessInstanceDetailResponse;
import com.sdm.common.entity.resp.flowable.ProcessInstanceDetailResponse;
import com.sdm.common.entity.resp.flowable.DeployFlowableResp;
import com.sdm.flowable.enums.FlowElementTypeEnums;
import com.sdm.flowable.service.IProcessNodeParamService;
import com.sdm.flowable.util.Dto2BpmnConverter;
import com.sdm.flowable.dto.req.CompleteTaskReq;
import com.sdm.flowable.util.FlowNodeIdUtils;
@@ -60,6 +61,9 @@ public class ProcessService {
@Autowired
private UniversalDelegate universalDelegate;
@Autowired
private IProcessNodeParamService processNodeParamService;
// 部署流程前端传入Flowable标准JSON
public SdmResponse<DeployFlowableResp> deploy(ProcessDefinitionDTO processDTO) throws Exception {
log.info("开始部署流程定义");

View File

@@ -1,6 +1,7 @@
package com.sdm.project.controller;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.capability.FlowNodeDto;
import com.sdm.common.entity.req.data.CreateDirReq;
import com.sdm.common.entity.req.data.KnowledgeCallBackReq;
import com.sdm.common.entity.req.data.QueryDirReq;
@@ -194,4 +195,12 @@ public class SimulationRunController {
return runService.saveNodeParams(req);
}
/**
* 任务执行 查询流程节点列表
*/
@PostMapping("/listFlowNodes")
public SdmResponse<List<FlowNodeDto>> listFlowNodes(@RequestBody SpdmTaskRunReq req) {
return runService.listFlowNodes(req);
}
}

View File

@@ -93,36 +93,6 @@ public class SimulationRun implements Serializable {
@TableField("englishName")
private Long englishName;
@TableField("tag1")
private String tag1;
@TableField("tag2")
private String tag2;
@TableField("tag3")
private String tag3;
@TableField("tag4")
private String tag4;
@TableField("tag5")
private String tag5;
@TableField("tag6")
private String tag6;
@TableField("tag7")
private String tag7;
@TableField("tag8")
private String tag8;
@TableField("tag9")
private String tag9;
@TableField("tag10")
private String tag10;
@Schema(description= "创建者ID")
@TableField("creator")
private Long creator;

View File

@@ -3,6 +3,8 @@ package com.sdm.project.model.req;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Map;
@Data
public class SpdmNodeParamReq {
@@ -12,11 +14,14 @@ public class SpdmNodeParamReq {
@Schema(description = "算例uuid")
private String runId;
@Schema(description = "上传脚本文件id")
private String scriptFileId;
@Schema(description = "用户输入的参数")
private Map<String, Object> inputParams;
@Schema(description = "用户输入的正则表达式参数")
private String regExp;
// @Schema(description = "上传脚本文件id")
// private String scriptFileId;
//
// @Schema(description = "用户输入的正则表达式参数")
// private String regExp;
}

View File

@@ -1,6 +1,7 @@
package com.sdm.project.service;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.capability.FlowNodeDto;
import com.sdm.common.entity.req.data.CreateDirReq;
import com.sdm.common.entity.req.data.KnowledgeCallBackReq;
import com.sdm.common.entity.req.data.QueryDirReq;
@@ -61,4 +62,6 @@ public interface ISimulationRunService extends IService<SimulationRun> {
SdmResponse startProcessInstance(SpdmTaskRunReq req);
SdmResponse saveNodeParams(SpdmNodeParamReq req);
SdmResponse<List<FlowNodeDto>> listFlowNodes(SpdmTaskRunReq req);
}

View File

@@ -13,6 +13,7 @@ import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.enums.DirTypeEnum;
import com.sdm.common.entity.enums.NodeTypeEnum;
import com.sdm.common.entity.flowable.dto.FlowElementDTO;
import com.sdm.common.entity.flowable.dto.NodeStructureInfo;
import com.sdm.common.entity.flowable.dto.ProcessDefinitionDTO;
import com.sdm.common.entity.req.capability.FlowNodeDto;
import com.sdm.common.entity.req.data.*;
@@ -21,6 +22,7 @@ import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.capability.FlowTemplateResp;
import com.sdm.common.entity.resp.data.BatchAddFileInfoResp;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.entity.resp.flowable.ProcessInstanceDetailResponse;
import com.sdm.common.entity.resp.flowable.ProcessInstanceResp;
import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.feign.impl.capability.SimulationFlowFeignClientImpl;
@@ -565,6 +567,9 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
List<FlowNodeDto> flowNodeDtoList = new ArrayList<>();
ProcessDefinitionDTO definitionDTO = JSON.parseObject(flowTemplateResp.getData().getTemplateContent(), ProcessDefinitionDTO.class);
for (FlowElementDTO flowElement : definitionDTO.getFlowElements()) {
if (flowElement.getName() == null) {
continue;
}
FlowNodeDto flowNodeDto = new FlowNodeDto();
flowNodeDto.setUuid(generateUuid("flow_node_"));
flowNodeDto.setNodeName(flowElement.getName());
@@ -952,9 +957,8 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
// 脚本节点
// 处理脚本上传到当前节点文件夹下,获得 脚本文件id
// 脚本文件id 保存到用户输入参数
params.put("scriptFileId", req.getScriptFileId());
// 正则表达式 保存到用户输入参数
params.put("regExp", req.getRegExp());
params.putAll(req.getInputParams());
// 脚本输出文件夹id 保存到用户输入参数
params.put("outputDirId", flowNodeDto.getOutputDirId());
}
@@ -967,6 +971,41 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
return null;
}
@Override
public SdmResponse<List<FlowNodeDto>> listFlowNodes(SpdmTaskRunReq req) {
FlowNodeDto nodeReq = new FlowNodeDto();
nodeReq.setRunId(req.getRunId());
SdmResponse<List<FlowNodeDto>> sdmResponse = flowFeignClient.listSimulationFlowNode(nodeReq);
if (sdmResponse.getData() != null) {
List<FlowNodeDto> flowNodeDtoList = sdmResponse.getData();
SimulationRun simulationRun = this.lambdaQuery().eq(SimulationRun::getUuid, req.getRunId()).one();
if (simulationRun.getFlowInstanceId() != null) {
SdmResponse<ProcessInstanceDetailResponse> response = flowableFeignClient.getProcessAndNodeDetailByInstanceId(simulationRun.getFlowInstanceId());
if (response.getData() != null && CollectionUtils.isNotEmpty(response.getData().getNodes())) {
for (FlowNodeDto flowNodeDto : flowNodeDtoList) {
response.getData().getNodes().stream().filter(i -> StringUtils.equals(i.getId(), flowNodeDto.getNodeId())).findFirst().ifPresent(i -> {
flowNodeDto.setNodeStatus(i.getStatus());
});
}
}
} else {
flowNodeDtoList.forEach(node -> {
node.setNodeStatus("pending");
});
}
List<NodeStructureInfo> nodeStructureInfoList = flowableFeignClient.listNodesByProcessDefinitionId(simulationRun.getProcessDefinitionId()).getData();
if (CollectionUtils.isNotEmpty(nodeStructureInfoList)) {
for (FlowNodeDto flowNodeDto : flowNodeDtoList) {
nodeStructureInfoList.stream().filter(i -> StringUtils.equals(i.getId(), flowNodeDto.getNodeId())).findFirst().ifPresent(i -> {
});
}
}
return SdmResponse.success(flowNodeDtoList);
}
return SdmResponse.success(new ArrayList<>());
}
public static void deleteFolder(File folder) {
if (folder.isDirectory()) {
File[] files = folder.listFiles();