diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeMode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeMode.java index c219755f7..06b6a756a 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeMode.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeMode.java @@ -2,6 +2,7 @@ package cn.axzo.workflow.common.enums; public enum BpmnFlowNodeMode { + STARTNODE("STARTNODE", "发起节点"), GENERAL("GENERAL", "普通"), OR("OR", "或签"), AND("AND", "会签"); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java index 4b1a8398b..4e916c348 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java @@ -46,6 +46,7 @@ import org.flowable.bpmn.model.Pool; import org.flowable.bpmn.model.SequenceFlow; import org.flowable.bpmn.model.ServiceTask; import org.flowable.bpmn.model.SignalEventDefinition; +import org.flowable.bpmn.model.StartEvent; import org.flowable.bpmn.model.SubProcess; import org.flowable.bpmn.model.TextAnnotation; import org.flowable.bpmn.model.TimerEventDefinition; @@ -558,9 +559,10 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic throw new WorkflowEngineException(PROCESS_INSTANCE_ID_NOT_EXISTS, processInstanceId); } BpmnModel bpmnModel = repositoryService.getBpmnModel(instance.getProcessDefinitionId()); + List flowElements = bpmnModel.getMainProcess().getFlowElements().stream().filter(UserTask.class::isInstance).collect(Collectors.toList()); - List resultList = new ArrayList<>(flowElements.size()); + List resultList = new ArrayList<>(flowElements.size() + 1); flowElements.forEach(i -> { UserTask userTask = (UserTask) i; ProcessNodeDetailVO node = new ProcessNodeDetailVO().setId(userTask.getId()) @@ -574,15 +576,28 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic } resultList.add(node); }); + + // 处理发起节点 + List startNodes = + bpmnModel.getMainProcess().getFlowElements().stream().filter(StartEvent.class::isInstance).collect(Collectors.toList()); + startNodes.forEach(i -> { + StartEvent startEvent = (StartEvent) i; + ProcessNodeDetailVO node = new ProcessNodeDetailVO() + .setId(startEvent.getId()) + .setName(startEvent.getName()) + .setFormKey(startEvent.getFormKey()) + .setNodeMode(BpmnFlowNodeMode.STARTNODE); + resultList.add(0, node); + }); return resultList; } private List gatherCompletedFlows(Set completedActivityInstances, - Set currentActivityinstances, BpmnModel pojoModel) { + Set currentActivityInstances, BpmnModel pojoModel) { List completedFlows = new ArrayList<>(); List activities = new ArrayList<>(completedActivityInstances); - activities.addAll(currentActivityinstances); + activities.addAll(currentActivityInstances); // TODO: not a robust way of checking when parallel paths are active, should be revisited // Go over all activities and check if it's possible to match any outgoing paths against the activities