From 0a13ba30f626791a504de3963d1d68cac21afcb7 Mon Sep 17 00:00:00 2001 From: lzh Date: Wed, 25 Feb 2026 18:00:37 +0800 Subject: [PATCH] =?UTF-8?q?fix(ops):=20=E4=BF=AE=E5=A4=8D=E6=B4=BE?= =?UTF-8?q?=E5=8F=91=E6=96=B0=E5=B7=A5=E5=8D=95=E6=97=B6=E5=B5=8C=E5=A5=97?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E6=97=A7=E5=B7=A5=E5=8D=95=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=20UnexpectedRollbackException=20=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用 REQUIRES_NEW 独立事务隔离 handleDispatched 中的旧工单取消操作, 避免内层事务异常标记外层事务 rollback-only。 Co-Authored-By: Claude Opus 4.6 --- .../listener/BadgeDeviceStatusEventListener.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/listener/BadgeDeviceStatusEventListener.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/listener/BadgeDeviceStatusEventListener.java index 103ea183..a9cc44c5 100644 --- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/listener/BadgeDeviceStatusEventListener.java +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/listener/BadgeDeviceStatusEventListener.java @@ -15,6 +15,9 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.support.TransactionTemplate; /** * 工牌设备状态事件监听器 @@ -84,6 +87,9 @@ public class BadgeDeviceStatusEventListener { @Resource private OrderLifecycleManager orderLifecycleManager; + @Resource + private PlatformTransactionManager transactionManager; + /** * 监听工单状态变更事件,同步更新设备工单关联 *

@@ -192,10 +198,15 @@ public class BadgeDeviceStatusEventListener { || oldStatus == WorkOrderStatusEnum.CONFIRMED || oldStatus == WorkOrderStatusEnum.ARRIVED) { // 旧工单仍在进行,先取消 + // 使用 REQUIRES_NEW 独立事务,避免内层异常标记外层事务 rollback-only log.warn("[BadgeDeviceStatusEventListener] 取消残留的旧工单: oldOrderId={}", oldOrderId); try { - orderLifecycleManager.cancelOrder(oldOrderId, deviceId, - OperatorTypeEnum.SYSTEM, "新工单派发,自动取消旧工单"); + TransactionTemplate txTemplate = new TransactionTemplate(transactionManager); + txTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); + txTemplate.executeWithoutResult(status -> { + orderLifecycleManager.cancelOrder(oldOrderId, deviceId, + OperatorTypeEnum.SYSTEM, "新工单派发,自动取消旧工单"); + }); } catch (Exception e) { log.error("[BadgeDeviceStatusEventListener] 取消旧工单失败: oldOrderId={}", oldOrderId, e); }