Parcourir la source

refactor(bpm): 优化多实例行为初始化逻辑

- 将 collectionVariable 和 collectionElementVariable 的初始化移到构造函数中
- 避免在运行期修改 Behavior 实例状态
- 删除重复的变量设置代码
- 保留必要的注释说明字段用途
- 确保表达式和变量互斥关系正确处理
sisw il y a 5 mois
Parent
commit
cae80cae31

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

@@ -34,6 +34,11 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav
     public BpmParallelMultiInstanceBehavior(Activity activity,
                                             AbstractBpmnActivityBehavior innerActivityBehavior) {
         super(activity, innerActivityBehavior);
+        // 在解析/构造阶段基于 activityId 初始化与 activity 绑定且不变的字段,避免在运行期修改 Behavior 实例状态
+        super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的
+        super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(activity.getId());
+        // 从 execution.getVariable() 读取当前所有任务处理的人的 key
+        super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(activity.getId());
     }
 
     /**
@@ -50,14 +55,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) {

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

@@ -30,6 +30,11 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
 
     public BpmSequentialMultiInstanceBehavior(Activity activity, AbstractBpmnActivityBehavior innerActivityBehavior) {
         super(activity, innerActivityBehavior);
+        // 在解析/构造阶段基于 activityId 初始化与 activity 绑定且不变的字段,避免在运行期修改 Behavior 实例状态
+        super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的
+        super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(activity.getId());
+        // 从 execution.getVariable() 读取当前所有任务处理的人的 key
+        super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(activity.getId());
     }
 
     /**
@@ -41,14 +46,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);
@@ -88,10 +86,6 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
             super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter);
             return;
         }
-        // 参见 https://gitee.com/zhijiantianya/yudao-cloud/issues/IC239F
-        super.collectionExpression = null;
-        super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId());
-        super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
         super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter);
     }