From 6bc4c7401ebbf1248f86490ea205e1b7c090b0bd Mon Sep 17 00:00:00 2001 From: zhuxinru Date: Fri, 28 Nov 2025 18:09:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E7=AE=97=E4=BE=8B=E5=88=9D=E5=A7=8B=E5=8C=96=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E8=8A=82=E7=82=B9/=E5=90=AF=E5=8A=A8=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=9E=E4=BE=8B/=E6=9F=A5=E8=AF=A2=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../capability/controller/FlowController.java | 25 +++- .../dao/SimulationFlowNodeMapper.java | 10 ++ .../model/entity/SimulationFlowNode.java | 78 ++++++++++ .../service/ISimulationFlowNodeService.java | 19 +++ .../service/impl/FlowServiceImpl.java | 6 +- .../impl/ISimulationFlowNodeServiceImpl.java | 69 +++++++++ .../sdm/common/entity/enums/NodeTypeEnum.java | 4 +- .../entity/req/capability/FlowNodeDto.java | 58 ++++++++ .../resp/capability/FlowTemplateResp.java | 51 +++++++ .../resp/flowable}/ProcessInstanceResp.java | 2 +- .../SimulationFlowFeignClientImpl.java | 95 ++++++++++++ ...SimulationFlowTemplateFeignClientImpl.java | 36 ----- .../FlowableClientFeignClientImpl.java | 29 ++++ .../ISimulationFlowFeignClient.java | 33 +++++ .../ISimulationFlowTemplateFeignClient.java | 15 -- .../inter/flowable/IFlowableFeignClient.java | 15 ++ .../impl/MinioFileIDataFileServiceImpl.java | 4 +- ...SimulationParameterLibraryServiceImpl.java | 2 +- .../controller/ProcessController.java | 6 +- .../src/main/resources/application-dev.yml | 8 ++ .../src/main/resources/application-local.yml | 8 ++ .../src/main/resources/application-prod.yml | 8 ++ pom.xml | 2 +- .../controller/SimulationRunController.java | 8 ++ .../project/model/entity/SimulationRun.java | 4 + .../sdm/project/model/req/SpdmTaskRunReq.java | 3 + .../service/ISimulationRunService.java | 2 + .../impl/SimulationRunServiceImpl.java | 136 +++++++++++++++--- .../SimulationSystemConfigServiceImpl.java | 1 + .../SimulationFlowTemplateNoticeStrategy.java | 5 +- 30 files changed, 655 insertions(+), 87 deletions(-) create mode 100644 capability/src/main/java/com/sdm/capability/dao/SimulationFlowNodeMapper.java create mode 100644 capability/src/main/java/com/sdm/capability/model/entity/SimulationFlowNode.java create mode 100644 capability/src/main/java/com/sdm/capability/service/ISimulationFlowNodeService.java create mode 100644 capability/src/main/java/com/sdm/capability/service/impl/ISimulationFlowNodeServiceImpl.java create mode 100644 common/src/main/java/com/sdm/common/entity/req/capability/FlowNodeDto.java create mode 100644 common/src/main/java/com/sdm/common/entity/resp/capability/FlowTemplateResp.java rename {flowable/src/main/java/com/sdm/flowable/dto/resp => common/src/main/java/com/sdm/common/entity/resp/flowable}/ProcessInstanceResp.java (93%) create mode 100644 common/src/main/java/com/sdm/common/feign/impl/capability/SimulationFlowFeignClientImpl.java delete mode 100644 common/src/main/java/com/sdm/common/feign/impl/capability/SimulationFlowTemplateFeignClientImpl.java create mode 100644 common/src/main/java/com/sdm/common/feign/impl/flowable/FlowableClientFeignClientImpl.java create mode 100644 common/src/main/java/com/sdm/common/feign/inter/capability/ISimulationFlowFeignClient.java delete mode 100644 common/src/main/java/com/sdm/common/feign/inter/capability/ISimulationFlowTemplateFeignClient.java create mode 100644 common/src/main/java/com/sdm/common/feign/inter/flowable/IFlowableFeignClient.java diff --git a/capability/src/main/java/com/sdm/capability/controller/FlowController.java b/capability/src/main/java/com/sdm/capability/controller/FlowController.java index a9da0016..0b490dac 100644 --- a/capability/src/main/java/com/sdm/capability/controller/FlowController.java +++ b/capability/src/main/java/com/sdm/capability/controller/FlowController.java @@ -4,21 +4,27 @@ import com.sdm.capability.model.entity.SimulationFlowTemplate; import com.sdm.capability.model.req.flow.GetFlowTemplateReq; import com.sdm.capability.model.req.flow.ReleaseFlowTemplateReq; import com.sdm.capability.service.IFlowService; +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.req.system.LaunchApproveReq; -import com.sdm.common.feign.inter.capability.ISimulationFlowTemplateFeignClient; +import com.sdm.common.feign.inter.capability.ISimulationFlowFeignClient; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.List; @RestController @RequestMapping("/flow") -public class FlowController implements ISimulationFlowTemplateFeignClient { +public class FlowController implements ISimulationFlowFeignClient { @Resource private IFlowService IFlowService; + @Resource + private ISimulationFlowNodeService simulationFlowNodeService; + @PostMapping("/createFlowTemplateDraft") public SdmResponse createFlowTemplateDraft(@RequestBody @Validated SimulationFlowTemplate flowTemplate) { return IFlowService.createFlowTemplateDraft(flowTemplate); @@ -108,4 +114,19 @@ public class FlowController implements ISimulationFlowTemplateFeignClient { return IFlowService.handleApproveResult(req); } + @PostMapping("/node/batchAddSimulationFlowNode") + public SdmResponse batchAddSimulationFlowNode(@RequestBody FlowNodeDto req) { + return simulationFlowNodeService.batchAddSimulationFlowNode(req); + } + + @PostMapping("/node/batchUpdateSimulationFlowNode") + public SdmResponse batchUpdateSimulationFlowNode(@RequestBody FlowNodeDto req) { + return simulationFlowNodeService.batchUpdateSimulationFlowNode(req); + } + + @PostMapping("/node/listSimulationFlowNode") + public SdmResponse> listSimulationFlowNode(@RequestBody FlowNodeDto req) { + return simulationFlowNodeService.listSimulationFlowNode(req); + } + } diff --git a/capability/src/main/java/com/sdm/capability/dao/SimulationFlowNodeMapper.java b/capability/src/main/java/com/sdm/capability/dao/SimulationFlowNodeMapper.java new file mode 100644 index 00000000..0c30b4bd --- /dev/null +++ b/capability/src/main/java/com/sdm/capability/dao/SimulationFlowNodeMapper.java @@ -0,0 +1,10 @@ +package com.sdm.capability.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.sdm.capability.model.entity.SimulationFlowNode; +import org.mapstruct.Mapper; + +@Mapper +public interface SimulationFlowNodeMapper extends BaseMapper { + +} diff --git a/capability/src/main/java/com/sdm/capability/model/entity/SimulationFlowNode.java b/capability/src/main/java/com/sdm/capability/model/entity/SimulationFlowNode.java new file mode 100644 index 00000000..3c141a5b --- /dev/null +++ b/capability/src/main/java/com/sdm/capability/model/entity/SimulationFlowNode.java @@ -0,0 +1,78 @@ +package com.sdm.capability.model.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("simulation_flow_node") +@ApiModel(value="SimulationFlowNode对象", description="流程实例节点表") +public class SimulationFlowNode { + + @TableId(value = "id", type = IdType.INPUT) + @ApiModelProperty(value = "主键ID") + private Integer id; + + @TableField("uuid") + @ApiModelProperty(value = "流程节点唯一ID") + private String uuid; + + @TableField("nodeName") + @ApiModelProperty(value = "流程节点名称") + private String nodeName; + + @TableField("flowInstanceId") + @ApiModelProperty(value = "所属流程实例ID(流程引擎)") + private String flowInstanceId; + + @TableField("nodeId") + @ApiModelProperty(value = "流程引擎中的nodeId") + private String nodeId; + + @TableField("templateId") + @ApiModelProperty(value = "所属流程模版ID") + private String templateId; + + @TableField("runId") + @ApiModelProperty(value = "所属算例ID") + private String runId; + + @TableField("nodeType") + @ApiModelProperty(value = "节点类型") + private Integer nodeType; + + @TableField("inputDirId") + @ApiModelProperty(value = "输入文件夹id") + private Long inputDirId; + + @TableField("outputDirId") + @ApiModelProperty(value = "输出文件夹id") + private Long outputDirId; + + @TableField("creator") + @ApiModelProperty(value = "创建人") + private Long creator; + + @TableField("createTime") + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @TableField("updater") + @ApiModelProperty(value = "更新人") + private Long updater; + + @TableField("updateTime") + @ApiModelProperty(value = "更新时间") + private Date updateTime; +} \ No newline at end of file diff --git a/capability/src/main/java/com/sdm/capability/service/ISimulationFlowNodeService.java b/capability/src/main/java/com/sdm/capability/service/ISimulationFlowNodeService.java new file mode 100644 index 00000000..023744c8 --- /dev/null +++ b/capability/src/main/java/com/sdm/capability/service/ISimulationFlowNodeService.java @@ -0,0 +1,19 @@ +package com.sdm.capability.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.sdm.capability.model.entity.SimulationFlowNode; +import com.sdm.common.common.SdmResponse; +import com.sdm.common.entity.req.capability.FlowNodeDto; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +public interface ISimulationFlowNodeService extends IService { + + SdmResponse batchAddSimulationFlowNode(@RequestBody FlowNodeDto req); + + SdmResponse batchUpdateSimulationFlowNode(@RequestBody FlowNodeDto req); + + SdmResponse> listSimulationFlowNode(@RequestBody FlowNodeDto req); + +} diff --git a/capability/src/main/java/com/sdm/capability/service/impl/FlowServiceImpl.java b/capability/src/main/java/com/sdm/capability/service/impl/FlowServiceImpl.java index 527472b8..8618c484 100644 --- a/capability/src/main/java/com/sdm/capability/service/impl/FlowServiceImpl.java +++ b/capability/src/main/java/com/sdm/capability/service/impl/FlowServiceImpl.java @@ -9,10 +9,12 @@ import com.sdm.common.common.SdmResponse; import com.sdm.common.common.ThreadLocalContext; import com.sdm.common.entity.bo.DataPageInfo; import com.sdm.common.entity.req.system.LaunchApproveReq; +import com.sdm.common.entity.resp.capability.FlowTemplateResp; import com.sdm.common.feign.impl.system.ApproveFeignClientImpl; import com.sdm.common.service.BaseService; import com.sdm.common.utils.Tools; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -371,7 +373,9 @@ public class FlowServiceImpl extends BaseService implements IFlowService { } else { - response.setData(flowTemplate); + FlowTemplateResp flowTemplateResp = new FlowTemplateResp(); + BeanUtils.copyProperties(flowTemplate,flowTemplateResp); + response.setData(flowTemplateResp); } return response; } diff --git a/capability/src/main/java/com/sdm/capability/service/impl/ISimulationFlowNodeServiceImpl.java b/capability/src/main/java/com/sdm/capability/service/impl/ISimulationFlowNodeServiceImpl.java new file mode 100644 index 00000000..5ec23287 --- /dev/null +++ b/capability/src/main/java/com/sdm/capability/service/impl/ISimulationFlowNodeServiceImpl.java @@ -0,0 +1,69 @@ +package com.sdm.capability.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sdm.capability.dao.SimulationFlowNodeMapper; +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; +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 implements ISimulationFlowNodeService { + + @Override + @Transactional(rollbackFor = Exception.class) + public SdmResponse batchAddSimulationFlowNode(FlowNodeDto req) { + if (CollectionUtils.isNotEmpty(req.getFlowNodeDtoList())) { + List entityList = req.getFlowNodeDtoList().stream().map(flowNodeReq -> { + SimulationFlowNode simulationFlowNode = new SimulationFlowNode(); + BeanUtils.copyProperties(flowNodeReq, simulationFlowNode); + return simulationFlowNode; + }).toList(); + if (!this.saveBatch(entityList)) { + return SdmResponse.failed("批量新增流程节点失败"); + } + } + return SdmResponse.success(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public SdmResponse batchUpdateSimulationFlowNode(FlowNodeDto req) { + if (StringUtils.isNotEmpty(req.getRunId())) { + List entityList = this.lambdaQuery().eq(SimulationFlowNode::getRunId, req.getRunId()).list(); + entityList.forEach(entity -> { + entity.setFlowInstanceId(req.getFlowInstanceId()); + }); + this.updateBatchById(entityList); + } + return SdmResponse.success(); + } + + @Override + public SdmResponse> listSimulationFlowNode(FlowNodeDto req) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (StringUtils.isNotBlank(req.getRunId())) { + queryWrapper.eq(SimulationFlowNode::getRunId, req.getRunId()); + } + if (StringUtils.isNotBlank(req.getFlowInstanceId())) { + queryWrapper.eq(SimulationFlowNode::getFlowInstanceId, req.getFlowInstanceId()); + } + List flowNodeList = this.baseMapper.selectList(queryWrapper); + List dtoList = flowNodeList.stream().map(entity -> { + FlowNodeDto dto = new FlowNodeDto(); + BeanUtils.copyProperties(entity, dto); + return dto; + }).toList(); + return SdmResponse.success(dtoList); + } +} diff --git a/common/src/main/java/com/sdm/common/entity/enums/NodeTypeEnum.java b/common/src/main/java/com/sdm/common/entity/enums/NodeTypeEnum.java index 0ef85fbc..59f34f20 100644 --- a/common/src/main/java/com/sdm/common/entity/enums/NodeTypeEnum.java +++ b/common/src/main/java/com/sdm/common/entity/enums/NodeTypeEnum.java @@ -10,7 +10,9 @@ public enum NodeTypeEnum { WORKSPACE("workspace"), TASK("task"), RUN("run"), - PERFORMANCE("performance"); + PERFORMANCE("performance"), + FLOW_NODE("flowNode") + ; String value; NodeTypeEnum(String i) { diff --git a/common/src/main/java/com/sdm/common/entity/req/capability/FlowNodeDto.java b/common/src/main/java/com/sdm/common/entity/req/capability/FlowNodeDto.java new file mode 100644 index 00000000..7dd4bfdb --- /dev/null +++ b/common/src/main/java/com/sdm/common/entity/req/capability/FlowNodeDto.java @@ -0,0 +1,58 @@ +package com.sdm.common.entity.req.capability; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class FlowNodeDto { + + @Schema(description = "主键ID") + private Integer id; + + @Schema(description = "流程节点唯一ID") + private String uuid; + + @Schema(description = "流程节点名称") + private String nodeName; + + @Schema(description = "所属流程实例ID(流程引擎)") + private String flowInstanceId; + + @Schema(description = "流程引擎中的nodeId") + private String nodeId; + + @Schema(description = "所属流程模版ID") + private String templateId; + + @Schema(description = "所属算例ID") + private String runId; + + @Schema(description = "节点类型") + private Integer nodeType; + + @Schema(description = "输入文件夹id") + private Long inputDirId; + + @Schema(description = "输出文件夹id") + private Long outputDirId; + + @Schema(description = "创建人") + private Long creator; + + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + @Schema(description = "更新人") + private Long updater; + + @Schema(description = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + private List flowNodeDtoList; +} \ No newline at end of file diff --git a/common/src/main/java/com/sdm/common/entity/resp/capability/FlowTemplateResp.java b/common/src/main/java/com/sdm/common/entity/resp/capability/FlowTemplateResp.java new file mode 100644 index 00000000..61966538 --- /dev/null +++ b/common/src/main/java/com/sdm/common/entity/resp/capability/FlowTemplateResp.java @@ -0,0 +1,51 @@ +package com.sdm.common.entity.resp.capability; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class FlowTemplateResp { + + @Schema(description = "流程模版唯一ID") + public String uuid; + + @Schema(description = "流程模版名称") + public String templateName; + + @Schema(description = "流程模版版本") + public String templateVersion; + + @Schema(description = "流程模版内容") + public String templateContent; + + @Schema(description = "流程模版显示内容") + public String viewContent; + + @Schema(description = "父版本UUID") + public String parentUuid; + + @Schema(description = "流程模版编码") + public String templateCode; + + @Schema(description = "模版状态") + public int templateStatus = 1; + + @Schema(description = "模版类型") + public String templateType; + + @Schema(description = "模版评审类型") + public int approveType; + + @Schema(description = "描述信息") + public String comment; + + @Schema(description = "升版类型 0:小版本 1:大版本") + public int versionType; + + @Schema(description = "评审流程模版名称") + public String approveFlowTemplateName; + + @Schema(description = "评审流程模版Id") + public String approveFlowTemplateId; + +} diff --git a/flowable/src/main/java/com/sdm/flowable/dto/resp/ProcessInstanceResp.java b/common/src/main/java/com/sdm/common/entity/resp/flowable/ProcessInstanceResp.java similarity index 93% rename from flowable/src/main/java/com/sdm/flowable/dto/resp/ProcessInstanceResp.java rename to common/src/main/java/com/sdm/common/entity/resp/flowable/ProcessInstanceResp.java index 13d291a7..4fdad1b8 100644 --- a/flowable/src/main/java/com/sdm/flowable/dto/resp/ProcessInstanceResp.java +++ b/common/src/main/java/com/sdm/common/entity/resp/flowable/ProcessInstanceResp.java @@ -1,4 +1,4 @@ -package com.sdm.flowable.dto.resp; +package com.sdm.common.entity.resp.flowable; import lombok.Data; diff --git a/common/src/main/java/com/sdm/common/feign/impl/capability/SimulationFlowFeignClientImpl.java b/common/src/main/java/com/sdm/common/feign/impl/capability/SimulationFlowFeignClientImpl.java new file mode 100644 index 00000000..adb7a16f --- /dev/null +++ b/common/src/main/java/com/sdm/common/feign/impl/capability/SimulationFlowFeignClientImpl.java @@ -0,0 +1,95 @@ +package com.sdm.common.feign.impl.capability; + +import com.sdm.common.common.SdmResponse; +import com.sdm.common.entity.req.capability.FlowNodeDto; +import com.sdm.common.entity.req.system.LaunchApproveReq; +import com.sdm.common.feign.inter.capability.ISimulationFlowFeignClient; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Slf4j +@Component +public class SimulationFlowFeignClientImpl implements ISimulationFlowFeignClient { + + @Autowired + private ISimulationFlowFeignClient flowFeignClient; + + + @Override + public SdmResponse receiveApproveNotice(LaunchApproveReq req) { + SdmResponse response; + try { + response = flowFeignClient.receiveApproveNotice(req); + if (!response.isSuccess()) { + return SdmResponse.failed("仿真知识库文件审批状态修改失败"); + } + return response; + } catch (Exception e) { + log.error("仿真知识库文件审批状态修改异常", e); + return SdmResponse.failed("仿真知识库文件审批状态修改异常"); + } + } + + @Override + public SdmResponse queryFlowTemplateInfo(String uuid) { + SdmResponse response; + try { + response = flowFeignClient.queryFlowTemplateInfo(uuid); + if (!response.isSuccess()) { + return SdmResponse.failed("查询流程模板信息失败"); + } + return response; + } catch (Exception e) { + log.error("查询流程模板信息失败异常", e); + return SdmResponse.failed("查询流程模板信息失败异常"); + } + } + + @Override + public SdmResponse batchAddSimulationFlowNode(FlowNodeDto req) { + SdmResponse response; + try { + response = flowFeignClient.batchAddSimulationFlowNode(req); + if (!response.isSuccess()) { + return SdmResponse.failed("新增流程实例节点失败"); + } + return response; + } catch (Exception e) { + log.error("新增流程实例节点异常", e); + return SdmResponse.failed("新增流程实例节点异常"); + } + } + + @Override + public SdmResponse batchUpdateSimulationFlowNode(FlowNodeDto req) { + SdmResponse response; + try { + response = flowFeignClient.batchUpdateSimulationFlowNode(req); + if (!response.isSuccess()) { + return SdmResponse.failed("更新流程实例节点失败"); + } + return response; + } catch (Exception e) { + log.error("更新流程实例节点异常", e); + return SdmResponse.failed("更新流程实例节点异常"); + } + } + + @Override + public SdmResponse> listSimulationFlowNode(FlowNodeDto req) { + SdmResponse response; + try { + response = flowFeignClient.listSimulationFlowNode(req); + if (!response.isSuccess()) { + return SdmResponse.failed("查询流程节点信息失败"); + } + return response; + } catch (Exception e) { + log.error("查询流程节点信息失败异常", e); + return SdmResponse.failed("查询流程节点信息失败异常"); + } + } +} diff --git a/common/src/main/java/com/sdm/common/feign/impl/capability/SimulationFlowTemplateFeignClientImpl.java b/common/src/main/java/com/sdm/common/feign/impl/capability/SimulationFlowTemplateFeignClientImpl.java deleted file mode 100644 index a15f5b8d..00000000 --- a/common/src/main/java/com/sdm/common/feign/impl/capability/SimulationFlowTemplateFeignClientImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.sdm.common.feign.impl.capability; - -import com.alibaba.fastjson2.JSONObject; -import com.sdm.common.common.SdmResponse; -import com.sdm.common.entity.req.system.LaunchApproveReq; -import com.sdm.common.feign.inter.capability.ISimulationFlowTemplateFeignClient; -import com.sdm.common.feign.inter.system.IApproveFeignClient; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.Optional; - -@Slf4j -@Component -public class SimulationFlowTemplateFeignClientImpl implements ISimulationFlowTemplateFeignClient { - - @Autowired - private ISimulationFlowTemplateFeignClient flowFeignClient; - - - @Override - public SdmResponse receiveApproveNotice(LaunchApproveReq req) { - SdmResponse response; - try { - response = flowFeignClient.receiveApproveNotice(req); - if (!response.isSuccess()) { - return SdmResponse.failed("仿真知识库文件审批状态修改失败"); - } - return response; - } catch (Exception e) { - log.error("仿真知识库文件审批状态修改异常", e); - return SdmResponse.failed("仿真知识库文件审批状态修改异常"); - } - } -} diff --git a/common/src/main/java/com/sdm/common/feign/impl/flowable/FlowableClientFeignClientImpl.java b/common/src/main/java/com/sdm/common/feign/impl/flowable/FlowableClientFeignClientImpl.java new file mode 100644 index 00000000..df111b7e --- /dev/null +++ b/common/src/main/java/com/sdm/common/feign/impl/flowable/FlowableClientFeignClientImpl.java @@ -0,0 +1,29 @@ +package com.sdm.common.feign.impl.flowable; + +import com.sdm.common.common.SdmResponse; +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.RequestParam; + + +@Slf4j +@Component +public class FlowableClientFeignClientImpl implements IFlowableFeignClient { + @Autowired + private IFlowableFeignClient flowableFeignClient; + + public SdmResponse startByProcessDefinitionKey(@RequestParam String processDefinitionKey) { + SdmResponse response; + try { + response = flowableFeignClient.startByProcessDefinitionKey(processDefinitionKey); + log.info("启动流程实例:"+ response); + return response; + } catch (Exception e) { + log.error("启动流程实例", e); + return SdmResponse.failed("启动流程实例"); + } + } +} diff --git a/common/src/main/java/com/sdm/common/feign/inter/capability/ISimulationFlowFeignClient.java b/common/src/main/java/com/sdm/common/feign/inter/capability/ISimulationFlowFeignClient.java new file mode 100644 index 00000000..9061caf8 --- /dev/null +++ b/common/src/main/java/com/sdm/common/feign/inter/capability/ISimulationFlowFeignClient.java @@ -0,0 +1,33 @@ +package com.sdm.common.feign.inter.capability; + +import com.sdm.common.common.SdmResponse; +import com.sdm.common.entity.req.capability.FlowNodeDto; +import com.sdm.common.entity.req.system.LaunchApproveReq; +import com.sdm.common.entity.resp.capability.FlowTemplateResp; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +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; + +@FeignClient(name = "capability") +public interface ISimulationFlowFeignClient { + + @PostMapping("/flow/approveHandleNotice") + SdmResponse receiveApproveNotice(@RequestBody LaunchApproveReq req); + + @GetMapping("/flow/queryFlowTemplateInfo") + SdmResponse queryFlowTemplateInfo(@RequestParam("uuid") String uuid); + + @PostMapping("/flow/node/batchAddSimulationFlowNode") + SdmResponse batchAddSimulationFlowNode(@RequestBody FlowNodeDto req); + + @PostMapping("/flow/node/batchUpdateSimulationFlowNode") + SdmResponse batchUpdateSimulationFlowNode(@RequestBody FlowNodeDto req); + + @PostMapping("/node/listSimulationFlowNode") + SdmResponse> listSimulationFlowNode(@RequestBody FlowNodeDto req); + +} diff --git a/common/src/main/java/com/sdm/common/feign/inter/capability/ISimulationFlowTemplateFeignClient.java b/common/src/main/java/com/sdm/common/feign/inter/capability/ISimulationFlowTemplateFeignClient.java deleted file mode 100644 index 18df9cf0..00000000 --- a/common/src/main/java/com/sdm/common/feign/inter/capability/ISimulationFlowTemplateFeignClient.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.sdm.common.feign.inter.capability; - -import com.sdm.common.common.SdmResponse; -import com.sdm.common.entity.req.system.LaunchApproveReq; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -@FeignClient(name = "capability") -public interface ISimulationFlowTemplateFeignClient { - - @PostMapping("/flow/approveHandleNotice") - SdmResponse receiveApproveNotice(@RequestBody LaunchApproveReq req); - -} diff --git a/common/src/main/java/com/sdm/common/feign/inter/flowable/IFlowableFeignClient.java b/common/src/main/java/com/sdm/common/feign/inter/flowable/IFlowableFeignClient.java new file mode 100644 index 00000000..d0c33cf8 --- /dev/null +++ b/common/src/main/java/com/sdm/common/feign/inter/flowable/IFlowableFeignClient.java @@ -0,0 +1,15 @@ +package com.sdm.common.feign.inter.flowable; + +import com.sdm.common.common.SdmResponse; +import com.sdm.common.entity.resp.flowable.ProcessInstanceResp; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + + +@FeignClient(name = "flowable") +public interface IFlowableFeignClient { + @GetMapping("/process/startByProcessDefinitionKey") + SdmResponse startByProcessDefinitionKey(@RequestParam String processDefinitionKey); + +} diff --git a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java index 862d2bcb..287a0eb4 100644 --- a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java @@ -531,7 +531,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { createDirectoryPermission(dirInfo.getId()); log.info("根目录创建成功"); - return SdmResponse.success("根目录创建成功"); + return SdmResponse.success(dirInfo.getId()); } catch (Exception dbException) { log.error("创建根目录失败", dbException); @@ -596,7 +596,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { createDirectoryPermission(dirInfo.getId()); log.info("子目录创建成功"); - return SdmResponse.success("子目录创建成功"); + return SdmResponse.success(dirInfo.getId()); } catch (Exception dbException) { log.error("创建子目录失败", dbException); diff --git a/data/src/main/java/com/sdm/data/service/impl/SimulationParameterLibraryServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/SimulationParameterLibraryServiceImpl.java index 28ef39cb..86c23fb4 100644 --- a/data/src/main/java/com/sdm/data/service/impl/SimulationParameterLibraryServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/SimulationParameterLibraryServiceImpl.java @@ -242,7 +242,7 @@ public class SimulationParameterLibraryServiceImpl extends ServiceImpl getSimulationParameterLibraryCategoryObject(Long ObjectId) { SimulationParameterLibraryCategoryObjectResp resp = getSimulationParameterLibraryCategoryObjectInner(ObjectId); - if (ApproveFileDataTypeEnum.UPLOAD_REVIEWING.getCode() != resp.getApproveType()) { + if (resp.getApproveType() != null && ApproveFileDataTypeEnum.UPLOAD_REVIEWING.getCode() != resp.getApproveType()) { return SdmResponse.success(resp); } else { return SdmResponse.success(null); diff --git a/flowable/src/main/java/com/sdm/flowable/controller/ProcessController.java b/flowable/src/main/java/com/sdm/flowable/controller/ProcessController.java index c31d2a2d..3696242f 100644 --- a/flowable/src/main/java/com/sdm/flowable/controller/ProcessController.java +++ b/flowable/src/main/java/com/sdm/flowable/controller/ProcessController.java @@ -2,12 +2,14 @@ package com.sdm.flowable.controller; 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.UniversalDelegate; import com.sdm.flowable.delegate.handler.HpcHandler; import com.sdm.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.flowable.dto.resp.ProcessInstanceResp; +import com.sdm.common.entity.resp.flowable.ProcessInstanceResp; import com.sdm.flowable.process.ProcessService; import com.sdm.flowable.service.IProcessNodeParamService; import org.flowable.engine.history.HistoricProcessInstance; @@ -23,7 +25,7 @@ import java.util.Map; @RestController @RequestMapping("/process") -public class ProcessController { +public class ProcessController implements IFlowableFeignClient { @Autowired private ProcessService processService; diff --git a/gateway2/src/main/resources/application-dev.yml b/gateway2/src/main/resources/application-dev.yml index aed8fa3f..4b3b1b5e 100644 --- a/gateway2/src/main/resources/application-dev.yml +++ b/gateway2/src/main/resources/application-dev.yml @@ -76,6 +76,14 @@ spring: - StripPrefix=2 metadata: group: DEV_GROUP # 指定目标服务的分组 + - id: flowable-service + uri: lb://flowable + predicates: + - Path=/simulation/flowable/** + filters: + - StripPrefix=2 + metadata: + group: LOCAL_GROUP # 指定目标服务的分组 discovery: locator: enabled: true diff --git a/gateway2/src/main/resources/application-local.yml b/gateway2/src/main/resources/application-local.yml index 03555538..0e9baa52 100644 --- a/gateway2/src/main/resources/application-local.yml +++ b/gateway2/src/main/resources/application-local.yml @@ -76,6 +76,14 @@ spring: - StripPrefix=2 metadata: group: LOCAL_GROUP # 指定目标服务的分组 + - id: flowable-service + uri: lb://flowable + predicates: + - Path=/simulation/flowable/** + filters: + - StripPrefix=2 + metadata: + group: LOCAL_GROUP # 指定目标服务的分组 discovery: locator: enabled: true diff --git a/gateway2/src/main/resources/application-prod.yml b/gateway2/src/main/resources/application-prod.yml index a8cd0a09..9d6d15d4 100644 --- a/gateway2/src/main/resources/application-prod.yml +++ b/gateway2/src/main/resources/application-prod.yml @@ -76,6 +76,14 @@ spring: - StripPrefix=2 metadata: group: PROD_GROUP # 指定目标服务的分组 + - id: flowable-service + uri: lb://flowable + predicates: + - Path=/simulation/flowable/** + filters: + - StripPrefix=2 + metadata: + group: LOCAL_GROUP # 指定目标服务的分组 discovery: locator: enabled: true diff --git a/pom.xml b/pom.xml index a666dba1..05cb792b 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ pbs system common - + flowable diff --git a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java index fb105629..3ff84adf 100644 --- a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java +++ b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java @@ -178,4 +178,12 @@ public class SimulationRunController { runService.generateReport(req,response); } + /** + * 任务执行 一键执行 启动流程 + */ + @PostMapping("/startProcessInstance") + public SdmResponse startProcessInstance(@RequestBody SpdmTaskRunReq req) { + return runService.startProcessInstance(req); + } + } diff --git a/project/src/main/java/com/sdm/project/model/entity/SimulationRun.java b/project/src/main/java/com/sdm/project/model/entity/SimulationRun.java index 61ebeaaf..fff57ef7 100644 --- a/project/src/main/java/com/sdm/project/model/entity/SimulationRun.java +++ b/project/src/main/java/com/sdm/project/model/entity/SimulationRun.java @@ -141,4 +141,8 @@ public class SimulationRun implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; + @Schema(description= "流程实例id(流程引擎返回的)") + @TableField("flowInstanceId") + private String flowInstanceId; + } diff --git a/project/src/main/java/com/sdm/project/model/req/SpdmTaskRunReq.java b/project/src/main/java/com/sdm/project/model/req/SpdmTaskRunReq.java index b8e2ebf3..190b3e79 100644 --- a/project/src/main/java/com/sdm/project/model/req/SpdmTaskRunReq.java +++ b/project/src/main/java/com/sdm/project/model/req/SpdmTaskRunReq.java @@ -17,5 +17,8 @@ public class SpdmTaskRunReq { @Schema(description = "任务uuid") private String taskId; + @Schema(description = "流程模板id") + private String templateId; + } diff --git a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java index 14e97268..1c18829d 100644 --- a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java +++ b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java @@ -57,4 +57,6 @@ public interface ISimulationRunService extends IService { SdmResponse deleteSimulationKeyResult(KeyResultReq req); void generateReport(SpdmReportReq req, HttpServletResponse response); + + SdmResponse startProcessInstance(SpdmTaskRunReq req); } diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java index fc368a32..2eaef7de 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java @@ -3,20 +3,27 @@ package com.sdm.project.service.impl; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; 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.req.capability.FlowNodeDto; import com.sdm.common.entity.req.data.*; import com.sdm.common.entity.req.system.UserQueryReq; 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.ProcessInstanceResp; import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.feign.impl.system.SysUserFeignClientImpl; +import com.sdm.common.feign.inter.capability.ISimulationFlowFeignClient; import com.sdm.common.feign.inter.data.IDataFeignClient; +import com.sdm.common.feign.inter.flowable.IFlowableFeignClient; import com.sdm.common.utils.PageUtils; import com.sdm.common.utils.RandomUtil; import com.sdm.project.common.KeyResultTypeEnum; @@ -50,11 +57,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.*; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; +import static com.sdm.common.service.BaseService.generateUuid; import static com.sdm.project.service.impl.NodeServiceImpl.getTagProperty; import static com.sdm.project.service.impl.NodeServiceImpl.setTagProperty; @@ -91,6 +97,12 @@ public class SimulationRunServiceImpl extends ServiceImpl flowTemplateResp = flowFeignClient.queryFlowTemplateInfo(simulationRun.getFlowTemplate()); + if (flowTemplateResp.getData() != null) { + try { + List flowNodeDtoList = new ArrayList<>(); + List> result = extractFlowElements(flowTemplateResp.getData().getTemplateContent()); + for (Map map : result) { + 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.setRunId(simulationRun.getUuid()); + flowNodeDtoList.add(flowNodeDto); + } + for (FlowNodeDto flowNodeDto : flowNodeDtoList) { + // 每个流程节点建立节点文件夹 + SdmResponse nodeDirResponse = createDir(flowNodeDto.getUuid(), simulationRun.getUuid(), flowNodeDto.getNodeName(), DirTypeEnum.PROJECT_NODE_DIR.getValue(), NodeTypeEnum.FLOW_NODE.getValue()); + if (!nodeDirResponse.isSuccess()) { + return SdmResponse.failed("创建节点文件夹失败:{}" + nodeDirResponse.getMessage()); + } + // 每个流程节点初始化输入输出两个文件夹 + SdmResponse inputDir = createDir(null, flowNodeDto.getUuid(), "数据输入", DirTypeEnum.PROJECT_NODE_DIR.getValue(), null); + SdmResponse outputDir = createDir(null, flowNodeDto.getUuid(), "数据输出", DirTypeEnum.PROJECT_NODE_DIR.getValue(), null); + flowNodeDto.setInputDirId(Long.parseLong(inputDir.getData().toString())); + flowNodeDto.setOutputDirId(Long.parseLong(outputDir.getData().toString())); + } + FlowNodeDto addReq = new FlowNodeDto(); + addReq.setFlowNodeDtoList(flowNodeDtoList); + if (!flowFeignClient.batchAddSimulationFlowNode(addReq).isSuccess()) { + return SdmResponse.failed("新增流程节点失败:{}"); + } + } catch (Exception e) { + log.error("解析流程模板json文件失败,flowTemplateId:{}", simulationRun.getFlowTemplate(), e); + throw new RuntimeException("解析流程模板json文件失败:" + e.getMessage(), e); + } } } return SdmResponse.success(simulationRun.getUuid()); } } + private SdmResponse createDir(String uuid, String parentUuid, String dirName, Integer dirType, String uuidOwnType) { + CreateDirReq createDirReq = new CreateDirReq(); + createDirReq.setUuId(uuid); + createDirReq.setParentUuId(parentUuid); + createDirReq.setUuIdOwnType(uuidOwnType); + createDirReq.setDirName(dirName); + createDirReq.setDirType(dirType); + log.info("创建算例阶段时,调用创建文件夹的参数为:{}", createDirReq); + SdmResponse response = dataFeignClient.createDir(createDirReq); + log.info("创建算例阶段时,调用创建文件夹的返回值为:{}", response); + return response; + } + + /** + * 解析流程模板json结构 获取节点id和名称 + * @param jsonString + * @return + * @throws Exception + */ + public static List> extractFlowElements(String jsonString) throws Exception { + ObjectMapper mapper = new ObjectMapper(); + JsonNode rootNode = mapper.readTree(jsonString); + JsonNode flowElements = rootNode.path("flowElements"); + List> elements = new ArrayList<>(); + for (JsonNode element : flowElements) { + if ("sequenceFlow".equals(element.get("type").asText())) { + continue; + } + Map 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) { @@ -681,7 +754,7 @@ public class SimulationRunServiceImpl extends ServiceImpl sdmResponse = flowableFeignClient.startByProcessDefinitionKey(simulationRun.getFlowTemplate()); + 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); + } else { + return SdmResponse.failed("流程实例启动失败"); + } + return sdmResponse; + } + public static void deleteFolder(File folder) { if (folder.isDirectory()) { File[] files = folder.listFiles(); diff --git a/system/src/main/java/com/sdm/system/service/impl/SimulationSystemConfigServiceImpl.java b/system/src/main/java/com/sdm/system/service/impl/SimulationSystemConfigServiceImpl.java index de0dde40..8cd1c5f0 100644 --- a/system/src/main/java/com/sdm/system/service/impl/SimulationSystemConfigServiceImpl.java +++ b/system/src/main/java/com/sdm/system/service/impl/SimulationSystemConfigServiceImpl.java @@ -351,6 +351,7 @@ public class SimulationSystemConfigServiceImpl extends BaseService implements IS queryWrapper.like(SysFormConfigure::getFormName, req.formName); } queryWrapper.orderByDesc(SysFormConfigure::getCreateTime); + queryWrapper.eq(SysFormConfigure::getTenantId, ThreadLocalContext.getTenantId()); List list = formConfigureService.list(queryWrapper); if (CollectionUtils.isEmpty(list)) { return SdmResponse.failed("自定义表单列表为空,请初始化"); diff --git a/system/src/main/java/com/sdm/system/service/impl/approvalNotice/SimulationFlowTemplateNoticeStrategy.java b/system/src/main/java/com/sdm/system/service/impl/approvalNotice/SimulationFlowTemplateNoticeStrategy.java index 9a05fac0..fca7b8cd 100644 --- a/system/src/main/java/com/sdm/system/service/impl/approvalNotice/SimulationFlowTemplateNoticeStrategy.java +++ b/system/src/main/java/com/sdm/system/service/impl/approvalNotice/SimulationFlowTemplateNoticeStrategy.java @@ -2,8 +2,7 @@ package com.sdm.system.service.impl.approvalNotice; import com.sdm.common.common.SdmResponse; import com.sdm.common.entity.req.system.LaunchApproveReq; -import com.sdm.common.feign.inter.capability.ISimulationFlowTemplateFeignClient; -import com.sdm.common.feign.inter.task.ISimuluationTaskPoolFeignClient; +import com.sdm.common.feign.inter.capability.ISimulationFlowFeignClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -11,7 +10,7 @@ import org.springframework.stereotype.Component; public class SimulationFlowTemplateNoticeStrategy extends ApproveAbstractNoticeStrategy { @Autowired - private ISimulationFlowTemplateFeignClient simulationFlowTemplateFeignClient; + private ISimulationFlowFeignClient simulationFlowTemplateFeignClient; // 这个回调场景值和 LaunchApproveReq 类里的 approveType 对应 // 审批类型 0.http回调的,replyUrl必须传递,相当于是跨系统的,调用的时候可以不传,replyUrl必须传递 ;1:仿真地图审批(spdm内部feign) 2:知识库审批(spdm内部feign) @Override