|
@@ -1,8 +1,8 @@
|
|
|
package com.ruoyi.execution.produce.dispersed.runbpm;
|
|
|
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
|
-import com.alibaba.fastjson2.JSONObject;
|
|
|
import com.ruoyi.common.constant.HttpStatus;
|
|
|
+import com.ruoyi.common.core.domain.AjaxResult;
|
|
|
import com.ruoyi.common.utils.bpm.XmlDataParserUtils;
|
|
|
import com.ruoyi.common.utils.uuid.IdUtils;
|
|
|
import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNode;
|
|
@@ -26,6 +26,7 @@ import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.scheduling.annotation.EnableAsync;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
@@ -48,6 +49,12 @@ public class PreExecutionToolClass<R> {
|
|
|
@Autowired // 执行流程节点表
|
|
|
private BpmExecuteNodeMapper runBpmExecuteNodeMapper;
|
|
|
|
|
|
+ @Autowired // 节点脚本表单中间表
|
|
|
+ private IBpmExecuteNodeFormService iBpmExecuteNodeFormService;
|
|
|
+
|
|
|
+ @Autowired // 执行流程service
|
|
|
+ private IBpmExecuteProcessService iBpmExecuteProcessService;
|
|
|
+
|
|
|
@Autowired // 定义流程
|
|
|
private BpmProcessMapper bpmProcessMapper;
|
|
|
|
|
@@ -66,11 +73,6 @@ public class PreExecutionToolClass<R> {
|
|
|
@Autowired // 校验执行流程的数据
|
|
|
private VerifyExecutionProcess iVerifyExecutionProcess;
|
|
|
|
|
|
- @Autowired // 节点脚本表单中间表
|
|
|
- private IBpmExecuteNodeFormService iBpmExecuteNodeFormService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private IBpmExecuteProcessService iBpmExecuteProcessService;
|
|
|
|
|
|
/**
|
|
|
* 预执行流程自动执行开始节点
|
|
@@ -79,15 +81,16 @@ public class PreExecutionToolClass<R> {
|
|
|
* @return
|
|
|
*/
|
|
|
@Transactional
|
|
|
- public int ReadyToExecute(CommonEntity commonEntity) {
|
|
|
+ @Async
|
|
|
+ public AjaxResult ReadyToExecute(CommonEntity commonEntity) {
|
|
|
// 获取发起流程所需数据
|
|
|
IntoProduction intoProduction = this.obtainData(commonEntity);
|
|
|
/**
|
|
|
* 根据流程key校验当前流程数据的完整性,是否可以运行
|
|
|
*/
|
|
|
- // if (!iVerifyExecutionProcess.VerifyProcessData(intoProduction.getTaskProcessKey()))
|
|
|
- // return HttpStatus.EXECUTEPROCESS;
|
|
|
-
|
|
|
+ if (!iVerifyExecutionProcess.VerifyProcessData(intoProduction.getTaskProcessKey())) {
|
|
|
+ return AjaxResult.error(HttpStatus.EXECUTEPROCESS, "流程数据验证失败!");
|
|
|
+ }
|
|
|
/**1️⃣1️⃣1️⃣ 得到当前投产需要执行的流程详细信息*/
|
|
|
//--得到当前流程的详细信息
|
|
|
BpmProcess bpmProcess = bpmProcessMapper.selectBpmProcessByProcessKey(intoProduction.getTaskProcessKey());
|
|
@@ -101,6 +104,7 @@ public class PreExecutionToolClass<R> {
|
|
|
List<BpmUserScriptVo> bpmUserScriptVoList = new ArrayList<>();
|
|
|
// 得到当前流程所有脚本数据
|
|
|
List<BpmNodeScriptRelevance> bpmNodeScriptRelevanceList = new ArrayList<>();
|
|
|
+
|
|
|
bpmProcessConfigurationList.forEach(item -> {
|
|
|
BpmUserScriptVo bpmUserScriptVo = new BpmUserScriptVo();
|
|
|
bpmUserScriptVo.setNodeKey(item.getNodeKey());
|
|
@@ -197,42 +201,55 @@ public class PreExecutionToolClass<R> {
|
|
|
runBpmExecuteNodeMiddleList.add(bpmExecuteNodeMiddle);
|
|
|
});
|
|
|
runBpmExecuteNodeMiddleMapper.insertBpmExecuteNodeMiddleList(runBpmExecuteNodeMiddleList);
|
|
|
- /**3️⃣⚡️5️⃣ 流程任务当中的所有节点关联的表单信息
|
|
|
- * 得到当前流程的所有节点以及当前节点脚本绑定的异常脚本-》处理当前节点脚本、异常脚本绑定的表单到中间表信息 */
|
|
|
-
|
|
|
-
|
|
|
+ //**3️⃣⚡️5️⃣ 流程任务当中的所有节点关联的表单信息 得到当前流程的所有节点以及当前节点脚本绑定的异常脚本-》处理当前节点脚本、异常脚本绑定的表单到中间表信息 */
|
|
|
List<BpmExecuteNodeForm> bpmExecuteNodeFormList = new ArrayList<>();
|
|
|
+ // 当前流程的正常节点、异常节点(理论上无论什么节点都会绑定一个表单)
|
|
|
+ Map<String, String> nodeMap = new HashMap<>();
|
|
|
Map<String, BpmProcessConfiguration> nodeInfo = new HashMap<>();
|
|
|
bpmProcessConfigurationList.forEach(item -> {
|
|
|
+ if (item.getNodeType().equals("startEvent")) {
|
|
|
+ nodeMap.put("startNodeKey", item.getNodeKey());
|
|
|
+ } else if (item.getNodeType().equals("endEvent")) {
|
|
|
+ nodeMap.put("endNodeKey", item.getNodeKey());
|
|
|
+ }
|
|
|
nodeInfo.put(item.getNodeKey(), item);
|
|
|
});
|
|
|
bpmNodeScriptRelevanceList.forEach(item -> {
|
|
|
- // 0=:异常脚本;1:正常脚本 2:节点前后自动 节点前后执行的脚本是没有表单的
|
|
|
- if (item.getScriptTriggerType() != 2L) {
|
|
|
- BpmExecuteNodeForm bpmExecuteNodeForm = new BpmExecuteNodeForm();
|
|
|
- bpmExecuteNodeForm.setTaskProcessKey(intoProduction.getTaskProcessKey());
|
|
|
- bpmExecuteNodeForm.setTaskNodeKey(item.getNodeKey());
|
|
|
- bpmExecuteNodeForm.setTaskScriptKey(item.getScriptKey());
|
|
|
- if (item.getScriptTriggerType() == 1L) { // 正常节点脚本
|
|
|
- // bpmProcessConfigurationList
|
|
|
- bpmExecuteNodeForm.setTaskNodeFormKey(nodeInfo.get(item.getNodeKey()).getNodeFormKey());
|
|
|
- bpmExecuteNodeForm.setTaskNodeFromType(nodeInfo.get(item.getNodeKey()).getNodeFormType());
|
|
|
- // bpmExecuteNodeForm.setTaskNodeFromContent();
|
|
|
- } else if (item.getScriptTriggerType() == 0L) { // 异常脚本
|
|
|
- bpmExecuteNodeForm.setTaskNodeFormKey(item.getFormKey());
|
|
|
- bpmExecuteNodeForm.setTaskNodeFromType(item.getScriptNodeFormType());
|
|
|
- // bpmExecuteNodeForm.setTaskNodeFromContent();
|
|
|
+
|
|
|
+ if (item.getNodeKey().equals(nodeMap.get("startNodeKey")) || item.getNodeKey().equals(nodeMap.get("endNodeKey"))) {
|
|
|
+ // 开始结束节点不做记录
|
|
|
+ } else
|
|
|
+
|
|
|
+ // 0=:异常脚本;1:正常脚本 2:节点前后自动 节点前后执行的脚本是没有表单的
|
|
|
+ if (item.getScriptTriggerType() != 2L) {
|
|
|
+ BpmExecuteNodeForm bpmExecuteNodeForm = new BpmExecuteNodeForm();
|
|
|
+ bpmExecuteNodeForm.setTaskProcessKey(intoProduction.getTaskProcessKey());
|
|
|
+ bpmExecuteNodeForm.setTaskNodeKey(item.getNodeKey());
|
|
|
+ bpmExecuteNodeForm.setTaskScriptKey(item.getScriptKey());
|
|
|
+ if (item.getScriptTriggerType() == 1L) { // 正常节点脚本
|
|
|
+ // bpmProcessConfigurationList
|
|
|
+ bpmExecuteNodeForm.setTaskNodeFormKey(nodeInfo.get(item.getNodeKey()).getNodeFormKey());
|
|
|
+ bpmExecuteNodeForm.setTaskNodeFromType(nodeInfo.get(item.getNodeKey()).getNodeFormType());
|
|
|
+ // bpmExecuteNodeForm.setTaskNodeFromContent();
|
|
|
+ } else if (item.getScriptTriggerType() == 0L) { // 异常脚本
|
|
|
+ bpmExecuteNodeForm.setTaskNodeFormKey(item.getFormKey());
|
|
|
+ bpmExecuteNodeForm.setTaskNodeFromType(item.getScriptNodeFormType());
|
|
|
+ // bpmExecuteNodeForm.setTaskNodeFromContent();
|
|
|
+ }
|
|
|
+ bpmExecuteNodeFormList.add(bpmExecuteNodeForm);
|
|
|
}
|
|
|
- bpmExecuteNodeFormList.add(bpmExecuteNodeForm);
|
|
|
- }
|
|
|
});
|
|
|
- Map<String, Object> nodeFrom = new HashMap<>(); // 当前流程所需的表单
|
|
|
+ // 得到当前流程所有的表单类型
|
|
|
+ Map<String, String> nodeFrom = iBpmExecuteNodeFormService.selectNodeFromInfos(commonEntity.getCommMap().get("process_key").toString());
|
|
|
+ // 得到当前表单的所有信息
|
|
|
+ Map<String, Object> nodeFromInfoMap = this.getNodeFormInfos(nodeFrom);
|
|
|
bpmExecuteNodeFormList.forEach(item -> {
|
|
|
- nodeFrom.put(item.getTaskNodeFormKey(), item.getTaskNodeFromType());
|
|
|
+ item.setTaskNodeFromContent(nodeFromInfoMap.get(item.getTaskNodeFormKey()).toString());
|
|
|
+ });
|
|
|
+ // 最终提交新增 bpmExecuteNodeFormList
|
|
|
+ bpmExecuteNodeFormList.forEach(item -> {
|
|
|
+ iBpmExecuteNodeFormService.insertBpmExecuteNodeForm(item);
|
|
|
});
|
|
|
- ///未完待续。。。
|
|
|
-
|
|
|
-
|
|
|
// iBpmExecuteNodeFormService
|
|
|
/**4️⃣4️⃣4️⃣ 调用执行节点接口 预执行当前投产流程的开始节点,执行开始节点*/
|
|
|
// bpmUserScriptVoList 节点key对应的脚本
|
|
@@ -250,21 +267,26 @@ public class PreExecutionToolClass<R> {
|
|
|
iScriptEntity.setScriptNodeKey(optionalBpmUserScriptVo.get().getNodeKey());
|
|
|
if (!iRunImplementationClass.RunScriptImplementationClassLogicCode(iScriptEntity, intoProduction)) {
|
|
|
// 判断脚本执行状态
|
|
|
- return HttpStatus.SCRIPTEXCEPTION;
|
|
|
+ return AjaxResult.error(HttpStatus.SCRIPTEXCEPTION, "脚本执行异常!");
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
// 数据出现问题
|
|
|
- return HttpStatus.EXECUTEPROCESS;
|
|
|
+ return AjaxResult.error(HttpStatus.EXECUTEPROCESS, "流程开始节点数据异常!");
|
|
|
}
|
|
|
/**5️⃣5️⃣5️⃣ 执行结果返回前端*/
|
|
|
- return HttpStatus.SUCCESS;
|
|
|
+ return AjaxResult.success();
|
|
|
}
|
|
|
|
|
|
- // 执行流程节点共通接口
|
|
|
+ /**
|
|
|
+ * 执行流程节点共通接口
|
|
|
+ *
|
|
|
+ * @param bpmRunNodeVo
|
|
|
+ * @return
|
|
|
+ */
|
|
|
@Transactional
|
|
|
@Async
|
|
|
- public int executionNode(BpmRunNodeVo bpmRunNodeVo) {
|
|
|
+ public AjaxResult executionNode(BpmRunNodeVo bpmRunNodeVo) {
|
|
|
System.err.println(bpmRunNodeVo.getTaskNodeKey());
|
|
|
System.err.println(bpmRunNodeVo.getNextNodeKey());
|
|
|
String taskProcessKey = bpmRunNodeVo.getTaskProcessKey(); // 任务流程编码
|
|
@@ -286,7 +308,10 @@ public class PreExecutionToolClass<R> {
|
|
|
iScriptEntity.setScriptNodeKey(taskNodeKey);
|
|
|
iScriptEntity.setImplementationName(script[i]);
|
|
|
// 调用执行脚本方法
|
|
|
- iRunImplementationClass.RunScriptImplementationClassLogicCode(iScriptEntity, bpmRunNodeVo);
|
|
|
+ if (!iRunImplementationClass.RunScriptImplementationClassLogicCode(iScriptEntity, bpmRunNodeVo)) {
|
|
|
+ // 判断脚本执行状态
|
|
|
+ return AjaxResult.error(HttpStatus.SCRIPTEXCEPTION, "节点前脚本执行失败!");
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -298,7 +323,10 @@ public class PreExecutionToolClass<R> {
|
|
|
iRunBPMEntity.setExecutionNodeKey(taskNodeKey);
|
|
|
iRunBPMEntity.setExecutionMap(bpmRunNodeVo.getFormDataMap());
|
|
|
iRunBPMEntity.setTableName(bpmRunNodeVo.getTableName());
|
|
|
- iRunImplementationClass.RunBPMImplementationClassLogicCode(iRunBPMEntity);
|
|
|
+ AjaxResult ajaxResult = iRunImplementationClass.RunBPMImplementationClassLogicCode(iRunBPMEntity); // 调用节点绑定逻辑代码
|
|
|
+ if (!ajaxResult.get("code").equals("200")) {
|
|
|
+ return ajaxResult;
|
|
|
+ }
|
|
|
//--- 2️⃣⚡️5️⃣ 当节点执行完成后修改节点的状态
|
|
|
System.err.println("--- 2️⃣⚡️5️⃣ 当节点执行完成后修改节点的状态");
|
|
|
BpmExecuteNode updateNodeStateEn = new BpmExecuteNode();
|
|
@@ -319,7 +347,10 @@ public class PreExecutionToolClass<R> {
|
|
|
iScriptEntity.setScriptNodeKey(taskNodeKey);
|
|
|
iScriptEntity.setImplementationName(script[i]);
|
|
|
// 调用执行节点
|
|
|
- iRunImplementationClass.RunScriptImplementationClassLogicCode(iScriptEntity, bpmRunNodeVo);
|
|
|
+ if (!iRunImplementationClass.RunScriptImplementationClassLogicCode(iScriptEntity, bpmRunNodeVo)) {
|
|
|
+ // 判断脚本执行状态
|
|
|
+ return AjaxResult.error(HttpStatus.SCRIPTEXCEPTION, "节点后执行脚本失败!");
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -333,12 +364,15 @@ public class PreExecutionToolClass<R> {
|
|
|
iScriptEntity.setScriptNodeKey(taskNodeKey);
|
|
|
iScriptEntity.setImplementationName("commonEndEvent"); // 直接调用结束节点执行逻辑
|
|
|
// 调用执行结束节点
|
|
|
- iRunImplementationClass.RunScriptImplementationClassLogicCode(iScriptEntity, iScriptEntity);
|
|
|
+ if (!iRunImplementationClass.RunScriptImplementationClassLogicCode(iScriptEntity, iScriptEntity)) {
|
|
|
+ // 判断脚本执行状态
|
|
|
+ return AjaxResult.error(HttpStatus.SCRIPTEXCEPTION, "流程结束失败!");
|
|
|
+ }
|
|
|
// 结束当前流程 更新流程状态
|
|
|
if (runBpmExecuteProcessMapper.endProcess(bpmRunNodeVo.getTaskProcessKey()) > 1) {
|
|
|
- return HttpStatus.SUCCESS;
|
|
|
+ AjaxResult.success("流程执行成功!");
|
|
|
} else {
|
|
|
- return HttpStatus.PROCESSERROR;
|
|
|
+ AjaxResult.error(HttpStatus.PROCESSERROR, "流程结束失败!");
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
@@ -374,9 +408,9 @@ public class PreExecutionToolClass<R> {
|
|
|
bpmExecuteProcess.setTaskNodeKey(bpmRunNodeVo.getTaskNodeKey());
|
|
|
bpmExecuteProcess.setTaskNodeNextKey(bpmRunNodeVo.getNextNodeKey());
|
|
|
runBpmExecuteProcessMapper.updateProcessNode(bpmExecuteProcess);
|
|
|
- return HttpStatus.SUCCESS;
|
|
|
+ return AjaxResult.success();
|
|
|
}
|
|
|
- return HttpStatus.SUCCESS;
|
|
|
+ return AjaxResult.success();
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -401,12 +435,9 @@ public class PreExecutionToolClass<R> {
|
|
|
return intoProduction;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
public Map<String, Object> getNodeFormInfos(Map<String, String> nodeForm) {
|
|
|
- //nodeForm.put("5", "dragForm");
|
|
|
- nodeForm.put("e8e649b5-61d0-4616-8a10-8bc8a49d3882", "composeForm");
|
|
|
Set<String> nodeKey = nodeForm.keySet();
|
|
|
- Map resultMap=new HashMap();
|
|
|
+ Map resultMap = new HashMap();
|
|
|
nodeKey.forEach(item -> {
|
|
|
if (nodeForm.get(item).equals("dragForm")) { // 拖拽类型的表单
|
|
|
String fromInfo = iBpmExecuteProcessService.getFromInfo(item);
|
|
@@ -421,61 +452,4 @@ public class PreExecutionToolClass<R> {
|
|
|
return resultMap;
|
|
|
}
|
|
|
|
|
|
- // 弃用保留
|
|
|
- public int updateNodeState(String taskProcessKey, String taskNodeKey, CommonEntity commonEntity) {
|
|
|
- BpmExecuteNode bpmExecuteNode1 = new BpmExecuteNode();
|
|
|
- bpmExecuteNode1.setTaskProcessKey(taskProcessKey);
|
|
|
- bpmExecuteNode1.setTaskNodeKey(taskNodeKey);
|
|
|
- bpmExecuteNode1.setTaskNodeState("1"); // 状态标识已经执行
|
|
|
- // 修改当前节点的状态
|
|
|
- runBpmExecuteNodeMapper.updateNodeState(bpmExecuteNode1);
|
|
|
-
|
|
|
-
|
|
|
- // 得到当前节点的所有信息
|
|
|
- BpmExecuteNode currentBpmExecuteNode = runBpmExecuteNodeMapper.queryBpmExecuteNodeBytaskNodeKey(taskProcessKey, taskNodeKey);
|
|
|
- /**
|
|
|
- * 执行当前节点配置的操作 例如:当前节点中的自动执行的脚本
|
|
|
- * 得到当前节点的关联信息
|
|
|
- */
|
|
|
- BpmExecuteNodeMiddle bpmExecuteNodeMiddle = runBpmExecuteNodeMiddleMapper.queryBpmExecuteNodeMiddleByTaskNodeKey(taskProcessKey, taskNodeKey);
|
|
|
- String script[] = bpmExecuteNodeMiddle.getTaskAutomaticScriptTriggerType().split(","); // 得到当前节点需要自动执行的脚本
|
|
|
- // 1️⃣1️⃣1️⃣节点前执行的脚本
|
|
|
- if (currentBpmExecuteNode.getTaskNodeBefore().equals("true")) {
|
|
|
- // 调用执行脚本接口
|
|
|
- if (script.length != 0 && !script[0].isEmpty()) {
|
|
|
- for (int i = 0; i < script.length; i++) {
|
|
|
- // 节点执行必要的参数
|
|
|
- IScriptEntity iScriptEntity = new IScriptEntity();
|
|
|
- iScriptEntity.setScriptFlowKey(taskProcessKey);
|
|
|
- iScriptEntity.setScriptNodeKey(taskNodeKey);
|
|
|
- iScriptEntity.setImplementationName(script[i]);
|
|
|
- // 调用执行节点
|
|
|
- iRunImplementationClass.RunScriptImplementationClassLogicCode(iScriptEntity, commonEntity);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- // 2️⃣2️⃣2️⃣执行节点绑定的正常脚本
|
|
|
- IRunBPMEntity iRunBPMEntity = new IRunBPMEntity();
|
|
|
- iRunBPMEntity.setImplementationName(commonEntity.getBasicMap().get("implementationName").toString());
|
|
|
- iRunBPMEntity.setExecutionFlowKey(taskProcessKey);
|
|
|
- iRunBPMEntity.setExecutionNodeKey(taskNodeKey);
|
|
|
- iRunBPMEntity.setExecutionMap((Map<String, Object>) JSON.parse(commonEntity.toString()));
|
|
|
- iRunImplementationClass.RunBPMImplementationClassLogicCode(iRunBPMEntity);
|
|
|
- // 3️⃣3️⃣3️⃣节点后执行的脚本
|
|
|
- if (currentBpmExecuteNode.getTaskNodeAfter().equals("true")) {
|
|
|
- // 调用执行脚本接口
|
|
|
- if (script.length != 0 && !script[0].isEmpty()) {
|
|
|
- for (int i = 0; i < script.length; i++) {
|
|
|
- // 节点执行必要的参数
|
|
|
- IScriptEntity iScriptEntity = new IScriptEntity();
|
|
|
- iScriptEntity.setScriptFlowKey(taskProcessKey);
|
|
|
- iScriptEntity.setScriptNodeKey(taskNodeKey);
|
|
|
- iScriptEntity.setImplementationName(script[i]);
|
|
|
- // 调用执行节点
|
|
|
- iRunImplementationClass.RunScriptImplementationClassLogicCode(iScriptEntity, commonEntity);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return 1;
|
|
|
- }
|
|
|
}
|