From 120736e393d462797b56cbcab77765e05b2943b4 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Fri, 10 Oct 2025 10:48:54 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20[BPM=20=E5=B7=A5=E4=BD=9C=E6=B5=81]=20?= =?UTF-8?q?=E9=A9=B3=E5=9B=9E=E9=A2=84=E6=B5=8B=20review=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/service/task/BpmTaskServiceImpl.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 34fa696d1b..7be2d53d7b 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.*; import cn.hutool.extra.spring.SpringUtil; @@ -934,9 +933,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { // 3. 构建需要预测的任务流程变量 // TODO @jason:【驳回预测相关】是不是搞成一个变量,里面是 set 更简洁一点呀? - Set taskDefinitionKeyList = getNeedSimulateTaskDefinitionKeys(bpmnModel, currentTask, targetElement); - Map needSimulateVariables = convertMap(taskDefinitionKeyList, - taskId -> StrUtil.concat(false, PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_PREFIX, taskId), item -> Boolean.TRUE); + Set needSimulateTaskDefinitionKeys = getNeedSimulateTaskDefinitionKeys(bpmnModel, currentTask, targetElement); + Map needSimulateVariables = convertMap(needSimulateTaskDefinitionKeys, + key -> StrUtil.concat(false, PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_PREFIX, key), item -> Boolean.TRUE); + // 4. 执行驳回 // 使用 moveExecutionsToSingleActivityId 替换 moveActivityIdsToSingleActivityId 原因: @@ -956,22 +956,22 @@ public class BpmTaskServiceImpl implements BpmTaskService { // 1. 获取需要预测的任务的 definition key。因为当前任务还没完成,也需要预测 Set taskDefinitionKeys = CollUtil.newHashSet(currentTask.getTaskDefinitionKey()); - // 2.1 从已结束任务中找到要回退的目标任务,按时间倒序最近的一个目标任务 + // 2.1 获取已结束任务按时间倒序排序 List endTaskList = CollectionUtils.filterList( getTaskListByProcessInstanceId(currentTask.getProcessInstanceId(), Boolean.FALSE), item -> item.getEndTime() != null); - // 2.2 遍历已结束的任务,找到在 targetTask 之后生成的任务,且串行可达的任务 + // 2.2 从结束任务中找到最近一个的目标任务 HistoricTaskInstance targetTask = findFirst(endTaskList, item -> item.getTaskDefinitionKey().equals(targetElement.getId())); - // TODO @jason:【驳回预测相关】是不是 if targetTask 先判空? + if (targetTask == null) { + return taskDefinitionKeys; + } + // 2.3 遍历已结束的任务,找到在 targetTask 之后生成的任务,且串行可达的任务 endTaskList.forEach(item -> { FlowElement element = getFlowElementById(bpmnModel, item.getTaskDefinitionKey()); - // 如果已结束的任务在回退目标节点之后生成,且串行可达,则标记为需要预算节点 + // 如果已结束的任务在回退目标节点之后生成,且串行可达,则加到需要预测节点中 // TODO 串行可达的方法需要和判断可回退节点 validateTargetTaskCanReturn 分开吗? 并行网关可能会有问题。 - // TODO @jason:【驳回预测相关】这里是不是判断 element 哈? - if (targetTask != null - // TODO @jason:【驳回预测相关】这里直接 createTime 的 compare 更简单?因为不太会出现空哈。 - && DateUtil.compare(item.getCreateTime(), targetTask.getCreateTime()) > 0 + if (item.getCreateTime().compareTo(targetTask.getCreateTime()) > 0 && BpmnModelUtils.isSequentialReachable(element, targetElement, null)) { taskDefinitionKeys.add(item.getTaskDefinitionKey()); }