Commit 4fbdd3dc5cc87005bdfe7451b30c4c72c7567235

Authored by YunaiV
1 parent 8ee1fef9

feat:【bpm 工作流】兼容 bpmn 场景下,使用 START_USER_NODE_ID 的预测

yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
... ... @@ -67,7 +67,6 @@ import java.util.*;
67 67  
68 68 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
69 69 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
70   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
71 70 import static cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNode;
72 71 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
73 72 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID;
... ... @@ -415,7 +414,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
415 414 endActivities.forEach(activity -> {
416 415 // StartEvent:只处理 BPMN 的场景。因为,SIMPLE 情况下,已经有 START_USER_NODE 节点
417 416 if (ELEMENT_EVENT_START.equals(activity.getActivityType())
418   - && BpmModelTypeEnum.BPMN.getType().equals(processDefinitionInfo.getModelType())) {
  417 + && BpmModelTypeEnum.BPMN.getType().equals(processDefinitionInfo.getModelType())
  418 + && !CollUtil.contains(activities, // 特殊:如果已经存在用户手动创建的 START_USER_NODE_ID 节点,则忽略 StartEvent
  419 + historicActivity -> historicActivity.getActivityId().equals(START_USER_NODE_ID))) {
419 420 ActivityNodeTask startTask = new ActivityNodeTask().setId(BpmnModelConstants.START_USER_NODE_ID)
420 421 .setAssignee(startUserId).setStatus(BpmTaskStatusEnum.APPROVE.getStatus());
421 422 ActivityNode startNode = new ActivityNode().setId(startTask.getId())
... ... @@ -555,7 +556,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
555 556 // 情况一:BPMN 设计器
556 557 if (Objects.equals(BpmModelTypeEnum.BPMN.getType(), processDefinitionInfo.getModelType())) {
557 558 List<FlowElement> flowElements = BpmnModelUtils.simulateProcess(bpmnModel, processVariables);
558   - return convertList(flowElements, flowElement -> buildNotRunApproveNodeForBpmn(startUserId, bpmnModel,
  559 + return convertList(flowElements, flowElement -> buildNotRunApproveNodeForBpmn(
  560 + startUserId, bpmnModel, flowElements,
559 561 processDefinitionInfo, processVariables, flowElement, runActivityIds));
560 562 }
561 563 // 情况二:SIMPLE 设计器
... ... @@ -563,7 +565,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
563 565 BpmSimpleModelNodeVO simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(),
564 566 BpmSimpleModelNodeVO.class);
565 567 List<BpmSimpleModelNodeVO> simpleNodes = SimpleModelUtils.simulateProcess(simpleModel, processVariables);
566   - return convertList(simpleNodes, simpleNode -> buildNotRunApproveNodeForSimple(startUserId, bpmnModel,
  568 + return convertList(simpleNodes, simpleNode -> buildNotRunApproveNodeForSimple(
  569 + startUserId, bpmnModel,
567 570 processDefinitionInfo, processVariables, simpleNode, runActivityIds));
568 571 }
569 572 throw new IllegalArgumentException("未知设计器类型:" + processDefinitionInfo.getModelType());
... ... @@ -618,8 +621,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
618 621 return null;
619 622 }
620 623  
621   - private ActivityNode buildNotRunApproveNodeForBpmn(Long startUserId, BpmnModel bpmnModel,
622   - BpmProcessDefinitionInfoDO processDefinitionInfo, Map<String, Object> processVariables,
  624 + private ActivityNode buildNotRunApproveNodeForBpmn(Long startUserId, BpmnModel bpmnModel, List<FlowElement> flowElements,
  625 + BpmProcessDefinitionInfoDO processDefinitionInfo,
  626 + Map<String, Object> processVariables,
623 627 FlowElement node, Set<String> runActivityIds) {
624 628 if (runActivityIds.contains(node.getId())) {
625 629 return null;
... ... @@ -634,6 +638,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
634 638  
635 639 // 1. 开始节点
636 640 if (node instanceof StartEvent) {
  641 + if (CollUtil.contains(flowElements, // 特殊:如果已经存在用户手动创建的 START_USER_NODE_ID 节点,则忽略 StartEvent
  642 + flowElement -> flowElement.getId().equals(START_USER_NODE_ID))) {
  643 + return null;
  644 + }
637 645 return activityNode.setName(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getName())
638 646 .setNodeType(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType());
639 647 }
... ...