From fe92b4cafbe3b880fcfbb4706194b6e0bc8040b4 Mon Sep 17 00:00:00 2001 From: lzh Date: Fri, 30 Jan 2026 09:45:16 +0800 Subject: [PATCH] =?UTF-8?q?fix(ops):=20=E5=B7=A5=E5=8D=95=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E6=B7=BB=E5=8A=A0=E8=AF=AD=E9=9F=B3=E6=92=AD=E6=8A=A5?= =?UTF-8?q?=E5=92=8CassigneeId=E4=BC=A0=E9=80=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CleanOrderCompleteEventHandler.java | 10 ++-- .../listener/CleanOrderEventListener.java | 49 ++++++++++--------- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderCompleteEventHandler.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderCompleteEventHandler.java index 5674d62..3af6414 100644 --- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderCompleteEventHandler.java +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderCompleteEventHandler.java @@ -26,6 +26,7 @@ import java.util.concurrent.TimeUnit; * 订阅 IoT 模块发布的保洁工单完成事件 *

* 调用链路: + * *

  * IoT 发布 RocketMQ 消息 (ops-order-complete)
  *     ↓
@@ -60,12 +61,7 @@ import java.util.concurrent.TimeUnit;
  */
 @Slf4j
 @Component
-@RocketMQMessageListener(
-        topic = "ops-order-complete",
-        consumerGroup = "ops-clean-order-complete-group",
-        consumeMode = ConsumeMode.CONCURRENTLY,
-        selectorExpression = "*"
-)
+@RocketMQMessageListener(topic = "ops-order-complete", consumerGroup = "ops-clean-order-complete-group", consumeMode = ConsumeMode.CONCURRENTLY, selectorExpression = "*")
 public class CleanOrderCompleteEventHandler implements RocketMQListener {
 
     /**
@@ -90,7 +86,6 @@ public class CleanOrderCompleteEventHandler implements RocketMQListener
     @Resource
     private OrderLifecycleManager orderLifecycleManager;
 
-
     @Override
     public void onMessage(String message) {
         try {
@@ -155,6 +150,7 @@ public class CleanOrderCompleteEventHandler implements RocketMQListener
                 .orderId(event.getOrderId())
                 .targetStatus(WorkOrderStatusEnum.COMPLETED)
                 .operatorType(OperatorTypeEnum.SYSTEM)
+                .assigneeId(event.getDeviceId()) // 设备ID用于后续自动调度
                 .reason(remark)
                 .payload(payload)
                 .build();
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 b0f5d67..5e6056a 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
@@ -36,9 +36,9 @@ import java.util.Map;
  * 职责:
  * 1. 监听工单创建事件,触发自动调度
  * 2. 监听工单状态变更事件,处理:
- *    - 扩展表时间记录(到岗、完成、暂停)
- *    - 通知发送(语音、站内信)
- *    - 业务日志记录
+ * - 扩展表时间记录(到岗、完成、暂停)
+ * - 通知发送(语音、站内信)
+ * - 业务日志记录
  * 3. 监听工单完成事件,触发自动派单下一个任务
  * 

* 职责划分: @@ -381,12 +381,11 @@ public class CleanOrderEventListener { Long deviceId = event.getAssigneeId(); if (deviceId != null) { + // 发送完成通知(语音播报) + asyncSendOrderCompletedNotification(event.getOrderId(), deviceId); // 自动推送下一个任务(异步) asyncDispatchNext(deviceId, event.getOrderId()); } - - // 发送完成通知(异步) - asyncSendOrderCompletedNotification(event.getOrderId()); } /** @@ -397,12 +396,9 @@ public class CleanOrderEventListener { cleanOrderService.autoDispatchNextOrder(completedOrderId, deviceId); } - /** - * 异步发送完成通知 - */ @Async("ops-task-executor") - public void asyncSendOrderCompletedNotification(Long orderId) { - sendOrderCompletedNotification(orderId); + public void asyncSendOrderCompletedNotification(Long orderId, Long deviceId) { + sendOrderCompletedNotification(orderId, deviceId); } // ==================== 通知方法 ==================== @@ -431,8 +427,7 @@ public class CleanOrderEventListener { CleanNotificationConstants.NotifyParamsBuilder.newOrderParams( order.getOrderCode(), order.getTitle(), - CleanNotificationConstants.VoiceBuilder.getAreaName(order.getLocation()) - )); + CleanNotificationConstants.VoiceBuilder.getAreaName(order.getLocation()))); } catch (Exception e) { log.error("[新工单通知] 发送失败: deviceId={}, orderId={}", deviceId, orderId, e); @@ -530,23 +525,33 @@ public class CleanOrderEventListener { } /** - * 发送工单完成通知 + * 发送工单完成通知(语音播报 + 站内信) */ - @Async("ops-task-executor") - public void sendOrderCompletedNotification(Long orderId) { + public void sendOrderCompletedNotification(Long orderId, Long deviceId) { try { OpsOrderDO order = opsOrderMapper.selectById(orderId); if (order == null) { return; } - log.info("[工单完成通知] orderId={}, orderCode={}, areaId={}", - orderId, order.getOrderCode(), order.getAreaId()); + log.info("[工单完成通知] orderId={}, orderCode={}, areaId={}, deviceId={}", + orderId, order.getOrderCode(), order.getAreaId(), deviceId); - // TODO: 查询该区域的巡检员列表并发送通知 + // 1. 语音播报 - 通知保洁员工单已完成 + if (deviceId != null) { + playVoice(deviceId, CleanNotificationConstants.VoiceTemplate.ORDER_COMPLETED); + } + + // 2. 发送站内信(给管理员) + sendNotifyMessage(1L, + CleanNotificationConstants.TemplateCode.ORDER_COMPLETED, + CleanNotificationConstants.NotifyParamsBuilder.orderCompletedParams( + order.getOrderCode(), + CleanNotificationConstants.VoiceBuilder.getAreaName(order.getLocation()), + order.getTitle())); } catch (Exception e) { - log.error("[工单完成通知] 发送失败: orderId={}", orderId, e); + log.error("[工单完成通知] 发送失败: orderId={}, deviceId={}", orderId, deviceId, e); } } @@ -694,7 +699,8 @@ public class CleanOrderEventListener { } // 计算响应时长(秒):到岗 - 首次下发 - 暂停时长 - long responseSeconds = java.time.Duration.between(ext.getFirstDispatchedTime(), ext.getArrivedTime()).getSeconds(); + long responseSeconds = java.time.Duration.between(ext.getFirstDispatchedTime(), ext.getArrivedTime()) + .getSeconds(); int totalPauseSeconds = ext.getTotalPauseSeconds() != null ? ext.getTotalPauseSeconds() : 0; responseSeconds = responseSeconds - totalPauseSeconds; @@ -775,4 +781,3 @@ public class CleanOrderEventListener { } } } -