Commit cbdc081cfe348bae4728eab704b96eb30d21617d

Authored by jason
1 parent 009f1889

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

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; @@ -17,7 +17,8 @@ import java.util.Arrays;
17 public enum BpmTriggerTypeEnum implements ArrayValuable<Integer> { 17 public enum BpmTriggerTypeEnum implements ArrayValuable<Integer> {
18 18
19 HTTP_REQUEST(1, "发起 HTTP 请求"), 19 HTTP_REQUEST(1, "发起 HTTP 请求"),
20 - FORM_UPDATE(2, "更新流程表单"); 20 + FORM_UPDATE(2, "更新流程表单数据"),
  21 + FORM_DELETE(3, "删除流程表单数据");
21 22
22 /** 23 /**
23 * 触发器执行动作类型 24 * 触发器执行动作类型
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; @@ -14,6 +14,7 @@ import org.hibernate.validator.constraints.URL;
14 14
15 import java.util.List; 15 import java.util.List;
16 import java.util.Map; 16 import java.util.Map;
  17 +import java.util.Set;
17 18
18 @Schema(description = "管理后台 - 仿钉钉流程设计模型节点 VO") 19 @Schema(description = "管理后台 - 仿钉钉流程设计模型节点 VO")
19 @Data 20 @Data
@@ -393,8 +394,11 @@ public class BpmSimpleModelNodeVO { @@ -393,8 +394,11 @@ public class BpmSimpleModelNodeVO {
393 @Schema(description = "条件组", example = "{}") 394 @Schema(description = "条件组", example = "{}")
394 private ConditionGroups conditionGroups; 395 private ConditionGroups conditionGroups;
395 396
396 - @Schema(description = "修改的表单字段", example = "userName") 397 + @Schema(description = "修改的表单字段", example = "{}")
397 private Map<String, Object> updateFormFields; 398 private Map<String, Object> updateFormFields;
  399 +
  400 + @Schema(description = "删除表单字段", example = "[]")
  401 + private Set<String> deleteFields;
398 } 402 }
399 } 403 }
400 } 404 }
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; @@ -7,6 +7,7 @@ import jakarta.validation.Valid;
7 import org.flowable.engine.history.HistoricProcessInstance; 7 import org.flowable.engine.history.HistoricProcessInstance;
8 import org.flowable.engine.runtime.ProcessInstance; 8 import org.flowable.engine.runtime.ProcessInstance;
9 9
  10 +import java.util.Collection;
10 import java.util.List; 11 import java.util.List;
11 import java.util.Map; 12 import java.util.Map;
12 import java.util.Set; 13 import java.util.Set;
@@ -148,15 +149,6 @@ public interface BpmProcessInstanceService { @@ -148,15 +149,6 @@ public interface BpmProcessInstanceService {
148 */ 149 */
149 void updateProcessInstanceReject(ProcessInstance processInstance, String reason); 150 void updateProcessInstanceReject(ProcessInstance processInstance, String reason);
150 151
151 - // ========== Event 事件相关方法 ==========  
152 -  
153 - /**  
154 - * 处理 ProcessInstance 完成事件,例如说:审批通过、不通过、取消  
155 - *  
156 - * @param instance 流程任务  
157 - */  
158 - void processProcessInstanceCompleted(ProcessInstance instance);  
159 -  
160 /** 152 /**
161 * 更新 ProcessInstance 的变量 153 * 更新 ProcessInstance 的变量
162 * 154 *
@@ -165,4 +157,20 @@ public interface BpmProcessInstanceService { @@ -165,4 +157,20 @@ public interface BpmProcessInstanceService {
165 */ 157 */
166 void updateProcessInstanceVariables(String id, Map<String, Object> variables); 158 void updateProcessInstanceVariables(String id, Map<String, Object> variables);
167 159
  160 + /**
  161 + * 删除 ProcessInstance 的变量
  162 + *
  163 + * @param processInstanceId 流程编号
  164 + * @param variableNames 流程变量名
  165 + */
  166 + void removeProcessInstanceVariables(String processInstanceId, Collection<String> variableNames);
  167 +
  168 + // ========== Event 事件相关方法 ==========
  169 +
  170 + /**
  171 + * 处理 ProcessInstance 完成事件,例如说:审批通过、不通过、取消
  172 + *
  173 + * @param instance 流程任务
  174 + */
  175 + void processProcessInstanceCompleted(ProcessInstance instance);
168 } 176 }
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 @@ -776,6 +776,16 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
776 BpmReasonEnum.REJECT_TASK.format(reason)); 776 BpmReasonEnum.REJECT_TASK.format(reason));
777 } 777 }
778 778
  779 + @Override
  780 + public void updateProcessInstanceVariables(String id, Map<String, Object> variables) {
  781 + runtimeService.setVariables(id, variables);
  782 + }
  783 +
  784 + @Override
  785 + public void removeProcessInstanceVariables(String processInstanceId, Collection<String> variableNames) {
  786 + runtimeService.removeVariables(processInstanceId, variableNames);
  787 + }
  788 +
779 // ========== Event 事件相关方法 ========== 789 // ========== Event 事件相关方法 ==========
780 790
781 @Override 791 @Override
@@ -809,10 +819,4 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -809,10 +819,4 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
809 BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceStatusEvent(this, instance, status)); 819 BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceStatusEvent(this, instance, status));
810 }); 820 });
811 } 821 }
812 -  
813 - @Override  
814 - public void updateProcessInstanceVariables(String id, Map<String, Object> variables) {  
815 - runtimeService.setVariables(id, variables);  
816 - }  
817 -  
818 } 822 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmFormDeleteTrigger.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.service.task.trigger;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  5 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
  6 +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum;
  7 +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
  8 +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils;
  9 +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
  10 +import com.fasterxml.jackson.core.type.TypeReference;
  11 +import jakarta.annotation.Resource;
  12 +import lombok.extern.slf4j.Slf4j;
  13 +import org.springframework.stereotype.Component;
  14 +
  15 +import java.util.HashSet;
  16 +import java.util.List;
  17 +import java.util.Map;
  18 +import java.util.Set;
  19 +
  20 +/**
  21 + * BPM 删除流程表单数据触发器
  22 + *
  23 + * @author jason
  24 + */
  25 +@Component
  26 +@Slf4j
  27 +public class BpmFormDeleteTrigger implements BpmTrigger {
  28 +
  29 + @Resource
  30 + private BpmProcessInstanceService processInstanceService;
  31 +
  32 + @Override
  33 + public BpmTriggerTypeEnum getType() {
  34 + return BpmTriggerTypeEnum.FORM_DELETE;
  35 + }
  36 +
  37 + @Override
  38 + public void execute(String processInstanceId, String param) {
  39 + // 1. 解析删除流程表单数据配置
  40 + List<BpmSimpleModelNodeVO.TriggerSetting.FormTriggerSetting> settings = JsonUtils.parseObject(param, new TypeReference<>() {});
  41 + if (CollUtil.isEmpty(settings)) {
  42 + log.error("[execute][流程({}) 删除流程表单数据触发器配置为空]", processInstanceId);
  43 + return;
  44 + }
  45 +
  46 + // 2.获取流程变量
  47 + Map<String, Object> processVariables = processInstanceService.getProcessInstance(processInstanceId).getProcessVariables();
  48 +
  49 + // 3.获取需要删除的表单字段
  50 + Set<String> deleteFields = new HashSet<>();
  51 + settings.forEach(setting -> {
  52 + if (CollUtil.isEmpty(setting.getDeleteFields())) {
  53 + return;
  54 + }
  55 + // 配置了条件,判断条件是否满足
  56 + boolean isFieldDeletedNeeded = true;
  57 + if (setting.getConditionType() != null) {
  58 + String conditionExpression = SimpleModelUtils.buildConditionExpression(
  59 + setting.getConditionType(), setting.getConditionExpression(), setting.getConditionGroups());
  60 + isFieldDeletedNeeded = BpmnModelUtils.evalConditionExpress(processVariables, conditionExpression);
  61 + }
  62 + if (isFieldDeletedNeeded) {
  63 + deleteFields.addAll(setting.getDeleteFields());
  64 + }
  65 + });
  66 +
  67 + // 4. 删除流程变量
  68 + if (CollUtil.isNotEmpty(deleteFields)) {
  69 + processInstanceService.removeProcessInstanceVariables(processInstanceId, deleteFields);
  70 + }
  71 + }
  72 +}