Răsfoiți Sursa

feat:流程异常节点表单绑定,异常节点、正常节点表单存贮,媳妇修改流程定义bug

韩帛霖 1 an în urmă
părinte
comite
9213af699b
14 a modificat fișierele cu 737 adăugiri și 22 ștergeri
  1. 99 0
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/controller/BpmExecuteNodeFormController.java
  2. 121 0
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/entity/BpmExecuteNodeForm.java
  3. 3 0
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/entity/BpmExecuteNodeMiddle.java
  4. 62 0
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/mapper/BpmExecuteNodeFormMapper.java
  5. 64 0
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/runbpm/PreExecutionToolClass.java
  6. 63 0
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/IBpmExecuteNodeFormService.java
  7. 94 0
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/BpmExecuteNodeFormServiceImpl.java
  8. 44 0
      ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/runbpm/testImpl.java
  9. 83 0
      ruoyi-process-execution/src/main/resources/mapper/bpm/dispersed/BpmExecuteNodeFormMapper.xml
  10. 50 7
      ruoyi-system/src/main/java/com/ruoyi/system/entity/BpmNodeScriptRelevance.java
  11. 1 1
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/BpmNodeScriptRelevanceMapper.java
  12. 9 2
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BpmNodeScriptRelevanceServiceImpl.java
  13. 2 2
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BpmProcessConfigurationServiceImpl.java
  14. 42 10
      ruoyi-system/src/main/resources/mapper/bpm/BpmNodeScriptRelevanceMapper.xml

+ 99 - 0
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/controller/BpmExecuteNodeFormController.java

@@ -0,0 +1,99 @@
+package com.ruoyi.execution.produce.dispersed.controller;
+
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm;
+import com.ruoyi.execution.produce.dispersed.service.IBpmExecuteNodeFormService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+import java.util.List;
+
+/**
+ * 执行节点单Controller
+ *
+ * @author ruoyi
+ * @date 2023-12-07
+ */
+@RestController
+@RequestMapping("/system/form")
+public class BpmExecuteNodeFormController extends BaseController {
+    @Autowired
+    private IBpmExecuteNodeFormService bpmExecuteNodeFormService;
+
+    /**
+     * 查询执行节点单列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:form:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(BpmExecuteNodeForm bpmExecuteNodeForm) {
+        startPage();
+        List<BpmExecuteNodeForm> list = bpmExecuteNodeFormService.selectBpmExecuteNodeFormList(bpmExecuteNodeForm);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出执行节点单列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:form:export')")
+    @Log(title = "执行节点单", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, BpmExecuteNodeForm bpmExecuteNodeForm) {
+        List<BpmExecuteNodeForm> list = bpmExecuteNodeFormService.selectBpmExecuteNodeFormList(bpmExecuteNodeForm);
+        ExcelUtil<BpmExecuteNodeForm> util = new ExcelUtil<BpmExecuteNodeForm>(BpmExecuteNodeForm.class);
+        util.exportExcel(response, list, "执行节点单数据");
+    }
+
+    /**
+     * 获取执行节点单详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:form:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        return success(bpmExecuteNodeFormService.selectBpmExecuteNodeFormById(id));
+    }
+
+    /**
+     * 新增执行节点单
+     */
+    @PreAuthorize("@ss.hasPermi('system:form:add')")
+    @Log(title = "执行节点单", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody BpmExecuteNodeForm bpmExecuteNodeForm) {
+        return toAjax(bpmExecuteNodeFormService.insertBpmExecuteNodeForm(bpmExecuteNodeForm));
+    }
+
+    /**
+     * 修改执行节点单
+     */
+    @PreAuthorize("@ss.hasPermi('system:form:edit')")
+    @Log(title = "执行节点单", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody BpmExecuteNodeForm bpmExecuteNodeForm) {
+        return toAjax(bpmExecuteNodeFormService.updateBpmExecuteNodeForm(bpmExecuteNodeForm));
+    }
+
+    /**
+     * 删除执行节点单
+     */
+    @PreAuthorize("@ss.hasPermi('system:form:remove')")
+    @Log(title = "执行节点单", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        return toAjax(bpmExecuteNodeFormService.deleteBpmExecuteNodeFormByIds(ids));
+    }
+}

+ 121 - 0
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/entity/BpmExecuteNodeForm.java

@@ -0,0 +1,121 @@
+package com.ruoyi.execution.produce.dispersed.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 执行节点单对象 bpm_execute_node_form
+ * 
+ * @author ruoyi
+ * @date 2023-12-07
+ */
+public class BpmExecuteNodeForm extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    /** 任务流程编码 */
+    @Excel(name = "任务流程编码")
+    private String taskProcessKey;
+
+    /** 节点编码 */
+    @Excel(name = "节点编码")
+    private String taskNodeKey;
+
+    /** 脚本编码 */
+    @Excel(name = "脚本编码")
+    private String taskScriptKey;
+
+    /** 表单编码 */
+    @Excel(name = "表单编码")
+    private String taskNodeFormKey;
+
+    /** 表单类型 */
+    @Excel(name = "表单类型")
+    private String taskNodeFromType;
+
+    /** 表单内容 */
+    @Excel(name = "表单内容")
+    private String taskNodeFromContent;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setTaskProcessKey(String taskProcessKey) 
+    {
+        this.taskProcessKey = taskProcessKey;
+    }
+
+    public String getTaskProcessKey() 
+    {
+        return taskProcessKey;
+    }
+    public void setTaskNodeKey(String taskNodeKey) 
+    {
+        this.taskNodeKey = taskNodeKey;
+    }
+
+    public String getTaskNodeKey() 
+    {
+        return taskNodeKey;
+    }
+    public void setTaskScriptKey(String taskScriptKey) 
+    {
+        this.taskScriptKey = taskScriptKey;
+    }
+
+    public String getTaskScriptKey() 
+    {
+        return taskScriptKey;
+    }
+    public void setTaskNodeFormKey(String taskNodeFormKey) 
+    {
+        this.taskNodeFormKey = taskNodeFormKey;
+    }
+
+    public String getTaskNodeFormKey() 
+    {
+        return taskNodeFormKey;
+    }
+    public void setTaskNodeFromType(String taskNodeFromType) 
+    {
+        this.taskNodeFromType = taskNodeFromType;
+    }
+
+    public String getTaskNodeFromType() 
+    {
+        return taskNodeFromType;
+    }
+    public void setTaskNodeFromContent(String taskNodeFromContent) 
+    {
+        this.taskNodeFromContent = taskNodeFromContent;
+    }
+
+    public String getTaskNodeFromContent() 
+    {
+        return taskNodeFromContent;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("taskProcessKey", getTaskProcessKey())
+            .append("taskNodeKey", getTaskNodeKey())
+            .append("taskScriptKey", getTaskScriptKey())
+            .append("taskNodeFormKey", getTaskNodeFormKey())
+            .append("taskNodeFromType", getTaskNodeFromType())
+            .append("taskNodeFromContent", getTaskNodeFromContent())
+            .toString();
+    }
+}

+ 3 - 0
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/entity/BpmExecuteNodeMiddle.java

@@ -50,6 +50,9 @@ public class BpmExecuteNodeMiddle extends BaseEntity
     /** 自动触发的脚本需要根据执行节点表中的节点前后执行 */
     private String taskNodeAroundScriptKey;
 
+
+
+
     public void setId(Long id)
     {
         this.id = id;

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

@@ -0,0 +1,62 @@
+package com.ruoyi.execution.produce.dispersed.mapper;
+
+import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm;
+
+import java.util.List;
+
+/**
+ * 执行节点单Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2023-12-07
+ */
+public interface BpmExecuteNodeFormMapper 
+{
+    /**
+     * 查询执行节点单
+     * 
+     * @param id 执行节点单主键
+     * @return 执行节点单
+     */
+    public BpmExecuteNodeForm selectBpmExecuteNodeFormById(Long id);
+
+    /**
+     * 查询执行节点单列表
+     * 
+     * @param bpmExecuteNodeForm 执行节点单
+     * @return 执行节点单集合
+     */
+    public List<BpmExecuteNodeForm> selectBpmExecuteNodeFormList(BpmExecuteNodeForm bpmExecuteNodeForm);
+
+    /**
+     * 新增执行节点单
+     * 
+     * @param bpmExecuteNodeForm 执行节点单
+     * @return 结果
+     */
+    public int insertBpmExecuteNodeForm(BpmExecuteNodeForm bpmExecuteNodeForm);
+
+    /**
+     * 修改执行节点单
+     * 
+     * @param bpmExecuteNodeForm 执行节点单
+     * @return 结果
+     */
+    public int updateBpmExecuteNodeForm(BpmExecuteNodeForm bpmExecuteNodeForm);
+
+    /**
+     * 删除执行节点单
+     * 
+     * @param id 执行节点单主键
+     * @return 结果
+     */
+    public int deleteBpmExecuteNodeFormById(Long id);
+
+    /**
+     * 批量删除执行节点单
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteBpmExecuteNodeFormByIds(Long[] ids);
+}

+ 64 - 0
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/runbpm/PreExecutionToolClass.java

@@ -5,12 +5,14 @@ import com.ruoyi.common.constant.HttpStatus;
 import com.ruoyi.common.utils.bpm.XmlDataParserUtils;
 import com.ruoyi.common.utils.uuid.IdUtils;
 import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNode;
+import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm;
 import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeMiddle;
 import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteProcess;
 import com.ruoyi.execution.produce.dispersed.entity.runbpm.*;
 import com.ruoyi.execution.produce.dispersed.mapper.BpmExecuteNodeMapper;
 import com.ruoyi.execution.produce.dispersed.mapper.BpmExecuteNodeMiddleMapper;
 import com.ruoyi.execution.produce.dispersed.mapper.BpmExecuteProcessMapper;
+import com.ruoyi.execution.produce.dispersed.service.IBpmExecuteNodeFormService;
 import com.ruoyi.execution.produce.dispersed.service.impl.utils.VerifyExecutionProcess;
 import com.ruoyi.system.entity.*;
 import com.ruoyi.system.mapper.BpmNodeHandleUserMapper;
@@ -18,10 +20,13 @@ import com.ruoyi.system.mapper.BpmNodeScriptRelevanceMapper;
 import com.ruoyi.system.mapper.BpmProcessConfigurationMapper;
 import com.ruoyi.system.mapper.BpmProcessMapper;
 import org.springframework.beans.factory.annotation.Autowired;
+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.*;
+import java.util.concurrent.locks.ReentrantLock;
 
 /**
  * 预备执行流程工具类
@@ -30,6 +35,7 @@ import java.util.*;
  * @date 2023/11/15
  */
 @Component
+@EnableAsync  // 异步
 public class PreExecutionToolClass<R> {
 
     @Autowired // 执行流程
@@ -59,6 +65,9 @@ public class PreExecutionToolClass<R> {
     @Autowired // 校验执行流程的数据
     private VerifyExecutionProcess iVerifyExecutionProcess;
 
+    @Autowired // 节点脚本表单中间表
+    private IBpmExecuteNodeFormService iBpmExecuteNodeFormService;
+
     /**
      * 预执行流程自动执行开始节点
      *
@@ -86,13 +95,17 @@ public class PreExecutionToolClass<R> {
         bpmProcessConfigurationList.forEach(item -> nodekeyList.add(item.getNodeKey()));
         // 当前流程的所有节点详细信息
         List<BpmUserScriptVo> bpmUserScriptVoList = new ArrayList<>();
+        // 得到当前流程所有脚本数据
+        List<BpmNodeScriptRelevance> bpmNodeScriptRelevanceList = new ArrayList<>();
         bpmProcessConfigurationList.forEach(item -> {
             BpmUserScriptVo bpmUserScriptVo = new BpmUserScriptVo();
             bpmUserScriptVo.setNodeKey(item.getNodeKey());
             bpmUserScriptVo.setBpmNodeHandleUserList(bpmNodeHandleUserMapper.selectBpmNodeHandleUserList(new BpmNodeHandleUser(item.getNodeRolePermission())));
             bpmUserScriptVo.setBpmNodeScriptRelevanceList(bpmNodeScriptRelevanceMapper.selectBpmNodeScriptRelevanceList(new BpmNodeScriptRelevance(item.getNodeKey())));
+            bpmNodeScriptRelevanceList.addAll(bpmUserScriptVo.getBpmNodeScriptRelevanceList());
             bpmUserScriptVoList.add(bpmUserScriptVo);
         });
+
         Map<String, String> shunxu = XmlDataParserUtils.getStartNodeAndNextNode(bpmProcess.getProcessXmlContent());
         /**2️⃣2️⃣2️⃣ 新增执行流程表数据*/
         BpmExecuteProcess runBpmExecuteProcess = new BpmExecuteProcess();
@@ -180,6 +193,43 @@ public class PreExecutionToolClass<R> {
             runBpmExecuteNodeMiddleList.add(bpmExecuteNodeMiddle);
         });
         runBpmExecuteNodeMiddleMapper.insertBpmExecuteNodeMiddleList(runBpmExecuteNodeMiddleList);
+        /**3️⃣⚡️5️⃣ 流程任务当中的所有节点关联的表单信息
+         * 得到当前流程的所有节点以及当前节点脚本绑定的异常脚本-》处理当前节点脚本、异常脚本绑定的表单到中间表信息 */
+
+
+        List<BpmExecuteNodeForm> bpmExecuteNodeFormList = new ArrayList<>();
+        Map<String, BpmProcessConfiguration> nodeInfo = new HashMap<>();
+        bpmProcessConfigurationList.forEach(item -> {
+            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();
+                }
+                bpmExecuteNodeFormList.add(bpmExecuteNodeForm);
+            }
+        });
+        Map<String, Object> nodeFrom = new HashMap<>();  // 当前流程所需的表单
+        bpmExecuteNodeFormList.forEach(item -> {
+            nodeFrom.put(item.getTaskNodeFormKey(), item.getTaskNodeFromType());
+        });
+        ///未完待续。。。
+
+
+        // iBpmExecuteNodeFormService
         /**4️⃣4️⃣4️⃣ 调用执行节点接口 预执行当前投产流程的开始节点,执行开始节点*/
         // bpmUserScriptVoList  节点key对应的脚本
         // 根据节点类型startEvent 筛选得到当前流程的开始节点,进行自动执行    // startEvent  开始节点类型
@@ -209,6 +259,7 @@ public class PreExecutionToolClass<R> {
 
     // 执行流程节点共通接口
     @Transactional
+    @Async
     public int executionNode(BpmRunNodeVo bpmRunNodeVo) {
         System.err.println(bpmRunNodeVo.getTaskNodeKey());
         System.err.println(bpmRunNodeVo.getNextNodeKey());
@@ -346,6 +397,19 @@ public class PreExecutionToolClass<R> {
         return intoProduction;
     }
 
+    public Map<String, Object> getNodeFormInfos(Map<String, String> nodeForm) {
+        Set<String> nodeKey = nodeForm.keySet();
+        nodeKey.forEach(item -> {
+            if (nodeForm.get(item).equals("dragForm")) {  // 拖拽类型的表单
+
+            } else if (nodeForm.get(item).equals("composeForm")) { // 组合类型的表单
+
+            } else if (nodeForm.get(item).equals("designForm")) {  // 自定义类型表单
+
+            }
+        });
+        return null;
+    }
 
     // 弃用保留
     public int updateNodeState(String taskProcessKey, String taskNodeKey, CommonEntity commonEntity) {

+ 63 - 0
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/IBpmExecuteNodeFormService.java

@@ -0,0 +1,63 @@
+package com.ruoyi.execution.produce.dispersed.service;
+
+
+import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm;
+
+import java.util.List;
+
+/**
+ * 执行节点单Service接口
+ * 
+ * @author ruoyi
+ * @date 2023-12-07
+ */
+public interface IBpmExecuteNodeFormService 
+{
+    /**
+     * 查询执行节点单
+     * 
+     * @param id 执行节点单主键
+     * @return 执行节点单
+     */
+    public BpmExecuteNodeForm selectBpmExecuteNodeFormById(Long id);
+
+    /**
+     * 查询执行节点单列表
+     * 
+     * @param bpmExecuteNodeForm 执行节点单
+     * @return 执行节点单集合
+     */
+    public List<BpmExecuteNodeForm> selectBpmExecuteNodeFormList(BpmExecuteNodeForm bpmExecuteNodeForm);
+
+    /**
+     * 新增执行节点单
+     * 
+     * @param bpmExecuteNodeForm 执行节点单
+     * @return 结果
+     */
+    public int insertBpmExecuteNodeForm(BpmExecuteNodeForm bpmExecuteNodeForm);
+
+    /**
+     * 修改执行节点单
+     * 
+     * @param bpmExecuteNodeForm 执行节点单
+     * @return 结果
+     */
+    public int updateBpmExecuteNodeForm(BpmExecuteNodeForm bpmExecuteNodeForm);
+
+    /**
+     * 批量删除执行节点单
+     * 
+     * @param ids 需要删除的执行节点单主键集合
+     * @return 结果
+     */
+    public int deleteBpmExecuteNodeFormByIds(Long[] ids);
+
+    /**
+     * 删除执行节点单信息
+     * 
+     * @param id 执行节点单主键
+     * @return 结果
+     */
+    public int deleteBpmExecuteNodeFormById(Long id);
+}

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

@@ -0,0 +1,94 @@
+package com.ruoyi.execution.produce.dispersed.service.impl;
+
+import java.util.List;
+
+import com.ruoyi.execution.produce.dispersed.entity.BpmExecuteNodeForm;
+import com.ruoyi.execution.produce.dispersed.mapper.BpmExecuteNodeFormMapper;
+import com.ruoyi.execution.produce.dispersed.service.IBpmExecuteNodeFormService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 执行节点单Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2023-12-07
+ */
+@Service
+public class BpmExecuteNodeFormServiceImpl implements IBpmExecuteNodeFormService
+{
+    @Autowired
+    private BpmExecuteNodeFormMapper bpmExecuteNodeFormMapper;
+
+    /**
+     * 查询执行节点单
+     * 
+     * @param id 执行节点单主键
+     * @return 执行节点单
+     */
+    @Override
+    public BpmExecuteNodeForm selectBpmExecuteNodeFormById(Long id)
+    {
+        return bpmExecuteNodeFormMapper.selectBpmExecuteNodeFormById(id);
+    }
+
+    /**
+     * 查询执行节点单列表
+     * 
+     * @param bpmExecuteNodeForm 执行节点单
+     * @return 执行节点单
+     */
+    @Override
+    public List<BpmExecuteNodeForm> selectBpmExecuteNodeFormList(BpmExecuteNodeForm bpmExecuteNodeForm)
+    {
+        return bpmExecuteNodeFormMapper.selectBpmExecuteNodeFormList(bpmExecuteNodeForm);
+    }
+
+    /**
+     * 新增执行节点单
+     * 
+     * @param bpmExecuteNodeForm 执行节点单
+     * @return 结果
+     */
+    @Override
+    public int insertBpmExecuteNodeForm(BpmExecuteNodeForm bpmExecuteNodeForm)
+    {
+        return bpmExecuteNodeFormMapper.insertBpmExecuteNodeForm(bpmExecuteNodeForm);
+    }
+
+    /**
+     * 修改执行节点单
+     * 
+     * @param bpmExecuteNodeForm 执行节点单
+     * @return 结果
+     */
+    @Override
+    public int updateBpmExecuteNodeForm(BpmExecuteNodeForm bpmExecuteNodeForm)
+    {
+        return bpmExecuteNodeFormMapper.updateBpmExecuteNodeForm(bpmExecuteNodeForm);
+    }
+
+    /**
+     * 批量删除执行节点单
+     * 
+     * @param ids 需要删除的执行节点单主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBpmExecuteNodeFormByIds(Long[] ids)
+    {
+        return bpmExecuteNodeFormMapper.deleteBpmExecuteNodeFormByIds(ids);
+    }
+
+    /**
+     * 删除执行节点单信息
+     * 
+     * @param id 执行节点单主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBpmExecuteNodeFormById(Long id)
+    {
+        return bpmExecuteNodeFormMapper.deleteBpmExecuteNodeFormById(id);
+    }
+}

+ 44 - 0
ruoyi-process-execution/src/main/java/com/ruoyi/execution/produce/dispersed/service/impl/runbpm/testImpl.java

@@ -0,0 +1,44 @@
+package com.ruoyi.execution.produce.dispersed.service.impl.runbpm;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.execution.produce.dispersed.entity.runbpm.IRunBPMEntity;
+import com.ruoyi.execution.produce.dispersed.service.IRunBPMService;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PreDestroy;
+
+/**
+ * @author hanzihang
+ * @date 2023/12/5 2:37 PM
+ */
+@Service("2cbf7a46-cb1c-45c3-ada0-6926924bb478")
+@Scope("prototype")
+public class testImpl implements IRunBPMService {
+    @Override
+    public AjaxResult preValidation(IRunBPMEntity iRunBPMEntity) {
+        return AjaxResult.success();
+    }
+
+    @Override
+    public AjaxResult executeNode(IRunBPMEntity iRunBPMEntity) {
+        //
+        return null;
+    }
+
+    @Override
+    public AjaxResult afterValidation(IRunBPMEntity iRunBPMEntity) {
+        return null;
+    }
+
+    @Override
+    public boolean isVerificationMethod() {
+        return true;
+    }
+
+    @Override
+    @PreDestroy
+    public boolean preDestroy() {
+        return true;
+    }
+}

+ 83 - 0
ruoyi-process-execution/src/main/resources/mapper/bpm/dispersed/BpmExecuteNodeFormMapper.xml

@@ -0,0 +1,83 @@
+<?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">
+<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"    />
+    </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
+    </sql>
+
+    <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>
+    </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 into bpm_execute_node_form
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="taskProcessKey != null">task_process_key,</if>
+            <if test="taskNodeKey != null">task_node_key,</if>
+            <if test="taskScriptKey != null">task_script_key,</if>
+            <if test="taskNodeFormKey != null">task_node_form_key,</if>
+            <if test="taskNodeFromType != null">task_node_from_type,</if>
+            <if test="taskNodeFromContent != null">task_node_from_content,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="taskProcessKey != null">#{taskProcessKey},</if>
+            <if test="taskNodeKey != null">#{taskNodeKey},</if>
+            <if test="taskScriptKey != null">#{taskScriptKey},</if>
+            <if test="taskNodeFormKey != null">#{taskNodeFormKey},</if>
+            <if test="taskNodeFromType != null">#{taskNodeFromType},</if>
+            <if test="taskNodeFromContent != null">#{taskNodeFromContent},</if>
+        </trim>
+    </insert>
+
+    <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>
+            <if test="taskNodeKey != null">task_node_key = #{taskNodeKey},</if>
+            <if test="taskScriptKey != null">task_script_key = #{taskScriptKey},</if>
+            <if test="taskNodeFormKey != null">task_node_form_key = #{taskNodeFormKey},</if>
+            <if test="taskNodeFromType != null">task_node_from_type = #{taskNodeFromType},</if>
+            <if test="taskNodeFromContent != null">task_node_from_content = #{taskNodeFromContent},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteBpmExecuteNodeFormById" parameterType="Long">
+        delete from bpm_execute_node_form where id = #{id}
+    </delete>
+
+    <delete id="deleteBpmExecuteNodeFormByIds" parameterType="String">
+        delete from bpm_execute_node_form where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 50 - 7
ruoyi-system/src/main/java/com/ruoyi/system/entity/BpmNodeScriptRelevance.java

@@ -33,11 +33,47 @@ public class BpmNodeScriptRelevance extends BaseEntity implements Serializable {
     @Excel(name = "脚本编码")
     private String scriptKey;
 
+    /**
+     * 异常节点表单
+     */
+    private String formKey;
     /**
      * 脚本触发机制(0:异常手动;1:正常自动;2:节点前后自动)
      */
     @Excel(name = "脚本触发机制", readConverterExp = "0=:异常脚本;1:正常脚本 2:节点前后自动")
     private Long scriptTriggerType;
+    /**
+     * 异常节点名称
+     */
+    private String scriptNodeName;
+    /**
+     * 异常节点表单类型
+     */
+    private String scriptNodeFormType;
+
+    public String getFormKey() {
+        return formKey;
+    }
+
+    public void setFormKey(String formKey) {
+        this.formKey = formKey;
+    }
+
+    public String getScriptNodeName() {
+        return scriptNodeName;
+    }
+
+    public void setScriptNodeName(String scriptNodeName) {
+        this.scriptNodeName = scriptNodeName;
+    }
+
+    public String getScriptNodeFormtype() {
+        return scriptNodeFormType;
+    }
+
+    public void setScriptNodeFormtype(String scriptNodeFormType) {
+        this.scriptNodeFormType = scriptNodeFormType;
+    }
 
     public BpmNodeScriptRelevance(String nodeKey) {
         this.nodeKey = nodeKey;
@@ -46,11 +82,14 @@ public class BpmNodeScriptRelevance extends BaseEntity implements Serializable {
     public BpmNodeScriptRelevance() {
     }
 
-    public BpmNodeScriptRelevance(Long id, String nodeKey, String scriptKey, Long scriptTriggerType) {
+    public BpmNodeScriptRelevance(Long id, String nodeKey, String scriptKey, Long scriptTriggerType, String formKey, String scriptNodeName, String scriptNodeFormType) {
         this.id = id;
         this.nodeKey = nodeKey;
         this.scriptKey = scriptKey;
         this.scriptTriggerType = scriptTriggerType;
+        this.formKey = formKey;
+        this.scriptNodeName = scriptNodeName;
+        this.scriptNodeFormType = scriptNodeFormType;
     }
 
     public void setId(Long id) {
@@ -87,11 +126,15 @@ public class BpmNodeScriptRelevance extends BaseEntity implements Serializable {
 
     @Override
     public String toString() {
-        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("id", getId())
-                .append("nodeKey", getNodeKey())
-                .append("scriptKey", getScriptKey())
-                .append("scriptTriggerType", getScriptTriggerType())
-                .toString();
+        final StringBuffer sb = new StringBuffer("BpmNodeScriptRelevance{");
+        sb.append("id=").append(id);
+        sb.append(", nodeKey='").append(nodeKey).append('\'');
+        sb.append(", scriptKey='").append(scriptKey).append('\'');
+        sb.append(", scriptTriggerType=").append(scriptTriggerType);
+        sb.append(", formKey='").append(formKey).append('\'');
+        sb.append(", scriptNodeName='").append(scriptNodeName).append('\'');
+        sb.append(", scriptNodeFormType='").append(scriptNodeFormType).append('\'');
+        sb.append('}');
+        return sb.toString();
     }
 }

+ 1 - 1
ruoyi-system/src/main/java/com/ruoyi/system/mapper/BpmNodeScriptRelevanceMapper.java

@@ -33,7 +33,7 @@ public interface BpmNodeScriptRelevanceMapper
      * @param bpmNodeScriptRelevance 流程节点脚本关联
      * @return 结果
      */
-    public int insertBpmNodeScriptRelevance(List<BpmNodeScriptRelevance> bpmNodeScriptRelevance);
+    public int insertBpmNodeScriptRelevance(BpmNodeScriptRelevance bpmNodeScriptRelevance);
 
     /**
      * 修改流程节点脚本关联

+ 9 - 2
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BpmNodeScriptRelevanceServiceImpl.java

@@ -51,8 +51,15 @@ public class BpmNodeScriptRelevanceServiceImpl implements IBpmNodeScriptRelevanc
      */
     @Override
     @Transactional
-    public int insertBpmNodeScriptRelevance(List<BpmNodeScriptRelevance> bpmNodeScriptRelevance) {
-        return bpmNodeScriptRelevanceMapper.insertBpmNodeScriptRelevance(bpmNodeScriptRelevance);
+    public int insertBpmNodeScriptRelevance(List<BpmNodeScriptRelevance> bpmNodeScriptRelevanceList) {
+        bpmNodeScriptRelevanceList.forEach(item -> {
+            if (item.getId() == null) {
+                bpmNodeScriptRelevanceMapper.insertBpmNodeScriptRelevance(item);
+            } else {
+                bpmNodeScriptRelevanceMapper.updateBpmNodeScriptRelevance(item);
+            }
+        });
+        return 1;
     }
 
     /**

+ 2 - 2
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BpmProcessConfigurationServiceImpl.java

@@ -180,10 +180,10 @@ public class BpmProcessConfigurationServiceImpl implements IBpmProcessConfigurat
         if (nodeVo.getBpmNodeScriptRelevanceList().size() != 0) {
             //删除节点脚本关系
             List<String> nodeKeys = nodeVo.getBpmNodeScriptRelevanceList().stream().map(BpmNodeScriptRelevance::getNodeKey).collect(Collectors.toList());
-            if(nodeVo.getRemoveNodeIds().length > 0){
+            if (nodeVo.getRemoveNodeIds().length > 0) {
                 nodeKeys.addAll(bpmProcessConfigurationMapper.selectNodeKeyByIds(Arrays.asList(nodeVo.getRemoveNodeIds())));
             }
-            iBpmNodeScriptRelevanceService.deleteBpmNodeScriptRelevanceByNodeKeys(nodeKeys);
+            // iBpmNodeScriptRelevanceService.deleteBpmNodeScriptRelevanceByNodeKeys(nodeKeys);  有问题。。。
             //新增节点脚本关系
             iBpmNodeScriptRelevanceService.insertBpmNodeScriptRelevance(nodeVo.getBpmNodeScriptRelevanceList());
         }

+ 42 - 10
ruoyi-system/src/main/resources/mapper/bpm/BpmNodeScriptRelevanceMapper.xml

@@ -9,10 +9,13 @@
         <result property="nodeKey" column="node_key"/>
         <result property="scriptKey" column="script_key"/>
         <result property="scriptTriggerType" column="script_trigger_type"/>
+        <result property="formKey" column="form_key"/>
+        <result property="scriptNodeName" column="script_node_name"/>
+        <result property="scriptNodeFormType" column="script_node_form_type"/>
     </resultMap>
 
     <sql id="selectBpmNodeScriptRelevanceVo">
-        select id, node_key, script_key, script_trigger_type
+        select id, node_key, script_key, script_trigger_type,form_key,script_node_name,script_node_form_type
         from bpm_node_script_relevance
     </sql>
 
@@ -23,6 +26,9 @@
             <if test="nodeKey != null  and nodeKey != ''">and node_key = #{nodeKey}</if>
             <if test="scriptKey != null  and scriptKey != ''">and script_key = #{scriptKey}</if>
             <if test="scriptTriggerType != null ">and script_trigger_type = #{scriptTriggerType}</if>
+            <if test="formKey != null">and form_key = #{formKey},</if>
+            <if test="scriptNodeName != null">and script_node_name = #{scriptNodeName},</if>
+            <if test="scriptNodeFormType != null">and script_node_form_type = #{scriptNodeFormType},</if>
         </where>
     </select>
 
@@ -31,27 +37,53 @@
         where id = #{id}
     </select>
 
-    <insert id="insertBpmNodeScriptRelevance" parameterType="java.util.List">
-        insert into bpm_node_script_relevance( node_key,script_key,script_trigger_type )
-        values
-        <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.nodeKey},#{item.scriptKey},#{item.scriptTriggerType})
-        </foreach>
+<!--    <insert id="insertBpmNodeScriptRelevancelist" parameterType="java.util.List">-->
+<!--        insert into bpm_node_script_relevance( node_key,script_key,script_trigger_type-->
+<!--        ,form_key,script_node_name,script_node_form_type )-->
+<!--        values-->
+<!--        <foreach collection="list" item="item" index="index" separator=",">-->
+<!--            (#{item.nodeKey},#{item.scriptKey},#{item.scriptTriggerType},#{formKey},#{scriptNodeName},#{scriptNodeFormType})-->
+<!--        </foreach>-->
+<!--    </insert>-->
+    <!--    <foreach collection="list" item="item" index="index" separator=";">-->
+    <insert id="insertBpmNodeScriptRelevance" parameterType="com.ruoyi.system.entity.BpmNodeScriptRelevance">
+        insert into bpm_node_script_relevance
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="nodeKey != null">node_key,</if>
+            <if test="scriptKey != null">script_key,</if>
+            <if test="scriptTriggerType != null">script_trigger_type,</if>
+            <if test="formKey != null">form_key,</if>
+            <if test="scriptNodeName != null">script_node_name,</if>
+            <if test="scriptNodeFormType != null">script_node_form_type,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="nodeKey != null">#{nodeKey},</if>
+            <if test="scriptKey != null">#{scriptKey},</if>
+            <if test="scriptTriggerType != null">#{scriptTriggerType},</if>
+            <if test="formKey != null">#{formKey},</if>
+            <if test="scriptNodeName != null">#{scriptNodeName},</if>
+            <if test="scriptNodeFormType != null">#{scriptNodeFormType},</if>
+        </trim>
     </insert>
-<!--    <foreach collection="list" item="item" index="index" separator=";">-->
-    <update id="updateBpmNodeScriptRelevance" parameterType="com.ruoyi.system.entity.BpmNodeScriptRelevance">
 
+    <update id="updateBpmNodeScriptRelevance" parameterType="com.ruoyi.system.entity.BpmNodeScriptRelevance">
         update bpm_node_script_relevance
         <trim prefix="SET" suffixOverrides=",">
             <if test="nodeKey != null">node_key = #{nodeKey},</if>
             <if test="scriptKey != null">script_key = #{scriptKey},</if>
             <if test="scriptTriggerType != null">script_trigger_type = #{scriptTriggerType},</if>
+            <if test="formKey != null">form_key = #{formKey},</if>
+            <if test="scriptNodeName != null">script_node_name = #{scriptNodeName},</if>
+            <if test="scriptNodeFormType != null">script_node_form_type = #{scriptNodeFormType},</if>
         </trim>
         where id = #{id}
     </update>
 
     <delete id="deleteBpmNodeScriptRelevanceById" parameterType="Long">
-        delete from bpm_node_script_relevance
+        delete
+        from bpm_node_script_relevance
         where id = #{id}
     </delete>