From d40cc7160939e2b3bc8f68c6ad9a739f6b93edb4 Mon Sep 17 00:00:00 2001 From: konbai <1527468660@qq.com> Date: Sat, 26 Mar 2022 00:26:33 +0800 Subject: [PATCH] =?UTF-8?q?fix=20--=20=E4=BF=AE=E5=A4=8D=E8=B7=9F=E8=B8=AA?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E6=9C=89=E6=97=B6=E6=97=A0=E6=B3=95=E7=9D=80?= =?UTF-8?q?=E8=89=B2=E9=97=AE=E9=A2=98=E3=80=82=E6=B7=BB=E5=8A=A0=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E8=89=B2=E5=BD=A9=E6=A0=87=E8=AE=B0"=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E8=B7=9F=E8=B8=AA"=E8=8A=82=E7=82=B9=E7=8A=B6?= =?UTF-8?q?=E6=80=81=EF=BC=88=E8=AF=95=E9=AA=8C=E9=98=B6=E6=AE=B5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/workflow/domain/vo/WfViewerVo.java | 16 ++- .../service/impl/WfTaskServiceImpl.java | 93 +++++++++++++--- .../src/components/ProcessViewer/index.vue | 54 ++++++---- ruoyi-ui/src/plugins/package/theme/index.scss | 101 ++++++++++++++++-- .../src/views/workflow/task/record/index.vue | 69 ++++++------ 5 files changed, 252 insertions(+), 81 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfViewerVo.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfViewerVo.java index 50364f65..5676d8e6 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfViewerVo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfViewerVo.java @@ -6,7 +6,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; +import java.util.Set; /** * 任务追踪视图对象 @@ -24,10 +24,20 @@ public class WfViewerVo { /** * 获取流程实例的历史节点(去重) */ - private List finishedTaskList; + private Set finishedTaskSet; + + /** + * 已完成 + */ + private Set finishedSequenceFlowSet; /** * 获取流程实例当前正在待办的节点(去重) */ - private List unfinishedTaskList; + private Set unfinishedTaskSet; + + /** + * 已拒绝 + */ + private Set rejectedTaskSet; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java index c53354db..bce733c9 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java @@ -1,6 +1,8 @@ package com.ruoyi.workflow.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; @@ -20,14 +22,14 @@ import com.ruoyi.flowable.flow.FindNextNodeUtil; import com.ruoyi.flowable.flow.FlowableUtils; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; +import com.ruoyi.workflow.domain.bo.WfTaskBo; import com.ruoyi.workflow.domain.dto.WfCommentDto; import com.ruoyi.workflow.domain.dto.WfNextDto; -import com.ruoyi.workflow.domain.vo.WfTaskVo; -import com.ruoyi.workflow.domain.bo.WfTaskBo; -import com.ruoyi.workflow.domain.vo.WfViewerVo; import com.ruoyi.workflow.domain.vo.WfFormVo; -import com.ruoyi.workflow.service.IWfTaskService; +import com.ruoyi.workflow.domain.vo.WfTaskVo; +import com.ruoyi.workflow.domain.vo.WfViewerVo; import com.ruoyi.workflow.service.IWfDeployFormService; +import com.ruoyi.workflow.service.IWfTaskService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -816,16 +818,79 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ // 构建查询条件 HistoricActivityInstanceQuery query = historyService.createHistoricActivityInstanceQuery() .processInstanceId(procInsId); - // 获取流程实例已完成的节点 - List finishedTaskList = query.finished().list() - .stream().distinct().map(HistoricActivityInstance::getActivityId) - .collect(Collectors.toList()); - // 获取流程实例正在待办的节点 - List unfinishedTaskList = query.unfinished().list() - .stream().distinct().map(HistoricActivityInstance::getActivityId) - .collect(Collectors.toList()); - // 构建视图类 - return new WfViewerVo(finishedTaskList, unfinishedTaskList); + List allActivityInstanceList = query.list(); + if (CollUtil.isEmpty(allActivityInstanceList)) { + return new WfViewerVo(); + } + // 获取流程发布Id信息 + String processDefinitionId = allActivityInstanceList.get(0).getProcessDefinitionId(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + if (ObjectUtil.isNull(bpmnModel)) { + throw new ServiceException("流程模型不存在"); + } + Map> sequenceElementMap = new HashMap<>(); + Map sequenceFlowMap = new HashMap<>(); + Collection flowElements = bpmnModel.getMainProcess().getFlowElements(); + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof SequenceFlow) { + SequenceFlow sequenceFlow = (SequenceFlow) flowElement; + String sourceRef = sequenceFlow.getSourceRef(); + String targetRef = sequenceFlow.getTargetRef(); + List targetRefList = sequenceElementMap.get(sourceRef); + if (CollUtil.isEmpty(targetRefList)) { + sequenceElementMap.put(sourceRef, ListUtil.toList(targetRef)); + } else { + targetRefList.add(targetRef); + } + sequenceFlowMap.put(sourceRef + targetRef, sequenceFlow.getId()); + } + } + // 查询所有已完成的元素 + List finishedElementList = allActivityInstanceList.stream() + .filter(item -> ObjectUtil.isNotNull(item.getEndTime())).collect(Collectors.toList()); + // 所有已完成的连线 + Set finishedSequenceFlowSet = new HashSet<>(); + // 所有已完成的任务节点 + Set finishedTaskSet = new HashSet<>(); + finishedElementList.forEach(item -> { + if ("sequenceFlow".equals(item.getActivityType())) { + finishedSequenceFlowSet.add(item.getActivityId()); + } else { + finishedTaskSet.add(item.getActivityId()); + } + }); + // 查询所有未结束的节点 + Set unfinishedTaskSet = allActivityInstanceList.stream() + .filter(item -> ObjectUtil.isNull(item.getEndTime())) + .map(HistoricActivityInstance::getActivityId) + .collect(Collectors.toSet()); + + Set rejectedTaskSet = new LinkedHashSet<>(); + Set sourceTaskSet = unfinishedTaskSet; + while (true) { + Set nextIdSet = new HashSet<>(); + for (String previousId : sourceTaskSet) { + List nextIdList = sequenceElementMap.get(previousId); + if (CollUtil.isEmpty(nextIdList)) { + continue; + } + for (String childId : nextIdList) { + String rejectedSequenceFlow = sequenceFlowMap.get(previousId + childId); + if (finishedTaskSet.contains(childId)) { + nextIdSet.add(childId); + if (finishedSequenceFlowSet.contains(rejectedSequenceFlow)) { + nextIdSet.add(sequenceFlowMap.get(previousId + childId)); + } + } + } + } + if (CollUtil.isEmpty(nextIdSet)) { + break; + } + rejectedTaskSet.addAll(nextIdSet); + sourceTaskSet = nextIdSet; + } + return new WfViewerVo(finishedTaskSet, finishedSequenceFlowSet, unfinishedTaskSet, rejectedTaskSet); } /** diff --git a/ruoyi-ui/src/components/ProcessViewer/index.vue b/ruoyi-ui/src/components/ProcessViewer/index.vue index 89df2d9b..8fdd0a16 100644 --- a/ruoyi-ui/src/components/ProcessViewer/index.vue +++ b/ruoyi-ui/src/components/ProcessViewer/index.vue @@ -1,8 +1,8 @@