fix(iot,ops): 确保信标相关审计事件包含orderId以支持工单关联查询
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled

修改内容:
1. BeaconDetectionRuleProcessor.publishAuditEvent 添加 orderId 参数
   - BEACON_ARRIVE_CONFIRMED 事件包含当前工单ID
   - BEACON_LEAVE_WARNING_SENT 事件从设备状态获取工单ID
   - TTS_REQUEST 事件不包含工单ID(非工单特定)

2. SignalLossRuleProcessor.publishAuditEvent 添加 orderId 参数
   - BEACON_COMPLETE_REQUESTED 事件包含当前工单ID
   - COMPLETE_SUPPRESSED_INVALID 事件从设备状态获取工单ID

3. CleanOrderAuditEventHandler 使用 EventLogRecord.builder()
   - 显式设置 targetId 和 targetType 字段
   - 确保 targetType="order" 当 orderId 存在时

影响范围:
- ops_business_event_log 表新增记录将正确包含 targetId 和 targetType
- 支持按工单ID查询所有相关审计日志
- 解决信标到岗/离岗/完成事件缺失工单关联的问题

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
lzh
2026-02-01 10:26:06 +08:00
parent fc1bc609e6
commit 46096a6e6b
4 changed files with 42 additions and 32 deletions

View File

@@ -171,7 +171,7 @@ public class BeaconDetectionRuleProcessor {
}
// 7. 发布审计日志
publishAuditEvent("BEACON_ARRIVE_CONFIRMED", deviceId, null, areaId,
publishAuditEvent("BEACON_ARRIVE_CONFIRMED", deviceId, null, areaId, currentOrder.getOrderId(),
"蓝牙信标自动到岗确认", triggerData);
}
@@ -209,13 +209,17 @@ public class BeaconDetectionRuleProcessor {
(exitConfig.getLossTimeoutMinutes() > 0 ? exitConfig.getLossTimeoutMinutes() + "分钟内工单将自动结算"
: "工单将自动结算"));
// 3. 发布审日志
// 3. 发布审<EFBFBD><EFBFBD><EFBFBD>日志
Map<String, Object> data = new HashMap<>();
data.put("firstLossTime", System.currentTimeMillis());
data.put("rssi", window.isEmpty() ? -999 : window.get(window.size() - 1));
data.put("warningDelayMinutes", exitConfig.getWarningDelayMinutes());
publishAuditEvent("BEACON_LEAVE_WARNING_SENT", deviceId, null, areaId,
// 获取当前工单ID
BadgeDeviceStatusRedisDAO.OrderInfo currentOrder = badgeDeviceStatusRedisDAO.getCurrentOrder(deviceId);
Long orderId = currentOrder != null ? currentOrder.getOrderId() : null;
publishAuditEvent("BEACON_LEAVE_WARNING_SENT", deviceId, null, areaId, orderId,
"保洁员离开作业区域,已发送警告", data);
} else {
// 4. 更新最后丢失时间
@@ -253,7 +257,7 @@ public class BeaconDetectionRuleProcessor {
* 发布审计事件
*/
private void publishAuditEvent(String auditType, Long deviceId, String deviceKey,
Long areaId, String message, Map<String, Object> data) {
Long areaId, Long orderId, String message, Map<String, Object> data) {
try {
CleanOrderAuditEvent event = CleanOrderAuditEvent.builder()
.eventId(java.util.UUID.randomUUID().toString())
@@ -261,14 +265,15 @@ public class BeaconDetectionRuleProcessor {
.deviceId(deviceId)
.deviceKey(deviceKey)
.areaId(areaId)
.orderId(orderId)
.message(message)
.data(data)
.build();
rocketMQTemplate.syncSend(CleanOrderTopics.ORDER_AUDIT, MessageBuilder.withPayload(event).build());
log.debug("[BeaconDetection] 发布审计事件auditType={}, deviceId={}, areaId={}",
auditType, deviceId, areaId);
log.debug("[BeaconDetection] 发布审计事件auditType={}, deviceId={}, areaId={}, orderId={}",
auditType, deviceId, areaId, orderId);
} catch (Exception e) {
log.error("[BeaconDetection] 发布审计事件失败auditType={}, deviceId={}", auditType, deviceId, e);
}
@@ -282,7 +287,7 @@ public class BeaconDetectionRuleProcessor {
data.put("tts", text);
data.put("timestamp", System.currentTimeMillis());
publishAuditEvent("TTS_REQUEST", deviceId, null, null, text, data);
publishAuditEvent("TTS_REQUEST", deviceId, null, null, null, text, data);
}
/**

View File

@@ -220,7 +220,11 @@ public class SignalLossRuleProcessor {
data.put("minValidWorkMinutes", exitConfig.getMinValidWorkMinutes());
data.put("shortageMs", minValidWorkMillis - durationMs);
publishAuditEvent("COMPLETE_SUPPRESSED_INVALID", deviceId, deviceKey, areaId,
// 获取当前工单ID
BadgeDeviceStatusRedisDAO.OrderInfo currentOrder = badgeDeviceStatusRedisDAO.getCurrentOrder(deviceId);
Long orderId = currentOrder != null ? currentOrder.getOrderId() : null;
publishAuditEvent("COMPLETE_SUPPRESSED_INVALID", deviceId, deviceKey, areaId, orderId,
"作业时长不足,抑制自动完成", data);
// 3. 清除丢失记录(允许重新进入)
@@ -280,7 +284,7 @@ public class SignalLossRuleProcessor {
auditData.put("durationMs", durationMs);
auditData.put("lastLossTime", lastLossTime);
publishAuditEvent("BEACON_COMPLETE_REQUESTED", deviceId, deviceKey, areaId,
publishAuditEvent("BEACON_COMPLETE_REQUESTED", deviceId, deviceKey, areaId, currentOrder.getOrderId(),
"信号丢失超时自动完成", auditData);
// 5. 清理 Redis 数据
@@ -302,7 +306,7 @@ public class SignalLossRuleProcessor {
* 发布审计事件
*/
private void publishAuditEvent(String auditType, Long deviceId, String deviceKey,
Long areaId, String message, Map<String, Object> data) {
Long areaId, Long orderId, String message, Map<String, Object> data) {
try {
CleanOrderAuditEvent event = CleanOrderAuditEvent.builder()
.eventId(java.util.UUID.randomUUID().toString())
@@ -310,13 +314,14 @@ public class SignalLossRuleProcessor {
.deviceId(deviceId)
.deviceKey(deviceKey)
.areaId(areaId)
.orderId(orderId)
.message(message)
.data(data)
.build();
rocketMQTemplate.syncSend(CleanOrderTopics.ORDER_AUDIT, MessageBuilder.withPayload(event).build());
log.debug("[SignalLoss] 发布审计事件auditType={}, deviceId={}", auditType, deviceId);
log.debug("[SignalLoss] 发布审计事件auditType={}, deviceId={}, orderId={}", auditType, deviceId, orderId);
} catch (Exception e) {
log.error("[SignalLoss] 发布审计事件失败auditType={}, deviceId={}", auditType, deviceId, e);
}
@@ -330,7 +335,7 @@ public class SignalLossRuleProcessor {
data.put("tts", text);
data.put("timestamp", System.currentTimeMillis());
publishAuditEvent("TTS_REQUEST", deviceId, null, null, text, data);
publishAuditEvent("TTS_REQUEST", deviceId, null, null, null, text, data);
}
/**