Commit cae80cae31a46d98478d4b3e38341582e90a1230
1 parent
4caae18d
refactor(bpm): 优化多实例行为初始化逻辑
- 将 collectionVariable 和 collectionElementVariable 的初始化移到构造函数中 - 避免在运行期修改 Behavior 实例状态 - 删除重复的变量设置代码 - 保留必要的注释说明字段用途 - 确保表达式和变量互斥关系正确处理
Showing
2 changed files
with
12 additions
and
20 deletions
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 | 34 | public BpmParallelMultiInstanceBehavior(Activity activity, |
| 35 | 35 | AbstractBpmnActivityBehavior innerActivityBehavior) { |
| 36 | 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 | 55 | protected int resolveNrOfInstances(DelegateExecution execution) { |
| 51 | 56 | // 情况一:UserTask 节点 |
| 52 | 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 | 59 | @SuppressWarnings("unchecked") |
| 62 | 60 | Set<Long> assigneeUserIds = (Set<Long>) execution.getVariable(super.collectionVariable, Set.class); |
| 63 | 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 | 30 | |
| 31 | 31 | public BpmSequentialMultiInstanceBehavior(Activity activity, AbstractBpmnActivityBehavior innerActivityBehavior) { |
| 32 | 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 | 46 | protected int resolveNrOfInstances(DelegateExecution execution) { |
| 42 | 47 | // 情况一:UserTask 节点 |
| 43 | 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 | 50 | // 不使用 execution.getVariable 原因:目前依次审批任务回退后 collectionVariable 变量没有清理, 如果重新进入该任务不会重新分配审批人 |
| 53 | 51 | @SuppressWarnings("unchecked") |
| 54 | 52 | Set<Long> assigneeUserIds = (Set<Long>) execution.getVariableLocal(super.collectionVariable, Set.class); |
| ... | ... | @@ -88,10 +86,6 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB |
| 88 | 86 | super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter); |
| 89 | 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 | 89 | super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter); |
| 96 | 90 | } |
| 97 | 91 | ... | ... |