Commit 4fbdd3dc5cc87005bdfe7451b30c4c72c7567235
1 parent
8ee1fef9
feat:【bpm 工作流】兼容 bpmn 场景下,使用 START_USER_NODE_ID 的预测
Showing
1 changed file
with
14 additions
and
6 deletions
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 | } |