This commit is contained in:
2025-12-02 08:50:14 +08:00
68 changed files with 1154 additions and 356 deletions

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;
@@ -186,4 +187,20 @@ public class SimulationRunController {
return runService.startProcessInstance(req);
}
/**
* 任务执行 设置节点输入参数和输出参数
*/
@PostMapping("/saveNodeParams")
public SdmResponse saveNodeParams(@RequestBody SpdmNodeParamReq req) {
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;
@@ -141,6 +111,10 @@ public class SimulationRun implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
@Schema(description = "flowable流程完成部署后的流程定义id根据这个发起流程实例")
@TableField("processDefinitionId")
public String processDefinitionId;
@Schema(description= "流程实例id流程引擎返回的")
@TableField("flowInstanceId")
private String flowInstanceId;

View File

@@ -0,0 +1,27 @@
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 {
@Schema(description = "节点uuid")
private String nodeUuid;
@Schema(description = "算例uuid")
private String runId;
@Schema(description = "用户输入的参数")
private Map<String, Object> inputParams;
// @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;
@@ -59,4 +60,8 @@ public interface ISimulationRunService extends IService<SimulationRun> {
void generateReport(SpdmReportReq req, HttpServletResponse response);
SdmResponse startProcessInstance(SpdmTaskRunReq req);
SdmResponse saveNodeParams(SpdmNodeParamReq req);
SdmResponse<List<FlowNodeDto>> listFlowNodes(SpdmTaskRunReq req);
}

View File

@@ -1,5 +1,6 @@
package com.sdm.project.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -11,6 +12,9 @@ import com.sdm.common.common.SdmResponse;
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.*;
import com.sdm.common.entity.req.system.UserQueryReq;
@@ -18,8 +22,12 @@ 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;
import com.sdm.common.feign.impl.data.DataClientFeignClientImpl;
import com.sdm.common.feign.impl.flowable.FlowableClientFeignClientImpl;
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
import com.sdm.common.feign.inter.capability.ISimulationFlowFeignClient;
import com.sdm.common.feign.inter.data.IDataFeignClient;
@@ -95,13 +103,13 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
SysUserFeignClientImpl sysUserFeignClient;
@Autowired
private IDataFeignClient dataFeignClient;
private DataClientFeignClientImpl dataFeignClient;
@Autowired
private IFlowableFeignClient flowableFeignClient;
private FlowableClientFeignClientImpl flowableFeignClient;
@Autowired
private ISimulationFlowFeignClient flowFeignClient;
private SimulationFlowFeignClientImpl flowFeignClient;
private static final String TEMP_REPORT_PATH = "/opt/report/";
@@ -557,14 +565,15 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
if (flowTemplateResp.getData() != null) {
try {
List<FlowNodeDto> flowNodeDtoList = new ArrayList<>();
List<Map<String, String>> result = extractFlowElements(flowTemplateResp.getData().getTemplateContent());
for (Map<String, String> map : result) {
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(map.get("name"));
// flowNodeReq.setFlowInstanceId(simulationRun.getFlowInstanceId());
flowNodeDto.setNodeId(map.get("id"));
flowNodeDto.setTemplateId(simulationRun.getFlowTemplate());
flowNodeDto.setNodeName(flowElement.getName());
flowNodeDto.setNodeId(flowElement.getId());
flowNodeDto.setRunId(simulationRun.getUuid());
flowNodeDtoList.add(flowNodeDto);
}
@@ -589,6 +598,8 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
log.error("解析流程模板json文件失败,flowTemplateId:{}", simulationRun.getFlowTemplate(), e);
throw new RuntimeException("解析流程模板json文件失败:" + e.getMessage(), e);
}
simulationRun.setProcessDefinitionId(flowTemplateResp.getData().getProcessDefinitionId());
this.updateById(simulationRun);
}
}
return SdmResponse.success(simulationRun.getUuid());
@@ -608,29 +619,6 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
return response;
}
/**
* 解析流程模板json结构 获取节点id和名称
* @param jsonString
* @return
* @throws Exception
*/
public static List<Map<String, String>> extractFlowElements(String jsonString) throws Exception {
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(jsonString);
JsonNode flowElements = rootNode.path("flowElements");
List<Map<String, String>> elements = new ArrayList<>();
for (JsonNode element : flowElements) {
if ("sequenceFlow".equals(element.get("type").asText())) {
continue;
}
Map<String, String> item = new HashMap<>();
item.put("id", element.path("id").asText());
item.put("name", element.path("name").asText());
elements.add(item);
}
return elements;
}
@Override
@Transactional(rollbackFor = Exception.class)
public SdmResponse deleteTaskRun(SpdmTaskRunReq req) {
@@ -937,21 +925,81 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
@Transactional(rollbackFor = Exception.class)
public SdmResponse startProcessInstance(SpdmTaskRunReq req) {
SimulationRun simulationRun = this.lambdaQuery().eq(SimulationRun::getUuid, req.getRunId()).one();
// 启动流程实例
SdmResponse<ProcessInstanceResp> sdmResponse = flowableFeignClient.startByProcessDefinitionKey(simulationRun.getFlowTemplate());
// 启动流程实例 多次执行会生成多个流程实例id更新算例run表、同时更新flowable流程参数的流程实例id
SdmResponse<ProcessInstanceResp> sdmResponse = flowableFeignClient.startByProcessDefinitionId(simulationRun.getProcessDefinitionId(), null);
if (sdmResponse.getData() != null) {
this.lambdaUpdate().set(SimulationRun::getFlowInstanceId, sdmResponse.getData().getId()).eq(SimulationRun::getUuid, req.getRunId()).update();
// 更新node节点的流程实例id
FlowNodeDto flowNodeDto = new FlowNodeDto();
flowNodeDto.setRunId(req.getRunId());
flowNodeDto.setFlowInstanceId(sdmResponse.getData().getId());
flowFeignClient.batchUpdateSimulationFlowNode(flowNodeDto);
this.lambdaUpdate().set(SimulationRun::getFlowInstanceId, sdmResponse.getData().getProcessInstanceId()).eq(SimulationRun::getUuid, req.getRunId()).update();
flowableFeignClient.updateNodeParamProcessInstanceId(simulationRun.getProcessDefinitionId(), sdmResponse.getData().getProcessInstanceId());
} else {
return SdmResponse.failed("流程实例启动失败");
}
return sdmResponse;
}
@Override
public SdmResponse saveNodeParams(SpdmNodeParamReq req) {
SimulationRun simulationRun = this.lambdaQuery().eq(SimulationRun::getUuid, req.getRunId()).one();
SdmResponse<FlowTemplateResp> flowTemplateResp = flowFeignClient.queryFlowTemplateInfo(simulationRun.getFlowTemplate());
if (flowTemplateResp.getData() != null) {
ProcessDefinitionDTO definitionDTO = JSON.parseObject(flowTemplateResp.getData().getTemplateContent(), ProcessDefinitionDTO.class);
FlowNodeDto flowNodeReq = new FlowNodeDto();
flowNodeReq.setUuid(req.getNodeUuid());
SdmResponse<FlowNodeDto> sdmResponse = flowFeignClient.querySimulationFlowNode(flowNodeReq);
if (sdmResponse.getData() != null) {
FlowNodeDto flowNodeDto = sdmResponse.getData();
definitionDTO.getFlowElements().stream().filter(i -> StringUtils.equals(i.getId(), flowNodeDto.getNodeId())).findFirst().ifPresent(i -> {
if (i.getExtensionElements() != null && i.getExtensionElements().getExecuteConfig() != null) {
Map<String, Object> params = new HashMap<>();
if ("HPC".equals(i.getExtensionElements().getExecuteConfig().getExecuteType())) {
// 计算节点 输出文件夹id 保存到用户输入参数
params.put("outputDirId", flowNodeDto.getOutputDirId());
} else if ("exportWordScript".equals(i.getExtensionElements().getExecuteConfig().getExecuteType())) {
// 脚本节点
// 处理脚本上传到当前节点文件夹下,获得 脚本文件id
// 脚本文件id 保存到用户输入参数
// 正则表达式 保存到用户输入参数
params.putAll(req.getInputParams());
// 脚本输出文件夹id 保存到用户输入参数
params.put("outputDirId", flowNodeDto.getOutputDirId());
}
flowableFeignClient.saveParamsByDefinitionId(simulationRun.getProcessDefinitionId(), flowNodeDto.getNodeId(), params);
}
});
}
}
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();
SdmResponse<ProcessInstanceDetailResponse> response = flowableFeignClient.getProcessAndNodeDetailByInstanceId(simulationRun.getProcessDefinitionId(), 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());
flowNodeDto.setUserParams(i.getUserParam());
});
}
}
if (simulationRun.getFlowInstanceId() == null) {
flowNodeDtoList.forEach(node -> {
node.setNodeStatus("pending");
});
}
return SdmResponse.success(flowNodeDtoList);
}
return SdmResponse.success(new ArrayList<>());
}
public static void deleteFolder(File folder) {
if (folder.isDirectory()) {
File[] files = folder.listFiles();