fix(ops): 修复语音播报顺序和无工单误报问题
1. CleanOrderEventListener: 将完成通知和自动派单合并为单个异步方法, 保证先播报"工单已完成",间隔5秒后再派发下一个任务, 避免"新工单来啦"先于"工单已完成"播报 2. CleanNotificationConstants: 修复 buildQuery 在无工单时仍播报 "当前工单在作业区域"的问题,原因是 areaName 为 null 时被回退为 默认值后导致"有工单"判断永远为 true Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -170,7 +170,7 @@ public class CleanNotificationConstants {
|
||||
*/
|
||||
public static final String TASK_RESUMED = "任务已恢复,请继续完成%s的清洁";
|
||||
|
||||
// ==================== 按<EFBFBD><EFBFBD><EFBFBD>查询播报 ====================
|
||||
// ==================== 按键查询播报 ====================
|
||||
|
||||
/**
|
||||
* 按键查询播报(有工单时)
|
||||
@@ -361,11 +361,9 @@ public class CleanNotificationConstants {
|
||||
* @return 播报内容
|
||||
*/
|
||||
public static String buildQuery(String areaName, int pendingCount) {
|
||||
// 处理区域名称
|
||||
String name = (areaName != null && !areaName.isEmpty()) ? areaName : DEFAULT_AREA_NAME;
|
||||
|
||||
// 有当前工单
|
||||
if (name != null && !name.isEmpty()) {
|
||||
// 有当前工单(areaName 非空表示存在进行中的工单)
|
||||
if (areaName != null && !areaName.isEmpty()) {
|
||||
String name = areaName;
|
||||
if (pendingCount > 0) {
|
||||
// 当前工单 + 待办数量
|
||||
return String.format(VoiceTemplate.QUERY_AREA_AND_PENDING, name, pendingCount);
|
||||
|
||||
@@ -437,24 +437,32 @@ public class CleanOrderEventListener {
|
||||
|
||||
Long deviceId = event.getAssigneeId();
|
||||
if (deviceId != null) {
|
||||
// 发送完成通知(语音播报)
|
||||
asyncSendOrderCompletedNotification(event.getOrderId(), deviceId);
|
||||
// 自动推送下一个任务(异步)
|
||||
asyncDispatchNext(deviceId, event.getOrderId());
|
||||
// 异步执行:先发送完成通知,等待5秒后再派发下一个任务
|
||||
asyncCompleteAndDispatchNext(event.getOrderId(), deviceId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 异步推送下一个任务
|
||||
* 异步执行工单完成后的通知和派单
|
||||
* <p>
|
||||
* 保证顺序:先播报"工单已完成",间隔5秒后再派发下一个任务(触发"新工单来啦")
|
||||
* 避免两条语音播报顺序混乱或被覆盖
|
||||
*/
|
||||
@Async("ops-task-executor")
|
||||
public void asyncDispatchNext(Long deviceId, Long completedOrderId) {
|
||||
cleanOrderService.autoDispatchNextOrder(completedOrderId, deviceId);
|
||||
}
|
||||
|
||||
@Async("ops-task-executor")
|
||||
public void asyncSendOrderCompletedNotification(Long orderId, Long deviceId) {
|
||||
public void asyncCompleteAndDispatchNext(Long orderId, Long deviceId) {
|
||||
// 1. 先发送完成通知
|
||||
sendOrderCompletedNotification(orderId, deviceId);
|
||||
|
||||
// 2. 等待5秒,确保完成语音播报完毕后再触发下一个任务的通知
|
||||
try {
|
||||
Thread.sleep(5000);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
log.warn("[CleanOrderEventListener] 等待被中断: orderId={}", orderId);
|
||||
}
|
||||
|
||||
// 3. 自动推送下一个任务
|
||||
cleanOrderService.autoDispatchNextOrder(orderId, deviceId);
|
||||
}
|
||||
|
||||
// ==================== 通知方法 ====================
|
||||
|
||||
Reference in New Issue
Block a user