fix(ops): 工单完成添加语音播报和assigneeId传递
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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 {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user