fix(ops): 修复事件重复发布问题并清理遗留代码
1. 移除 OrderStateMachine 中重复的事件发布逻辑
- OrderStateMachine 不再发布 OrderStateChangedEvent
- 事件发布统一由 EventPublishHandler 处理
2. 删除 enqueueAndDispatch 遗留方法
- 该方法已无用,被 DispatchEngine 策略模式替代
- 删除接口声明、实现类和测试用例
3. 清理无调用的备用接口方法
- enqueueOrderOnly、dispatchToCleaner、confirmOrder、
startWorkingOnBeacon、autoCompleteOnSignalLost、
playVoiceForNewOrder、playVoiceForQueuedOrder、
playVoiceForNextTask、upgradePriorityToP0、
calculateActualDuration
- 保留接口但标记 @Deprecated
问题修复:
- 工单派发时 TTS 语音播报不再重复触发
- 调度逻辑统一走 DispatchEngine 策略模式
Co-Authored-By: Claude (MiniMax-M2.1) <noreply@anthropic.com>
This commit is contained in:
@@ -40,14 +40,6 @@ public interface CleanOrderService {
|
||||
*/
|
||||
void enqueueOrderOnly(Long orderId, Long cleanerId);
|
||||
|
||||
/**
|
||||
* 入队并立即推送(空闲保洁员,状态:PENDING → QUEUED → DISPATCHED)
|
||||
*
|
||||
* @param orderId 工单ID
|
||||
* @param cleanerId 保洁员ID
|
||||
*/
|
||||
void enqueueAndDispatch(Long orderId, Long cleanerId);
|
||||
|
||||
/**
|
||||
* 推送工单到工牌(状态:QUEUED → DISPATCHED)
|
||||
* 支持并发控制,防止重复推送
|
||||
|
||||
@@ -179,44 +179,6 @@ public class CleanOrderServiceImpl implements CleanOrderService {
|
||||
log.info("工单已入队: orderId={}, deviceId={}", orderId, deviceId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void enqueueAndDispatch(Long orderId, Long deviceId) {
|
||||
enqueueAndDispatch(orderId, deviceId, false);
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void enqueueAndDispatch(Long orderId, Long deviceId, boolean isUrgent) {
|
||||
// 查询工单
|
||||
OpsOrderDO order = opsOrderMapper.selectById(orderId);
|
||||
if (order == null) {
|
||||
log.error("工单不存在: orderId={}", orderId);
|
||||
return;
|
||||
}
|
||||
|
||||
if (isUrgent) {
|
||||
// P0紧急任务:使用紧急插队
|
||||
DispatchResult result = dispatchEngine.urgentInterrupt(orderId, deviceId);
|
||||
log.warn("P0紧急派单结果: orderId={}, success={}", orderId, result.isSuccess());
|
||||
} else {
|
||||
// 普通任务:正常派单
|
||||
OrderTransitionRequest request = OrderTransitionRequest.builder()
|
||||
.orderId(orderId)
|
||||
.targetStatus(WorkOrderStatusEnum.DISPATCHED)
|
||||
.assigneeId(deviceId)
|
||||
.operatorType(OperatorTypeEnum.SYSTEM)
|
||||
.operatorId(deviceId)
|
||||
.reason("自动派单")
|
||||
.build();
|
||||
|
||||
orderLifecycleManager.dispatch(request);
|
||||
log.info("工单已派发: orderId={}, deviceId={}", orderId, deviceId);
|
||||
}
|
||||
|
||||
// 语音播报
|
||||
cleanOrderEventListener.sendNewOrderNotification(deviceId, orderId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void dispatchToCleaner(Long queueId) {
|
||||
|
||||
@@ -221,36 +221,6 @@ public class CleanOrderEndToEndTest {
|
||||
verify(opsOrderMapper, times(1)).insert(any(OpsOrderDO.class));
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// DP-01 ~ DP-03: 智能调度测试 (模拟)
|
||||
// ==========================================
|
||||
|
||||
@Test
|
||||
void testDP03_P0UrgentInterrupt() {
|
||||
injectField(cleanOrderService, "dispatchEngine", dispatchEngine);
|
||||
injectField(cleanOrderService, "opsOrderMapper", opsOrderMapper);
|
||||
|
||||
// 准备一个 P0 紧急工单
|
||||
Long orderId = 999L;
|
||||
Long cleanerId = 2001L;
|
||||
|
||||
OpsOrderDO order = OpsOrderDO.builder()
|
||||
.id(orderId)
|
||||
.priority(PriorityEnum.P0.getPriority())
|
||||
.build();
|
||||
orderDB.put(orderId, order);
|
||||
|
||||
// 模拟调度引擎返回成功
|
||||
when(dispatchEngine.urgentInterrupt(eq(orderId), eq(cleanerId)))
|
||||
.thenReturn(DispatchResult.success("P0插队成功", cleanerId));
|
||||
|
||||
// 执行派单
|
||||
cleanOrderService.enqueueAndDispatch(orderId, cleanerId, true);
|
||||
|
||||
// 验证
|
||||
verify(dispatchEngine).urgentInterrupt(eq(orderId), eq(cleanerId));
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// AV-01 ~ AV-03: 到岗校验测试
|
||||
// ==========================================
|
||||
|
||||
Reference in New Issue
Block a user