fix(ops): 修复派发新工单时嵌套取消旧工单导致 UnexpectedRollbackException 的问题

使用 REQUIRES_NEW 独立事务隔离 handleDispatched 中的旧工单取消操作,
避免内层事务异常标记外层事务 rollback-only。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
lzh
2026-02-25 18:00:37 +08:00
parent 7dd3c9a5c4
commit 0a13ba30f6

View File

@@ -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;
/**
* 监听工单状态变更事件,同步更新设备工单关联
* <p>
@@ -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);
}