Răsfoiți Sursa

improvement:正常节点、异常节点绑定表单的理论锁定,执行流程相关接口的优化,返回节点脚本执行状态

韩帛霖 1 an în urmă
părinte
comite
3e3fe4fec8
22 a modificat fișierele cu 263 adăugiri și 246 ștergeri
  1. 0 14
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/dragForm/CommonFileController.java
  2. 0 2
      ruoyi-common/src/main/java/com/ruoyi/common/exception/tenantdatassource/TenantDataSource.java
  3. 1 1
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionAspect.java
  4. 16 0
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java
  5. 1 1
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/controller/BpmExecuteProcessController.java
  6. 5 44
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/controller/BpmRunController.java
  7. 2 1
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/controller/BpmScriptController.java
  8. 1 1
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/entity/BpmExecuteNode.java
  9. 10 0
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/mapper/BpmExecuteNodeFormMapper.java
  10. 84 110
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/runbpm/PreExecutionToolClass.java
  11. 21 9
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/runbpm/RunImplementationClass.java
  12. 17 9
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/IBpmExecuteNodeFormService.java
  13. 2 1
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/IBpmExecuteProcessService.java
  14. 2 1
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/IScriptService.java
  15. 26 21
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/BpmExecuteNodeFormServiceImpl.java
  16. 2 1
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/BpmExecuteProcessServiceImpl.java
  17. 1 1
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/script/ProductionWarehousing.java
  18. 1 1
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/script/common/CommonNodeEndServiceImpl.java
  19. 1 1
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/script/common/CommonProductionSchedulingServiceImpl.java
  20. 2 1
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/templateimpl/RunBPMImpl.java
  21. 1 1
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/templateimpl/ScriptImpl.java
  22. 67 25
      ruoyi-process-execution/src/main/resources/mapper/bpm/dispersed/BpmExecuteNodeFormMapper.xml

+ 0 - 14
ruoyi-admin/src/main/java/com/ruoyi/web/controller/dragForm/CommonFileController.java

@@ -1,10 +1,5 @@
 package com.ruoyi.web.controller.dragForm;
 
-import com.alibaba.excel.EasyExcel;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
-import com.alibaba.fastjson2.TypeReference;
-import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.common.config.RuoYiConfig;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.AjaxResult;
@@ -12,12 +7,6 @@ import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.file.FileUploadUtils;
 import com.ruoyi.common.utils.file.FileUtils;
 import com.ruoyi.framework.config.ServerConfig;
-import com.ruoyi.system.entity.CommonEntity;
-import com.ruoyi.system.entity.TableSql;
-import com.ruoyi.system.service.ICommonService;
-import com.ruoyi.system.service.IDataSourceService;
-import com.ruoyi.system.service.ITableSqlService;
-import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -25,13 +14,10 @@ import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import static com.ruoyi.common.core.domain.AjaxResult.success;
 

+ 0 - 2
ruoyi-common/src/main/java/com/ruoyi/common/exception/tenantdatassource/TenantDataSource.java

@@ -1,7 +1,5 @@
 package com.ruoyi.common.exception.tenantdatassource;
 
-import com.ruoyi.common.core.domain.AjaxResult;
-
 /**
  * @author hanzihang
  * @date 2023/9/20 5:16

+ 1 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionAspect.java

@@ -17,7 +17,7 @@ import org.springframework.stereotype.Component;
 @Component
 public class GlobalExceptionAspect {
     // com.ruoyi.system.service.impl
-//    @Around("execution(* com.ruoyi.system..*(..))") // 切入点表达式
+//    @Around("execution(* com.ruoyi.execution.produce..*(..))") // 切入点表达式
 //    public Object handleExceptionALL(ProceedingJoinPoint joinPoint) throws Throwable {
 //        try {
 //            return joinPoint.proceed(); // 继续执行被拦截的方法

+ 16 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java

@@ -133,4 +133,20 @@ public class GlobalExceptionHandler {
     public AjaxResult handleTenantDateSource(TenantDataSource t) {
         return AjaxResult.error(602, "解析租户数据源异常");
     }
+
+//    /**
+//     * 流程节点执行异常
+//     */
+//    @ExceptionHandler(NodeException.class)
+//    public AjaxResult handleNodeException(NodeException n) {
+//        return AjaxResult.error(n.getCode(), n.getMessage());
+//    }
+//
+//    /**
+//     * 脚本执行异常(节点前后,按钮绑定的节点等等)
+//     */
+//    @ExceptionHandler(ScriptException.class)
+//    public AjaxResult handleScriptException(ScriptException s) {
+//        return AjaxResult.error(s.getCode(), s.getMessage());
+//    }
 }

+ 1 - 1
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/controller/BpmExecuteProcessController.java

@@ -106,7 +106,7 @@ public class BpmExecuteProcessController extends BaseController {
      */
     @Log(title = "投产执行流程", businessType = BusinessType.INSERT)
     @PostMapping("/productionScheduling")
-    public AjaxResult productionScheduling(@RequestBody CommonEntity commonEntity) {
+    public AjaxResult productionScheduling(@RequestBody CommonEntity commonEntity)   {
         return bpmExecuteProcessService.productionScheduling(commonEntity);
     }
 

+ 5 - 44
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/controller/BpmRunController.java

@@ -56,15 +56,14 @@ public class BpmRunController extends BaseController {
                 throw new RuntimeException(e);
             }
         }
-        return AjaxResult.success(ipreExecutionToolClass.executionNode(bpmRunNodeVo));
+        return ipreExecutionToolClass.executionNode(bpmRunNodeVo);
     }
 
 
     /**
      * 共通执行节点表单模版接口
      */
-    @Log(title = "执行流程节点前表单模版", businessType = BusinessType.INSERT)
-    @PostMapping("/ProcessNodeFormTemplate")
+    @GetMapping("/ProcessNodeFormTemplate")
     public AjaxResult ProcessNodeFormTemplate(BpmRunNodeVo bpmRunNodeVo) {
         return AjaxResult.success(null);
     }
@@ -77,44 +76,6 @@ public class BpmRunController extends BaseController {
     public AjaxResult triggerExceptionNode(@RequestBody TriggerExceptionVO vo) throws Exception {
         return toAjax(bpmExecuteNodeService.triggerExceptionNode(vo));
     }
-}
-/**
- * 15:39:45.028 [http-nio-8055-exec-3] WARN  o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - [logException,208] -
- * Resolved [org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
- * <EOL>### Error updating database.
- * Cause: java.lang.NullPointerException<EOL>
- * ### The error may exist in file [/Users/zrwj/Desktop/ZKQY_LJJ/Intelligent_manufacturing/drag_process/ruoyi-process-execution/target/classes/mapper/bpm/dispersed/BpmExecuteProcessMapper.xml]
- * <EOL>### The error may involve com.ruoyi.execution.produce.dispersed.mapper.BpmExecuteProcessMapper.insertBpmExecuteProcess<EOL>
- * ### The error occurred while executing an update<EOL>### Cause: java.lang.NullPointerException]
- * <p>
- * <p>
- * <p>
- * <p>
- * insert into `tenant1116`.bpm_execute_node
- * (
- * task_process_key
- * task_node_key
- * task_node_name
- * task_node_form_key
- * task_node_type
- * task_node_before
- * task_node_after
- * task_node_role_permission
- * task_remark
- * task_node_number
- * task_node_weight
- * task_node_state
- * task_priority
- * task1
- * task2
- * task3
- * task4
- * task5
- * del_flag
- * create_by_id
- * create_by
- * create_time )values
- * (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 22
- * (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
- * (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
- */
+
+
+}

+ 2 - 1
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/controller/BpmScriptController.java

@@ -3,6 +3,7 @@ package com.ruoyi.execution.produce.dispersed.controller;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.enums.BusinessType;
+
 import com.ruoyi.execution.produce.dispersed.entity.runbpm.IScriptEntity;
 import com.ruoyi.execution.produce.dispersed.runbpm.RunImplementationClass;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -28,7 +29,7 @@ public class BpmScriptController {
      */
     @Log(title = "脚本执行接口", businessType = BusinessType.UPDATE)
     @PostMapping("/execute")
-    public AjaxResult productionScheduling(@RequestBody String scriptKey) {
+    public AjaxResult productionScheduling(@RequestBody String scriptKey)   {
         IScriptEntity iScriptEntity = new IScriptEntity();
         iScriptEntity.setScriptFlowKey(scriptKey); // 脚本别名
         return AjaxResult.success(irunImplementationClass.RunScriptImplementationClassLogicCode(iScriptEntity,scriptKey));

+ 1 - 1
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/entity/BpmExecuteNode.java

@@ -57,7 +57,7 @@ public class BpmExecuteNode extends BaseEntity implements Serializable {
     private String taskNodeType;
 
     /**
-     * 节点执行类型(0:自动执行;1:手动执行)
+     * 节点执行类型(0:true:自动执行;1:false:手动执行)
      */
     private String taskNodeExecuteType;
 

+ 10 - 0
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/mapper/BpmExecuteNodeFormMapper.java

@@ -1,8 +1,10 @@
 package com.ruoyi.execution.produce.dispersed.mapper;
 
 import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 执行节点单Mapper接口
@@ -60,6 +62,14 @@ public interface BpmExecuteNodeFormMapper
      */
     public int deleteBpmExecuteNodeFormByIds(Long[] ids);
 
+    /**
+     * 当前发起的流程节点的表单信息
+     *
+     * @param processKey 流程编码
+     * @return
+     */
+    public List<Map<String, String>> selectNodeFromInfos(String processKey);
+
     /**
      * 查询执行节点单详情
      *

+ 84 - 110
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/runbpm/PreExecutionToolClass.java

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

+ 21 - 9
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/runbpm/RunImplementationClass.java

@@ -7,9 +7,11 @@ import com.ruoyi.execution.produce.dispersed.service.IRunBPMService;
 import com.ruoyi.execution.produce.dispersed.service.IScriptService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 
 
 /**
@@ -37,18 +39,20 @@ public class RunImplementationClass<J> {
      * @param iRunBPMEntity 节点执行参数
      * @return
      */
+    @Transactional
     public AjaxResult RunBPMImplementationClassLogicCode(IRunBPMEntity iRunBPMEntity) {
-        AjaxResult ajaxResult = new AjaxResult();
+        AjaxResult ajaxResult = new AjaxResult(); // 节点逻辑执行完成返回提示
         if (applicationContext.containsBean(iRunBPMEntity.getImplementationName())) {
             IRunBPMService iRunBPMService = (IRunBPMService) applicationContext.getBean(iRunBPMEntity.getImplementationName(), IRunBPMService.class);
             // 校验当前需要执行的脚本是否存在
             if (iRunBPMService.isVerificationMethod()) {
                 // 脚本执行前验证
-                AjaxResult ajaxResult1 = iRunBPMService.preValidation(iRunBPMEntity);
-                if (ajaxResult1.get("code").toString().equals("200")) {
+                if (iRunBPMService.preValidation(iRunBPMEntity).get("code").toString().equals("200")) {
                     ajaxResult = iRunBPMService.executeNode(iRunBPMEntity);
-                    // 把当前节点置为已经执行状态
-                    iRunBPMService.afterValidation(iRunBPMEntity);
+                    if (ajaxResult.get("code").equals("200")) {
+                        // 节点后置验证
+                        ajaxResult = iRunBPMService.afterValidation(iRunBPMEntity);
+                    }
                 }
                 // 执行清理操作
                 iRunBPMService.preDestroy();
@@ -67,6 +71,7 @@ public class RunImplementationClass<J> {
      * @param parameter     脚本实现逻辑其他参数
      * @return
      */
+    @Transactional
     public boolean RunScriptImplementationClassLogicCode(IScriptEntity iScriptEntity, J parameter) {
         if (applicationContext.containsBean(iScriptEntity.getImplementationName())) {
             IScriptService iScriptService = (IScriptService) applicationContext.getBean(iScriptEntity.getImplementationName(), IScriptService.class);
@@ -74,7 +79,7 @@ public class RunImplementationClass<J> {
             if (iScriptService.isVerificationMethod()) {
                 // 脚本执行前验证
                 if ((Boolean) iScriptService.preExecutionScript(parameter)) {
-                    iScriptService.ExecutionScript(parameter);
+                    iScriptService.executionScript(parameter);
                     iScriptService.afterExecutionScript(parameter);
                 }
                 // 执行清理操作
@@ -96,9 +101,16 @@ public class RunImplementationClass<J> {
      */
     public boolean isVerificationMethod(String implementationName) {
         if (applicationContext.containsBean(implementationName)) {
-            IScriptService iScriptService = (IScriptService) applicationContext.getBean(implementationName, IScriptService.class);
-            // 校验当前需要执行的脚本是否存在
-            return iScriptService.isVerificationMethod();
+            boolean state = false;
+            try {
+                // 尝试获取bean
+                applicationContext.getBean(implementationName);
+                state = true;
+            } catch (NoSuchBeanDefinitionException e) {
+                state = false;
+            } finally {
+                return state;
+            }
         } else {
             return false;
         }

+ 17 - 9
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/IBpmExecuteNodeFormService.java

@@ -4,18 +4,18 @@ package com.ruoyi.execution.produce.dispersed.service;
 import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 执行节点单Service接口
- * 
+ *
  * @author ruoyi
  * @date 2023-12-07
  */
-public interface IBpmExecuteNodeFormService 
-{
+public interface IBpmExecuteNodeFormService {
     /**
      * 查询执行节点单
-     * 
+     *
      * @param id 执行节点单主键
      * @return 执行节点单
      */
@@ -23,7 +23,7 @@ public interface IBpmExecuteNodeFormService
 
     /**
      * 查询执行节点单列表
-     * 
+     *
      * @param bpmExecuteNodeForm 执行节点单
      * @return 执行节点单集合
      */
@@ -31,7 +31,7 @@ public interface IBpmExecuteNodeFormService
 
     /**
      * 新增执行节点单
-     * 
+     *
      * @param bpmExecuteNodeForm 执行节点单
      * @return 结果
      */
@@ -39,7 +39,7 @@ public interface IBpmExecuteNodeFormService
 
     /**
      * 修改执行节点单
-     * 
+     *
      * @param bpmExecuteNodeForm 执行节点单
      * @return 结果
      */
@@ -47,7 +47,7 @@ public interface IBpmExecuteNodeFormService
 
     /**
      * 批量删除执行节点单
-     * 
+     *
      * @param ids 需要删除的执行节点单主键集合
      * @return 结果
      */
@@ -55,9 +55,17 @@ public interface IBpmExecuteNodeFormService
 
     /**
      * 删除执行节点单信息
-     * 
+     *
      * @param id 执行节点单主键
      * @return 结果
      */
     public int deleteBpmExecuteNodeFormById(Long id);
+
+    /**
+     * 当前发起的流程节点的表单信息
+     *
+     * @param processKey 流程编码
+     * @return
+     */
+    public Map<String, String> selectNodeFromInfos(String processKey);
 }

+ 2 - 1
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/IBpmExecuteProcessService.java

@@ -4,6 +4,7 @@ import java.util.List;
 import java.util.Map;
 
 import com.ruoyi.common.core.domain.AjaxResult;
+
 import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteProcess;
 import com.ruoyi.system.entity.CommonEntity;
 
@@ -69,7 +70,7 @@ public interface IBpmExecuteProcessService {
      * @param commonEntity 预执行流程任务实体
      * @return
      */
-    public AjaxResult productionScheduling(CommonEntity commonEntity);
+    public AjaxResult productionScheduling(CommonEntity commonEntity)  ;
 
     /**
      * 根据formId查询form表单信息

+ 2 - 1
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/IScriptService.java

@@ -1,5 +1,6 @@
 package com.ruoyi.execution.produce.dispersed.service;
 
+
 /**
  * 脚本接口
  * 作用: 仅为一个标识接口,实现类可以直接被注入到脚本执行引擎,进行计算。
@@ -23,7 +24,7 @@ public interface IScriptService<J> {
      * @param parameter
      * @return
      */
-    J ExecutionScript(J parameter);
+    J executionScript(J parameter)  ;
 
     /**
      * 执行脚本后验证

+ 26 - 21
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/BpmExecuteNodeFormServiceImpl.java

@@ -1,6 +1,8 @@
 package com.ruoyi.execution.produce.dispersed.service.impl;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm;
 import com.ruoyi.execution.produce.dispersed.mapper.BpmExecuteNodeFormMapper;
@@ -10,85 +12,88 @@ import org.springframework.stereotype.Service;
 
 /**
  * 执行节点单Service业务层处理
- * 
+ *
  * @author ruoyi
  * @date 2023-12-07
  */
 @Service
-public class BpmExecuteNodeFormServiceImpl implements IBpmExecuteNodeFormService
-{
+public class BpmExecuteNodeFormServiceImpl implements IBpmExecuteNodeFormService {
     @Autowired
     private BpmExecuteNodeFormMapper bpmExecuteNodeFormMapper;
 
     /**
      * 查询执行节点单
-     * 
+     *
      * @param id 执行节点单主键
      * @return 执行节点单
      */
     @Override
-    public BpmExecuteNodeForm selectBpmExecuteNodeFormById(Long id)
-    {
+    public BpmExecuteNodeForm selectBpmExecuteNodeFormById(Long id) {
         return bpmExecuteNodeFormMapper.selectBpmExecuteNodeFormById(id);
     }
 
     /**
      * 查询执行节点单列表
-     * 
+     *
      * @param bpmExecuteNodeForm 执行节点单
      * @return 执行节点单
      */
     @Override
-    public List<BpmExecuteNodeForm> selectBpmExecuteNodeFormList(BpmExecuteNodeForm bpmExecuteNodeForm)
-    {
+    public List<BpmExecuteNodeForm> selectBpmExecuteNodeFormList(BpmExecuteNodeForm bpmExecuteNodeForm) {
         return bpmExecuteNodeFormMapper.selectBpmExecuteNodeFormList(bpmExecuteNodeForm);
     }
 
     /**
      * 新增执行节点单
-     * 
+     *
      * @param bpmExecuteNodeForm 执行节点单
      * @return 结果
      */
     @Override
-    public int insertBpmExecuteNodeForm(BpmExecuteNodeForm bpmExecuteNodeForm)
-    {
+    public int insertBpmExecuteNodeForm(BpmExecuteNodeForm bpmExecuteNodeForm) {
         return bpmExecuteNodeFormMapper.insertBpmExecuteNodeForm(bpmExecuteNodeForm);
     }
 
     /**
      * 修改执行节点单
-     * 
+     *
      * @param bpmExecuteNodeForm 执行节点单
      * @return 结果
      */
     @Override
-    public int updateBpmExecuteNodeForm(BpmExecuteNodeForm bpmExecuteNodeForm)
-    {
+    public int updateBpmExecuteNodeForm(BpmExecuteNodeForm bpmExecuteNodeForm) {
         return bpmExecuteNodeFormMapper.updateBpmExecuteNodeForm(bpmExecuteNodeForm);
     }
 
     /**
      * 批量删除执行节点单
-     * 
+     *
      * @param ids 需要删除的执行节点单主键
      * @return 结果
      */
     @Override
-    public int deleteBpmExecuteNodeFormByIds(Long[] ids)
-    {
+    public int deleteBpmExecuteNodeFormByIds(Long[] ids) {
         return bpmExecuteNodeFormMapper.deleteBpmExecuteNodeFormByIds(ids);
     }
 
     /**
      * 删除执行节点单信息
-     * 
+     *
      * @param id 执行节点单主键
      * @return 结果
      */
     @Override
-    public int deleteBpmExecuteNodeFormById(Long id)
-    {
+    public int deleteBpmExecuteNodeFormById(Long id) {
         return bpmExecuteNodeFormMapper.deleteBpmExecuteNodeFormById(id);
     }
+
+    @Override
+    public Map<String, String> selectNodeFromInfos(String processKey) {
+        Map<String, String> map = new HashMap<>();
+        List<Map<String, String>> infos = bpmExecuteNodeFormMapper.selectNodeFromInfos(processKey);
+        infos.forEach(item -> map.put(item.get("formKey"), item.get("formType")));
+        return map;
+    }
+
+
 }

+ 2 - 1
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/BpmExecuteProcessServiceImpl.java

@@ -8,6 +8,7 @@ import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.SysRole;
+
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.http.Sending;
 import com.ruoyi.execution.produce.dispersed.runbpm.PreExecutionToolClass;
@@ -143,7 +144,7 @@ public class BpmExecuteProcessServiceImpl implements IBpmExecuteProcessService {
      * @return
      */
     @Override
-    public AjaxResult productionScheduling(CommonEntity commonEntity) {
+    public AjaxResult productionScheduling(CommonEntity commonEntity)   {
         // 得到流程key 和 投产数据条的id  (做关联查询)
         // intoProduction.getTaskProcessKey();
         return AjaxResult.success(ipreExecutionToolClass.ReadyToExecute(commonEntity));

+ 1 - 1
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/script/ProductionWarehousing.java

@@ -45,7 +45,7 @@ public class ProductionWarehousing implements IScriptService {
     }
 
     @Override
-    public Object ExecutionScript(Object parameter) {
+    public Object executionScript(Object parameter) {
         //接收参数
         Map<String, Object> map = (Map<String, Object>) parameter;
 

+ 1 - 1
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/script/common/CommonNodeEndServiceImpl.java

@@ -37,7 +37,7 @@ public class CommonNodeEndServiceImpl implements IScriptService {
     }
 
     @Override
-    public Object ExecutionScript(Object parameter) {
+    public Object executionScript(Object parameter) {
         IScriptEntity iScriptEntity = (IScriptEntity) parameter;
         // 执行结束脚本逻辑。。。
         // 更改任务流程状态

+ 1 - 1
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/script/common/CommonProductionSchedulingServiceImpl.java

@@ -37,7 +37,7 @@ public class CommonProductionSchedulingServiceImpl implements IScriptService {
     }
 
     @Override
-    public Object ExecutionScript(Object parameter) {
+    public Object executionScript(Object parameter) {
         // 得到当前脚本执行所需数据
         IntoProduction intoProduction = (IntoProduction) parameter;
         // 根据流程别名 把开始节点执行

+ 2 - 1
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/templateimpl/RunBPMImpl.java

@@ -24,6 +24,7 @@ import javax.annotation.PreDestroy;
  * 使用 @Scope("prototype") 注解指定了 bean 的作用域为 prototype。
  * 这样,在每次通过 applicationContext.getBean()
  * 获取该 bean 的实例时,都会返回一个新的实例。从而避免并发的的操作
+ * spring不会清理prototype作用域的bean。
  */
 @Service("RunBPMImpl")
 @Scope("prototype")
@@ -58,7 +59,6 @@ public class RunBPMImpl implements IRunBPMService {
      * 后置验证节点
      *
      * @param iRunBPMEntity 节点执行参数
-     *                      spring不会清理prototype作用域的bean。
      */
     @Override
     public AjaxResult afterValidation(IRunBPMEntity iRunBPMEntity) {
@@ -78,6 +78,7 @@ public class RunBPMImpl implements IRunBPMService {
 
     /**
      * * @PreDestroy 注解用来清理当前bean。
+     * spring不会清理prototype作用域的bean。
      *
      * @return
      */

+ 1 - 1
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/templateimpl/ScriptImpl.java

@@ -39,7 +39,7 @@ public class ScriptImpl implements IScriptService {
      * @return
      */
     @Override
-    public Object ExecutionScript(Object parameter) {
+    public Object executionScript(Object parameter) {
         return null;
     }
 

+ 67 - 25
ruoyi-process-execution/src/main/resources/mapper/bpm/dispersed/BpmExecuteNodeFormMapper.xml

@@ -1,41 +1,56 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.execution.produce.dispersed.mapper.BpmExecuteNodeFormMapper">
-    
+
     <resultMap type="com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm" id="BpmExecuteNodeFormResult">
-        <result property="id"    column="id"    />
-        <result property="taskProcessKey"    column="task_process_key"    />
-        <result property="taskNodeKey"    column="task_node_key"    />
-        <result property="taskScriptKey"    column="task_script_key"    />
-        <result property="taskNodeFormKey"    column="task_node_form_key"    />
-        <result property="taskNodeFromType"    column="task_node_from_type"    />
-        <result property="taskNodeFromContent"    column="task_node_from_content"    />
+        <result property="id" column="id"/>
+        <result property="taskProcessKey" column="task_process_key"/>
+        <result property="taskNodeKey" column="task_node_key"/>
+        <result property="taskScriptKey" column="task_script_key"/>
+        <result property="taskNodeFormKey" column="task_node_form_key"/>
+        <result property="taskNodeFromType" column="task_node_from_type"/>
+        <result property="taskNodeFromContent" column="task_node_from_content"/>
     </resultMap>
 
     <sql id="selectBpmExecuteNodeFormVo">
-        select id, task_process_key, task_node_key, task_script_key, task_node_form_key, task_node_from_type, task_node_from_content from bpm_execute_node_form
+        select id,
+               task_process_key,
+               task_node_key,
+               task_script_key,
+               task_node_form_key,
+               task_node_from_type,
+               task_node_from_content
+        from bpm_execute_node_form
     </sql>
 
-    <select id="selectBpmExecuteNodeFormList" parameterType="com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm" resultMap="BpmExecuteNodeFormResult">
+    <select id="selectBpmExecuteNodeFormList"
+            parameterType="com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm"
+            resultMap="BpmExecuteNodeFormResult">
         <include refid="selectBpmExecuteNodeFormVo"/>
-        <where>  
-            <if test="taskProcessKey != null  and taskProcessKey != ''"> and task_process_key = #{taskProcessKey}</if>
-            <if test="taskNodeKey != null  and taskNodeKey != ''"> and task_node_key = #{taskNodeKey}</if>
-            <if test="taskScriptKey != null  and taskScriptKey != ''"> and task_script_key = #{taskScriptKey}</if>
-            <if test="taskNodeFormKey != null  and taskNodeFormKey != ''"> and task_node_form_key = #{taskNodeFormKey}</if>
-            <if test="taskNodeFromType != null  and taskNodeFromType != ''"> and task_node_from_type = #{taskNodeFromType}</if>
-            <if test="taskNodeFromContent != null  and taskNodeFromContent != ''"> and task_node_from_content = #{taskNodeFromContent}</if>
+        <where>
+            <if test="taskProcessKey != null  and taskProcessKey != ''">and task_process_key = #{taskProcessKey}</if>
+            <if test="taskNodeKey != null  and taskNodeKey != ''">and task_node_key = #{taskNodeKey}</if>
+            <if test="taskScriptKey != null  and taskScriptKey != ''">and task_script_key = #{taskScriptKey}</if>
+            <if test="taskNodeFormKey != null  and taskNodeFormKey != ''">and task_node_form_key = #{taskNodeFormKey}
+            </if>
+            <if test="taskNodeFromType != null  and taskNodeFromType != ''">and task_node_from_type =
+                #{taskNodeFromType}
+            </if>
+            <if test="taskNodeFromContent != null  and taskNodeFromContent != ''">and task_node_from_content =
+                #{taskNodeFromContent}
+            </if>
         </where>
     </select>
-    
+
     <select id="selectBpmExecuteNodeFormById" parameterType="Long" resultMap="BpmExecuteNodeFormResult">
         <include refid="selectBpmExecuteNodeFormVo"/>
         where id = #{id}
     </select>
-        
-    <insert id="insertBpmExecuteNodeForm" parameterType="com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm">
+
+    <insert id="insertBpmExecuteNodeForm"
+            parameterType="com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm">
         insert into bpm_execute_node_form
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="id != null">id,</if>
@@ -57,7 +72,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </trim>
     </insert>
 
-    <update id="updateBpmExecuteNodeForm" parameterType="com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm">
+    <update id="updateBpmExecuteNodeForm"
+            parameterType="com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm">
         update bpm_execute_node_form
         <trim prefix="SET" suffixOverrides=",">
             <if test="taskProcessKey != null">task_process_key = #{taskProcessKey},</if>
@@ -71,16 +87,42 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </update>
 
     <delete id="deleteBpmExecuteNodeFormById" parameterType="Long">
-        delete from bpm_execute_node_form where id = #{id}
+        delete
+        from bpm_execute_node_form
+        where id = #{id}
     </delete>
 
     <delete id="deleteBpmExecuteNodeFormByIds" parameterType="String">
-        delete from bpm_execute_node_form where id in 
+        delete from bpm_execute_node_form where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>
     </delete>
 
+    <select id="selectNodeFromInfos" resultType="map">
+        select bpc.node_form_key  as form_key,
+               bpc.node_form_type as form_type
+        from {DBNAME}.bpm_process_configuration bpc
+        where bpc.node_type != "endEvent"
+          and bpc.node_type != "startEvent"
+          and bpc.node_process_key = #{processKey}
+        union
+        select bnsr.form_key              as form_key,
+               bnsr.script_node_form_type as form_type
+        from {DBNAME}.bpm_node_script_relevance bnsr
+        where bnsr.script_trigger_type != 1
+          and
+            bnsr.node_key in (
+            select
+            bpc.node_key
+            from
+            {DBNAME}.bpm_process_configuration bpc
+            where
+            bpc.node_type != "endEvent"
+          and bpc.node_type != "startEvent"
+          and bpc.node_process_key = #{processKey})
+    </select>
+
     <select id="selectBpmExecuteNodeFormInfo" parameterType="com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm" resultMap="BpmExecuteNodeFormResult">
         <include refid="selectBpmExecuteNodeFormVo"/>
         <where>