feat:任务执行算例初始化流程节点/启动流程实例/查询流程节点

This commit is contained in:
2025-11-28 18:09:56 +08:00
parent 4d8497c366
commit 6bc4c7401e
30 changed files with 655 additions and 87 deletions

View File

@@ -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<List<FlowNodeDto>> listSimulationFlowNode(@RequestBody FlowNodeDto req) {
return simulationFlowNodeService.listSimulationFlowNode(req);
}
}

View File

@@ -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<SimulationFlowNode> {
}

View File

@@ -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;
}

View File

@@ -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<SimulationFlowNode> {
SdmResponse batchAddSimulationFlowNode(@RequestBody FlowNodeDto req);
SdmResponse batchUpdateSimulationFlowNode(@RequestBody FlowNodeDto req);
SdmResponse<List<FlowNodeDto>> listSimulationFlowNode(@RequestBody FlowNodeDto req);
}

View File

@@ -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;
}

View File

@@ -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<SimulationFlowNodeMapper, SimulationFlowNode> implements ISimulationFlowNodeService {
@Override
@Transactional(rollbackFor = Exception.class)
public SdmResponse batchAddSimulationFlowNode(FlowNodeDto req) {
if (CollectionUtils.isNotEmpty(req.getFlowNodeDtoList())) {
List<SimulationFlowNode> 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<SimulationFlowNode> 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<List<FlowNodeDto>> listSimulationFlowNode(FlowNodeDto req) {
LambdaQueryWrapper<SimulationFlowNode> 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<SimulationFlowNode> flowNodeList = this.baseMapper.selectList(queryWrapper);
List<FlowNodeDto> dtoList = flowNodeList.stream().map(entity -> {
FlowNodeDto dto = new FlowNodeDto();
BeanUtils.copyProperties(entity, dto);
return dto;
}).toList();
return SdmResponse.success(dtoList);
}
}

View File

@@ -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) {

View File

@@ -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<FlowNodeDto> flowNodeDtoList;
}

View File

@@ -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;
}

View File

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

View File

@@ -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<List<FlowNodeDto>> 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("查询流程节点信息失败异常");
}
}
}

View File

@@ -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("仿真知识库文件审批状态修改异常");
}
}
}

View File

@@ -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<ProcessInstanceResp> startByProcessDefinitionKey(@RequestParam String processDefinitionKey) {
SdmResponse<ProcessInstanceResp> response;
try {
response = flowableFeignClient.startByProcessDefinitionKey(processDefinitionKey);
log.info("启动流程实例:"+ response);
return response;
} catch (Exception e) {
log.error("启动流程实例", e);
return SdmResponse.failed("启动流程实例");
}
}
}

View File

@@ -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<FlowTemplateResp> 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<List<FlowNodeDto>> listSimulationFlowNode(@RequestBody FlowNodeDto req);
}

View File

@@ -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);
}

View File

@@ -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<ProcessInstanceResp> startByProcessDefinitionKey(@RequestParam String processDefinitionKey);
}

View File

@@ -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);

View File

@@ -242,7 +242,7 @@ public class SimulationParameterLibraryServiceImpl extends ServiceImpl<Simulatio
@Override
public SdmResponse<SimulationParameterLibraryCategoryObjectResp> 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);

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -20,7 +20,7 @@
<module>pbs</module>
<module>system</module>
<module>common</module>
<!-- <module>flowable</module>-->
<module>flowable</module>
</modules>
<!--引入Spring Boot项目子项目都是这个版本-->

View File

@@ -178,4 +178,12 @@ public class SimulationRunController {
runService.generateReport(req,response);
}
/**
* 任务执行 一键执行 启动流程
*/
@PostMapping("/startProcessInstance")
public SdmResponse startProcessInstance(@RequestBody SpdmTaskRunReq req) {
return runService.startProcessInstance(req);
}
}

View File

@@ -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;
}

View File

@@ -17,5 +17,8 @@ public class SpdmTaskRunReq {
@Schema(description = "任务uuid")
private String taskId;
@Schema(description = "流程模板id")
private String templateId;
}

View File

@@ -57,4 +57,6 @@ public interface ISimulationRunService extends IService<SimulationRun> {
SdmResponse deleteSimulationKeyResult(KeyResultReq req);
void generateReport(SpdmReportReq req, HttpServletResponse response);
SdmResponse startProcessInstance(SpdmTaskRunReq req);
}

View File

@@ -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<SimulationRunMapper, S
@Autowired
private IDataFeignClient dataFeignClient;
@Autowired
private IFlowableFeignClient flowableFeignClient;
@Autowired
private ISimulationFlowFeignClient flowFeignClient;
private static final String TEMP_REPORT_PATH = "/opt/report/";
private int getCurrentNodeDepth(NodeAllBase eachNode) {
@@ -502,13 +514,8 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
if (fileMetadataInfoResp.getData() != null) {
simulationRun.setFolderId(fileMetadataInfoResp.getData().getId());
}
BeanUtils.copyProperties(req, simulationRun);
simulationRun.setUuid(RandomUtil.generateString(32));
simulationRun.setRunName(req.getRunName());
simulationRun.setTaskId(req.getTaskId());
simulationRun.setDescription(req.getDescription());
simulationRun.setTotalStep(req.getTotalStep());
simulationRun.setParentId(req.getParentId());
simulationRun.setFlowTemplate(req.getFlowTemplate());
simulationRun.setCreator(userId);
simulationRun.setUpdater(userId);
simulationRun.setTenantId(tenantId);
@@ -538,26 +545,92 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
simulationPerformanceService.saveBatch(runPerformanceList);
}
}
CreateDirReq createDirReq = new CreateDirReq();
createDirReq.setUuId(simulationRun.getUuid());
if (fileMetadataInfoResp.getData() != null) {
createDirReq.setParDirId(fileMetadataInfoResp.getData().getId());
// 创建算例文件夹
SdmResponse runDirResponse = createDir(simulationRun.getUuid(), simulationTask.getUuid(), req.getRunName(), DirTypeEnum.PROJECT_NODE_DIR.getValue(), NodeTypeEnum.RUN.getValue());
if (!runDirResponse.isSuccess()) {
return SdmResponse.failed("创建算例文件夹失败:{}" + runDirResponse.getMessage());
}
createDirReq.setUuIdOwnType(NodeTypeEnum.RUN.getValue());
createDirReq.setDirName(req.getRunName());
createDirReq.setDirType(DirTypeEnum.PROJECT_NODE_DIR.getValue());
log.info("创建算例时,调用创建文件夹的参数为:{}", createDirReq);
SdmResponse response = dataFeignClient.createDir(createDirReq);
log.info("创建算例时,调用创建文件夹的返回值为:{}", response);
if (!response.isSuccess()) {
this.removeById(simulationRun.getUuid());
simulationPerformanceService.lambdaUpdate().eq(SimulationPerformance::getRunId, simulationRun.getUuid()).remove();
// 解析流程模板中的节点结构,初始化流程节点表
SdmResponse<FlowTemplateResp> flowTemplateResp = flowFeignClient.queryFlowTemplateInfo(simulationRun.getFlowTemplate());
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) {
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<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) {
@@ -681,7 +754,7 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
if (!simulationKeyResultService.save(simulationRunKeyResult)) {
return SdmResponse.failed("添加关键结果失败");
}
return SdmResponse.success();
return SdmResponse.success(simulationRunKeyResult.getUuid());
}
@Override
@@ -860,6 +933,25 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
}
@Override
@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());
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();

View File

@@ -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<SysFormConfigure> list = formConfigureService.list(queryWrapper);
if (CollectionUtils.isEmpty(list)) {
return SdmResponse.failed("自定义表单列表为空,请初始化");

View File

@@ -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