From 67bed9d0521dd8e5b5c7cb4a3465cdb99870066b Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 7 Aug 2024 18:00:19 +0800 Subject: [PATCH] =?UTF-8?q?fix=20-=20=E6=96=B0=E5=A2=9E=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E4=BA=8B=E5=8A=A1=E7=9B=91=E5=90=AC=E5=AE=9E=E7=8E=B0=EF=BC=8C?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E5=A4=84=E7=90=86=E8=87=AA=E5=8A=A8=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=92=8C=E8=87=AA=E5=8A=A8=E9=A9=B3=E5=9B=9E=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/AutoPassTransactionListener.java | 58 +++++++++++++++++++ .../AutoRejectTransactionListener.java | 46 +++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AutoPassTransactionListener.java create mode 100644 workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AutoRejectTransactionListener.java diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AutoPassTransactionListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AutoPassTransactionListener.java new file mode 100644 index 000000000..bb43b8ac7 --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AutoPassTransactionListener.java @@ -0,0 +1,58 @@ +package cn.axzo.workflow.core.engine.tx.listener; + +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; +import cn.axzo.workflow.core.engine.cmd.CustomApproveTaskCmd; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.impl.cfg.TransactionListener; +import org.flowable.common.engine.impl.cfg.TransactionPropagation; +import org.flowable.common.engine.impl.interceptor.CommandConfig; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.common.engine.impl.interceptor.CommandExecutor; +import org.flowable.engine.impl.cmd.GetExecutionVariableCmd; +import org.flowable.task.service.delegate.DelegateTask; + +import java.util.Collections; + +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO; + +/** + * 自动过审的事务监听器 + *
+ * 在节点会签模式下,业务指定审批人、加签时,由于这两个动作的内部是先进行 addMultiTask ,对当前节点加了新的实例数, + * 而该动作默认会触发多种内外部实现的监听,其中一个监听是自动过审,此时,节点的完成条件 nrOfInstance == nrOfCompleteInstances 一定不满足, + * 所以无法跳出当前节点。当 addMultiTask 执行完后,便会再执行 deleteMultiTask,但该动作只是把 nrOfInstance == nrOfCompleteInstances + * 表达式中的两个变量值变成了可以为 true 的结果。但并不会再触发节点的 leave 动作。 + * + *
+ * 使用示例: + * Context.getTransactionContext().addTransactionListener(TransactionState.COMMITTED, new AutoPassTransactionListener(delegateTask, ["advice"])); + *+ * + * @author wangli + * @since 2024-08-07 10:24 + */ +@Slf4j +@AllArgsConstructor +public class AutoPassTransactionListener implements TransactionListener { + private final DelegateTask delegateTask; + private final String advice; + + @Override + public void execute(CommandContext commandContext) { + log.info("exec auto pass transaction listener start, processInstanceId: {}, taskId: {}", delegateTask.getProcessInstanceId(), delegateTask.getId()); + + // 必须开启新的事务 + CommandConfig commandConfig = new CommandConfig(false, TransactionPropagation.REQUIRES_NEW); + CommandExecutor commandExecutor = commandContext.getCommandExecutor(); + BpmnTaskDelegateAssigner assigner = BpmnTaskDelegateAssigner.toObjectCompatible(commandExecutor.execute(getVariableCmd())); + commandExecutor.execute(commandConfig, new CustomApproveTaskCmd(delegateTask.getId(), advice, "自动通过", + Collections.emptyList(), assigner, null)); + + log.info("exec auto pass transaction listener end"); + } + + private GetExecutionVariableCmd getVariableCmd() { + return new GetExecutionVariableCmd(delegateTask.getProcessInstanceId(), INTERNAL_TASK_RELATION_ASSIGNEE_INFO + delegateTask.getId(), false); + } +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AutoRejectTransactionListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AutoRejectTransactionListener.java new file mode 100644 index 000000000..ac05879be --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AutoRejectTransactionListener.java @@ -0,0 +1,46 @@ +package cn.axzo.workflow.core.engine.tx.listener; + +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; +import cn.axzo.workflow.core.engine.cmd.CustomRejectionTaskCmd; +import cn.axzo.workflow.core.service.ExtAxHiTaskInstService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.impl.cfg.TransactionListener; +import org.flowable.common.engine.impl.cfg.TransactionPropagation; +import org.flowable.common.engine.impl.interceptor.CommandConfig; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.task.service.delegate.DelegateTask; + +/** + * 自动拒绝的事务监听 + * + *
+ * 使用示例: + * Context.getTransactionContext().addTransactionListener(TransactionState.COMMITTED, new AutoRejectTransactionListener(delegateTask, extAxHiTaskInstService)); + *+ * + * @author wangli + * @since 2024-08-07 10:26 + */ +@Slf4j +@AllArgsConstructor +public class AutoRejectTransactionListener implements TransactionListener { + private final DelegateTask delegateTask; + private final ExtAxHiTaskInstService extAxHiTaskInstService; + + @Override + public void execute(CommandContext commandContext) { + log.info("exec auto reject transaction listener start, processInstanceId: {}, taskId: {}", + delegateTask.getProcessInstanceId(), delegateTask.getId()); + + // 必须开启新的事务 + CommandConfig commandConfig = new CommandConfig(false, TransactionPropagation.REQUIRES_NEW); + BpmnTaskAuditDTO taskAudit = new BpmnTaskAuditDTO(); + taskAudit.setTaskId(delegateTask.getId()); + taskAudit.setApprover(new BpmnTaskDelegateAssigner("系统", "system", delegateTask.getTenantId())); + commandContext.getCommandExecutor().execute(commandConfig, new CustomRejectionTaskCmd(taskAudit, extAxHiTaskInstService, "自动驳回")); + + log.info("exec auto reject transaction listener end"); + } +}