From 8108b9b82650b407c5eee2cb67983ff7c8be49c0 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 4 Aug 2025 12:52:07 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix=EF=BC=9A=E3=80=90bpm=20=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E3=80=91BpmSequentialMultiInstanceBehavior?= =?UTF-8?q?=20=E5=85=BC=E5=AE=B9=20CallActivity=E3=80=81SubProcess=20?= =?UTF-8?q?=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BpmParallelMultiInstanceBehavior.java | 49 ++++++++----------- .../BpmSequentialMultiInstanceBehavior.java | 11 +++-- 2 files changed, 28 insertions(+), 32 deletions(-) diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java index 87e6a605ff..57f4d393f3 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java @@ -7,35 +7,44 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCand import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; import lombok.Setter; -import org.flowable.bpmn.model.*; +import org.flowable.bpmn.model.Activity; +import org.flowable.bpmn.model.CallActivity; +import org.flowable.bpmn.model.FlowElement; +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.SequentialMultiInstanceBehavior; -import org.flowable.engine.impl.persistence.entity.ExecutionEntity; +import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; import java.util.List; import java.util.Set; /** - * 自定义的【串行】的【多个】流程任务的 assignee 负责人的分配 + * 自定义的【并行】的【多个】流程任务的 assignee 负责人的分配 + * 第一步,基于分配规则,计算出分配任务的【多个】候选人们。 + * 第二步,将【多个】任务候选人们,设置到 DelegateExecution 的 collectionVariable 变量中,以便 BpmUserTaskActivityBehavior 使用它 * - * 本质上,实现和 {@link BpmParallelMultiInstanceBehavior} 一样,只是继承的类不一样 - * - * @author 芋道源码 + * @author kemengkai + * @since 2022-04-21 16:57 */ @Setter -public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceBehavior { +public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehavior { private BpmTaskCandidateInvoker taskCandidateInvoker; - public BpmSequentialMultiInstanceBehavior(Activity activity, AbstractBpmnActivityBehavior innerActivityBehavior) { + public BpmParallelMultiInstanceBehavior(Activity activity, + AbstractBpmnActivityBehavior innerActivityBehavior) { super(activity, innerActivityBehavior); } /** - * 逻辑和 {@link BpmParallelMultiInstanceBehavior#resolveNrOfInstances(DelegateExecution)} 类似 + * 重写该方法,主要实现两个功能: + * 1. 忽略原有的 collectionVariable、collectionElementVariable 表达式,而是采用自己定义的 + * 2. 获得任务的处理人,并设置到 collectionVariable 中,用于 BpmUserTaskActivityBehavior 从中可以获取任务的处理人 * - * 差异的点:是在【第二步】的时候,需要返回 LinkedHashSet 集合!因为它需要有序! + * 注意,多个任务实例,每个任务实例对应一个处理人,所以返回的数量就是任务处理人的数量 + * + * @param execution 执行任务 + * @return 数量 */ @Override protected int resolveNrOfInstances(DelegateExecution execution) { @@ -49,9 +58,8 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId()); // 第二步,获取任务的所有处理人 - // 不使用 execution.getVariable 原因:目前依次审批任务回退后 collectionVariable 变量没有清理, 如果重新进入该任务不会重新分配审批人 @SuppressWarnings("unchecked") - Set assigneeUserIds = (Set) execution.getVariableLocal(super.collectionVariable, Set.class); + Set assigneeUserIds = (Set) execution.getVariable(super.collectionVariable, Set.class); if (assigneeUserIds == null) { assigneeUserIds = taskCandidateInvoker.calculateUsersByTask(execution); if (CollUtil.isEmpty(assigneeUserIds)) { @@ -80,19 +88,4 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB return super.resolveNrOfInstances(execution); } - @Override - protected void executeOriginalBehavior(DelegateExecution execution, ExecutionEntity multiInstanceRootExecution, int loopCounter) { - // 参见 https://t.zsxq.com/53Meo 情况 - if (execution.getCurrentFlowElement() instanceof CallActivity - || execution.getCurrentFlowElement() instanceof SubProcess) { - 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); - } - } diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java index 21b4f9ee8d..e48b1f95d5 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java @@ -7,10 +7,7 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCand import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; import lombok.Setter; -import org.flowable.bpmn.model.Activity; -import org.flowable.bpmn.model.CallActivity; -import org.flowable.bpmn.model.FlowElement; -import org.flowable.bpmn.model.UserTask; +import org.flowable.bpmn.model.*; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior; import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; @@ -85,6 +82,12 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB @Override protected void executeOriginalBehavior(DelegateExecution execution, ExecutionEntity multiInstanceRootExecution, int loopCounter) { + // 参见 https://t.zsxq.com/53Meo 情况 + if (execution.getCurrentFlowElement() instanceof CallActivity + || execution.getCurrentFlowElement() instanceof SubProcess) { + super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter); + return; + } // 参见 https://gitee.com/zhijiantianya/yudao-cloud/issues/IC239F super.collectionExpression = null; super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId()); From 9d26bf9224ad28d17fbed8533d319d45e1bd0261 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 4 Aug 2025 18:41:17 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix=EF=BC=9A=E3=80=90pay=20=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E3=80=91=E4=BF=AE=E5=A4=8D=20expireOrder=20logger=20?= =?UTF-8?q?=E6=96=87=E6=A1=88=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/pay/service/order/PayOrderServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java b/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java index 31532e5c65..b7f18abd65 100755 --- a/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java +++ b/yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java @@ -585,7 +585,7 @@ public class PayOrderServiceImpl implements PayOrderService { log.error("[expireOrder][order({}) 更新为支付关闭失败]", order.getId()); return false; } - log.info("[expireOrder][order({}) 更新为支付关闭失败]", order.getId()); + log.info("[expireOrder][order({}) 更新为支付关闭成功]", order.getId()); return true; } catch (Throwable e) { log.error("[expireOrder][order({}) 过期订单异常]", order.getId(), e); From 60e5f2b542bf4e4ae1135f7fd2f8c56d5b5bc3e9 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Sat, 9 Aug 2025 12:26:47 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E3=80=90infra=20=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E8=AE=BE=E6=96=BD=E3=80=91=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4=E5=90=8E?= =?UTF-8?q?=20checkedIds=20=E6=9C=AA=E9=87=8D=E7=BD=AE=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/codegen/vue3/views/components/list_sub_erp.vue.vm | 1 + .../src/main/resources/codegen/vue3/views/index.vue.vm | 1 + .../resources/codegen/vue3_vben5_antd/general/views/index.vue.vm | 1 + .../vue3_vben5_antd/general/views/modules/list_sub_erp.vue.vm | 1 + .../resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm | 1 + .../vue3_vben5_antd/schema/views/modules/list_sub_erp.vue.vm | 1 + .../resources/codegen/vue3_vben5_ele/general/views/index.vue.vm | 1 + .../vue3_vben5_ele/general/views/modules/list_sub_erp.vue.vm | 1 + .../resources/codegen/vue3_vben5_ele/schema/views/index.vue.vm | 1 + .../vue3_vben5_ele/schema/views/modules/list_sub_erp.vue.vm | 1 + 10 files changed, 10 insertions(+) diff --git a/yudao-module-infra/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm index f9fbb9787b..a94cab5a59 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm @@ -209,6 +209,7 @@ const handleDeleteBatch = async () => { // 删除的二次确认 await message.delConfirm() await ${simpleClassName}Api.delete${subSimpleClassName}List(checkedIds.value); + checkedIds.value = []; message.success(t('common.delSuccess')) await getList(); } catch {} diff --git a/yudao-module-infra/src/main/resources/codegen/vue3/views/index.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3/views/index.vue.vm index 851bc2b5e4..dfb97804ce 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3/views/index.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3/views/index.vue.vm @@ -366,6 +366,7 @@ const handleDeleteBatch = async () => { // 删除的二次确认 await message.delConfirm() await ${simpleClassName}Api.delete${simpleClassName}List(checkedIds.value); + checkedIds.value = []; message.success(t('common.delSuccess')) await getList(); } catch {} diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/index.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/index.vue.vm index bb743305f8..6553ed0c87 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/index.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/index.vue.vm @@ -168,6 +168,7 @@ async function handleDeleteBatch() { }); try { await delete${simpleClassName}List(checkedIds.value); + checkedIds.value = []; message.success( $t('ui.actionMessage.deleteSuccess') ); await getList(); } finally { diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/list_sub_erp.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/list_sub_erp.vue.vm index cfd85589c9..999257d91d 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/list_sub_erp.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/list_sub_erp.vue.vm @@ -92,6 +92,7 @@ async function handleDeleteBatch() { }); try { await delete${subSimpleClassName}List(checkedIds.value); + checkedIds.value = []; message.success( $t('ui.actionMessage.deleteSuccess') ); await getList(); } finally { diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm index 635e12ac24..1e13de2e97 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm @@ -102,6 +102,7 @@ async function handleDeleteBatch() { }); try { await delete${simpleClassName}List(checkedIds.value); + checkedIds.value = []; message.success({ content: $t('ui.actionMessage.deleteSuccess'), key: 'action_key_msg', diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_erp.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_erp.vue.vm index 4001ed3992..e046226efc 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_erp.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_erp.vue.vm @@ -82,6 +82,7 @@ async function handleDeleteBatch() { }); try { await delete${subSimpleClassName}List(checkedIds.value); + checkedIds.value = []; message.success({ content: $t('ui.actionMessage.deleteSuccess', [row.id]), key: 'action_key_msg', diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/general/views/index.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/general/views/index.vue.vm index 9897ba6773..ae77cd4c7b 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/general/views/index.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/general/views/index.vue.vm @@ -163,6 +163,7 @@ async function handleDeleteBatch() { }); try { await delete${simpleClassName}List(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); await getList(); } finally { diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/general/views/modules/list_sub_erp.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/general/views/modules/list_sub_erp.vue.vm index e27965e4c1..ccad79a0d9 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/general/views/modules/list_sub_erp.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/general/views/modules/list_sub_erp.vue.vm @@ -87,6 +87,7 @@ async function handleDeleteBatch() { }); try { await delete${subSimpleClassName}List(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); await getList(); } finally { diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/index.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/index.vue.vm index f9232d6b50..c29beb9aa9 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/index.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/index.vue.vm @@ -99,6 +99,7 @@ async function handleDeleteBatch() { }); try { await delete${simpleClassName}List(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } finally { diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/list_sub_erp.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/list_sub_erp.vue.vm index 5afb9c7a0d..13a2415efd 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/list_sub_erp.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/list_sub_erp.vue.vm @@ -79,6 +79,7 @@ async function handleDeleteBatch() { }); try { await delete${subSimpleClassName}List(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } finally { From ccfc5e18cc08158e88aac4b7bfe9f21a346be51a Mon Sep 17 00:00:00 2001 From: puhui999 Date: Sat, 9 Aug 2025 12:29:27 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20=E3=80=90infra=20=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E8=AE=BE=E6=96=BD=E3=80=91=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4=E5=90=8E?= =?UTF-8?q?=20checkedIds=20=E6=9C=AA=E9=87=8D=E7=BD=AE=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/codegen/vue/views/components/list_sub_erp.vue.vm | 1 + .../src/main/resources/codegen/vue/views/index.vue.vm | 1 + 2 files changed, 2 insertions(+) diff --git a/yudao-module-infra/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm index e1305586cc..3f290ccff8 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm @@ -170,6 +170,7 @@ await this.#[[$modal]]#.confirm('是否确认删除?') try { await ${simpleClassName}Api.delete${subSimpleClassName}List(this.checkedIds); + this.checkedIds = []; await this.getList(); this.#[[$modal]]#.msgSuccess("删除成功"); } catch {} diff --git a/yudao-module-infra/src/main/resources/codegen/vue/views/index.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue/views/index.vue.vm index 30014a8ff4..bbc913114a 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue/views/index.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue/views/index.vue.vm @@ -338,6 +338,7 @@ export default { await this.#[[$modal]]#.confirm('是否确认删除?') try { await ${simpleClassName}Api.delete${simpleClassName}List(this.checkedIds); + this.checkedIds = []; await this.getList(); this.#[[$modal]]#.msgSuccess("删除成功"); } catch {}