Prechádzať zdrojové kódy

feat:流程回退逻辑,流程执行日志,测试异常节点,流程节点执行逻辑优化等

韩帛霖 1 rok pred
rodič
commit
6a4671318c
17 zmenil súbory, kde vykonal 1279 pridanie a 156 odobranie
  1. 11 7
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/entity/BpmExecuteNode.java
  2. 77 58
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/entity/BpmExecuteNodeForm.java
  3. 438 0
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/entity/BpmExecuteNodeLog.java
  4. 68 0
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/entity/runbpm/BpmBackNodeVo.java
  5. 16 1
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/entity/runbpm/BpmRunNodeVo.java
  6. 62 0
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/mapper/BpmExecuteNodeLogMapper.java
  7. 12 0
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/mapper/BpmExecuteNodeMapper.java
  8. 136 65
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/runbpm/PreExecutionToolClass.java
  9. 62 0
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/IBpmExecuteNodeLogService.java
  10. 94 0
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/impl/BpmExecuteNodeLogServiceImpl.java
  11. 13 13
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/impl/BpmExecuteNodeServiceImpl.java
  12. 4 1
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/impl/runbpm/hangye1/testNode/CaiGou.java
  13. 78 0
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/impl/runbpm/hangye1/yichang/yichang1.java
  14. 2 2
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/utils/EchoNodeFormData.java
  15. 178 0
      zkqy-process-execution/src/main/resources/mapper/bpm/dispersed/BpmExecuteNodeLogMapper.xml
  16. 27 8
      zkqy-process-execution/src/main/resources/mapper/bpm/dispersed/BpmExecuteNodeMapper.xml
  17. 1 1
      zkqy-system/src/main/java/com/zkqy/system/service/impl/BpmProcessConfigurationServiceImpl.java

+ 11 - 7
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/entity/BpmExecuteNode.java

@@ -8,10 +8,10 @@ import com.zkqy.common.core.domain.BaseEntity;
 import java.io.Serializable;
 
 /**
- * 节点执行(记录)对象 bpm_execute_node
+ * 节点执行 对象 bpm_execute_node
  *
  * @author hzh
- * @date 2023-11-01
+ * @date 2023-12-18
  */
 public class BpmExecuteNode extends BaseEntity implements Serializable {
     private static final long serialVersionUID = 1123123L;
@@ -271,9 +271,13 @@ public class BpmExecuteNode extends BaseEntity implements Serializable {
         return taskNodeState;
     }
 
-    public String getTaskNodeOtherState() {return taskNodeOtherState;}
+    public String getTaskNodeOtherState() {
+        return taskNodeOtherState;
+    }
 
-    public void setTaskNodeOtherState(String taskNodeOtherState) {this.taskNodeOtherState = taskNodeOtherState;}
+    public void setTaskNodeOtherState(String taskNodeOtherState) {
+        this.taskNodeOtherState = taskNodeOtherState;
+    }
 
     public void setTaskPriority(String taskPriority) {
         this.taskPriority = taskPriority;
@@ -340,9 +344,9 @@ public class BpmExecuteNode extends BaseEntity implements Serializable {
                 .append("taskNodeKey", getTaskNodeKey())
                 .append("taskNodeName", getTaskNodeName())
                 .append("taskNodeFormKey", getTaskNodeFormKey())
-                .append("taskNodeFormType",getTaskNodeFormType())
+                .append("taskNodeFormType", getTaskNodeFormType())
                 .append("taskNodeType", getTaskNodeType())
-                .append("taskNodeExecuteType",getTaskNodeExecuteType())
+                .append("taskNodeExecuteType", getTaskNodeExecuteType())
                 .append("taskNodeBefore", getTaskNodeBefore())
                 .append("taskNodeAfter", getTaskNodeAfter())
                 .append("taskNodeRolePermission", getTaskNodeRolePermission())
@@ -350,7 +354,7 @@ public class BpmExecuteNode extends BaseEntity implements Serializable {
                 .append("taskNodeNumber", getTaskNodeNumber())
                 .append("taskNodeWeight", getTaskNodeWeight())
                 .append("taskNodeState", getTaskNodeState())
-                .append("taskNodeOtherState",getTaskNodeOtherState())
+                .append("taskNodeOtherState", getTaskNodeOtherState())
                 .append("taskPriority", getTaskPriority())
                 .append("task1", getTask1())
                 .append("task2", getTask2())

+ 77 - 58
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/entity/BpmExecuteNodeForm.java

@@ -7,115 +7,134 @@ import com.zkqy.common.core.domain.BaseEntity;
 
 /**
  * 执行节点单对象 bpm_execute_node_form
- * 
+ *
  * @author zkqy
  * @date 2023-12-07
  */
-public class BpmExecuteNodeForm extends BaseEntity
-{
+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;
+    private String taskNodeFormType;
 
-    /** 表单内容 */
+    /**
+     * 表单内容
+     */
     @Excel(name = "表单内容")
-    private String taskNodeFromContent;
+    private String taskNodeFormContent;
 
-    public void setId(Long id) 
-    {
+    // 节点名称
+    private String taskNodeName;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
         this.id = id;
     }
 
-    public Long getId() 
-    {
-        return id;
+    public String getTaskProcessKey() {
+        return taskProcessKey;
     }
-    public void setTaskProcessKey(String taskProcessKey) 
-    {
+
+    public void setTaskProcessKey(String taskProcessKey) {
         this.taskProcessKey = taskProcessKey;
     }
 
-    public String getTaskProcessKey() 
-    {
-        return taskProcessKey;
+    public String getTaskNodeKey() {
+        return taskNodeKey;
     }
-    public void setTaskNodeKey(String taskNodeKey) 
-    {
+
+    public void setTaskNodeKey(String taskNodeKey) {
         this.taskNodeKey = taskNodeKey;
     }
 
-    public String getTaskNodeKey() 
-    {
-        return taskNodeKey;
+    public String getTaskScriptKey() {
+        return taskScriptKey;
     }
-    public void setTaskScriptKey(String taskScriptKey) 
-    {
+
+    public void setTaskScriptKey(String taskScriptKey) {
         this.taskScriptKey = taskScriptKey;
     }
 
-    public String getTaskScriptKey() 
-    {
-        return taskScriptKey;
+    public String getTaskNodeFormKey() {
+        return taskNodeFormKey;
     }
-    public void setTaskNodeFormKey(String taskNodeFormKey) 
-    {
+
+    public void setTaskNodeFormKey(String taskNodeFormKey) {
         this.taskNodeFormKey = taskNodeFormKey;
     }
 
-    public String getTaskNodeFormKey() 
-    {
-        return taskNodeFormKey;
+    public String getTaskNodeFormType() {
+        return taskNodeFormType;
     }
-    public void setTaskNodeFromType(String taskNodeFromType) 
-    {
-        this.taskNodeFromType = taskNodeFromType;
+
+    public void setTaskNodeFormType(String taskNodeFormType) {
+        this.taskNodeFormType = taskNodeFormType;
     }
 
-    public String getTaskNodeFromType() 
-    {
-        return taskNodeFromType;
+    public String getTaskNodeFormContent() {
+        return taskNodeFormContent;
     }
-    public void setTaskNodeFromContent(String taskNodeFromContent) 
-    {
-        this.taskNodeFromContent = taskNodeFromContent;
+
+    public void setTaskNodeFormContent(String taskNodeFormContent) {
+        this.taskNodeFormContent = taskNodeFormContent;
+    }
+
+    public String getTaskNodeName() {
+        return taskNodeName;
     }
 
-    public String getTaskNodeFromContent() 
-    {
-        return taskNodeFromContent;
+    public void setTaskNodeName(String taskNodeName) {
+        this.taskNodeName = taskNodeName;
     }
 
     @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();
+        final StringBuilder sb = new StringBuilder("BpmExecuteNodeForm{");
+        sb.append("id=").append(id);
+        sb.append(", taskProcessKey='").append(taskProcessKey).append('\'');
+        sb.append(", taskNodeKey='").append(taskNodeKey).append('\'');
+        sb.append(", taskScriptKey='").append(taskScriptKey).append('\'');
+        sb.append(", taskNodeFormKey='").append(taskNodeFormKey).append('\'');
+        sb.append(", taskNodeFormType='").append(taskNodeFormType).append('\'');
+        sb.append(", taskNodeFormContent='").append(taskNodeFormContent).append('\'');
+        sb.append(", taskNodeFormName='").append(taskNodeName).append('\'');
+        sb.append('}');
+        return sb.toString();
     }
 }

+ 438 - 0
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/entity/BpmExecuteNodeLog.java

@@ -0,0 +1,438 @@
+package com.zkqy.execution.produce.dispersed.entity;
+
+import com.zkqy.common.annotation.Excel;
+import com.zkqy.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.io.Serializable;
+
+/**
+ * 节点执行(记录)对象 bpm_execute_node
+ *
+ * @author hzh
+ * @date 2023-11-01
+ */
+public class BpmExecuteNodeLog extends BaseEntity implements Serializable {
+    private static final long serialVersionUID = 1123123L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+
+    /**
+     * 节点回滚,记录某个节点发起的操作
+     */
+    private String taskParentNodeKey;
+
+    /**
+     * 当前执行流程任务编号task_key
+     */
+    @Excel(name = "当前执行流程任务编号task_key")
+    private String taskProcessKey;
+
+    /**
+     * 节点编号
+     */
+    @Excel(name = "节点编号")
+    private String taskNodeKey;
+
+    /**
+     * 节点名称
+     */
+    @Excel(name = "节点名称")
+    private String taskNodeName;
+
+    /**
+     * 表单编号
+     */
+    @Excel(name = "表单编号")
+    private String taskNodeFormKey;
+
+    /**
+     * 任务节点表单类型
+     */
+    private String taskNodeFormType;
+
+    /**
+     * 节点类型(当前节点是判断、网关、普通节点等等。。。。。)
+     */
+    @Excel(name = "节点类型", readConverterExp = "当=前节点是判断、网关、普通节点等等。。。。。")
+    private String taskNodeType;
+
+    /**
+     * 节点执行类型(0:true:自动执行;1:false:手动执行)
+     */
+    private String taskNodeExecuteType;
+
+    /**
+     * 节点前(节点前后只能执行脚本,下一个节点前相当于当前节点后)
+     */
+    @Excel(name = "节点前", readConverterExp = "节=点前后只能执行脚本,下一个节点前相当于当前节点后")
+    private String taskNodeBefore;
+
+    /**
+     * 节点后(节点前只存在一个)
+     */
+    @Excel(name = "节点后", readConverterExp = "节=点前只存在一个")
+    private String taskNodeAfter;
+
+    /**
+     * 角色权限 虚拟角色-》勾选用户存储中间表
+     */
+    @Excel(name = "角色权限 虚拟角色-》勾选用户存储中间表")
+    private String taskNodeRolePermission;
+
+    /**
+     * 节点描述
+     */
+    @Excel(name = "节点描述")
+    private String taskRemark;
+
+    /**
+     * 节点任务执行数量记录(件数)
+     */
+    @Excel(name = "节点任务执行数量记录", readConverterExp = "件=数")
+    private String taskNodeNumber;
+
+    /**
+     * 节点任务执行重量记录(重量)
+     */
+    @Excel(name = "节点任务执行重量记录", readConverterExp = "重=量")
+    private String taskNodeWeight;
+
+    /**
+     * 节点状态(0:未执行 1:已执行)
+     */
+    @Excel(name = "节点状态(0:未执行 1:已执行)")
+    private String taskNodeState;
+
+    /**
+     * 节点其他状态记录(1,2,3具体对应字典,当前节点工序状态)
+     */
+    @Excel(name = "节点状态(0:未执行 1:已执行)")
+    private String taskNodeOtherState;
+
+    /**
+     * 流程发起的时添设置该任务的优先级
+     */
+    @Excel(name = "流程发起的时添设置该任务的优先级")
+    private String taskPriority;
+
+    /**
+     * 执行节点备用列(未启用)
+     */
+    @Excel(name = "执行节点备用列", readConverterExp = "未=启用")
+    private String task1;
+
+    /**
+     * 执行节点备用列(未启用)
+     */
+    @Excel(name = "执行节点备用列", readConverterExp = "未=启用")
+    private String task2;
+
+    /**
+     * 执行节点备用列(未启用)
+     */
+    @Excel(name = "执行节点备用列", readConverterExp = "未=启用")
+    private String task3;
+
+    /**
+     * 执行节点备用列(未启用)
+     */
+    @Excel(name = "执行节点备用列", readConverterExp = "未=启用")
+    private String task4;
+
+    /**
+     * 执行节点备用列(未启用)
+     */
+    @Excel(name = "执行节点备用列", readConverterExp = "未=启用")
+    private String task5;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private String delFlag;
+
+
+    public BpmExecuteNodeLog(Long id, String taskParentNodeKey, String taskProcessKey, String taskNodeKey, String taskNodeName, String taskNodeFormKey, String taskNodeFormType, String taskNodeType, String taskNodeExecuteType, String taskNodeBefore, String taskNodeAfter, String taskNodeRolePermission, String taskRemark, String taskNodeNumber, String taskNodeWeight, String taskNodeState, String taskNodeOtherState, String taskPriority, String task1, String task2, String task3, String task4, String task5, String delFlag) {
+        this.id = id;
+        this.taskParentNodeKey = taskParentNodeKey;
+        this.taskProcessKey = taskProcessKey;
+        this.taskNodeKey = taskNodeKey;
+        this.taskNodeName = taskNodeName;
+        this.taskNodeFormKey = taskNodeFormKey;
+        this.taskNodeFormType = taskNodeFormType;
+        this.taskNodeType = taskNodeType;
+        this.taskNodeExecuteType = taskNodeExecuteType;
+        this.taskNodeBefore = taskNodeBefore;
+        this.taskNodeAfter = taskNodeAfter;
+        this.taskNodeRolePermission = taskNodeRolePermission;
+        this.taskRemark = taskRemark;
+        this.taskNodeNumber = taskNodeNumber;
+        this.taskNodeWeight = taskNodeWeight;
+        this.taskNodeState = taskNodeState;
+        this.taskNodeOtherState = taskNodeOtherState;
+        this.taskPriority = taskPriority;
+        this.task1 = task1;
+        this.task2 = task2;
+        this.task3 = task3;
+        this.task4 = task4;
+        this.task5 = task5;
+        this.delFlag = delFlag;
+    }
+
+    public BpmExecuteNodeLog() {
+    }
+
+    public BpmExecuteNodeLog(BpmExecuteNode bpmExecuteNode) {
+        this.id = bpmExecuteNode.getId();
+        this.taskProcessKey = bpmExecuteNode.getTaskProcessKey();
+        this.taskNodeKey = bpmExecuteNode.getTaskNodeKey();
+        this.taskNodeName = bpmExecuteNode.getTaskNodeName();
+        this.taskNodeFormKey = bpmExecuteNode.getTaskNodeFormKey();
+        this.taskNodeFormType = bpmExecuteNode.getTaskNodeFormType();
+        this.taskNodeType = bpmExecuteNode.getTaskNodeType();
+        this.taskNodeExecuteType = bpmExecuteNode.getTaskNodeExecuteType();
+        this.taskNodeBefore = bpmExecuteNode.getTaskNodeBefore();
+        this.taskNodeAfter = bpmExecuteNode.getTaskNodeAfter();
+        this.taskNodeRolePermission = bpmExecuteNode.getTaskNodeRolePermission();
+        this.taskRemark = bpmExecuteNode.getTaskRemark();
+        this.taskNodeNumber = bpmExecuteNode.getTaskNodeNumber();
+        this.taskNodeWeight = bpmExecuteNode.getTaskNodeWeight();
+        this.taskNodeState = bpmExecuteNode.getTaskNodeState();
+        this.taskNodeOtherState = bpmExecuteNode.getTaskNodeOtherState();
+        this.taskPriority = bpmExecuteNode.getTaskPriority();
+        this.task1 = bpmExecuteNode.getTask1();
+        this.task2 = bpmExecuteNode.getTask2();
+        this.task3 = bpmExecuteNode.getTask3();
+        this.task4 = bpmExecuteNode.getTask4();
+        this.task5 = bpmExecuteNode.getTask5();
+        this.delFlag = bpmExecuteNode.getDelFlag();
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTaskParentNodeKey() {
+        return taskParentNodeKey;
+    }
+
+    public void setTaskParentNodeKey(String taskParentNodeKey) {
+        this.taskParentNodeKey = taskParentNodeKey;
+    }
+
+    public String getTaskProcessKey() {
+        return taskProcessKey;
+    }
+
+    public void setTaskProcessKey(String taskProcessKey) {
+        this.taskProcessKey = taskProcessKey;
+    }
+
+    public String getTaskNodeKey() {
+        return taskNodeKey;
+    }
+
+    public void setTaskNodeKey(String taskNodeKey) {
+        this.taskNodeKey = taskNodeKey;
+    }
+
+    public String getTaskNodeName() {
+        return taskNodeName;
+    }
+
+    public void setTaskNodeName(String taskNodeName) {
+        this.taskNodeName = taskNodeName;
+    }
+
+    public String getTaskNodeFormKey() {
+        return taskNodeFormKey;
+    }
+
+    public void setTaskNodeFormKey(String taskNodeFormKey) {
+        this.taskNodeFormKey = taskNodeFormKey;
+    }
+
+    public String getTaskNodeFormType() {
+        return taskNodeFormType;
+    }
+
+    public void setTaskNodeFormType(String taskNodeFormType) {
+        this.taskNodeFormType = taskNodeFormType;
+    }
+
+    public String getTaskNodeType() {
+        return taskNodeType;
+    }
+
+    public void setTaskNodeType(String taskNodeType) {
+        this.taskNodeType = taskNodeType;
+    }
+
+    public String getTaskNodeExecuteType() {
+        return taskNodeExecuteType;
+    }
+
+    public void setTaskNodeExecuteType(String taskNodeExecuteType) {
+        this.taskNodeExecuteType = taskNodeExecuteType;
+    }
+
+    public String getTaskNodeBefore() {
+        return taskNodeBefore;
+    }
+
+    public void setTaskNodeBefore(String taskNodeBefore) {
+        this.taskNodeBefore = taskNodeBefore;
+    }
+
+    public String getTaskNodeAfter() {
+        return taskNodeAfter;
+    }
+
+    public void setTaskNodeAfter(String taskNodeAfter) {
+        this.taskNodeAfter = taskNodeAfter;
+    }
+
+    public String getTaskNodeRolePermission() {
+        return taskNodeRolePermission;
+    }
+
+    public void setTaskNodeRolePermission(String taskNodeRolePermission) {
+        this.taskNodeRolePermission = taskNodeRolePermission;
+    }
+
+    public String getTaskRemark() {
+        return taskRemark;
+    }
+
+    public void setTaskRemark(String taskRemark) {
+        this.taskRemark = taskRemark;
+    }
+
+    public String getTaskNodeNumber() {
+        return taskNodeNumber;
+    }
+
+    public void setTaskNodeNumber(String taskNodeNumber) {
+        this.taskNodeNumber = taskNodeNumber;
+    }
+
+    public String getTaskNodeWeight() {
+        return taskNodeWeight;
+    }
+
+    public void setTaskNodeWeight(String taskNodeWeight) {
+        this.taskNodeWeight = taskNodeWeight;
+    }
+
+    public String getTaskNodeState() {
+        return taskNodeState;
+    }
+
+    public void setTaskNodeState(String taskNodeState) {
+        this.taskNodeState = taskNodeState;
+    }
+
+    public String getTaskNodeOtherState() {
+        return taskNodeOtherState;
+    }
+
+    public void setTaskNodeOtherState(String taskNodeOtherState) {
+        this.taskNodeOtherState = taskNodeOtherState;
+    }
+
+    public String getTaskPriority() {
+        return taskPriority;
+    }
+
+    public void setTaskPriority(String taskPriority) {
+        this.taskPriority = taskPriority;
+    }
+
+    public String getTask1() {
+        return task1;
+    }
+
+    public void setTask1(String task1) {
+        this.task1 = task1;
+    }
+
+    public String getTask2() {
+        return task2;
+    }
+
+    public void setTask2(String task2) {
+        this.task2 = task2;
+    }
+
+    public String getTask3() {
+        return task3;
+    }
+
+    public void setTask3(String task3) {
+        this.task3 = task3;
+    }
+
+    public String getTask4() {
+        return task4;
+    }
+
+    public void setTask4(String task4) {
+        this.task4 = task4;
+    }
+
+    public String getTask5() {
+        return task5;
+    }
+
+    public void setTask5(String task5) {
+        this.task5 = task5;
+    }
+
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("BpmExecuteNodeLog{");
+        sb.append("id=").append(id);
+        sb.append(", taskParentNodeKey='").append(taskParentNodeKey).append('\'');
+        sb.append(", taskProcessKey='").append(taskProcessKey).append('\'');
+        sb.append(", taskNodeKey='").append(taskNodeKey).append('\'');
+        sb.append(", taskNodeName='").append(taskNodeName).append('\'');
+        sb.append(", taskNodeFormKey='").append(taskNodeFormKey).append('\'');
+        sb.append(", taskNodeFormType='").append(taskNodeFormType).append('\'');
+        sb.append(", taskNodeType='").append(taskNodeType).append('\'');
+        sb.append(", taskNodeExecuteType='").append(taskNodeExecuteType).append('\'');
+        sb.append(", taskNodeBefore='").append(taskNodeBefore).append('\'');
+        sb.append(", taskNodeAfter='").append(taskNodeAfter).append('\'');
+        sb.append(", taskNodeRolePermission='").append(taskNodeRolePermission).append('\'');
+        sb.append(", taskRemark='").append(taskRemark).append('\'');
+        sb.append(", taskNodeNumber='").append(taskNodeNumber).append('\'');
+        sb.append(", taskNodeWeight='").append(taskNodeWeight).append('\'');
+        sb.append(", taskNodeState='").append(taskNodeState).append('\'');
+        sb.append(", taskNodeOtherState='").append(taskNodeOtherState).append('\'');
+        sb.append(", taskPriority='").append(taskPriority).append('\'');
+        sb.append(", task1='").append(task1).append('\'');
+        sb.append(", task2='").append(task2).append('\'');
+        sb.append(", task3='").append(task3).append('\'');
+        sb.append(", task4='").append(task4).append('\'');
+        sb.append(", task5='").append(task5).append('\'');
+        sb.append(", delFlag='").append(delFlag).append('\'');
+        sb.append('}');
+        return sb.toString();
+    }
+}

+ 68 - 0
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/entity/runbpm/BpmBackNodeVo.java

@@ -0,0 +1,68 @@
+package com.zkqy.execution.produce.dispersed.entity.runbpm;
+
+/**
+ * 节点回退实体
+ *
+ * @author hanzihang
+ * @date 2023/12/18 3:18 PM
+ */
+public class BpmBackNodeVo {
+
+    /**
+     * 任务流程编号
+     */
+    private String taskProcessKey;
+
+    /**
+     * 任务节点编号
+     */
+    private String taskNodeKey;
+
+    /**
+     * 回退的节点表示
+     */
+    private String taskBackNodeKey;
+
+    public BpmBackNodeVo() {
+    }
+
+    public BpmBackNodeVo(String taskProcessKey, String taskNodeKey, String taskBackNodeKey) {
+        this.taskProcessKey = taskProcessKey;
+        this.taskNodeKey = taskNodeKey;
+        this.taskBackNodeKey = taskBackNodeKey;
+    }
+
+    public String getTaskProcessKey() {
+        return taskProcessKey;
+    }
+
+    public void setTaskProcessKey(String taskProcessKey) {
+        this.taskProcessKey = taskProcessKey;
+    }
+
+    public String getTaskNodeKey() {
+        return taskNodeKey;
+    }
+
+    public void setTaskNodeKey(String taskNodeKey) {
+        this.taskNodeKey = taskNodeKey;
+    }
+
+    public String getTaskBackNodeKey() {
+        return taskBackNodeKey;
+    }
+
+    public void setTaskBackNodeKey(String taskBackNodeKey) {
+        this.taskBackNodeKey = taskBackNodeKey;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("BpmBackNodeVo{");
+        sb.append("taskProcessKey='").append(taskProcessKey).append('\'');
+        sb.append(", taskNodeKey='").append(taskNodeKey).append('\'');
+        sb.append(", taskBackNodeKey='").append(taskBackNodeKey).append('\'');
+        sb.append('}');
+        return sb.toString();
+    }
+}

+ 16 - 1
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/entity/runbpm/BpmRunNodeVo.java

@@ -33,6 +33,18 @@ public class BpmRunNodeVo {
     // 当前节点绑定表单的表名称
     private String tableName;
 
+    // 节点类型
+    private String taskNodeType;
+
+
+    public String getTaskNodeType() {
+        return taskNodeType;
+    }
+
+    public void setTaskNodeType(String taskNodeType) {
+        this.taskNodeType = taskNodeType;
+    }
+
     public String getTaskProcessKey() {
         return taskProcessKey;
     }
@@ -113,7 +125,9 @@ public class BpmRunNodeVo {
     public BpmRunNodeVo() {
     }
 
-    public BpmRunNodeVo(String taskProcessKey, String taskNodeKey, String nextNodeKey, String implementationName, String taskProcessXmlContent, Map<String, Object> formDataMap, String tableName) {
+
+
+    public BpmRunNodeVo(String taskProcessKey, String taskNodeKey, String nextNodeKey, String implementationName, String taskProcessXmlContent, Map<String, Object> formDataMap, String tableName, String taskNodeType) {
         this.taskProcessKey = taskProcessKey;
         this.taskNodeKey = taskNodeKey;
         this.nextNodeKey = nextNodeKey;
@@ -121,5 +135,6 @@ public class BpmRunNodeVo {
         this.taskProcessXmlContent = taskProcessXmlContent;
         this.formDataMap = formDataMap;
         this.tableName = tableName;
+        this.taskNodeType = taskNodeType;
     }
 }

+ 62 - 0
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/mapper/BpmExecuteNodeLogMapper.java

@@ -0,0 +1,62 @@
+package com.zkqy.execution.produce.dispersed.mapper;
+
+import com.zkqy.execution.produce.dispersed.entity.BpmExecuteNodeLog;
+
+import java.util.List;
+
+/**
+ * 节点执行记录(日志)Mapper接口
+ * 
+ * @author zkqy
+ * @date 2023-12-18
+ */
+public interface BpmExecuteNodeLogMapper 
+{
+    /**
+     * 查询节点执行记录(日志)
+     * 
+     * @param id 节点执行记录(日志)主键
+     * @return 节点执行记录(日志)
+     */
+    public BpmExecuteNodeLog selectBpmExecuteNodeLogById(Long id);
+
+    /**
+     * 查询节点执行记录(日志)列表
+     * 
+     * @param bpmExecuteNodeLog 节点执行记录(日志)
+     * @return 节点执行记录(日志)集合
+     */
+    public List<BpmExecuteNodeLog> selectBpmExecuteNodeLogList(BpmExecuteNodeLog bpmExecuteNodeLog);
+
+    /**
+     * 新增节点执行记录(日志)
+     * 
+     * @param bpmExecuteNodeLog 节点执行记录(日志)
+     * @return 结果
+     */
+    public int insertBpmExecuteNodeLog(BpmExecuteNodeLog bpmExecuteNodeLog);
+
+    /**
+     * 修改节点执行记录(日志)
+     * 
+     * @param bpmExecuteNodeLog 节点执行记录(日志)
+     * @return 结果
+     */
+    public int updateBpmExecuteNodeLog(BpmExecuteNodeLog bpmExecuteNodeLog);
+
+    /**
+     * 删除节点执行记录(日志)
+     * 
+     * @param id 节点执行记录(日志)主键
+     * @return 结果
+     */
+    public int deleteBpmExecuteNodeLogById(Long id);
+
+    /**
+     * 批量删除节点执行记录(日志)
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteBpmExecuteNodeLogByIds(Long[] ids);
+}

+ 12 - 0
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/mapper/BpmExecuteNodeMapper.java

@@ -81,6 +81,18 @@ public interface BpmExecuteNodeMapper {
      */
     public int updateNodeState(BpmExecuteNode bpmExecuteNode);
 
+
+    /**
+     * 批量更新流程节点
+     *
+     * @param processKeys
+     * @param nodeKeys
+     * @return
+     */
+    public int updateNodeStateByKeys(@Param("processKey") String processKey, @Param("nodeKeys") List<String> nodeKeys);
+
+    public int deleteExceptionNodeByKeys(@Param("processKey") String processKey, @Param("nodeKeys") List<String> nodeKeys);
+
     /**
      * 根据任务流程key、节点key 得到该节点的详细信息
      *

+ 136 - 65
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/runbpm/PreExecutionToolClass.java

@@ -4,15 +4,14 @@ import com.zkqy.common.constant.HttpStatus;
 import com.zkqy.common.core.domain.AjaxResult;
 import com.zkqy.common.utils.bpm.XmlDataParserUtils;
 import com.zkqy.common.utils.uuid.IdUtils;
-import com.zkqy.execution.produce.dispersed.entity.BpmExecuteNode;
-import com.zkqy.execution.produce.dispersed.entity.BpmExecuteNodeMiddle;
-import com.zkqy.execution.produce.dispersed.entity.BpmExecuteProcess;
+import com.zkqy.execution.produce.dispersed.entity.*;
 import com.zkqy.execution.produce.dispersed.entity.runbpm.*;
 import com.zkqy.execution.produce.dispersed.mapper.BpmExecuteNodeFormMapper;
 import com.zkqy.execution.produce.dispersed.mapper.BpmExecuteNodeMapper;
 import com.zkqy.execution.produce.dispersed.mapper.BpmExecuteNodeMiddleMapper;
 import com.zkqy.execution.produce.dispersed.mapper.BpmExecuteProcessMapper;
 import com.zkqy.execution.produce.dispersed.service.IBpmExecuteNodeFormService;
+import com.zkqy.execution.produce.dispersed.service.IBpmExecuteNodeLogService;
 import com.zkqy.execution.produce.dispersed.service.IBpmExecuteProcessService;
 import com.zkqy.execution.produce.utils.VerifyExecutionProcess;
 import com.zkqy.system.entity.*;
@@ -21,7 +20,6 @@ import com.zkqy.system.mapper.BpmNodeScriptRelevanceMapper;
 import com.zkqy.system.mapper.BpmProcessConfigurationMapper;
 import com.zkqy.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;
@@ -72,10 +70,12 @@ public class PreExecutionToolClass<R> {
     @Autowired // 校验执行流程的数据
     private VerifyExecutionProcess iVerifyExecutionProcess;
 
-
-    @Autowired
+    @Autowired  // 节点表单
     private BpmExecuteNodeFormMapper executeNodeFormMapper;
 
+    @Autowired  // 节点日志
+    private IBpmExecuteNodeLogService iBpmExecuteNodeLogService;
+
     /**
      * 预执行流程自动执行开始节点
      *
@@ -203,59 +203,65 @@ public class PreExecutionToolClass<R> {
         });
         runBpmExecuteNodeMiddleMapper.insertBpmExecuteNodeMiddleList(runBpmExecuteNodeMiddleList);
         //**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 -> {
-//
-//            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);
-//                }
-//        });
-//        // 得到当前流程所有的表单类型
-//        Map<String, String> nodeFrom = iBpmExecuteNodeFormService.selectNodeFromInfos(commonEntity.getCommMap().get("process_key").toString());
-//        // 得到当前表单的所有信息
-//        Map<String, Object> nodeFromInfoMap = this.getNodeFormInfos(nodeFrom);
-//        bpmExecuteNodeFormList.forEach(item -> {
-//            item.setTaskNodeFromContent(nodeFromInfoMap.get(item.getTaskNodeFormKey()).toString());
-//        });
-//        // 最终提交新增 bpmExecuteNodeFormList
-//        bpmExecuteNodeFormList.forEach(item -> {
-//            iBpmExecuteNodeFormService.insertBpmExecuteNodeForm(item);
-//        });
+        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 -> {
+            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());
+                    bpmExecuteNodeForm.setTaskNodeName(item.getScriptNodeName());
+                    if (item.getScriptTriggerType() == 1L) { // 正常节点脚本
+                        // bpmProcessConfigurationList
+                        bpmExecuteNodeForm.setTaskNodeFormKey(nodeInfo.get(item.getNodeKey()).getNodeFormKey());
+                        bpmExecuteNodeForm.setTaskNodeFormType(nodeInfo.get(item.getNodeKey()).getNodeFormType());
+                        // bpmExecuteNodeForm.setTaskNodeFromContent();
+                    } else if (item.getScriptTriggerType() == 0L) { // 异常脚本
+                        bpmExecuteNodeForm.setTaskNodeFormKey(item.getFormKey());
+                        bpmExecuteNodeForm.setTaskNodeFormType(item.getScriptNodeFormType());
+                        // bpmExecuteNodeForm.setTaskNodeFromContent();
+                    }
+                    bpmExecuteNodeFormList.add(bpmExecuteNodeForm);
+                }
+        });
+        // 得到当前流程所有的表单类型
+        Map<String, String> nodeFrom = iBpmExecuteNodeFormService.selectNodeFromInfos(commonEntity.getCommMap().get("process_key").toString());
+        // 得到当前表单的所有信息
+        Map<String, Object> nodeFromInfoMap = this.getNodeFormInfos(nodeFrom);
+        bpmExecuteNodeFormList.forEach(item -> {
+            item.setTaskNodeFormContent(nodeFromInfoMap.get(item.getTaskNodeFormKey()).toString());
+        });
+        // 最终提交新增 bpmExecuteNodeFormList
+        bpmExecuteNodeFormList.forEach(item -> {
+            iBpmExecuteNodeFormService.insertBpmExecuteNodeForm(item);
+        });
         // iBpmExecuteNodeFormService
         /**4️⃣4️⃣4️⃣ 调用执行节点接口 预执行当前投产流程的开始节点,执行开始节点*/
         // bpmUserScriptVoList  节点key对应的脚本
         // 根据节点类型startEvent 筛选得到当前流程的开始节点,进行自动执行    // startEvent  开始节点类型
         Optional<BpmProcessConfiguration> optionalStartNode = bpmProcessConfigurationList.stream().filter(item -> item.getNodeType().equals("startEvent")).findFirst();
+        // 找到开始节点进行记录
+        runBpmExecuteNodeList.forEach(itme -> {
+            if (itme.getTaskNodeType().equals("startEvent")) {
+                BpmExecuteNodeLog bpmExecuteNodeLog = new BpmExecuteNodeLog(itme);
+                iBpmExecuteNodeLogService.insertBpmExecuteNodeLog(bpmExecuteNodeLog);
+            }
+        });
         if (optionalStartNode.isPresent()) {
             // optionalStartNode.get().getNodeKey();  当前流程开始节点key
             Optional<BpmUserScriptVo> optionalBpmUserScriptVo = bpmUserScriptVoList.stream().filter(item -> item.getNodeKey().equals(optionalStartNode.get().getNodeKey())).findFirst();
@@ -287,12 +293,16 @@ public class PreExecutionToolClass<R> {
      */
     @Transactional
     public AjaxResult executionNode(BpmRunNodeVo bpmRunNodeVo) {
-        System.err.println(bpmRunNodeVo.getTaskNodeKey());
-        System.err.println(bpmRunNodeVo.getNextNodeKey());
         String taskProcessKey = bpmRunNodeVo.getTaskProcessKey(); // 任务流程编码
         String taskNodeKey = bpmRunNodeVo.getTaskNodeKey(); // 任务节点编码
         // 得到当前节点的所有信息-》用于执行节点前后绑定的自动运行的脚本
         BpmExecuteNode currentBpmExecuteNode = runBpmExecuteNodeMapper.queryBpmExecuteNodeBytaskNodeKey(taskProcessKey, taskNodeKey);
+
+
+        // ⚠️⚠️⚠️ 新增节点执行记录
+        BpmExecuteNodeLog bpmExecuteNodeLog = new BpmExecuteNodeLog(currentBpmExecuteNode);
+        iBpmExecuteNodeLogService.insertBpmExecuteNodeLog(bpmExecuteNodeLog);
+
         // 在执行节时得到除当前节点绑定的正常脚本外,有可能会绑定自动执行的脚本(这些自动执行的脚本参数不能确定,无法传递)
         BpmExecuteNodeMiddle bpmExecuteNodeMiddle = runBpmExecuteNodeMiddleMapper.queryBpmExecuteNodeMiddleByTaskNodeKey(taskProcessKey, taskNodeKey);
         String script[] = bpmExecuteNodeMiddle.getTaskNodeAroundScriptKey().split(",");  // 得到当前节点需要自动执行的脚本
@@ -355,6 +365,11 @@ public class PreExecutionToolClass<R> {
             }
         }
         BpmExecuteNode bpmExecuteNode = runBpmExecuteNodeMapper.queryBpmExecuteNodeBytaskNodeKey(bpmRunNodeVo.getTaskProcessKey(), bpmRunNodeVo.getNextNodeKey());
+        //---3️⃣⚡️5️⃣ 添加节点执行记录  -》当前执行的节点详细信息
+        // ⚠️⚠️⚠️ 当前节点执行完成新增日志数据,
+        // 理论讲当前节点一旦点击运行操作就要新增日志,最后修改日志的状态
+//        BpmExecuteNodeLog bpmExecuteNodeLog1 = new BpmExecuteNodeLog(currentBpmExecuteNode);
+//        iBpmExecuteNodeLogService.insertBpmExecuteNodeLog(bpmExecuteNodeLog1);
         // 4️⃣4️⃣4️⃣ 校验当前节点是否为结束节点
         System.err.println("--- 4️⃣4️⃣4️⃣ 校验当前节点是否为结束节点");
         if (bpmExecuteNode.getTaskNodeType().equals("endEvent")) {
@@ -368,6 +383,9 @@ public class PreExecutionToolClass<R> {
                 // 判断脚本执行状态
                 return AjaxResult.error(HttpStatus.SCRIPTEXCEPTION, "流程结束失败!");
             }
+            // 记录结束节点
+            BpmExecuteNodeLog bpmExecuteNodeLog11 = new BpmExecuteNodeLog(bpmExecuteNode);
+            iBpmExecuteNodeLogService.insertBpmExecuteNodeLog(bpmExecuteNodeLog11);
             // 结束当前流程 更新流程状态
             if (runBpmExecuteProcessMapper.endProcess(bpmRunNodeVo.getTaskProcessKey()) > 1) {
                 AjaxResult.success("流程执行成功!");
@@ -403,6 +421,11 @@ public class PreExecutionToolClass<R> {
             this.executionNode(bpmRunNodeVo1);
         } else if (bpmExecuteNode.getTaskNodeExecuteType().equals("false")) {
             System.err.println("✅✅✅节点执行完成!!!");
+            // 判断当前执行的节点是否为回退类型的异常节点
+            // 回退类型的异常节点一定是的任务执行节点的编码是不能被改变的,其他类型的异常可以进行更改
+            if (bpmRunNodeVo.getTaskNodeType().equals("backExceptionTask")) {
+                return AjaxResult.success();
+            }
             BpmExecuteProcess bpmExecuteProcess = new BpmExecuteProcess();
             bpmExecuteProcess.setTaskKey(bpmRunNodeVo.getTaskProcessKey());
             bpmExecuteProcess.setTaskNodeKey(bpmRunNodeVo.getTaskNodeKey());
@@ -443,7 +466,6 @@ public class PreExecutionToolClass<R> {
     }
 
 
-
     /**
      * 查询节点对应的表单信息
      *
@@ -467,9 +489,58 @@ public class PreExecutionToolClass<R> {
         return resultMap;
     }
 
+    /**
+     * 回退流程节点
+     *
+     * @param bpmBackNodeVo
+     * @return
+     */
+    public AjaxResult backProcessNode(BpmBackNodeVo bpmBackNodeVo) {
+        /**
+         *当前流程的任务编码
+         * 发起操作的节点编码
+         * 需要回退到的节点编码
+         *
+         *
+         * 发起的操作节点的表单还是操作的当前节点的表单
+         * 也就是说相当于把当前节点执行后在更改当前任务流程的执行节点
+         */
+        // 得到当前流程的详细信息
+        BpmExecuteProcess bpmExecuteProcess = runBpmExecuteProcessMapper.selectBpmExecuteProcessByTaskKey(bpmBackNodeVo.getTaskProcessKey());
+        bpmExecuteProcess.getTaskProcessXmlContent(); // 当前流程xml内容
+        Map<String, Object> bpmInfoOrder = XmlDataParserUtils.getAllNodeKey(bpmExecuteProcess.getTaskProcessXmlContent());
+        // 修改流程-> 流程执行的xml文件
+        bpmExecuteProcess.setTaskNodeNextKey(bpmBackNodeVo.getTaskBackNodeKey());
+        bpmExecuteProcess.setTaskProcessXmlContent(XmlDataParserUtils.clearExceptionTask(bpmExecuteProcess.getTaskProcessXmlContent(), bpmBackNodeVo.getTaskBackNodeKey()));
+        runBpmExecuteProcessMapper.updateBpmExecuteProcess(bpmExecuteProcess);
+        Map<String, Object> nodeMap = (Map<String, Object>) bpmInfoOrder.get("nodeMap");
+        List<String> nodeList = (List<String>) bpmInfoOrder.get("nodeList");
+        int index = (int) nodeMap.get(bpmBackNodeVo.getTaskBackNodeKey()); // 得到被回退的节点下标
+        List<String> nodeKeys = new ArrayList<>();
+        for (int i = index; i < nodeList.size(); i++) {
+            nodeKeys.add(nodeList.get(i));
+        }
+        // 修改当前流程节点状态
+        runBpmExecuteNodeMapper.updateNodeStateByKeys(bpmBackNodeVo.getTaskProcessKey(), nodeKeys);
+        BpmExecuteNodeLog bpmExecuteNodeLog = new BpmExecuteNodeLog();
+        bpmExecuteNodeLog.setTaskProcessKey(bpmBackNodeVo.getTaskProcessKey());
+        bpmExecuteNodeLog.setTaskNodeKey(bpmBackNodeVo.getTaskNodeKey());
+        List<BpmExecuteNodeLog> bpmExecuteNodeLogList = iBpmExecuteNodeLogService.selectBpmExecuteNodeLogList(bpmExecuteNodeLog);
+        if (bpmExecuteNodeLogList.size() == 1) {
+            // 问题:当前修改回退节点日志,在此当前回退节点并未执行完成。
+            //      所以并没有日志数据,无法完成修改操作
+            BpmExecuteNodeLog bpmExecuteNodeLog1 = bpmExecuteNodeLogList.get(0);
+            bpmExecuteNodeLog1.setTaskParentNodeKey(bpmBackNodeVo.getTaskNodeKey());
+            iBpmExecuteNodeLogService.updateBpmExecuteNodeLog(bpmExecuteNodeLog1);
+        }
+        // 修改回退节点后的所有异常节点信息
+        runBpmExecuteNodeMapper.deleteExceptionNodeByKeys(bpmBackNodeVo.getTaskProcessKey(), nodeKeys);
+        return AjaxResult.success();
+    }
+
+
     public CommonEntity getProcessNodeFormTemplate(BpmRunNodeFromVo bpmRunNodeFromVo) {
         CommonEntity commonEntity = new CommonEntity();
-
         return commonEntity;
     }
 
@@ -490,13 +561,13 @@ public class PreExecutionToolClass<R> {
 //        List<Map> mapList = new ArrayList<>();
 //        //节点对应的表单信息不能为空
 //        if (bpmExecuteNodeForm != null) {
-//            String taskNodeFromContent = bpmExecuteNodeForm.getTaskNodeFromContent();
+//            String taskNodeFormContent = bpmExecuteNodeForm.getTaskNodeFromContent();
 //            //拿到当前节点对应的表单类型
-//            String taskNodeFromType = bpmExecuteNodeForm.getTaskNodeFromType();
-//            if (taskNodeFromType.equals("dragForm")) {
+//            String taskNodeFormType = bpmExecuteNodeForm.getTaskNodeFromType();
+//            if (taskNodeFormType.equals("dragForm")) {
 //                HashMap hashMap = new HashMap();
 //                //解析存进去的表单信息【task_node_from_content】
-//                JSONObject taskNodeFromContentJson = JSONObject.parseObject(taskNodeFromContent);
+//                JSONObject taskNodeFromContentJson = JSONObject.parseObject(taskNodeFormContent);
 //                //得到sqlKey
 //                String sqlKey = taskNodeFromContentJson.get("sqlKey").toString();
 //                //根据sqlKey查询表单数据
@@ -524,9 +595,9 @@ public class PreExecutionToolClass<R> {
 //                hashMap.put("template", taskNodeFromContentJson);
 //                //添加到返回集合中
 //                mapList.add(hashMap);
-//            } else if (taskNodeFromType.equals("composeForm")) {
+//            } else if (taskNodeFormType.equals("composeForm")) {
 //                //参数为一个数组
-//                JSONArray objects = JSON.parseArray(taskNodeFromContent);
+//                JSONArray objects = JSON.parseArray(taskNodeFormContent);
 //
 //                //循环数组元素
 //                objects.forEach(item -> {
@@ -548,7 +619,7 @@ public class PreExecutionToolClass<R> {
 //                    jsonObject.put("tableList", stringHashMap);
 //                    mapList.add(jsonObject);
 //                });
-//            } else if (taskNodeFromContent.equals("designForm")) {
+//            } else if (taskNodeFormContent.equals("designForm")) {
 //                HashMap hashMap = new HashMap();
 //                hashMap.put("resultMap", "");
 //                hashMap.put("template", "");

+ 62 - 0
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/IBpmExecuteNodeLogService.java

@@ -0,0 +1,62 @@
+package com.zkqy.execution.produce.dispersed.service;
+
+import com.zkqy.execution.produce.dispersed.entity.BpmExecuteNodeLog;
+
+import java.util.List;
+
+/**
+ * 节点执行记录(日志)Service接口
+ * 
+ * @author zkqy
+ * @date 2023-12-18
+ */
+public interface IBpmExecuteNodeLogService 
+{
+    /**
+     * 查询节点执行记录(日志)
+     * 
+     * @param id 节点执行记录(日志)主键
+     * @return 节点执行记录(日志)
+     */
+    public BpmExecuteNodeLog selectBpmExecuteNodeLogById(Long id);
+
+    /**
+     * 查询节点执行记录(日志)列表
+     * 
+     * @param bpmExecuteNodeLog 节点执行记录(日志)
+     * @return 节点执行记录(日志)集合
+     */
+    public List<BpmExecuteNodeLog> selectBpmExecuteNodeLogList(BpmExecuteNodeLog bpmExecuteNodeLog);
+
+    /**
+     * 新增节点执行记录(日志)
+     * 
+     * @param bpmExecuteNodeLog 节点执行记录(日志)
+     * @return 结果
+     */
+    public int insertBpmExecuteNodeLog(BpmExecuteNodeLog bpmExecuteNodeLog);
+
+    /**
+     * 修改节点执行记录(日志)
+     * 
+     * @param bpmExecuteNodeLog 节点执行记录(日志)
+     * @return 结果
+     */
+    public int updateBpmExecuteNodeLog(BpmExecuteNodeLog bpmExecuteNodeLog);
+
+    /**
+     * 批量删除节点执行记录(日志)
+     * 
+     * @param ids 需要删除的节点执行记录(日志)主键集合
+     * @return 结果
+     */
+    public int deleteBpmExecuteNodeLogByIds(Long[] ids);
+
+    /**
+     * 删除节点执行记录(日志)信息
+     * 
+     * @param id 节点执行记录(日志)主键
+     * @return 结果
+     */
+    public int deleteBpmExecuteNodeLogById(Long id);
+}

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

@@ -0,0 +1,94 @@
+package com.zkqy.execution.produce.dispersed.service.impl;
+
+import java.util.List;
+import com.zkqy.common.utils.DateUtils;
+import com.zkqy.execution.produce.dispersed.entity.BpmExecuteNodeLog;
+import com.zkqy.execution.produce.dispersed.mapper.BpmExecuteNodeLogMapper;
+import com.zkqy.execution.produce.dispersed.service.IBpmExecuteNodeLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+/**
+ * 节点执行记录(日志)Service业务层处理
+ * 
+ * @author zkqy
+ * @date 2023-12-18
+ */
+@Service
+public class BpmExecuteNodeLogServiceImpl implements IBpmExecuteNodeLogService
+{
+    @Autowired
+    private BpmExecuteNodeLogMapper bpmExecuteNodeLogMapper;
+
+    /**
+     * 查询节点执行记录(日志)
+     * 
+     * @param id 节点执行记录(日志)主键
+     * @return 节点执行记录(日志)
+     */
+    @Override
+    public BpmExecuteNodeLog selectBpmExecuteNodeLogById(Long id)
+    {
+        return bpmExecuteNodeLogMapper.selectBpmExecuteNodeLogById(id);
+    }
+
+    /**
+     * 查询节点执行记录(日志)列表
+     * 
+     * @param bpmExecuteNodeLog 节点执行记录(日志)
+     * @return 节点执行记录(日志)
+     */
+    @Override
+    public List<BpmExecuteNodeLog> selectBpmExecuteNodeLogList(BpmExecuteNodeLog bpmExecuteNodeLog)
+    {
+        return bpmExecuteNodeLogMapper.selectBpmExecuteNodeLogList(bpmExecuteNodeLog);
+    }
+
+    /**
+     * 新增节点执行记录(日志)
+     * 
+     * @param bpmExecuteNodeLog 节点执行记录(日志)
+     * @return 结果
+     */
+    @Override
+    public int insertBpmExecuteNodeLog(BpmExecuteNodeLog bpmExecuteNodeLog)
+    {
+        bpmExecuteNodeLog.setCreateTime(DateUtils.getNowDate());
+        return bpmExecuteNodeLogMapper.insertBpmExecuteNodeLog(bpmExecuteNodeLog);
+    }
+
+    /**
+     * 修改节点执行记录(日志)
+     * 
+     * @param bpmExecuteNodeLog 节点执行记录(日志)
+     * @return 结果
+     */
+    @Override
+    public int updateBpmExecuteNodeLog(BpmExecuteNodeLog bpmExecuteNodeLog)
+    {
+        return bpmExecuteNodeLogMapper.updateBpmExecuteNodeLog(bpmExecuteNodeLog);
+    }
+
+    /**
+     * 批量删除节点执行记录(日志)
+     * 
+     * @param ids 需要删除的节点执行记录(日志)主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBpmExecuteNodeLogByIds(Long[] ids)
+    {
+        return bpmExecuteNodeLogMapper.deleteBpmExecuteNodeLogByIds(ids);
+    }
+
+    /**
+     * 删除节点执行记录(日志)信息
+     * 
+     * @param id 节点执行记录(日志)主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBpmExecuteNodeLogById(Long id)
+    {
+        return bpmExecuteNodeLogMapper.deleteBpmExecuteNodeLogById(id);
+    }
+}

+ 13 - 13
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/impl/BpmExecuteNodeServiceImpl.java

@@ -127,14 +127,14 @@ public class BpmExecuteNodeServiceImpl implements IBpmExecuteNodeService {
         SysBpmNodeScriptVO sysBpmNodeScriptVO = vo.getSysBpmNodeScriptVO();
 
         //select bpm_execute_node_form
-//        BpmExecuteNodeForm bpmExecuteNodeForm = new BpmExecuteNodeForm();
-//        bpmExecuteNodeForm.setTaskProcessKey(vo.getTaskProcessKey());
-//        bpmExecuteNodeForm.setTaskNodeKey(vo.getTaskNodeKey());
-//        bpmExecuteNodeForm.setTaskScriptKey(vo.getSysBpmNodeScriptVO().getScriptKey());
-//        BpmExecuteNodeForm bpmExecuteNodeForm1 = bpmExecuteNodeFormMapper.selectBpmExecuteNodeFormInfo(bpmExecuteNodeForm);
-//        //insert bpm_execute_node_form
-//        bpmExecuteNodeForm1.setTaskNodeKey(newUserTaskTagId);
-//        bpmExecuteNodeFormMapper.insertBpmExecuteNodeForm(bpmExecuteNodeForm1);
+        BpmExecuteNodeForm bpmExecuteNodeForm = new BpmExecuteNodeForm();
+        bpmExecuteNodeForm.setTaskProcessKey(vo.getTaskProcessKey());
+        bpmExecuteNodeForm.setTaskNodeKey(vo.getTaskNodeKey());
+        bpmExecuteNodeForm.setTaskScriptKey(vo.getSysBpmNodeScriptVO().getScriptKey());
+        BpmExecuteNodeForm bpmExecuteNodeForm1 = bpmExecuteNodeFormMapper.selectBpmExecuteNodeFormInfo(bpmExecuteNodeForm);
+        //insert bpm_execute_node_form
+        bpmExecuteNodeForm1.setTaskNodeKey(newUserTaskTagId);
+        bpmExecuteNodeFormMapper.insertBpmExecuteNodeForm(bpmExecuteNodeForm1);
 
         //修改当前执行流程xml内容,当前节点下一节点信息
         String afterAnalysis = XmlDataParserUtils.addUserTaskTag(bpmExecuteProcess.getTaskProcessXmlContent(), newUserTaskTagId, sysBpmNodeScriptVO.getScriptName(), vo.getTaskNodeKey());
@@ -149,16 +149,16 @@ public class BpmExecuteNodeServiceImpl implements IBpmExecuteNodeService {
         BpmExecuteNode bpmExecuteNode = bpmExecuteNodeMapper.queryBpmExecuteNodeBytaskNodeKey(vo.getTaskProcessKey(), vo.getTaskNodeKey());
         bpmExecuteNode.setId(null);
         bpmExecuteNode.setTaskNodeKey(newUserTaskTagId);
-        bpmExecuteNode.setTaskNodeName(sysBpmNodeScriptVO.getScriptName());
+        bpmExecuteNode.setTaskNodeName(bpmExecuteNodeForm1.getTaskNodeName());
         bpmExecuteNode.setTaskNodeType(BpmNodeTypeConstants.EXCEPTION_TASK);
         bpmExecuteNode.setTaskRemark(sysBpmNodeScriptVO.getScriptDescription());
         bpmExecuteNode.setTaskNodeState("0");
         bpmExecuteNode.setTaskNodeNumber("");
         bpmExecuteNode.setTaskNodeWeight("");
-//        bpmExecuteNode.setTaskNodeFormKey(bpmExecuteNodeForm1.getTaskNodeFormKey());
-//        bpmExecuteNode.setTaskNodeFormType(bpmExecuteNodeForm1.getTaskNodeFromType());
-        bpmExecuteNode.setTaskNodeExecuteType("");
-        bpmExecuteNode.setTaskNodeFormKey("");
+        bpmExecuteNode.setTaskNodeFormKey(bpmExecuteNodeForm1.getTaskNodeFormKey());
+        bpmExecuteNode.setTaskNodeFormType(bpmExecuteNodeForm1.getTaskNodeFormType());
+        bpmExecuteNode.setTaskNodeExecuteType(bpmExecuteNode.getTaskNodeExecuteType());
+        bpmExecuteNode.setTaskNodeFormKey(bpmExecuteNodeForm1.getTaskNodeFormKey());
         bpmExecuteNode.setTaskNodeRolePermission(taskNodeRolePermission);
         bpmExecuteNodeMapper.insertBpmExecuteNode(bpmExecuteNode);
 

+ 4 - 1
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/impl/runbpm/hangye1/testNode/CaiGou.java

@@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.PreDestroy;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -39,7 +40,7 @@ public class CaiGou implements IRunBPMService {
 
     @Override
     public AjaxResult executeNode(IRunBPMEntity iRunBPMEntity) {
-        Map<String,Object> map = iRunBPMEntity.getExecutionMap();
+        Map<String, Object> map = iRunBPMEntity.getExecutionMap();
         CommonEntity commonEntity = new CommonEntity();
 //        commonEntity.getCommMap().put("")
 
@@ -57,7 +58,9 @@ public class CaiGou implements IRunBPMService {
     }
 
     @Override
+    @PreDestroy
     public boolean preDestroy() {
+        System.out.println("清理成功!");
         return true;
     }
 }

+ 78 - 0
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/impl/runbpm/hangye1/yichang/yichang1.java

@@ -0,0 +1,78 @@
+package com.zkqy.execution.produce.dispersed.service.impl.runbpm.hangye1.yichang;
+
+import com.zkqy.common.core.domain.AjaxResult;
+import com.zkqy.execution.produce.dispersed.entity.BpmExecuteNode;
+import com.zkqy.execution.produce.dispersed.entity.runbpm.BpmBackNodeVo;
+import com.zkqy.execution.produce.dispersed.entity.runbpm.BpmRunNodeFormFilterConditionsVo;
+import com.zkqy.execution.produce.dispersed.entity.runbpm.BpmRunNodeFromVo;
+import com.zkqy.execution.produce.dispersed.entity.runbpm.IRunBPMEntity;
+import com.zkqy.execution.produce.dispersed.runbpm.PreExecutionToolClass;
+import com.zkqy.execution.produce.dispersed.service.IBpmExecuteNodeService;
+import com.zkqy.execution.produce.dispersed.service.IRunBPMService;
+import com.zkqy.execution.produce.utils.EchoNodeFormData;
+import com.zkqy.system.entity.CommonEntity;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PreDestroy;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author hanzihang
+ * @date 2023/12/19 3:12 PM
+ */
+@Service("4c163c35-6005-48cf-9dc0-3f07af04c70b")
+@Scope("prototype")
+public class yichang1 implements IRunBPMService {
+    @Autowired  // 处理表单数据
+    private EchoNodeFormData echoNodeFormData;
+
+    @Autowired
+    private PreExecutionToolClass preExecutionToolClass;
+    @Autowired
+    private IBpmExecuteNodeService iBpmExecuteNodeService;
+
+    @Override
+    public CommonEntity getNodeFormData(BpmRunNodeFromVo bpmRunNodeFromVo) {
+        BpmExecuteNode bpmExecuteNode = new BpmExecuteNode();
+        bpmExecuteNode.setTaskProcessKey(bpmRunNodeFromVo.getTaskProcessKey());
+        iBpmExecuteNodeService.selectBpmExecuteNodeList(bpmExecuteNode);
+        Map<String, Object> map = new HashMap<>();
+        map.put("task_process_key", bpmRunNodeFromVo.getTaskProcessKey());
+        bpmRunNodeFromVo.getFormDataVoList().add(new BpmRunNodeFormFilterConditionsVo("bpm_execute_node", map, false, "nodeList"));
+        return echoNodeFormData.getEchoNodeFormData(bpmRunNodeFromVo);
+    }
+
+    @Override
+    public AjaxResult preValidation(IRunBPMEntity iRunBPMEntity) {
+        return AjaxResult.success();
+    }
+
+    @Override
+    public AjaxResult executeNode(IRunBPMEntity iRunBPMEntity) {
+        BpmBackNodeVo bpmBackNodeVo = new BpmBackNodeVo(
+                iRunBPMEntity.getExecutionMap().get("taskProcessKey").toString(),
+                iRunBPMEntity.getExecutionMap().get("taskNodeKey").toString(),
+                iRunBPMEntity.getExecutionMap().get("taskBackNodeKey").toString());
+        preExecutionToolClass.backProcessNode(bpmBackNodeVo);
+        return AjaxResult.success();
+    }
+
+    @Override
+    public AjaxResult afterValidation(IRunBPMEntity iRunBPMEntity) {
+        return AjaxResult.success();
+    }
+
+    @Override
+    public boolean isVerificationMethod() {
+        return true;
+    }
+
+    @Override
+    @PreDestroy
+    public boolean preDestroy() {
+        return true;
+    }
+}

+ 2 - 2
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/utils/EchoNodeFormData.java

@@ -70,13 +70,13 @@ public class EchoNodeFormData {
             if (listKey != null && !listKey.isEmpty()) {
                 //下拉框数据、或者表格多条数据
                 List<Map<String, Object>> maps = commonMapper.selectListMap(item.getTableName(), item.getCondition());
-                if(maps!=null){
+                if (maps != null) {
                     commonEntity.get().getResultMap().put(item.getListKey(), maps);
                 }
             } else {
                 //单条数据的回显逻辑
                 CommonEntity common = commonMapper.selectOne(item.getTableName(), item.getCondition());
-                if(common!=null){
+                if (common != null) {
                     commonEntity.get().getResultMap().putAll(common.getResultMap());
                 }
             }

+ 178 - 0
zkqy-process-execution/src/main/resources/mapper/bpm/dispersed/BpmExecuteNodeLogMapper.xml

@@ -0,0 +1,178 @@
+<?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.zkqy.execution.produce.dispersed.mapper.BpmExecuteNodeLogMapper">
+
+    <resultMap type="com.zkqy.execution.produce.dispersed.entity.BpmExecuteNodeLog" id="BpmExecuteNodeLogResult">
+        <result property="id"    column="id"    />
+        <result property="taskParentNodeKey"    column="task_parent_node_key"    />
+        <result property="taskProcessKey"    column="task_process_key"    />
+        <result property="taskNodeKey"    column="task_node_key"    />
+        <result property="taskNodeName"    column="task_node_name"    />
+        <result property="taskNodeFormKey"    column="task_node_form_key"    />
+        <result property="taskNodeFormType"    column="task_node_form_type"    />
+        <result property="taskNodeType"    column="task_node_type"    />
+        <result property="taskNodeExecuteType"    column="task_node_execute_type"    />
+        <result property="taskNodeBefore"    column="task_node_before"    />
+        <result property="taskNodeAfter"    column="task_node_after"    />
+        <result property="taskNodeRolePermission"    column="task_node_role_permission"    />
+        <result property="taskRemark"    column="task_remark"    />
+        <result property="taskNodeNumber"    column="task_node_number"    />
+        <result property="taskNodeWeight"    column="task_node_weight"    />
+        <result property="taskNodeState"    column="task_node_state"    />
+        <result property="taskNodeOtherState"    column="task_node_other_state"    />
+        <result property="taskPriority"    column="task_priority"    />
+        <result property="task1"    column="task1"    />
+        <result property="task2"    column="task2"    />
+        <result property="task3"    column="task3"    />
+        <result property="task4"    column="task4"    />
+        <result property="task5"    column="task5"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createById"    column="create_by_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+    </resultMap>
+
+    <sql id="selectBpmExecuteNodeLogVo">
+        select id, task_parent_node_key, task_process_key, task_node_key, task_node_name, task_node_form_key, task_node_form_type, task_node_type, task_node_execute_type, task_node_before, task_node_after, task_node_role_permission, task_remark, task_node_number, task_node_weight, task_node_state, task_node_other_state, task_priority, task1, task2, task3, task4, task5, del_flag, create_by_id, create_by, create_time from bpm_execute_node_log
+    </sql>
+
+    <select id="selectBpmExecuteNodeLogList" parameterType="com.zkqy.execution.produce.dispersed.entity.BpmExecuteNodeLog" resultMap="BpmExecuteNodeLogResult">
+        <include refid="selectBpmExecuteNodeLogVo"/>
+        <where>
+            <if test="taskParentNodeKey != null  and taskParentNodeKey != ''"> and task_parent_node_key = #{taskParentNodeKey}</if>
+            <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="taskNodeName != null  and taskNodeName != ''"> and task_node_name like concat('%', #{taskNodeName}, '%')</if>
+            <if test="taskNodeFormKey != null  and taskNodeFormKey != ''"> and task_node_form_key = #{taskNodeFormKey}</if>
+            <if test="taskNodeFormType != null  and taskNodeFormType != ''"> and task_node_form_type = #{taskNodeFormType}</if>
+            <if test="taskNodeType != null  and taskNodeType != ''"> and task_node_type = #{taskNodeType}</if>
+            <if test="taskNodeExecuteType != null  and taskNodeExecuteType != ''"> and task_node_execute_type = #{taskNodeExecuteType}</if>
+            <if test="taskNodeBefore != null  and taskNodeBefore != ''"> and task_node_before = #{taskNodeBefore}</if>
+            <if test="taskNodeAfter != null  and taskNodeAfter != ''"> and task_node_after = #{taskNodeAfter}</if>
+            <if test="taskNodeRolePermission != null  and taskNodeRolePermission != ''"> and task_node_role_permission = #{taskNodeRolePermission}</if>
+            <if test="taskRemark != null  and taskRemark != ''"> and task_remark = #{taskRemark}</if>
+            <if test="taskNodeNumber != null  and taskNodeNumber != ''"> and task_node_number = #{taskNodeNumber}</if>
+            <if test="taskNodeWeight != null  and taskNodeWeight != ''"> and task_node_weight = #{taskNodeWeight}</if>
+            <if test="taskNodeState != null  and taskNodeState != ''"> and task_node_state = #{taskNodeState}</if>
+            <if test="taskNodeOtherState != null  and taskNodeOtherState != ''"> and task_node_other_state = #{taskNodeOtherState}</if>
+            <if test="taskPriority != null  and taskPriority != ''"> and task_priority = #{taskPriority}</if>
+            <if test="task1 != null  and task1 != ''"> and task1 = #{task1}</if>
+            <if test="task2 != null  and task2 != ''"> and task2 = #{task2}</if>
+            <if test="task3 != null  and task3 != ''"> and task3 = #{task3}</if>
+            <if test="task4 != null  and task4 != ''"> and task4 = #{task4}</if>
+            <if test="task5 != null  and task5 != ''"> and task5 = #{task5}</if>
+            <if test="createById != null  and createById != ''"> and create_by_id = #{createById}</if>
+        </where>
+    </select>
+
+    <select id="selectBpmExecuteNodeLogById" parameterType="Long" resultMap="BpmExecuteNodeLogResult">
+        <include refid="selectBpmExecuteNodeLogVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertBpmExecuteNodeLog" parameterType="com.zkqy.execution.produce.dispersed.entity.BpmExecuteNodeLog" useGeneratedKeys="true" keyProperty="id">
+        insert into bpm_execute_node_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="taskParentNodeKey != null">task_parent_node_key,</if>
+            <if test="taskProcessKey != null">task_process_key,</if>
+            <if test="taskNodeKey != null">task_node_key,</if>
+            <if test="taskNodeName != null">task_node_name,</if>
+            <if test="taskNodeFormKey != null">task_node_form_key,</if>
+            <if test="taskNodeFormType != null">task_node_form_type,</if>
+            <if test="taskNodeType != null">task_node_type,</if>
+            <if test="taskNodeExecuteType != null">task_node_execute_type,</if>
+            <if test="taskNodeBefore != null">task_node_before,</if>
+            <if test="taskNodeAfter != null">task_node_after,</if>
+            <if test="taskNodeRolePermission != null">task_node_role_permission,</if>
+            <if test="taskRemark != null">task_remark,</if>
+            <if test="taskNodeNumber != null">task_node_number,</if>
+            <if test="taskNodeWeight != null">task_node_weight,</if>
+            <if test="taskNodeState != null">task_node_state,</if>
+            <if test="taskNodeOtherState != null">task_node_other_state,</if>
+            <if test="taskPriority != null">task_priority,</if>
+            <if test="task1 != null">task1,</if>
+            <if test="task2 != null">task2,</if>
+            <if test="task3 != null">task3,</if>
+            <if test="task4 != null">task4,</if>
+            <if test="task5 != null">task5,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createById != null">create_by_id,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="taskParentNodeKey != null">#{taskParentNodeKey},</if>
+            <if test="taskProcessKey != null">#{taskProcessKey},</if>
+            <if test="taskNodeKey != null">#{taskNodeKey},</if>
+            <if test="taskNodeName != null">#{taskNodeName},</if>
+            <if test="taskNodeFormKey != null">#{taskNodeFormKey},</if>
+            <if test="taskNodeFormType != null">#{taskNodeFormType},</if>
+            <if test="taskNodeType != null">#{taskNodeType},</if>
+            <if test="taskNodeExecuteType != null">#{taskNodeExecuteType},</if>
+            <if test="taskNodeBefore != null">#{taskNodeBefore},</if>
+            <if test="taskNodeAfter != null">#{taskNodeAfter},</if>
+            <if test="taskNodeRolePermission != null">#{taskNodeRolePermission},</if>
+            <if test="taskRemark != null">#{taskRemark},</if>
+            <if test="taskNodeNumber != null">#{taskNodeNumber},</if>
+            <if test="taskNodeWeight != null">#{taskNodeWeight},</if>
+            <if test="taskNodeState != null">#{taskNodeState},</if>
+            <if test="taskNodeOtherState != null">#{taskNodeOtherState},</if>
+            <if test="taskPriority != null">#{taskPriority},</if>
+            <if test="task1 != null">#{task1},</if>
+            <if test="task2 != null">#{task2},</if>
+            <if test="task3 != null">#{task3},</if>
+            <if test="task4 != null">#{task4},</if>
+            <if test="task5 != null">#{task5},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createById != null">#{createById},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateBpmExecuteNodeLog" parameterType="com.zkqy.execution.produce.dispersed.entity.BpmExecuteNodeLog">
+        update bpm_execute_node_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="taskParentNodeKey != null">task_parent_node_key = #{taskParentNodeKey},</if>
+            <if test="taskProcessKey != null">task_process_key = #{taskProcessKey},</if>
+            <if test="taskNodeKey != null">task_node_key = #{taskNodeKey},</if>
+            <if test="taskNodeName != null">task_node_name = #{taskNodeName},</if>
+            <if test="taskNodeFormKey != null">task_node_form_key = #{taskNodeFormKey},</if>
+            <if test="taskNodeFormType != null">task_node_form_type = #{taskNodeFormType},</if>
+            <if test="taskNodeType != null">task_node_type = #{taskNodeType},</if>
+            <if test="taskNodeExecuteType != null">task_node_execute_type = #{taskNodeExecuteType},</if>
+            <if test="taskNodeBefore != null">task_node_before = #{taskNodeBefore},</if>
+            <if test="taskNodeAfter != null">task_node_after = #{taskNodeAfter},</if>
+            <if test="taskNodeRolePermission != null">task_node_role_permission = #{taskNodeRolePermission},</if>
+            <if test="taskRemark != null">task_remark = #{taskRemark},</if>
+            <if test="taskNodeNumber != null">task_node_number = #{taskNodeNumber},</if>
+            <if test="taskNodeWeight != null">task_node_weight = #{taskNodeWeight},</if>
+            <if test="taskNodeState != null">task_node_state = #{taskNodeState},</if>
+            <if test="taskNodeOtherState != null">task_node_other_state = #{taskNodeOtherState},</if>
+            <if test="taskPriority != null">task_priority = #{taskPriority},</if>
+            <if test="task1 != null">task1 = #{task1},</if>
+            <if test="task2 != null">task2 = #{task2},</if>
+            <if test="task3 != null">task3 = #{task3},</if>
+            <if test="task4 != null">task4 = #{task4},</if>
+            <if test="task5 != null">task5 = #{task5},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createById != null">create_by_id = #{createById},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteBpmExecuteNodeLogById" parameterType="Long">
+        delete from bpm_execute_node_log where id = #{id}
+    </delete>
+
+    <delete id="deleteBpmExecuteNodeLogByIds" parameterType="String">
+        delete from bpm_execute_node_log where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 27 - 8
zkqy-process-execution/src/main/resources/mapper/bpm/dispersed/BpmExecuteNodeMapper.xml

@@ -212,14 +212,14 @@
     </insert>
 
     <update id="updateBpmExecuteNode" parameterType="com.zkqy.execution.produce.dispersed.entity.BpmExecuteNode">
-        update bpm_execute_node
+        update {DBNAME}.bpm_execute_node
         <trim prefix="SET" suffixOverrides=",">
             <if test="taskProcessKey != null">task_process_key = #{taskProcessKey},</if>
             <if test="taskNodeKey != null">task_node_key = #{taskNodeKey},</if>
             <if test="taskNodeName != null">task_node_name = #{taskNodeName},</if>
             <if test="taskNodeFormKey != null">task_node_form_key = #{taskNodeFormKey},</if>
             <if test="taskNodeFormType != null">task_node_form_type = #{taskNodeFormType},</if>
-            <if test="taskNodeType != null">task_node_type = #{taskNodeType},</if>
+            <if test="taskNodeType != null">task_node_type = #{taskNodeType },</if>
             <if test="taskNodeExecuteType != null">task_node_execute_type = #{taskNodeExecuteType},</if>
             <if test="taskNodeBefore != null">task_node_before = #{taskNodeBefore},</if>
             <if test="taskNodeAfter != null">task_node_after = #{taskNodeAfter},</if>
@@ -245,7 +245,7 @@
 
     <delete id="deleteBpmExecuteNodeById" parameterType="Long">
         delete
-        from bpm_execute_node
+        from {DBNAME}.bpm_execute_node
         where id = #{id}
     </delete>
 
@@ -257,7 +257,7 @@
     </delete>
 
     <update id="updateNodeState" parameterType="com.zkqy.execution.produce.dispersed.entity.BpmExecuteNode">
-        update bpm_execute_node
+        update {DBNAME}.bpm_execute_node
         <trim prefix="SET" suffixOverrides=",">
             <if test="taskProcessKey != null">task_process_key = #{taskProcessKey},</if>
             <if test="taskNodeKey != null">task_node_key = #{taskNodeKey},</if>
@@ -279,16 +279,35 @@
             <if test="task3 != null">task3 = #{task3},</if>
             <if test="task4 != null">task4 = #{task4},</if>
             <if test="task5 != null">task5 = #{task5},</if>
-            <if test="delFlag != null">del_flag = #{delFlag},</if>
-            <if test="createById != null">create_by_id = #{createById},</if>
-            <if test="createBy != null">create_by = #{createBy},</if>
-            <if test="createTime != null">create_time = #{createTime},</if>
         </trim>
         where task_process_key = #{taskProcessKey}
         <if test="taskNodeKey != null">AND task_node_key = #{taskNodeKey}</if>
         <if test="taskNodeType != null">AND task_node_type = #{taskNodeType}</if>
     </update>
 
+    <update id="updateNodeStateByKeys" parameterType="com.zkqy.execution.produce.dispersed.entity.BpmExecuteNode">
+        update {DBNAME}.bpm_execute_node
+        set task_node_state = 0
+        where task_process_key = #{processKey}
+        AND task_node_key IN
+        <foreach item="taskNodeKey" index="index" collection="nodeKeys" open="(" separator="," close=")">
+            #{taskNodeKey}
+        </foreach>
+    </update>
+
+    <delete id="deleteExceptionNodeByKeys" parameterType="com.zkqy.execution.produce.dispersed.entity.BpmExecuteNode">
+        UPDATE {DBNAME}.bpm_execute_node
+        SET task_node_state = CASE WHEN task_node_type = 'userTask' THEN 0 ELSE task_node_state END,
+        del_flag = CASE WHEN task_node_type = 'exceptionTask' THEN 2 ELSE del_flag END
+        WHERE task_process_key = #{processKey}
+        AND task_node_key IN
+        <foreach item="taskNodeKey" index="index" collection="nodeKeys" open="(" separator="," close=")">
+            #{taskNodeKey}
+        </foreach>
+    </delete>
+
+
+
 
     <select id="queryBpmExecuteNodeBytaskNodeKey" parameterType="String" resultMap="BpmExecuteNodeResult">
         <include refid="selectBpmExecuteNodeVo"/>

+ 1 - 1
zkqy-system/src/main/java/com/zkqy/system/service/impl/BpmProcessConfigurationServiceImpl.java

@@ -159,7 +159,7 @@ public class BpmProcessConfigurationServiceImpl implements IBpmProcessConfigurat
         List<String> list = nodeVo.getTableNameList();
         list = list.stream().filter(l -> !tableNameList.contains(l)).collect(Collectors.toList());
         String addField = ",task_key varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '任务编码'," +
-                "task_node_key varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '任务节点编码') ENGINE=InnoDB";
+                          "task_node_key varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '任务节点编码') ENGINE=InnoDB";
         // 新建流程节点所需数据表
         for (String tableName : list){
             try {