From d6e837df53cf68190007fa4c53fee1b89e94674a Mon Sep 17 00:00:00 2001 From: yangqicheng Date: Sat, 14 Sep 2024 10:42:36 +0800 Subject: [PATCH] =?UTF-8?q?REQ-2924-=E4=BF=AE=E5=A4=8D=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=80=80=E5=9B=9E=E8=8A=82=E7=82=B9=E6=8A=A5=E9=94=99=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/BpmnProcessTaskServiceImpl.java | 83 ++++++++++--------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessTaskServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessTaskServiceImpl.java index 72ea20e13..a21ed2b76 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessTaskServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessTaskServiceImpl.java @@ -1,7 +1,9 @@ package cn.axzo.workflow.core.service.impl; +import cn.axzo.framework.domain.ServiceException; import cn.axzo.workflow.common.enums.BpmnCountersignTypeEnum; import cn.axzo.workflow.common.enums.BpmnFlowNodeType; +import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO; @@ -55,12 +57,10 @@ import cn.hutool.core.collection.CollUtil; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.tuple.Pair; import org.flowable.bpmn.model.BaseElement; import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.FlowElement; -import org.flowable.bpmn.model.SequenceFlow; -import org.flowable.bpmn.model.ServiceTask; -import org.flowable.bpmn.model.UserTask; import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.interceptor.CommandExecutor; @@ -69,7 +69,6 @@ import org.flowable.engine.ManagementService; import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; -import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; @@ -101,6 +100,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -365,45 +365,54 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService { //流程为空,已经结束,返回空 throw new WorkflowEngineException(PROCESS_INSTANCE_NOT_EXISTS); } - List hisList = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(processInstanceId) - .orderByHistoricActivityInstanceStartTime() - .asc() - .list(); - List activeActivityIds = runtimeService.getActiveActivityIds(processInstanceId); - if (CollectionUtils.isEmpty(activeActivityIds)) { - return Collections.emptyList(); + List tasks = this.getHistoricTaskListByProcessInstanceId(processInstanceId, null); + tasks.sort(Comparator.comparing(BpmnHistoricTaskInstanceVO::getCreateTime)); + LinkedList>> executedList = new LinkedList<>(); + for (BpmnHistoricTaskInstanceVO vo : tasks) { + Pair> last = org.springframework.util.CollectionUtils.isEmpty(executedList) ? null : executedList.getLast(); + if (last != null && last.getLeft().equals(vo.getTaskDefinitionKey())) { + last.getRight().add(vo); + continue; + } + ArrayList objects = new ArrayList<>(); + objects.add(vo); + executedList.addLast(Pair.of(vo.getTaskDefinitionKey(), objects)); } - List flowElements = bpmnProcessModelService.findFlowElements(task.getProcessDefinitionId()); - if (CollectionUtils.isEmpty(flowElements)) { - return Collections.emptyList(); - } - //考虑会签 - Map flowElementMap = flowElements.stream().collect(Collectors.toMap(BaseElement::getId, f -> f)); - List executePath = new ArrayList<>(); - for (HistoricActivityInstance his : hisList) { - FlowElement flowElement = flowElementMap.get(his.getActivityId()); - if (flowElement != null) { - FlowElement previousNode = CollectionUtils.isEmpty(executePath) ? null : executePath.get(executePath.size() - 1); - //上一级直接连接,不是同一个节点,表示跳转过去的, - if (previousNode != null && !his.getActivityId().equals(previousNode.getId()) && (previousNode instanceof UserTask || previousNode instanceof ServiceTask) && !(flowElement instanceof SequenceFlow)) { - int i = executePath.size() - 1; - for (; i >= 0; i--) { - if (executePath.get(i).getId().equals(flowElement.getId())) { - break; - } + List>> valuableList = new LinkedList<>(); + for (Pair> pair : executedList) { + List taskInstanceVOList = pair.getRight(); + Optional backTaskOpt = taskInstanceVOList + .stream() + .filter(t -> t.getResult() != null) + .filter(t -> t.getResult() == BpmnProcessInstanceResultEnum.BACKED) + .findFirst(); + if (backTaskOpt.isPresent()) { + String deleteReason = backTaskOpt.get().getDeleteReason(); + String changeParentActivityTo = deleteReason + .replace("Change parent activity to ", "") + .replace("Change activity to ", ""); + if (org.springframework.util.CollectionUtils.isEmpty(valuableList)) { + throw new ServiceException("状态异常,首个节点进行了退回操作"); + } + int j = valuableList.size() - 1; + for (; j >= 0; j--) { + Pair> vPair = valuableList.get(j); + if (vPair.getLeft().equals(changeParentActivityTo)) { + break; } - //去掉跳过的路径 - executePath = executePath.subList(0, i); - } - if (previousNode == null || !previousNode.getId().equals(his.getActivityId())) { - executePath.add(flowElement); } + valuableList = valuableList.subList(0, j); + } else { + valuableList.add(pair); } } + List flowElements = bpmnProcessModelService.findFlowElements(processInstance.getProcessDefinitionId()); + Map flowElementMap = flowElements.stream().collect(Collectors.toMap(BaseElement::getId, f -> f)); AtomicInteger index = new AtomicInteger(0); - List resultList = executePath.stream() - .filter(flowElement -> !activeActivityIds.contains(flowElement.getId())) //排除当前节点 + List resultList = valuableList + .stream() + .filter(pair -> !task.getTaskDefinitionKey().equals(pair.getLeft())) //排除当前节点 + .map(pair -> flowElementMap.get(pair.getLeft())) .filter(flowElement -> { BpmnFlowNodeType currentNodeType = BpmnMetaParserHelper.getNodeType(flowElement).orElse(NODE_EMPTY); return currentNodeType == NODE_TASK || currentNodeType == NODE_BUSINESS;