diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderArriveEventHandler.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderArriveEventHandler.java
index 068da7b..1c649fd 100644
--- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderArriveEventHandler.java
+++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderArriveEventHandler.java
@@ -8,9 +8,6 @@ import com.viewsh.module.ops.dal.mysql.workorder.OpsOrderMapper;
import com.viewsh.module.ops.enums.OperatorTypeEnum;
import com.viewsh.module.ops.enums.WorkOrderStatusEnum;
import com.viewsh.module.ops.environment.integration.dto.CleanOrderArriveEventDTO;
-import com.viewsh.module.ops.infrastructure.log.enumeration.EventDomain;
-import com.viewsh.module.ops.infrastructure.log.recorder.EventLogRecord;
-import com.viewsh.module.ops.infrastructure.log.recorder.EventLogRecorder;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
@@ -28,9 +25,30 @@ import java.util.concurrent.TimeUnit;
*
* 订阅 IoT 模块发布的保洁工单到岗事件
*
- * RocketMQ 配置:
- * - Topic: ops-order-arrive
- * - ConsumerGroup: ops-clean-order-arrive-group
+ * 调用链路:
+ *
+ * IoT 发布 RocketMQ 消息 (ops-order-arrive)
+ * ↓
+ * CleanOrderArriveEventHandler.onMessage()
+ * - 幂等性检查
+ * - 状态检查
+ * ↓
+ * orderLifecycleManager.transition(ARRIVED) [@Transactional]
+ * - 更新工单状态
+ * - 发布 OrderStateChangedEvent
+ * ↓
+ * 事务提交
+ * ↓
+ * CleanOrderEventListener.handleArrived() [@Async, AFTER_COMMIT]
+ * - 记录到岗时间到扩展表
+ * - 更新设备工单关联信息(areaId, beaconMac)
+ * - 记录业务日志
+ *
+ *
+ * 设计说明:
+ * - Handler 只负责消息接收和状态转换
+ * - 业务日志、设备缓存更新由 CleanOrderEventListener 在事务提交后处理
+ * - BadgeDeviceStatusServiceImpl 在 BEFORE_COMMIT 阶段跳过 ARRIVED(由 Listener 处理完整信息)
*
* @author AI
*/
@@ -54,16 +72,6 @@ public class CleanOrderArriveEventHandler implements RocketMQListener {
*/
private static final int DEDUP_TTL_SECONDS = 300;
- /**
- * 设备当前工单缓存 Key 模式
- */
- private static final String ORDER_CACHE_KEY_PATTERN = "ops:clean:device:order:%s";
-
- /**
- * 工单缓存 TTL(秒)
- */
- private static final int ORDER_CACHE_TTL_SECONDS = 3600;
-
@Resource
private ObjectMapper objectMapper;
@@ -76,9 +84,6 @@ public class CleanOrderArriveEventHandler implements RocketMQListener {
@Resource
private OrderLifecycleManager orderLifecycleManager;
- @Resource
- private EventLogRecorder eventLogRecorder;
-
@Override
public void onMessage(String message) {
try {
@@ -126,12 +131,7 @@ public class CleanOrderArriveEventHandler implements RocketMQListener {
return;
}
- // 3. 更新工单的设备信息(扩展字段)
- order.setAssigneeDeviceId(event.getDeviceId());
- order.setAssigneeDeviceKey(event.getDeviceKey());
- opsOrderMapper.updateById(order);
-
- // 4. 构建状态转换请求
+ // 3. 构建状态转换请求(包含完整信息,供 Listener 使用)
Map payload = new HashMap<>();
payload.put("deviceId", event.getDeviceId());
payload.put("deviceKey", event.getDeviceKey());
@@ -148,87 +148,11 @@ public class CleanOrderArriveEventHandler implements RocketMQListener {
.reason("蓝牙信标自动到岗确认")
.payload(payload)
.build();
-
- // 5. 通过生命周期管理器执行状态转换(DISPATCHED/CONFIRMED -> ARRIVED)
+ // 4. 执行状态转换
+ // 注意:业务日志和设备缓存更新由 CleanOrderEventListener 在 AFTER_COMMIT 阶段处理
orderLifecycleManager.transition(request);
- // 6. 记录业务日志
- recordOrderArrivedLog(event, request);
-
- // 7. 更新 Redis 缓存(设备当前工单)
- cacheDeviceCurrentOrder(event);
-
log.info("[CleanOrderArriveEventHandler] 工单到岗成功: eventId={}, orderId={}, deviceId={}",
event.getEventId(), event.getOrderId(), event.getDeviceId());
}
-
- /**
- * 缓存设备当前工单
- *
- * 供 IoT 模块的规则处理器查询
- */
- private void cacheDeviceCurrentOrder(CleanOrderArriveEventDTO event) {
- try {
- String cacheKey = String.format(ORDER_CACHE_KEY_PATTERN, event.getDeviceId());
-
- // 构建缓存数据
- StringBuilder cacheData = new StringBuilder();
- cacheData.append("{");
- cacheData.append("\"orderId\":").append(event.getOrderId()).append(",");
- cacheData.append("\"status\":\"").append(WorkOrderStatusEnum.ARRIVED.getStatus()).append("\",");
- cacheData.append("\"areaId\":").append(event.getAreaId());
-
- // 如果有信标 MAC,也缓存
- if (event.getTriggerData() != null && event.getTriggerData().containsKey("beaconMac")) {
- cacheData.append(",\"beaconMac\":\"").append(event.getTriggerData().get("beaconMac")).append("\"");
- }
-
- cacheData.append("}");
-
- // 写入 Redis
- stringRedisTemplate.opsForValue().set(
- cacheKey,
- cacheData.toString(),
- ORDER_CACHE_TTL_SECONDS,
- TimeUnit.SECONDS
- );
-
- log.debug("[CleanOrderArriveEventHandler] 设备工单缓存已更新: deviceId={}, orderId={}",
- event.getDeviceId(), event.getOrderId());
- } catch (Exception e) {
- log.error("[CleanOrderArriveEventHandler] 设备工单缓存更新失败: deviceId={}", event.getDeviceId(), e);
- }
- }
-
- /**
- * 记录工单到岗业务日志
- */
- private void recordOrderArrivedLog(CleanOrderArriveEventDTO event, OrderTransitionRequest request) {
- try {
- // 构建扩展信息
- Map extra = new HashMap<>();
- extra.put("eventId", event.getEventId());
- extra.put("triggerSource", event.getTriggerSource());
- extra.put("areaId", event.getAreaId());
- if (event.getTriggerData() != null) {
- extra.putAll(event.getTriggerData());
- }
-
- // 记录日志
- eventLogRecorder.record(EventLogRecord.builder()
- .module("clean")
- .domain(EventDomain.BEACON)
- .eventType("ORDER_ARRIVED")
- .message(String.format("蓝牙信标自动到岗确认 [设备:%s, 区域:%d]",
- event.getDeviceKey(), event.getAreaId()))
- .targetId(event.getOrderId())
- .targetType("order")
- .deviceId(event.getDeviceId())
- .payload(extra)
- .build());
-
- } catch (Exception e) {
- log.warn("[CleanOrderArriveEventHandler] 记录业务日志失败: orderId={}", event.getOrderId(), e);
- }
- }
}
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 904a0c3..5674d62 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
@@ -8,10 +8,6 @@ import com.viewsh.module.ops.dal.mysql.workorder.OpsOrderMapper;
import com.viewsh.module.ops.enums.OperatorTypeEnum;
import com.viewsh.module.ops.enums.WorkOrderStatusEnum;
import com.viewsh.module.ops.environment.integration.dto.CleanOrderCompleteEventDTO;
-import com.viewsh.module.ops.environment.service.cleanorder.CleanOrderService;
-import com.viewsh.module.ops.infrastructure.log.enumeration.EventDomain;
-import com.viewsh.module.ops.infrastructure.log.recorder.EventLogRecord;
-import com.viewsh.module.ops.infrastructure.log.recorder.EventLogRecorder;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
@@ -29,9 +25,36 @@ import java.util.concurrent.TimeUnit;
*
* 订阅 IoT 模块发布的保洁工单完成事件
*
- * RocketMQ 配置:
- * - Topic: ops-order-complete
- * - ConsumerGroup: ops-clean-order-complete-group
+ * 调用链路:
+ *
+ * IoT 发布 RocketMQ 消息 (ops-order-complete)
+ * ↓
+ * CleanOrderCompleteEventHandler.onMessage()
+ * - 幂等性检查
+ * - 状态检查
+ * ↓
+ * orderLifecycleManager.transition(COMPLETED) [@Transactional]
+ * - 更新工单状态
+ * - 发布 OrderStateChangedEvent
+ * ↓
+ * 事务提交
+ * ↓
+ * BadgeDeviceStatusEventListener.onOrderStateChanged() [BEFORE_COMMIT]
+ * - 清除设备工单关联
+ * - 检查等待任务,决定设备状态 (BUSY/IDLE)
+ * ↓
+ * CleanOrderEventListener.handleCompleted() [AFTER_COMMIT]
+ * - 记录完成时间到扩展表
+ * - 记录业务日志
+ * CleanOrderEventListener.onOrderCompleted() [AFTER_COMMIT]
+ * - 自动调度下一个任务
+ * - 发送完成通知
+ *
+ *
+ * 设计说明:
+ * - Handler 只负责消息接收和状态转换
+ * - 设备状态由 BadgeDeviceStatusEventListener 在 BEFORE_COMMIT 阶段处理
+ * - 业务日志、自动调度由 CleanOrderEventListener 在 AFTER_COMMIT 阶段处理
*
* @author AI
*/
@@ -55,11 +78,6 @@ public class CleanOrderCompleteEventHandler implements RocketMQListener
*/
private static final int DEDUP_TTL_SECONDS = 300;
- /**
- * 设备当前工单缓存 Key 模式
- */
- private static final String ORDER_CACHE_KEY_PATTERN = "ops:clean:device:order:%s";
-
@Resource
private ObjectMapper objectMapper;
@@ -72,11 +90,6 @@ public class CleanOrderCompleteEventHandler implements RocketMQListener
@Resource
private OrderLifecycleManager orderLifecycleManager;
- @Resource
- private CleanOrderService cleanOrderService;
-
- @Resource
- private EventLogRecorder eventLogRecorder;
@Override
public void onMessage(String message) {
@@ -146,23 +159,12 @@ public class CleanOrderCompleteEventHandler implements RocketMQListener
.payload(payload)
.build();
- // 5. 通过生命周期管理器执行状态转换(ARRIVED -> COMPLETED)
- orderLifecycleManager.completeOrder(event.getOrderId(), null, remark);
+ // 5. 执行状态转换
+ // 注意:设备状态、业务日志、自动调度由事件监听器处理
+ orderLifecycleManager.transition(request);
- // 6. 记录业务日志
- recordOrderCompletedLog(event, order, remark);
-
- // 7. 清除 Redis 缓存(设备当前工单)
- clearDeviceCurrentOrder(event.getDeviceId());
-
- // 8. 自动调度下一个任务(优先恢复被中断的任务)
- if (order.getAssigneeId() != null) {
- cleanOrderService.autoDispatchNextOrder(event.getOrderId(), order.getAssigneeId());
- }
-
- log.info("[CleanOrderCompleteEventHandler] 工单完成成功: eventId={}, orderId={}, assigneeId={}, duration={}ms",
- event.getEventId(), event.getOrderId(), order.getAssigneeId(),
- event.getTriggerData() != null ? event.getTriggerData().get("durationMs") : "N/A");
+ log.info("[CleanOrderCompleteEventHandler] 工单完成成功: eventId={}, orderId={}",
+ event.getEventId(), event.getOrderId());
}
/**
@@ -183,62 +185,4 @@ public class CleanOrderCompleteEventHandler implements RocketMQListener
return remark.toString();
}
- /**
- * 清除设备当前工单缓存
- */
- private void clearDeviceCurrentOrder(Long deviceId) {
- try {
- String cacheKey = String.format(ORDER_CACHE_KEY_PATTERN, deviceId);
- stringRedisTemplate.delete(cacheKey);
-
- log.debug("[CleanOrderCompleteEventHandler] 设备工单缓存已清除: deviceId={}", deviceId);
- } catch (Exception e) {
- log.error("[CleanOrderCompleteEventHandler] 设备工单缓存清除失败: deviceId={}", deviceId, e);
- }
- }
-
- /**
- * 记录工单完成业务日志
- */
- private void recordOrderCompletedLog(CleanOrderCompleteEventDTO event, OpsOrderDO order, String remark) {
- try {
- // 构建扩展信息
- Map extra = new HashMap<>();
- extra.put("eventId", event.getEventId());
- extra.put("triggerSource", event.getTriggerSource());
- extra.put("areaId", event.getAreaId());
- extra.put("completionReason", event.getTriggerData() != null ?
- event.getTriggerData().get("completionReason") : "SIGNAL_LOSS_TIMEOUT");
- if (event.getTriggerData() != null) {
- extra.putAll(event.getTriggerData());
- }
-
- // 计算作业时长(分钟)
- String durationInfo = "";
- if (event.getTriggerData() != null && event.getTriggerData().containsKey("durationMs")) {
- Object durationMs = event.getTriggerData().get("durationMs");
- if (durationMs != null) {
- long durationMinutes = ((Number) durationMs).longValue() / 60000;
- durationInfo = String.format(",作业时长: %d分钟", durationMinutes);
- extra.put("durationMinutes", durationMinutes);
- }
- }
-
- // 记录日志
- eventLogRecorder.record(EventLogRecord.builder()
- .module("clean")
- .domain(EventDomain.BEACON)
- .eventType("ORDER_COMPLETED")
- .message("信号丢失超时自动完成 [设备:" + event.getDeviceKey() + durationInfo + "]")
- .targetId(event.getOrderId())
- .targetType("order")
- .deviceId(event.getDeviceId())
- .personId(order.getAssigneeId())
- .payload(extra)
- .build());
-
- } catch (Exception e) {
- log.warn("[CleanOrderCompleteEventHandler] 记录业务日志失败: orderId={}", event.getOrderId(), e);
- }
- }
}
diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderConfirmEventHandler.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderConfirmEventHandler.java
index c064e8d..c2778b7 100644
--- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderConfirmEventHandler.java
+++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderConfirmEventHandler.java
@@ -2,15 +2,12 @@ package com.viewsh.module.ops.environment.integration.consumer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.viewsh.module.ops.core.lifecycle.OrderLifecycleManager;
-import com.viewsh.module.ops.environment.service.voice.VoiceBroadcastService;
import com.viewsh.module.ops.core.lifecycle.model.OrderTransitionRequest;
import com.viewsh.module.ops.dal.dataobject.workorder.OpsOrderDO;
import com.viewsh.module.ops.dal.mysql.workorder.OpsOrderMapper;
import com.viewsh.module.ops.enums.OperatorTypeEnum;
import com.viewsh.module.ops.enums.WorkOrderStatusEnum;
import com.viewsh.module.ops.environment.integration.dto.CleanOrderConfirmEventDTO;
-import com.viewsh.module.ops.infrastructure.log.enumeration.EventDomain;
-import com.viewsh.module.ops.infrastructure.log.recorder.EventLogRecorder;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
@@ -25,6 +22,30 @@ import java.util.concurrent.TimeUnit;
* 保洁工单确认事件消费者
*
* 订阅 IoT 模块发布的工单确认事件(如:工牌按键确认)
+ *
+ * 调用链路:
+ *
+ * IoT 发布 RocketMQ 消息 (ops-order-confirm)
+ * ↓
+ * CleanOrderConfirmEventHandler.onMessage()
+ * - 幂等性检查
+ * - 状态检查
+ * ↓
+ * orderLifecycleManager.transition(CONFIRMED) [@Transactional]
+ * - 更新工单状态
+ * - 发布 OrderStateChangedEvent
+ * ↓
+ * 事务提交
+ * ↓
+ * CleanOrderEventListener.onOrderStateChanged() [@TransactionalEventListener(AFTER_COMMIT)]
+ * - 记录业务日志
+ * - 发送 TTS "工单已确认,请前往作业区域开始作业"
+ *
+ *
+ * 设计说明:
+ * - Handler 只负责消息接收和状态转换
+ * - 日志记录和通知发送由 CleanOrderEventListener 在事务提交后处理
+ * - 设备状态由 BadgeDeviceStatusServiceImpl 在 BEFORE_COMMIT 阶段同步
*
* @author AI
*/
@@ -40,10 +61,6 @@ public class CleanOrderConfirmEventHandler implements RocketMQListener {
private static final String DEDUP_KEY_PATTERN = "ops:clean:dedup:confirm:%s";
private static final int DEDUP_TTL_SECONDS = 300;
- private static final String TTS_ORDER_IN_PROGRESS = "工单已在进行中";
- private static final String TTS_CANNOT_CONFIRM = "当前状态无法确认工单";
- private static final String TTS_CONFIRM_SUCCESS = "工单已确认,请前往作业区域开始作业";
-
@Resource
private ObjectMapper objectMapper;
@@ -56,12 +73,6 @@ public class CleanOrderConfirmEventHandler implements RocketMQListener {
@Resource
private OrderLifecycleManager orderLifecycleManager;
- @Resource
- private EventLogRecorder eventLogRecorder;
-
- @Resource
- private VoiceBroadcastService voiceBroadcastService;
-
@Override
public void onMessage(String message) {
try {
@@ -88,60 +99,43 @@ public class CleanOrderConfirmEventHandler implements RocketMQListener {
}
WorkOrderStatusEnum currentStatus = WorkOrderStatusEnum.fromStatus(order.getStatus());
- log.info("[CleanOrderConfirmEventHandler] 收到确认事件: eventId={}, orderId={}, currentStatus={}",
- eventId, orderId, currentStatus);
+ log.info("[CleanOrderConfirmEventHandler] 收到确认事件: eventId={}, orderId={}, currentStatus={}, deviceId={}",
+ eventId, orderId, currentStatus, event.getDeviceId());
// 4. 状态检查
- // 如果已在进行中 (CONFIRMED or ARRIVED),提示"工单已在进行中"
+ // 如果已在进行中 (CONFIRMED or ARRIVED),直接返回(TTS 由 Listener 处理)
if (currentStatus == WorkOrderStatusEnum.CONFIRMED || currentStatus == WorkOrderStatusEnum.ARRIVED) {
- sendTts(event.getDeviceId(), TTS_ORDER_IN_PROGRESS);
+ log.debug("[CleanOrderConfirmEventHandler] 工单已在进行中: orderId={}, status={}", orderId, currentStatus);
return;
}
// 检查是否可以确认
if (!currentStatus.canConfirm()) {
log.warn("[CleanOrderConfirmEventHandler] 当前状态无法确认工单: orderId={}, status={}", orderId, currentStatus);
- sendTts(event.getDeviceId(), TTS_CANNOT_CONFIRM);
return;
}
- // 5. 状态流转 -> CONFIRMED
+ // 5. 构建状态转换请求(包含 deviceId,供 Listener 使用)
OrderTransitionRequest request = OrderTransitionRequest.builder()
.orderId(orderId)
.targetStatus(WorkOrderStatusEnum.CONFIRMED)
.reason("工牌按键确认")
.operatorType(OperatorTypeEnum.CLEANER)
- .operatorId(order.getAssigneeId() != null ? order.getAssigneeId() : 0L)
+ .operatorId(event.getDeviceId() != null ? event.getDeviceId() : order.getAssigneeId())
.build();
+ // 将 deviceId 放入 payload,供 Listener 使用
+ request.putPayload("deviceId", event.getDeviceId());
+ request.putPayload("triggerSource", "BADGE_BUTTON");
+ // 6. 执行状态转换
+ // 注意:日志记录和 TTS 由 CleanOrderEventListener 在 AFTER_COMMIT 阶段处理
orderLifecycleManager.transition(request);
- // 6. 记录业务日志
- eventLogRecorder.info("clean", EventDomain.AUDIT, "ORDER_CONFIRM",
- "工单已确认 (工牌按键)", orderId, event.getDeviceId(), order.getAssigneeId());
-
- // 7. 发送 TTS 通知
- // "工单已确认,请前往{AreaName}开始作业"
- sendTts(event.getDeviceId(), TTS_CONFIRM_SUCCESS);
+ log.info("[CleanOrderConfirmEventHandler] 工单确认成功: orderId={}, deviceId={}", orderId, event.getDeviceId());
} catch (Exception e) {
log.error("[CleanOrderConfirmEventHandler] 消息处理失败: message={}", message, e);
throw new RuntimeException("保洁工单确认事件处理失败", e);
}
}
-
- /**
- * 发送 TTS 语音播报
- */
- private void sendTts(Long deviceId, String text) {
- if (deviceId == null) {
- return;
- }
- try {
- voiceBroadcastService.broadcast(deviceId, text);
- log.info("[CleanOrderConfirmEventHandler] TTS 下发成功: deviceId={}, text={}", deviceId, text);
- } catch (Exception e) {
- log.error("[CleanOrderConfirmEventHandler] TTS 发送失败: deviceId={}", deviceId, e);
- }
- }
}
diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderCreateEventHandler.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderCreateEventHandler.java
index c09a6b2..4148676 100644
--- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderCreateEventHandler.java
+++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderCreateEventHandler.java
@@ -1,8 +1,6 @@
package com.viewsh.module.ops.environment.integration.consumer;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.viewsh.module.iot.api.device.IotDeviceControlApi;
-import com.viewsh.module.iot.api.device.dto.ResetTrafficCounterReqDTO;
import com.viewsh.module.ops.enums.PriorityEnum;
import com.viewsh.module.ops.environment.dal.dataobject.CleanOrderAutoCreateReqDTO;
import com.viewsh.module.ops.environment.integration.dto.CleanOrderCreateEventDTO;
@@ -63,9 +61,6 @@ public class CleanOrderCreateEventHandler implements RocketMQListener {
@Resource
private CleanOrderService cleanOrderService;
- @Resource
- private IotDeviceControlApi iotDeviceControlApi;
-
@Resource
private EventLogRecorder eventLogRecorder;
@@ -110,11 +105,10 @@ public class CleanOrderCreateEventHandler implements RocketMQListener {
createReq.setPriority(PriorityEnum.fromPriority(event.getPriority() != null ?
Integer.parseInt(event.getPriority()) : 2).getPriority());
createReq.setAreaId(event.getAreaId());
- // location 字段由 areaId 自动关联,不需要在事件中传递
// 扩展字段
createReq.setExpectedDuration(calculateExpectedDuration(event));
- createReq.setCleaningType("ROUTINE"); // 可根据triggerSource动态设置
+ createReq.setCleaningType("ROUTINE");
createReq.setDifficultyLevel(3);
// IoT集成字段
@@ -122,6 +116,7 @@ public class CleanOrderCreateEventHandler implements RocketMQListener {
createReq.setTriggerRuleId(extractRuleId(event));
createReq.setTriggerDeviceId(event.getTriggerDeviceId());
createReq.setTriggerDeviceKey(event.getTriggerDeviceKey());
+ createReq.setTriggerData(event.getTriggerData());
// 2. 创建工单(同时创建主表+扩展表)
Long orderId = cleanOrderService.createAutoCleanOrder(createReq);
@@ -129,11 +124,7 @@ public class CleanOrderCreateEventHandler implements RocketMQListener {
// 3. 记录业务日志
recordOrderCreatedLog(event, orderId, createReq);
- // 4. 如果是客流触发的工单,重置客流计数器基准值
- // TODO: 需要优化这个工单是否创建成功,才重置
- if ("IOT_TRAFFIC".equals(event.getTriggerSource()) && event.getTriggerData() != null) {
- resetTrafficCounter(event, orderId);
- }
+ // 注意:客流计数器重置已移至 CleanOrderEventListener,在事务提交后执行
log.info("[CleanOrderCreateEventHandler] 工单创建成功: eventId={}, orderId={}, areaId={}",
event.getEventId(), orderId, event.getAreaId());
@@ -144,9 +135,8 @@ public class CleanOrderCreateEventHandler implements RocketMQListener {
*/
private void recordOrderCreatedLog(CleanOrderCreateEventDTO event, Long orderId, CleanOrderAutoCreateReqDTO createReq) {
try {
- // 确定事件域和类型
+ // 确定事件域
EventDomain domain = determineDomain(event.getTriggerSource());
- String eventType = "ORDER_CREATED";
// 构建扩展信息
Map extra = new HashMap<>();
@@ -159,19 +149,12 @@ public class CleanOrderCreateEventHandler implements RocketMQListener {
extra.putAll(event.getTriggerData());
}
- // 记录日志
- eventLogRecorder.info("clean", domain, eventType,
- buildLogMessage(event, createReq),
- orderId,
- event.getTriggerDeviceId(),
- null);
-
- // 添加扩展信息
+ // 记录日志(合并为一次调用)
eventLogRecorder.record(EventLogRecord.builder()
.module("clean")
.domain(domain)
- .eventType(eventType + "_DETAIL")
- .message("工单创建详细数据")
+ .eventType("ORDER_CREATED")
+ .message(buildLogMessage(event, createReq))
.targetId(orderId)
.targetType("order")
.deviceId(event.getTriggerDeviceId())
@@ -213,56 +196,6 @@ public class CleanOrderCreateEventHandler implements RocketMQListener {
event.getTriggerDeviceKey(), event.getTriggerSource());
}
- /**
- * 重置客流计数器基准值
- *
- * 工单创建成功后,通知 IoT 模块重置客流计数器,以便统计下一波客流
- *
- * @param event 工单创建事件
- * @param orderId 工单ID
- */
- private void resetTrafficCounter(CleanOrderCreateEventDTO event, Long orderId) {
- try {
- // 获取当前客流值作为新的基准值
- Object currentCountObj = event.getTriggerData().get("actualCount");
- Object baseValueObj = event.getTriggerData().get("baseValue");
-
- if (currentCountObj == null || baseValueObj == null) {
- log.warn("[CleanOrderCreateEventHandler] 缺少客流数据,跳过重置: eventId={}, actualCount={}, baseValue={}",
- event.getEventId(), currentCountObj, baseValueObj);
- return;
- }
-
- // 计算新的基准值 = 当前值
- Long currentCount = ((Number) currentCountObj).longValue();
- Long newBaseValue = currentCount; // 将当前客流设为新的基准值
-
- // 构建重置请求
- ResetTrafficCounterReqDTO reqDTO = ResetTrafficCounterReqDTO.builder()
- .deviceId(event.getTriggerDeviceId())
- .newBaseValue(newBaseValue)
- .orderId(orderId)
- .remark("工单创建后重置计数器")
- .build();
-
- // 调用 IoT 模块 RPC 接口
- var result = iotDeviceControlApi.resetTrafficCounter(reqDTO);
-
- if (result.getData() != null && result.getData()) {
- log.info("[CleanOrderCreateEventHandler] 客流计数器重置成功: eventId={}, deviceId={}, newBaseValue={}",
- event.getEventId(), event.getTriggerDeviceId(), newBaseValue);
- } else {
- log.warn("[CleanOrderCreateEventHandler] 客流计数器重置失败: eventId={}, deviceId={}",
- event.getEventId(), event.getTriggerDeviceId());
- }
-
- } catch (Exception e) {
- // 重置失败不应影响主流程
- log.error("[CleanOrderCreateEventHandler] 客流计数器重置异常: eventId={}, deviceId={}",
- event.getEventId(), event.getTriggerDeviceId(), e);
- }
- }
-
/**
* 生成工单标题
*/