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

This commit is contained in:
jason 2025-02-21 22:41:49 +08:00
parent 009f1889a9
commit cbdc081cfe
5 changed files with 106 additions and 17 deletions

View File

@ -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, "删除流程表单数据");
/** /**
* 触发器执行动作类型 * 触发器执行动作类型

View File

@ -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;
} }
} }
} }

View File

@ -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);
} }

View File

@ -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);
}
} }

View File

@ -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);
}
}
}