fix(ops): 修复语音播报顺序和无工单误报问题
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled

1. CleanOrderEventListener: 将完成通知和自动派单合并为单个异步方法,
   保证先播报"工单已完成",间隔5秒后再派发下一个任务,
   避免"新工单来啦"先于"工单已完成"播报
2. CleanNotificationConstants: 修复 buildQuery 在无工单时仍播报
   "当前工单在作业区域"的问题,原因是 areaName 为 null 时被回退为
   默认值后导致"有工单"判断永远为 true

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
lzh
2026-02-04 10:43:12 +08:00
parent 117ad2c405
commit db5266d306
2 changed files with 23 additions and 17 deletions

View File

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

View File

@@ -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);
}
// ==================== 通知方法 ====================