diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderAuditEventHandler.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderAuditEventHandler.java index 6daf7a6..8c696e8 100644 --- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderAuditEventHandler.java +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderAuditEventHandler.java @@ -7,6 +7,7 @@ import com.viewsh.module.ops.dal.mysql.workorder.OpsOrderMapper; import com.viewsh.module.ops.enums.WorkOrderStatusEnum; import com.viewsh.module.ops.environment.constants.CleanNotificationConstants; import com.viewsh.module.ops.environment.integration.dto.CleanOrderAuditEventDTO; +import com.viewsh.module.ops.environment.service.voice.TtsQueueMessage; import com.viewsh.module.ops.environment.service.voice.VoiceBroadcastService; import com.viewsh.module.ops.infrastructure.log.enumeration.EventDomain; import com.viewsh.module.ops.infrastructure.log.enumeration.EventLevel; @@ -163,6 +164,9 @@ public class CleanOrderAuditEventHandler implements RocketMQListener { /** * 处理查询事件 (IOT_BUTTON_QUERY) + *

+ * 查询事件仅播报当前工单地点信息,不涉及循环播报停止和状态流转。 + * 循环播报的停止由确认路径(CleanOrderEventListener.handleConfirmed)负责。 */ private void handleQueryEvent(CleanOrderAuditEventDTO event) { log.info("[CleanOrderAuditEventHandler] Handling query event: eventId={}", event.getEventId()); @@ -196,20 +200,21 @@ public class CleanOrderAuditEventHandler implements RocketMQListener { // 3. 构建 TTS 文本(使用统一模板构建器) String ttsText = CleanNotificationConstants.VoiceBuilder.buildQuery(currentAreaName, pendingCount.intValue()); - // 4. 下发 TTS + // 4. 直接下发 TTS(按键响应需立即播报,不走队列) Long orderId = currentOrder != null ? currentOrder.getId() : null; sendTts(deviceId, ttsText, orderId); } /** - * 下发 TTS 语音播报 + * 下发 TTS 语音播报(直接发送,不走队列,按键响应需立即播报) */ private void sendTts(Long deviceId, String text, Long orderId) { try { - voiceBroadcastService.broadcastInOrder(deviceId, text, orderId); - log.info("[CleanOrderAuditEventHandler] TTS 下发成功: deviceId={}, text={}", deviceId, text); + voiceBroadcastService.broadcastDirect(deviceId, text, + TtsQueueMessage.TTS_FLAG_URGENT, orderId); + log.info("[CleanOrderAuditEventHandler] TTS 直接下发成功: deviceId={}, text={}", deviceId, text); } catch (Exception e) { - log.error("[CleanOrderAuditEventHandler] TTS 下发异常: deviceId={}", deviceId, e); + log.error("[CleanOrderAuditEventHandler] TTS 直接下发异常: deviceId={}", deviceId, e); } } 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 19b3815..6ee3aaa 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 @@ -15,6 +15,7 @@ import com.viewsh.module.ops.environment.dal.dataobject.workorder.OpsOrderCleanE import com.viewsh.module.ops.environment.dal.mysql.workorder.OpsOrderCleanExtMapper; import com.viewsh.module.ops.environment.dal.redis.TrafficActiveOrderRedisDAO; import com.viewsh.module.ops.environment.service.cleanorder.CleanOrderService; +import com.viewsh.module.ops.environment.service.voice.TtsQueueMessage; import com.viewsh.module.ops.environment.service.voice.VoiceBroadcastService; import com.viewsh.module.ops.infrastructure.log.enumeration.EventDomain; import com.viewsh.module.ops.infrastructure.log.recorder.EventLogRecord; @@ -276,13 +277,14 @@ public class CleanOrderEventListener { // 1. 停止循环播报 voiceBroadcastService.stopLoop(deviceId); - // 2. 播报地点信息 + // 2. 直接播报地点信息(不走队列,按键响应需立即播报) OpsOrderDO order = opsOrderMapper.selectById(orderId); String areaName = CleanNotificationConstants.VoiceBuilder.getAreaName( order != null ? order.getLocation() : null); String locationMessage = String.format( CleanNotificationConstants.VoiceTemplate.QUERY_HAS_ORDER, areaName); - playVoice(deviceId, locationMessage, orderId); + voiceBroadcastService.broadcastDirect(deviceId, locationMessage, + TtsQueueMessage.TTS_FLAG_URGENT, orderId); } log.info("[CleanOrderEventListener] 工单已确认: orderId={}, deviceId={}", orderId, deviceId); @@ -434,10 +436,12 @@ public class CleanOrderEventListener { updateExt.setCompletedTime(LocalDateTime.now()); cleanExtMapper.insertOnDuplicateKeyUpdate(updateExt); - // 2. 停止循环播报 + 语音播报通知保洁员工单已取消(取消是异常情况,需要通知) + // 2. 停止循环播报 + 直接播报通知保洁员工单已取消(取消是异常情况,需要通知) if (deviceId != null) { voiceBroadcastService.stopLoop(deviceId); - playVoice(deviceId, CleanNotificationConstants.VoiceTemplate.ORDER_CANCELLED, orderId); + voiceBroadcastService.broadcastDirect(deviceId, + CleanNotificationConstants.VoiceTemplate.ORDER_CANCELLED, + TtsQueueMessage.TTS_FLAG_URGENT, orderId); } // 3. 自动调度下一个等待任务(如果有 assignee) diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/voice/TtsQueueConsumer.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/voice/TtsQueueConsumer.java index e4c65af..bf685a1 100644 --- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/voice/TtsQueueConsumer.java +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/voice/TtsQueueConsumer.java @@ -51,7 +51,7 @@ public class TtsQueueConsumer { @Value("${ops.tts.queue.enabled:true}") private boolean queueEnabled; - @Value("${ops.tts.queue.interval-ms:6000}") + @Value("${ops.tts.queue.interval-ms:3000}") private long broadcastIntervalMs; @Value("${ops.tts.queue.max-queue-size:50}") @@ -376,6 +376,9 @@ public class TtsQueueConsumer { public void stopLoop(Long deviceId) { String loopKey = LOOP_KEY_PREFIX + deviceId; Boolean deleted = redisTemplate.delete(loopKey); + // 清除播报间隔锁,使后续播报(如地点播报)可以立即发送 + String lockKey = LOCK_KEY_PREFIX + deviceId; + redisTemplate.delete(lockKey); // 从队列中移除循环消息,保留非循环消息(如取消播报、待办播报等) int removed = removeLoopMessages(deviceId); log.info("[TTS队列] 停止循环播报: deviceId={}, loopKeyDeleted={}, removedMessages={}", deviceId, deleted, removed);