Просмотр исходного кода

refactor(bpm): 优化并行和串行多实例行为实现

- 移除多余的集合变量设置逻辑,简化任务处理人获取流程
- 添加对集合表达式、集合变量和元素变量的解析器覆写屏蔽
- 修复串行多实例中使用 getVariableLocal 替代 getVariable 避免变量清理问题
- 统一代码注释和实现逻辑,提高代码可读性
sisw месяцев назад: 5
Родитель
Сommit
6816821e13

+ 19 - 8
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java

@@ -14,6 +14,7 @@ import org.flowable.bpmn.model.UserTask;
 import org.flowable.engine.delegate.DelegateExecution;
 import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
 import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
+import org.flowable.common.engine.api.delegate.Expression;
 
 import java.util.List;
 import java.util.Set;
@@ -56,14 +57,7 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav
     protected int resolveNrOfInstances(DelegateExecution execution) {
         // 情况一:UserTask 节点
         if (execution.getCurrentFlowElement() instanceof UserTask) {
-            // 第一步,设置 collectionVariable 和 CollectionVariable
-            // 从  execution.getVariable() 读取所有任务处理人的 key
-            super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的
-            super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId());
-            // 从 execution.getVariable() 读取当前所有任务处理的人的 key
-            super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
-
-            // 第二步,获取任务的所有处理人
+            // 获取任务的所有处理人
             @SuppressWarnings("unchecked")
             Set<Long> assigneeUserIds = (Set<Long>) execution.getVariable(super.collectionVariable, Set.class);
             if (assigneeUserIds == null) {
@@ -94,4 +88,21 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav
         return super.resolveNrOfInstances(execution);
     }
 
+    // ========== 屏蔽解析器覆写 ==========
+
+    @Override
+    public void setCollectionExpression(Expression collectionExpression) {
+        // 保持自定义变量名,忽略解析器写入的 collection 表达式
+    }
+
+    @Override
+    public void setCollectionVariable(String collectionVariable) {
+        // 保持自定义变量名,忽略解析器写入的 collection 变量名
+    }
+
+    @Override
+    public void setCollectionElementVariable(String collectionElementVariable) {
+        // 保持自定义变量名,忽略解析器写入的单元素变量名
+    }
+
 }

+ 1 - 8
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java

@@ -47,14 +47,7 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
     protected int resolveNrOfInstances(DelegateExecution execution) {
         // 情况一:UserTask 节点
         if (execution.getCurrentFlowElement() instanceof UserTask) {
-            // 第一步,设置 collectionVariable 和 CollectionVariable
-            // 从  execution.getVariable() 读取所有任务处理人的 key
-            super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的
-            super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId());
-            // 从 execution.getVariable() 读取当前所有任务处理的人的 key
-            super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
-
-            // 第二步,获取任务的所有处理人
+            // 获取任务的所有处理人
             // 不使用 execution.getVariable 原因:目前依次审批任务回退后 collectionVariable 变量没有清理, 如果重新进入该任务不会重新分配审批人
             @SuppressWarnings("unchecked")
             Set<Long> assigneeUserIds = (Set<Long>) execution.getVariableLocal(super.collectionVariable, Set.class);