From 82fc6c69686f819df17cda1c30248d89a7ca09d1 Mon Sep 17 00:00:00 2001 From: gulongcheng <474084054@qq.com> Date: Thu, 11 Dec 2025 20:56:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=8A=B6=E6=80=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/dto/ProcessInstanceInfo.java | 2 +- .../handler/ExportWordScriptHandler.java | 1 + .../com/sdm/flowable/enums/NodeStateEnum.java | 41 ++++++++++++ .../enums/ProcessInstanceStateEnum.java | 41 ++++++++++++ .../sdm/flowable/process/ProcessService.java | 66 +++++++++++-------- 5 files changed, 121 insertions(+), 30 deletions(-) create mode 100644 flowable/src/main/java/com/sdm/flowable/enums/NodeStateEnum.java create mode 100644 flowable/src/main/java/com/sdm/flowable/enums/ProcessInstanceStateEnum.java diff --git a/common/src/main/java/com/sdm/common/entity/flowable/dto/ProcessInstanceInfo.java b/common/src/main/java/com/sdm/common/entity/flowable/dto/ProcessInstanceInfo.java index 73f73079..70621e7a 100644 --- a/common/src/main/java/com/sdm/common/entity/flowable/dto/ProcessInstanceInfo.java +++ b/common/src/main/java/com/sdm/common/entity/flowable/dto/ProcessInstanceInfo.java @@ -16,4 +16,4 @@ public class ProcessInstanceInfo { private Long durationInMillis; private String durationFormatted; private String status; // "pending""running" 或 "completed" -} +} \ No newline at end of file diff --git a/flowable/src/main/java/com/sdm/flowable/delegate/handler/ExportWordScriptHandler.java b/flowable/src/main/java/com/sdm/flowable/delegate/handler/ExportWordScriptHandler.java index 39ab92ff..f4d70837 100644 --- a/flowable/src/main/java/com/sdm/flowable/delegate/handler/ExportWordScriptHandler.java +++ b/flowable/src/main/java/com/sdm/flowable/delegate/handler/ExportWordScriptHandler.java @@ -184,6 +184,7 @@ public class ExportWordScriptHandler implements ExecutionHandler deadJobs = managementService.createDeadLetterJobQuery() .processInstanceId(processInstanceId).list(); - if (!deadJobs.isEmpty()) { - hasDeadLetterJobs = true; + // B. 查普通作业 (补全 Active 来源,防止重试瞬间查不到状态) + List activeJobs = managementService.createJobQuery() + .processInstanceId(processInstanceId).list(); - // 【优化】:只有存在死信时,才去查 Execution 映射 ActivityId - // 这样重试中的流程(无死信)可以少查一次数据库 + // C. 只有当有 作业(死信或普通) 时,才去查 Execution 映射 + if (!deadJobs.isEmpty() || !activeJobs.isEmpty()) { List executions = runtimeService.createExecutionQuery() .processInstanceId(processInstanceId).list(); Map executionToActivityMap = executions.stream() .filter(e -> e.getActivityId() != null) .collect(Collectors.toMap(Execution::getId, Execution::getActivityId, (v1, v2) -> v1)); - for (Job job : deadJobs) { - if (job.getExceptionMessage() != null) { - String activityId = executionToActivityMap.get(job.getExecutionId()); - if (activityId != null) { - errorMap.put(activityId, job.getExceptionMessage()); + // 处理死信 -> 放入 errorMap + if (!deadJobs.isEmpty()) { + hasDeadLetterJobs = true; + for (Job job : deadJobs) { + if (job.getExceptionMessage() != null) { + String actId = executionToActivityMap.get(job.getExecutionId()); + if (actId != null) errorMap.put(actId, job.getExceptionMessage()); } } } + + // 【重点改动】处理普通作业 -> 强制加入 activeActivityIds + // 只要 Job 表里有,它就是 Active 的,不管 Execution 查出来是不是 + for (Job job : activeJobs) { + String actId = executionToActivityMap.get(job.getExecutionId()); + if (actId != null && !activeActivityIds.contains(actId)) { + activeActivityIds.add(actId); + } + } } - // 【已移除】:原有的 createJobQuery (activeJobs) 查询逻辑。 - // 解释:重试中的任务虽然带有异常信息,但在业务逻辑上视为“正在执行(Active)”,不视为“错误(Error)”。 } // --- 5. 构建流程实例级状态 (ProcessInfo) --- @@ -341,19 +349,19 @@ public class ProcessService implements Iprocess{ String displayStatus; if (isError) { - displayStatus = "error"; // 彻底挂死:红色 + displayStatus = NodeStateEnum.ERROR.getCode(); // 彻底挂死:红色 } else if (isActive) { // 如果是重试任务:isError=false, isActive=true -> 进入这里 -> 显示为 Active (蓝色) // 同时兼容挂起状态显示 if (isProcessSuspended) { - displayStatus = "suspended"; + displayStatus = NodeStateEnum.SUSPENDED.getCode(); } else { - displayStatus = "active"; + displayStatus = NodeStateEnum.ACTIVE.getCode(); } } else if (isFinished) { - displayStatus = "finished"; + displayStatus = NodeStateEnum.FINISHED.getCode(); } else { - displayStatus = "pending"; + displayStatus = NodeStateEnum.PENDING.getCode(); } Date startTime = myHist != null ? myHist.getStartTime() : null; @@ -372,20 +380,20 @@ public class ProcessService implements Iprocess{ if (waitIsActive) { // 等待回调中,同样受挂起状态影响 - displayStatus = isProcessSuspended ? "suspended" : "active"; + displayStatus = isProcessSuspended ? NodeStateEnum.SUSPENDED.getCode() : NodeStateEnum.ACTIVE.getCode(); endTime = null; if (startTime != null) { duration = System.currentTimeMillis() - startTime.getTime(); } } else if (waitIsFinished) { - displayStatus = "finished"; + displayStatus = NodeStateEnum.FINISHED.getCode(); endTime = waitHist.getEndTime(); if (startTime != null && endTime != null) { duration = endTime.getTime() - startTime.getTime(); } } else if (isFinished && !waitIsFinished && !waitIsActive) { // 刚发完 ServiceTask,还没生成 ReceiveTask 的中间态 - displayStatus = isProcessSuspended ? "suspended" : "active"; + displayStatus = isProcessSuspended ? NodeStateEnum.SUSPENDED.getCode() : NodeStateEnum.ACTIVE.getCode(); endTime = null; } } @@ -440,11 +448,11 @@ public class ProcessService implements Iprocess{ if (isRunning) { // --- 运行中 --- if (hasError) { - status = "error"; // 有死信作业,视为异常 + status = ProcessInstanceStateEnum.ERROR.getCode(); // 有死信作业,视为异常 } else if (isSuspended) { - status = "suspended"; // 被挂起 + status = ProcessInstanceStateEnum.SUSPENDED.getCode(); // 被挂起 } else { - status = "running"; // 正常运行 + status = ProcessInstanceStateEnum.RUNNING.getCode(); // 正常运行 } } else { // --- 已结束 (运行时查不到,历史表里有) --- @@ -452,11 +460,11 @@ public class ProcessService implements Iprocess{ if (deleteReason == null) { // 1. 正常走完结束节点,deleteReason 为空 - status = "completed"; + status = ProcessInstanceStateEnum.COMPLETED.getCode(); } else { // 2. 有删除原因,说明是被取消或强制终止的 // 你可以根据 reason 的内容做更细的区分,或者统称为 cancelled - status = "cancelled"; + status = ProcessInstanceStateEnum.CANCELLED.getCode(); } } info.setStatus(status);