Commit 847e51269b8934823963d7e5822353de3c634c4a

Authored by smallNorthLee
1 parent a23ce600

feat: 新增校验 流程模型创建时第一个用户任务的规则类型不能是审批人自选

yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
@@ -24,6 +24,7 @@ public interface ErrorCodeConstants { @@ -24,6 +24,7 @@ public interface ErrorCodeConstants {
24 ErrorCode MODEL_DEPLOY_FAIL_BPMN_START_EVENT_NOT_EXISTS = new ErrorCode(1_009_002_005, "部署流程失败,原因:BPMN 流程图中,没有开始事件"); 24 ErrorCode MODEL_DEPLOY_FAIL_BPMN_START_EVENT_NOT_EXISTS = new ErrorCode(1_009_002_005, "部署流程失败,原因:BPMN 流程图中,没有开始事件");
25 ErrorCode MODEL_DEPLOY_FAIL_BPMN_USER_TASK_NAME_NOT_EXISTS = new ErrorCode(1_009_002_006, "部署流程失败,原因:BPMN 流程图中,用户任务({})的名字不存在"); 25 ErrorCode MODEL_DEPLOY_FAIL_BPMN_USER_TASK_NAME_NOT_EXISTS = new ErrorCode(1_009_002_006, "部署流程失败,原因:BPMN 流程图中,用户任务({})的名字不存在");
26 ErrorCode MODEL_UPDATE_FAIL_NOT_MANAGER = new ErrorCode(1_009_002_007, "操作流程失败,原因:你不是该流程({})的管理员"); 26 ErrorCode MODEL_UPDATE_FAIL_NOT_MANAGER = new ErrorCode(1_009_002_007, "操作流程失败,原因:你不是该流程({})的管理员");
  27 + ErrorCode MODEL_DEPLOY_FAIL_BPMN_USER_TASK_RULE_TYPE_NOT_APPROVE_USER_SELECT = new ErrorCode(1_009_002_008, "部署流程失败,原因:BPMN 流程图中,用户任务({})的规则类型不能是【审批人自选】");
27 28
28 // ========== 流程定义 1-009-003-000 ========== 29 // ========== 流程定义 1-009-003-000 ==========
29 ErrorCode PROCESS_DEFINITION_KEY_NOT_MATCH = new ErrorCode(1_009_003_000, "流程定义的标识期望是({}),当前是({}),请修改 BPMN 流程图"); 30 ErrorCode PROCESS_DEFINITION_KEY_NOT_MATCH = new ErrorCode(1_009_003_000, "流程定义的标识期望是({}),当前是({}),请修改 BPMN 流程图");
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
@@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum;
16 import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum; 16 import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum;
17 import cn.iocoder.yudao.module.bpm.enums.task.BpmReasonEnum; 17 import cn.iocoder.yudao.module.bpm.enums.task.BpmReasonEnum;
18 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; 18 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
  19 +import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum;
19 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; 20 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
20 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; 21 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
21 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; 22 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils;
@@ -23,9 +24,7 @@ import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceCopyService; @@ -23,9 +24,7 @@ import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceCopyService;
23 import jakarta.annotation.Resource; 24 import jakarta.annotation.Resource;
24 import jakarta.validation.Valid; 25 import jakarta.validation.Valid;
25 import lombok.extern.slf4j.Slf4j; 26 import lombok.extern.slf4j.Slf4j;
26 -import org.flowable.bpmn.model.BpmnModel;  
27 -import org.flowable.bpmn.model.StartEvent;  
28 -import org.flowable.bpmn.model.UserTask; 27 +import org.flowable.bpmn.model.*;
29 import org.flowable.common.engine.impl.db.SuspensionState; 28 import org.flowable.common.engine.impl.db.SuspensionState;
30 import org.flowable.engine.HistoryService; 29 import org.flowable.engine.HistoryService;
31 import org.flowable.engine.RepositoryService; 30 import org.flowable.engine.RepositoryService;
@@ -48,6 +47,7 @@ import java.util.Objects; @@ -48,6 +47,7 @@ import java.util.Objects;
48 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 47 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
49 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; 48 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
50 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; 49 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
  50 +import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseCandidateStrategy;
51 51
52 /** 52 /**
53 * 流程模型实现:主要进行 Flowable {@link Model} 的维护 53 * 流程模型实现:主要进行 Flowable {@link Model} 的维护
@@ -243,7 +243,18 @@ public class BpmModelServiceImpl implements BpmModelService { @@ -243,7 +243,18 @@ public class BpmModelServiceImpl implements BpmModelService {
243 if (startEvent == null) { 243 if (startEvent == null) {
244 throw exception(MODEL_DEPLOY_FAIL_BPMN_START_EVENT_NOT_EXISTS); 244 throw exception(MODEL_DEPLOY_FAIL_BPMN_START_EVENT_NOT_EXISTS);
245 } 245 }
246 - // 2. 校验 UserTask 的 name 都配置了 246 + // 2. 校验第一个用户任务的规则类型是否为 审批人自选,如果是则抛出异常,第一个用户任务的规则类型不允许是审批人自选,因为会出现无审批人的情况
  247 + List<SequenceFlow> outgoingFlows = startEvent.getOutgoingFlows();
  248 + if (CollUtil.isNotEmpty(outgoingFlows)){
  249 + // 2.1 获取第一个用户节点
  250 + FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement();
  251 + // 2.2 获取审批人策略
  252 + Integer candidateStrategy = parseCandidateStrategy(targetFlowElement);
  253 + if (ObjUtil.equals(candidateStrategy, BpmTaskCandidateStrategyEnum.APPROVE_USER_SELECT.getStrategy())){
  254 + throw exception(MODEL_DEPLOY_FAIL_BPMN_USER_TASK_RULE_TYPE_NOT_APPROVE_USER_SELECT, targetFlowElement.getName());
  255 + }
  256 + }
  257 + // 3. 校验 UserTask 的 name 都配置了
247 List<UserTask> userTasks = BpmnModelUtils.getBpmnModelElements(bpmnModel, UserTask.class); 258 List<UserTask> userTasks = BpmnModelUtils.getBpmnModelElements(bpmnModel, UserTask.class);
248 userTasks.forEach(userTask -> { 259 userTasks.forEach(userTask -> {
249 if (StrUtil.isEmpty(userTask.getName())) { 260 if (StrUtil.isEmpty(userTask.getName())) {