fix(ops): 手动派单提前写执行人字段,修复按键报"没有工单"
问题:管理员手动派单后,工牌按键查询持续返回"没有工单",TTS 循环播报"工单
来啦"但用户无法响应(线上日志可见 deviceId=58 一段时间内连续 8 次按键查询
全部命中 CleanOrderAuditEventHandler.handleQueryEvent 的"没有工单"分支)。
根因:ManualOrderActionFacade.dispatch() 原顺序是
1. transition() —— 事务内同步发布 OrderStateChangedEvent,
BadgeDeviceStatusEventListener.onOrderStateChanged 重新 selectById 拿
assigneeId 决定是否写 Redis 工单关联;
2. update assigneeId / assigneeName。
第 1 步事件触发时 assigneeId 仍是 null,listener 走"工单未关联设备,跳过
处理"分支,Redis ops:badge:status:{deviceId} 的 currentOpsOrderId 永远不
会写入;同时主表 assigneeDeviceId 也始终为 null,
CleanOrderAuditEventHandler.handleQueryEvent 用
"WHERE assignee_device_id=?" 查工单永远落空 → "没有工单"。
修复:把执行人字段更新前置到 transition() 之前,并补 setAssigneeDeviceId
(与 OrderLifecycleManagerImpl.dispatch() 自动派单路径一致)。
事件 listener 此时 selectById 拿得到 deviceId,正常落 Redis;audit
查询也命中,按键路径恢复。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -72,7 +72,19 @@ public class ManualOrderActionFacade {
|
||||
boolean idle = strategy.isAssigneeIdle(cmd, order);
|
||||
WorkOrderStatusEnum targetStatus = idle ? WorkOrderStatusEnum.DISPATCHED : WorkOrderStatusEnum.QUEUED;
|
||||
|
||||
// 4. 状态变更
|
||||
// 4. 提前写入执行人字段
|
||||
// 注:必须在 transition() 之前完成。transition() 在事务内同步发布 OrderStateChangedEvent,
|
||||
// BadgeDeviceStatusEventListener 会再次 selectById 拿 assigneeId 决定是否写 Redis 工单关联;
|
||||
// 若此处后置则事件触发时 assigneeId 仍为 null,工牌按键查询 (assigneeDeviceId) 永远查不到工单。
|
||||
// 同时写 assigneeDeviceId,与 OrderLifecycleManagerImpl.dispatch() 自动派单路径对齐。
|
||||
OpsOrderDO assigneeUpdate = new OpsOrderDO();
|
||||
assigneeUpdate.setId(cmd.getOrderId());
|
||||
assigneeUpdate.setAssigneeId(cmd.getAssigneeId());
|
||||
assigneeUpdate.setAssigneeName(cmd.getAssigneeName());
|
||||
assigneeUpdate.setAssigneeDeviceId(cmd.getAssigneeId());
|
||||
opsOrderMapper.updateById(assigneeUpdate);
|
||||
|
||||
// 5. 状态变更
|
||||
OrderTransitionRequest request = OrderTransitionRequest.builder()
|
||||
.orderId(cmd.getOrderId())
|
||||
.targetStatus(targetStatus)
|
||||
@@ -89,13 +101,6 @@ public class ManualOrderActionFacade {
|
||||
throw new IllegalStateException("手动派单失败: " + result.getMessage());
|
||||
}
|
||||
|
||||
// 5. 更新主表执行人(只更新 assignee 字段,避免覆盖状态机已写入的 status)
|
||||
OpsOrderDO assigneeUpdate = new OpsOrderDO();
|
||||
assigneeUpdate.setId(cmd.getOrderId());
|
||||
assigneeUpdate.setAssigneeId(cmd.getAssigneeId());
|
||||
assigneeUpdate.setAssigneeName(cmd.getAssigneeName());
|
||||
opsOrderMapper.updateById(assigneeUpdate);
|
||||
|
||||
// 6. 条线后置
|
||||
// 注:业务日志由生命周期事件 → 条线 EventListener 统一记录,此处不重复写
|
||||
strategy.afterDispatch(cmd, order);
|
||||
|
||||
Reference in New Issue
Block a user