@@ -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 I DataFeignClient dataFeignClient ;
private DataClient FeignClientImpl dataFeignClient ;
@Autowired
private I FlowableFeignClient flowableFeignClient ;
private FlowableClient FeignClientImpl flowableFeignClient ;
@Autowired
private I SimulationFlowFeignClient 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 ( " n ame" ) ) ;
// flowNodeReq.setFlowInstanceId(simulationRun.getFlowInstanceId()) ;
flowNodeDto . setNodeId ( map . get ( " id " ) ) ;
flowNodeDto . setTemplateId ( simulationRun . getFlowTemplate ( ) ) ;
flowNodeDto . setNodeName ( flowElement . getN ame( ) ) ;
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 ( ) . getProcessInstance Id ( ) ) . 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 ( ) ;