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 17 public enum BpmTriggerTypeEnum implements ArrayValuable<Integer> {
18 18  
19 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 14  
15 15 import java.util.List;
16 16 import java.util.Map;
  17 +import java.util.Set;
17 18  
18 19 @Schema(description = "管理后台 - 仿钉钉流程设计模型节点 VO")
19 20 @Data
... ... @@ -393,8 +394,11 @@ public class BpmSimpleModelNodeVO {
393 394 @Schema(description = "条件组", example = "{}")
394 395 private ConditionGroups conditionGroups;
395 396  
396   - @Schema(description = "修改的表单字段", example = "userName")
  397 + @Schema(description = "修改的表单字段", example = "{}")
397 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 7 import org.flowable.engine.history.HistoricProcessInstance;
8 8 import org.flowable.engine.runtime.ProcessInstance;
9 9  
  10 +import java.util.Collection;
10 11 import java.util.List;
11 12 import java.util.Map;
12 13 import java.util.Set;
... ... @@ -148,15 +149,6 @@ public interface BpmProcessInstanceService {
148 149 */
149 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 153 * 更新 ProcessInstance 的变量
162 154 *
... ... @@ -165,4 +157,20 @@ public interface BpmProcessInstanceService {
165 157 */
166 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 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 789 // ========== Event 事件相关方法 ==========
780 790  
781 791 @Override
... ... @@ -809,10 +819,4 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
809 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 +}
... ...