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); }