From db5266d30661e5fb2d5e5574a6e9e0a0ad119855 Mon Sep 17 00:00:00 2001 From: lzh Date: Wed, 4 Feb 2026 10:43:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(ops):=20=E4=BF=AE=E5=A4=8D=E8=AF=AD?= =?UTF-8?q?=E9=9F=B3=E6=92=AD=E6=8A=A5=E9=A1=BA=E5=BA=8F=E5=92=8C=E6=97=A0?= =?UTF-8?q?=E5=B7=A5=E5=8D=95=E8=AF=AF=E6=8A=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. CleanOrderEventListener: 将完成通知和自动派单合并为单个异步方法, 保证先播报"工单已完成",间隔5秒后再派发下一个任务, 避免"新工单来啦"先于"工单已完成"播报 2. CleanNotificationConstants: 修复 buildQuery 在无工单时仍播报 "当前工单在作业区域"的问题,原因是 areaName 为 null 时被回退为 默认值后导致"有工单"判断永远为 true Co-Authored-By: Claude Opus 4.5 --- .../constants/CleanNotificationConstants.java | 10 +++---- .../listener/CleanOrderEventListener.java | 30 ++++++++++++------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/constants/CleanNotificationConstants.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/constants/CleanNotificationConstants.java index 551f84e..8d77f89 100644 --- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/constants/CleanNotificationConstants.java +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/constants/CleanNotificationConstants.java @@ -170,7 +170,7 @@ public class CleanNotificationConstants { */ public static final String TASK_RESUMED = "任务已恢复,请继续完成%s的清洁"; - // ==================== 按���查询播报 ==================== + // ==================== 按键查询播报 ==================== /** * 按键查询播报(有工单时) @@ -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); diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/listener/CleanOrderEventListener.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/listener/CleanOrderEventListener.java index 8d40650..89f55f3 100644 --- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/listener/CleanOrderEventListener.java +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/listener/CleanOrderEventListener.java @@ -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); } } /** - * 异步推送下一个任务 + * 异步执行工单完成后的通知和派单 + *

+ * 保证顺序:先播报"工单已完成",间隔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); } // ==================== 通知方法 ====================