fix(ops): 工单完成添加语音播报和assigneeId传递

This commit is contained in:
lzh
2026-01-30 09:45:16 +08:00
parent 895fcc2712
commit fe92b4cafb
2 changed files with 30 additions and 29 deletions

View File

@@ -26,6 +26,7 @@ import java.util.concurrent.TimeUnit;
* 订阅 IoT 模块发布的保洁工单完成事件
* <p>
* 调用链路:
*
* <pre>
* 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<String> {
/**
@@ -90,7 +86,6 @@ public class CleanOrderCompleteEventHandler implements RocketMQListener<String>
@Resource
private OrderLifecycleManager orderLifecycleManager;
@Override
public void onMessage(String message) {
try {
@@ -155,6 +150,7 @@ public class CleanOrderCompleteEventHandler implements RocketMQListener<String>
.orderId(event.getOrderId())
.targetStatus(WorkOrderStatusEnum.COMPLETED)
.operatorType(OperatorTypeEnum.SYSTEM)
.assigneeId(event.getDeviceId()) // 设备ID用于后续自动调度
.reason(remark)
.payload(payload)
.build();

View File

@@ -36,9 +36,9 @@ import java.util.Map;
* 职责:
* 1. 监听工单创建事件,触发自动调度
* 2. 监听工单状态变更事件,处理:
* - 扩展表时间记录(到岗、完成、暂停)
* - 通知发送(语音、站内信)
* - 业务日志记录
* - 扩展表时间记录(到岗、完成、暂停)
* - 通知发送(语音、站内信)
* - 业务日志记录
* 3. 监听工单完成事件,触发自动派单下一个任务
* <p>
* 职责划分:
@@ -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 {
}
}
}