Commit cae80cae31a46d98478d4b3e38341582e90a1230

Authored by sisw
1 parent 4caae18d

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

- 将 collectionVariable 和 collectionElementVariable 的初始化移到构造函数中
- 避免在运行期修改 Behavior 实例状态
- 删除重复的变量设置代码
- 保留必要的注释说明字段用途
- 确保表达式和变量互斥关系正确处理
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 @@ -34,6 +34,11 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav
34 public BpmParallelMultiInstanceBehavior(Activity activity, 34 public BpmParallelMultiInstanceBehavior(Activity activity,
35 AbstractBpmnActivityBehavior innerActivityBehavior) { 35 AbstractBpmnActivityBehavior innerActivityBehavior) {
36 super(activity, innerActivityBehavior); 36 super(activity, innerActivityBehavior);
  37 + // 在解析/构造阶段基于 activityId 初始化与 activity 绑定且不变的字段,避免在运行期修改 Behavior 实例状态
  38 + super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的
  39 + super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(activity.getId());
  40 + // 从 execution.getVariable() 读取当前所有任务处理的人的 key
  41 + super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(activity.getId());
37 } 42 }
38 43
39 /** 44 /**
@@ -50,14 +55,7 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav @@ -50,14 +55,7 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav
50 protected int resolveNrOfInstances(DelegateExecution execution) { 55 protected int resolveNrOfInstances(DelegateExecution execution) {
51 // 情况一:UserTask 节点 56 // 情况一:UserTask 节点
52 if (execution.getCurrentFlowElement() instanceof UserTask) { 57 if (execution.getCurrentFlowElement() instanceof UserTask) {
53 - // 第一步,设置 collectionVariable 和 CollectionVariable  
54 - // 从 execution.getVariable() 读取所有任务处理人的 key  
55 - super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的  
56 - super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId());  
57 - // 从 execution.getVariable() 读取当前所有任务处理的人的 key  
58 - super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());  
59 -  
60 - // 第二步,获取任务的所有处理人 58 + // 获取任务的所有处理人
61 @SuppressWarnings("unchecked") 59 @SuppressWarnings("unchecked")
62 Set<Long> assigneeUserIds = (Set<Long>) execution.getVariable(super.collectionVariable, Set.class); 60 Set<Long> assigneeUserIds = (Set<Long>) execution.getVariable(super.collectionVariable, Set.class);
63 if (assigneeUserIds == null) { 61 if (assigneeUserIds == null) {
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 @@ -30,6 +30,11 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
30 30
31 public BpmSequentialMultiInstanceBehavior(Activity activity, AbstractBpmnActivityBehavior innerActivityBehavior) { 31 public BpmSequentialMultiInstanceBehavior(Activity activity, AbstractBpmnActivityBehavior innerActivityBehavior) {
32 super(activity, innerActivityBehavior); 32 super(activity, innerActivityBehavior);
  33 + // 在解析/构造阶段基于 activityId 初始化与 activity 绑定且不变的字段,避免在运行期修改 Behavior 实例状态
  34 + super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的
  35 + super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(activity.getId());
  36 + // 从 execution.getVariable() 读取当前所有任务处理的人的 key
  37 + super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(activity.getId());
33 } 38 }
34 39
35 /** 40 /**
@@ -41,14 +46,7 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB @@ -41,14 +46,7 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
41 protected int resolveNrOfInstances(DelegateExecution execution) { 46 protected int resolveNrOfInstances(DelegateExecution execution) {
42 // 情况一:UserTask 节点 47 // 情况一:UserTask 节点
43 if (execution.getCurrentFlowElement() instanceof UserTask) { 48 if (execution.getCurrentFlowElement() instanceof UserTask) {
44 - // 第一步,设置 collectionVariable 和 CollectionVariable  
45 - // 从 execution.getVariable() 读取所有任务处理人的 key  
46 - super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的  
47 - super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId());  
48 - // 从 execution.getVariable() 读取当前所有任务处理的人的 key  
49 - super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());  
50 -  
51 - // 第二步,获取任务的所有处理人 49 + // 获取任务的所有处理人
52 // 不使用 execution.getVariable 原因:目前依次审批任务回退后 collectionVariable 变量没有清理, 如果重新进入该任务不会重新分配审批人 50 // 不使用 execution.getVariable 原因:目前依次审批任务回退后 collectionVariable 变量没有清理, 如果重新进入该任务不会重新分配审批人
53 @SuppressWarnings("unchecked") 51 @SuppressWarnings("unchecked")
54 Set<Long> assigneeUserIds = (Set<Long>) execution.getVariableLocal(super.collectionVariable, Set.class); 52 Set<Long> assigneeUserIds = (Set<Long>) execution.getVariableLocal(super.collectionVariable, Set.class);
@@ -88,10 +86,6 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB @@ -88,10 +86,6 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
88 super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter); 86 super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter);
89 return; 87 return;
90 } 88 }
91 - // 参见 https://gitee.com/zhijiantianya/yudao-cloud/issues/IC239F  
92 - super.collectionExpression = null;  
93 - super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId());  
94 - super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());  
95 super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter); 89 super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter);
96 } 90 }
97 91