From 5720cd93abd7e5a8ad3b95277149993c9ffa8b1a Mon Sep 17 00:00:00 2001 From: konbai <1527468660@qq.com> Date: Sat, 15 Oct 2022 19:53:46 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E6=B5=81=E7=A8=8B=E8=AF=A6=E6=83=85):=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BF=AE=E6=94=B9=E6=B5=81=E7=A8=8B=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=EF=BC=8C=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=AF=B9=E6=B5=81=E7=A8=8B=E5=AE=9A=E4=B9=89=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/workflow/domain/vo/WfDetailVo.java | 7 +++ .../service/impl/WfProcessServiceImpl.java | 51 +++++++++++++++++-- ruoyi-ui/src/views/workflow/work/detail.vue | 51 ++----------------- 3 files changed, 58 insertions(+), 51 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDetailVo.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDetailVo.java index 6c3ad9cc..aba15487 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDetailVo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDetailVo.java @@ -30,6 +30,13 @@ public class WfDetailVo { */ private List processFormList; + /** + * 流程XML + */ + private String bpmnXml; + + private WfViewerVo flowViewer; + /** * 是否存在任务表单信息 * @return true:存在;false:不存在 diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java index ddc69191..874f530a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java @@ -21,6 +21,7 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.flowable.common.constant.TaskConstants; import com.ruoyi.flowable.core.FormConf; import com.ruoyi.flowable.factory.FlowServiceFactory; +import com.ruoyi.flowable.flow.FlowableUtils; import com.ruoyi.flowable.utils.ModelUtils; import com.ruoyi.flowable.utils.ProcessFormUtils; import com.ruoyi.flowable.utils.TaskUtils; @@ -40,6 +41,7 @@ import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.StartEvent; import org.flowable.bpmn.model.UserTask; import org.flowable.engine.history.HistoricActivityInstance; +import org.flowable.engine.history.HistoricActivityInstanceQuery; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; import org.flowable.engine.repository.Deployment; @@ -57,10 +59,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -210,9 +209,12 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce if (taskIns == null) { throw new ServiceException("没有可办理的任务!"); } + InputStream inputStream = repositoryService.getProcessModel(taskIns.getProcessDefinitionId()); + detailVo.setBpmnXml(IoUtil.readUtf8(inputStream)); detailVo.setTaskFormData(currTaskFormData(deployId, taskIns)); detailVo.setHistoryProcNodeList(historyProcNodeList(procInsId)); detailVo.setProcessFormList(processFormList(procInsId, deployId, taskIns)); + detailVo.setFlowViewer(getFlowViewer(procInsId)); return detailVo; } @@ -628,4 +630,45 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce } return elementVoList; } + + /** + * 获取流程执行过程 + * + * @param procInsId + * @return + */ + private WfViewerVo getFlowViewer(String procInsId) { + // 构建查询条件 + HistoricActivityInstanceQuery query = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(procInsId); + List allActivityInstanceList = query.list(); + if (CollUtil.isEmpty(allActivityInstanceList)) { + return new WfViewerVo(); + } + // 获取流程发布Id信息 + String processDefinitionId = allActivityInstanceList.get(0).getProcessDefinitionId(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + // 查询所有已完成的元素 + 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 (BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW.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()); + // DFS 查询未通过的元素集合 + Set rejectedSet = FlowableUtils.dfsFindRejects(bpmnModel, unfinishedTaskSet, finishedSequenceFlowSet, finishedTaskSet); + return new WfViewerVo(finishedTaskSet, finishedSequenceFlowSet, unfinishedTaskSet, rejectedSet); + } } diff --git a/ruoyi-ui/src/views/workflow/work/detail.vue b/ruoyi-ui/src/views/workflow/work/detail.vue index b5bcd85e..b4b9a4c9 100644 --- a/ruoyi-ui/src/views/workflow/work/detail.vue +++ b/ruoyi-ui/src/views/workflow/work/detail.vue @@ -196,13 +196,11 @@