Forráskód Böngészése

【功能优化】 删除表单数据触发器

jason 6 hónapja
szülő
commit
cbdc081cfe

+ 2 - 1
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java

@@ -17,7 +17,8 @@ import java.util.Arrays;
 public enum BpmTriggerTypeEnum implements ArrayValuable<Integer> {
 public enum BpmTriggerTypeEnum implements ArrayValuable<Integer> {
 
 
     HTTP_REQUEST(1, "发起 HTTP 请求"),
     HTTP_REQUEST(1, "发起 HTTP 请求"),
-    FORM_UPDATE(2, "更新流程表单");
+    FORM_UPDATE(2, "更新流程表单数据"),
+    FORM_DELETE(3, "删除流程表单数据");
 
 
     /**
     /**
      * 触发器执行动作类型
      * 触发器执行动作类型

+ 5 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java

@@ -14,6 +14,7 @@ import org.hibernate.validator.constraints.URL;
 
 
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.Set;
 
 
 @Schema(description = "管理后台 - 仿钉钉流程设计模型节点 VO")
 @Schema(description = "管理后台 - 仿钉钉流程设计模型节点 VO")
 @Data
 @Data
@@ -393,8 +394,11 @@ public class BpmSimpleModelNodeVO {
             @Schema(description = "条件组", example = "{}")
             @Schema(description = "条件组", example = "{}")
             private ConditionGroups conditionGroups;
             private ConditionGroups conditionGroups;
 
 
-            @Schema(description = "修改的表单字段", example = "userName")
+            @Schema(description = "修改的表单字段", example = "{}")
             private Map<String, Object> updateFormFields;
             private Map<String, Object> updateFormFields;
+
+            @Schema(description = "删除表单字段", example = "[]")
+            private Set<String> deleteFields;
         }
         }
     }
     }
 }
 }

+ 17 - 9
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java

@@ -7,6 +7,7 @@ import jakarta.validation.Valid;
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.engine.runtime.ProcessInstance;
 
 
+import java.util.Collection;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.Set;
 import java.util.Set;
@@ -148,15 +149,6 @@ public interface BpmProcessInstanceService {
      */
      */
     void updateProcessInstanceReject(ProcessInstance processInstance, String reason);
     void updateProcessInstanceReject(ProcessInstance processInstance, String reason);
 
 
-    // ========== Event 事件相关方法 ==========
-
-    /**
-     * 处理 ProcessInstance 完成事件,例如说:审批通过、不通过、取消
-     *
-     * @param instance 流程任务
-     */
-    void processProcessInstanceCompleted(ProcessInstance instance);
-
     /**
     /**
      * 更新 ProcessInstance 的变量
      * 更新 ProcessInstance 的变量
      *
      *
@@ -165,4 +157,20 @@ public interface BpmProcessInstanceService {
      */
      */
     void updateProcessInstanceVariables(String id, Map<String, Object> variables);
     void updateProcessInstanceVariables(String id, Map<String, Object> variables);
 
 
+    /**
+     * 删除 ProcessInstance 的变量
+     *
+     * @param processInstanceId  流程编号
+     * @param variableNames 流程变量名
+     */
+    void removeProcessInstanceVariables(String processInstanceId, Collection<String> variableNames);
+
+    // ========== Event 事件相关方法 ==========
+
+    /**
+     * 处理 ProcessInstance 完成事件,例如说:审批通过、不通过、取消
+     *
+     * @param instance 流程任务
+     */
+    void processProcessInstanceCompleted(ProcessInstance instance);
 }
 }

+ 10 - 6
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java

@@ -776,6 +776,16 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
                 BpmReasonEnum.REJECT_TASK.format(reason));
                 BpmReasonEnum.REJECT_TASK.format(reason));
     }
     }
 
 
+    @Override
+    public void updateProcessInstanceVariables(String id, Map<String, Object> variables) {
+        runtimeService.setVariables(id, variables);
+    }
+
+    @Override
+    public void removeProcessInstanceVariables(String processInstanceId, Collection<String> variableNames) {
+        runtimeService.removeVariables(processInstanceId, variableNames);
+    }
+
     // ========== Event 事件相关方法 ==========
     // ========== Event 事件相关方法 ==========
 
 
     @Override
     @Override
@@ -809,10 +819,4 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
                     BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceStatusEvent(this, instance, status));
                     BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceStatusEvent(this, instance, status));
         });
         });
     }
     }
-
-    @Override
-    public void updateProcessInstanceVariables(String id, Map<String, Object> variables) {
-        runtimeService.setVariables(id, variables);
-    }
-
 }
 }

+ 72 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmFormDeleteTrigger.java

@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.bpm.service.task.trigger;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
+import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum;
+import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
+import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils;
+import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
+import com.fasterxml.jackson.core.type.TypeReference;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * BPM 删除流程表单数据触发器
+ *
+ * @author jason
+ */
+@Component
+@Slf4j
+public class BpmFormDeleteTrigger implements BpmTrigger {
+
+    @Resource
+    private BpmProcessInstanceService processInstanceService;
+
+    @Override
+    public BpmTriggerTypeEnum getType() {
+        return BpmTriggerTypeEnum.FORM_DELETE;
+    }
+
+    @Override
+    public void execute(String processInstanceId, String param) {
+        // 1. 解析删除流程表单数据配置
+        List<BpmSimpleModelNodeVO.TriggerSetting.FormTriggerSetting> settings = JsonUtils.parseObject(param, new TypeReference<>() {});
+        if (CollUtil.isEmpty(settings)) {
+            log.error("[execute][流程({}) 删除流程表单数据触发器配置为空]", processInstanceId);
+            return;
+        }
+
+        // 2.获取流程变量
+        Map<String, Object> processVariables = processInstanceService.getProcessInstance(processInstanceId).getProcessVariables();
+
+        // 3.获取需要删除的表单字段
+        Set<String> deleteFields = new HashSet<>();
+        settings.forEach(setting -> {
+            if (CollUtil.isEmpty(setting.getDeleteFields())) {
+                return;
+            }
+            // 配置了条件,判断条件是否满足
+            boolean isFieldDeletedNeeded = true;
+            if (setting.getConditionType() != null) {
+                String conditionExpression = SimpleModelUtils.buildConditionExpression(
+                        setting.getConditionType(), setting.getConditionExpression(), setting.getConditionGroups());
+                isFieldDeletedNeeded = BpmnModelUtils.evalConditionExpress(processVariables, conditionExpression);
+            }
+            if (isFieldDeletedNeeded) {
+                deleteFields.addAll(setting.getDeleteFields());
+            }
+        });
+
+        // 4. 删除流程变量
+        if (CollUtil.isNotEmpty(deleteFields)) {
+            processInstanceService.removeProcessInstanceVariables(processInstanceId, deleteFields);
+        }
+    }
+}