From 4121bd72a24409b6b75a78de68a3414931585804 Mon Sep 17 00:00:00 2001 From: wsm <2746563060@qq.com> Date: Fri, 10 Jul 2026 10:00:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(bpm):=20=E4=BF=AE=E5=A4=8D=E5=B9=B6?= =?UTF-8?q?=E8=A1=8C=E5=AD=90=E6=B5=81=E7=A8=8BendEvent=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E8=A2=AB=E8=AF=AF=E5=88=A4=E4=B8=BA=E5=B7=B2?= =?UTF-8?q?=E7=BB=93=E6=9D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 改为通过 RuntimeService 查询流程实例是否活跃来判断结束状态 - 并行内嵌子流程各自的 endEvent 不再干扰主流程结束判断 Co-Authored-By: Claude Opus 4.7 --- .../bpm/controller/ActTaskController.java | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/controller/ActTaskController.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/controller/ActTaskController.java index 23e43f6..4d34245 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/controller/ActTaskController.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/controller/ActTaskController.java @@ -520,30 +520,30 @@ public class ActTaskController { Result> result = new Result<>(); Map map = new HashMap<>(); - // 1. 判断流程是否已结束 - boolean finished = false; - String endTime = null; - List startAndEndlist = activitiService.getActHiActinstStartAndEnd(procInstId); - if (startAndEndlist != null) { - for (ActHiActinstDTO m : startAndEndlist) { - if ("endEvent".equals(m.getActType())) { - finished = true; - endTime = m.getEndTime() != null - ? DateUtils.formatDate(m.getEndTime(), "YYYY-MM-dd HH:mm:ss") : null; - break; - } - } - } + // 通过运行时查询判断流程是否活跃,而非通过 ACT_HI_ACTINST 的 endEvent + // 原因:并行内嵌子流程(subProcess)各自有 endEvent,其中一个子流程结束时会写入 endEvent 记录, + // 通过 ACT_HI_ACTINST 查询会被误判为整个流程已结束 + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(procInstId).singleResult(); - map.put("finished", finished); - - if (finished) { - // 流程已结束:返回结束时间 - map.put("endTime", endTime); + if (processInstance == null) { + // 流程已结束 + map.put("finished", true); map.put("currentTasks", Collections.emptyList()); + + String endTime = null; + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(procInstId).singleResult(); + if (historicProcessInstance != null && historicProcessInstance.getEndTime() != null) { + endTime = DateUtils.formatDate(historicProcessInstance.getEndTime(), "YYYY-MM-dd HH:mm:ss"); + } + map.put("endTime", endTime); log.info("【流程-当前节点查询】流程已结束, procInstId: {}, endTime: {}", procInstId, endTime); } else { - // 流程未结束:查询所有活跃任务(支持会签/并行分支等多任务场景) + // 流程进行中:查询所有活跃任务(支持会签/并行分支/内嵌子流程等多任务场景) + map.put("finished", false); + map.put("endTime", null); + List activeTasks = taskService.createTaskQuery() .processInstanceId(procInstId).active().list(); @@ -581,7 +581,6 @@ public class ActTaskController { } map.put("currentTasks", taskList); - map.put("endTime", null); log.info("【流程-当前节点查询】查询成功, procInstId: {}, 活跃任务数: {}", procInstId, taskList.size()); }