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,7 +67,6 @@ import java.util.*;
67 67
68 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 68 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
69 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; 69 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
70 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;  
71 import static cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNode; 70 import static cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNode;
72 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; 71 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
73 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID; 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,7 +414,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
415 endActivities.forEach(activity -> { 414 endActivities.forEach(activity -> {
416 // StartEvent:只处理 BPMN 的场景。因为,SIMPLE 情况下,已经有 START_USER_NODE 节点 415 // StartEvent:只处理 BPMN 的场景。因为,SIMPLE 情况下,已经有 START_USER_NODE 节点
417 if (ELEMENT_EVENT_START.equals(activity.getActivityType()) 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 ActivityNodeTask startTask = new ActivityNodeTask().setId(BpmnModelConstants.START_USER_NODE_ID) 420 ActivityNodeTask startTask = new ActivityNodeTask().setId(BpmnModelConstants.START_USER_NODE_ID)
420 .setAssignee(startUserId).setStatus(BpmTaskStatusEnum.APPROVE.getStatus()); 421 .setAssignee(startUserId).setStatus(BpmTaskStatusEnum.APPROVE.getStatus());
421 ActivityNode startNode = new ActivityNode().setId(startTask.getId()) 422 ActivityNode startNode = new ActivityNode().setId(startTask.getId())
@@ -555,7 +556,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -555,7 +556,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
555 // 情况一:BPMN 设计器 556 // 情况一:BPMN 设计器
556 if (Objects.equals(BpmModelTypeEnum.BPMN.getType(), processDefinitionInfo.getModelType())) { 557 if (Objects.equals(BpmModelTypeEnum.BPMN.getType(), processDefinitionInfo.getModelType())) {
557 List<FlowElement> flowElements = BpmnModelUtils.simulateProcess(bpmnModel, processVariables); 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 processDefinitionInfo, processVariables, flowElement, runActivityIds)); 561 processDefinitionInfo, processVariables, flowElement, runActivityIds));
560 } 562 }
561 // 情况二:SIMPLE 设计器 563 // 情况二:SIMPLE 设计器
@@ -563,7 +565,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -563,7 +565,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
563 BpmSimpleModelNodeVO simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(), 565 BpmSimpleModelNodeVO simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(),
564 BpmSimpleModelNodeVO.class); 566 BpmSimpleModelNodeVO.class);
565 List<BpmSimpleModelNodeVO> simpleNodes = SimpleModelUtils.simulateProcess(simpleModel, processVariables); 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 processDefinitionInfo, processVariables, simpleNode, runActivityIds)); 570 processDefinitionInfo, processVariables, simpleNode, runActivityIds));
568 } 571 }
569 throw new IllegalArgumentException("未知设计器类型:" + processDefinitionInfo.getModelType()); 572 throw new IllegalArgumentException("未知设计器类型:" + processDefinitionInfo.getModelType());
@@ -618,8 +621,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -618,8 +621,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
618 return null; 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 FlowElement node, Set<String> runActivityIds) { 627 FlowElement node, Set<String> runActivityIds) {
624 if (runActivityIds.contains(node.getId())) { 628 if (runActivityIds.contains(node.getId())) {
625 return null; 629 return null;
@@ -634,6 +638,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -634,6 +638,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
634 638
635 // 1. 开始节点 639 // 1. 开始节点
636 if (node instanceof StartEvent) { 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 return activityNode.setName(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getName()) 645 return activityNode.setName(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getName())
638 .setNodeType(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType()); 646 .setNodeType(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType());
639 } 647 }