Commit 847e51269b8934823963d7e5822353de3c634c4a
1 parent
a23ce600
feat: 新增校验 流程模型创建时第一个用户任务的规则类型不能是审批人自选
Showing
2 changed files
with
16 additions
and
4 deletions
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())) { |