Переглянути джерело

优化事件类及mqtt监听类解决接收事件报错问题——目前USB与巡检

zhaojinyu 1 день тому
батько
коміт
71317e348e

+ 0 - 1
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasRoadblockEvent.java

@@ -20,7 +20,6 @@ public class SasRoadblockEvent implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    // 手动指定ID,与其他事件保持一致
     @TableId(value = "event_id", type = IdType.INPUT)
     private String eventId;
 

+ 0 - 1
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasUsbEvent.java

@@ -19,7 +19,6 @@ public class SasUsbEvent implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    // 关键修改:指定 IdType 为 INPUT(手动输入)
     @TableId(value = "event_id", type = IdType.INPUT)
     private String eventId;
 

+ 118 - 334
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/MqttService.java

@@ -2,6 +2,7 @@ package com.usky.sas.mqtt;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.IdUtil;
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.usky.sas.domain.*;
@@ -39,47 +40,35 @@ public class MqttService {
     @Value("${mqtt.password:}")
     private String password;
 
-    // 修改为 String 类型,逗号分隔
     @Value("${mqtt.topics:}")
     private String topics;
 
     private MqttClient client;
-    private final ObjectMapper mapper = new ObjectMapper();
+    private final ObjectMapper mapper = new ObjectMapper()
+            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
     private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
     @Autowired
     private SasUsbEventService usbEventService;
-
     @Autowired
     private SasSnapEventService snapEventService;
-
     @Autowired
     private SasEntranceEventService entranceEventService;
-
     @Autowired
     private SasParkingEventService parkingEventService;
-
     @Autowired
     private SasRoadblockEventService roadblockEventService;
-
     @Autowired
     private SasAlarsasEventService alarsasEventService;
-
     @Autowired
     private SasPatrolEventService patrolEventService;
-
     @Autowired
     private SasAcquisitionEventService acquisitionEventService;
-
     @Autowired
     private SasPerceptionEventService perceptionEventService;
-
     @Autowired
     private SasCollectionEventService collectionEventService;
 
-    /**
-     * 初始化MQTT连接
-     */
     @PostConstruct
     public void init() {
         try {
@@ -96,12 +85,10 @@ public class MqttService {
             options.setKeepAliveInterval(60);
             options.setAutomaticReconnect(true);
 
-            // 设置回调
             client.setCallback(new MqttCallbackExtended() {
                 @Override
                 public void connectComplete(boolean reconnect, String serverURI) {
                     log.info("MQTT连接成功, reconnect={}", reconnect);
-                    // 解析并订阅所有主题
                     parseTopics().forEach(MqttService.this::subscribe);
                 }
 
@@ -128,67 +115,69 @@ public class MqttService {
         }
     }
 
-
-    /**
-     * 解析逗号分隔的主题
-     */
     private List<String> parseTopics() {
         return Arrays.asList(topics.split(","));
     }
 
-    /**
-     * 消息处理分发
-     */
     private void processMessage(String topic, MqttMessage message) {
         String payload = new String(message.getPayload());
-        log.info("收到MQTT消息, topic={}, payload={}", topic, payload);
+        log.debug("收到MQTT消息, topic={}, payload={}", topic, payload);
 
         try {
-            // USB事件
-            if (topic.contains("event/usbalarm")) {
-                handleUsbEvent(payload, topic);
-            }
-            // 抓拍事件
-            else if (topic.contains("event/snap")) {
-                handleSnapEvent(payload, topic);
-            }
-
-            // 出入门禁事件
-            else if (topic.contains("event/entrance")) {
-                handleEntranceEvent(payload, topic);
-            }
-
-            // 停车场车牌抓拍事件
-            else if (topic.contains("event/parking")) {
-                handleParkingEvent(payload, topic);
+            // 从topic中提取事件类型,支持多级路径如 event/patrol/xxx 或 event/patrol
+            String[] parts = topic.split("/");
+            if (parts.length < 2) {
+                log.warn("未知的topic格式: {}", topic);
+                return;
             }
 
-            // 阻车路障探测事件
-            else if (topic.contains("event/roadblock")) {
-                handleRoadblockEvent(payload, topic);
+            // 查找事件类型关键字在topic中的位置
+            String eventType = null;
+            for (int i = 0; i < parts.length - 1; i++) {
+                if ("event".equals(parts[i]) && i + 1 < parts.length) {
+                    eventType = parts[i + 1];
+                    break;
+                }
             }
 
-            // 入侵紧急报警事件
-            else if (topic.contains("event/alarm")) {
-                handleAlarsasEvent(payload, topic);
+            if (eventType == null) {
+                log.warn("无法从topic解析事件类型: {}", topic);
+                return;
             }
 
-            // 实时电子巡检事件
-            else if (topic.contains("event/patrol")) {
-                handlePatrolEvent(payload, topic);
-            }
-
-            // 数据采集事件
-            else if (topic.contains("event/acquisition")) {
-                handleAcquisitionEvent(payload, topic);
-            }
-            // 状态感知事件
-            else if (topic.contains("event/perception")) {
-                handlePerceptionEvent(payload, topic);
-            }
-            // 状态采集事件
-            else if (topic.contains("event/collection")) {
-                handleCollectionEvent(payload, topic);
+            switch (eventType) {
+                case "usbalarm":
+                    handleUsbEvent(payload, topic);
+                    break;
+                case "snap":
+                    handleSnapEvent(payload, topic);
+                    break;
+                case "entrance":
+                    handleEntranceEvent(payload, topic);
+                    break;
+                case "parking":
+                    handleParkingEvent(payload, topic);
+                    break;
+                case "roadblock":
+                    handleRoadblockEvent(payload, topic);
+                    break;
+                case "alarm":
+                    handleAlarsasEvent(payload, topic);
+                    break;
+                case "patrol":
+                    handlePatrolEvent(payload, topic);
+                    break;
+                case "acquisition":
+                    handleAcquisitionEvent(payload, topic);
+                    break;
+                case "perception":
+                    handlePerceptionEvent(payload, topic);
+                    break;
+                case "collection":
+                    handleCollectionEvent(payload, topic);
+                    break;
+                default:
+                    log.warn("未知的事件类型: {}, topic={}", eventType, topic);
             }
 
         } catch (Exception e) {
@@ -196,9 +185,6 @@ public class MqttService {
         }
     }
 
-    /**
-     * 处理USB事件(修复版:确保eventId正确设置)
-     */
     private void handleUsbEvent(String payload, String topic) {
         try {
             JsonNode root = mapper.readTree(payload);
@@ -206,54 +192,29 @@ public class MqttService {
 
             if ("event".equals(method)) {
                 UsbEventMessage message = mapper.readValue(payload, UsbEventMessage.class);
-
-                // 关键修复:先创建实体,先生成ID,再复制其他属性
                 SasUsbEvent event = new SasUsbEvent();
 
-                // 步骤1:先生成并设置 eventId(必须在copyProperties之前)
-                String eventId = IdUtil.randomUUID();
+                String eventId = message.getId() != null && !message.getId().isEmpty()
+                        ? message.getId()
+                        : IdUtil.randomUUID();
                 event.setEventId(eventId);
 
-                // 调试日志:确认eventId已设置
-                log.debug("生成的eventId: {}", eventId);
-                log.debug("设置后event.getEventId(): {}", event.getEventId());
-
-                // 步骤2:复制其他属性,但忽略eventId字段(防止被null覆盖)
                 BeanUtil.copyProperties(message, event, "eventId");
-
-                // 步骤3:设置其他特殊字段映射
                 event.setCardId(message.getIcId());
                 event.setTriggerTime(parseTime(message.getTriggerTime()));
                 event.setCreateTime(LocalDateTime.now());
                 event.setUpdateTime(LocalDateTime.now());
 
-                // 最终检查:确保eventId不为null
-                if (event.getEventId() == null) {
-                    log.error("eventId为null,重新生成");
-                    event.setEventId(IdUtil.randomUUID());
-                }
-
-                // 调试日志:保存前的最终状态
-                log.info("保存USB事件: eventId={}, deviceId={}, eventCode={}",
-                        event.getEventId(), event.getDeviceId(), event.getEventCode());
-
-                // 保存到数据库
                 usbEventService.save(event);
                 log.info("USB事件保存成功, eventId={}", event.getEventId());
+            } else if ("heart".equals(method)) {
+                log.debug("收到USB设备心跳, deviceId={}", extractDeviceId(topic));
             }
-            else if ("heart".equals(method)) {
-                String deviceId = extractDeviceId(topic);
-                log.info("收到设备心跳, deviceId={}", deviceId);
-            }
-
         } catch (Exception e) {
             log.error("处理USB事件失败: {}", e.getMessage(), e);
         }
     }
 
-    /**
-     * 处理抓拍事件
-     */
     private void handleSnapEvent(String payload, String topic) {
         try {
             JsonNode root = mapper.readTree(payload);
@@ -261,50 +222,28 @@ public class MqttService {
 
             if ("event".equals(method)) {
                 SnapEventMessage message = mapper.readValue(payload, SnapEventMessage.class);
-
-                // 1. 创建实体并生成唯一eventId(防止被覆盖)
                 SasSnapEvent event = new SasSnapEvent();
-                String eventId = IdUtil.randomUUID();
-                event.setEventId(eventId);
 
-                // 调试日志
-                log.debug("生成的抓拍事件eventId: {}", eventId);
+                String eventId = message.getId() != null && !message.getId().isEmpty()
+                        ? message.getId()
+                        : IdUtil.randomUUID();
+                event.setEventId(eventId);
 
-                // 2. 复制属性,忽略eventId字段
                 BeanUtil.copyProperties(message, event, "eventId");
-
-                // 3. 特殊字段映射和转换
-                event.setTriggerTime(parseTime(message.getTriggerTime()));  // 时间字符串转LocalDateTime
+                event.setTriggerTime(parseTime(message.getTriggerTime()));
                 event.setCreateTime(LocalDateTime.now());
                 event.setUpdateTime(LocalDateTime.now());
 
-                // 最终检查:确保eventId不为null
-                if (event.getEventId() == null) {
-                    log.error("抓拍事件eventId为null,重新生成");
-                    event.setEventId(IdUtil.randomUUID());
-                }
-
-                // 调试日志:保存前的最终状态
-                log.info("保存抓拍事件: eventId={}, deviceId={}, eventCode={}",
-                        event.getEventId(), event.getDeviceId(), event.getEventCode());
-
-                // 保存到数据库
                 snapEventService.save(event);
                 log.info("抓拍事件保存成功, eventId={}", event.getEventId());
+            } else if ("heart".equals(method)) {
+                log.debug("收到抓拍设备心跳, deviceId={}", extractDeviceId(topic));
             }
-            else if ("heart".equals(method)) {
-                String deviceId = extractDeviceId(topic);
-                log.info("收到抓拍设备心跳, deviceId={}", deviceId);
-            }
-
         } catch (Exception e) {
             log.error("处理抓拍事件失败: {}", e.getMessage(), e);
         }
     }
 
-    /**
-     * 处理出入门禁事件
-     */
     private void handleEntranceEvent(String payload, String topic) {
         try {
             JsonNode root = mapper.readTree(payload);
@@ -312,51 +251,29 @@ public class MqttService {
 
             if ("event".equals(method)) {
                 EntranceEventMessage message = mapper.readValue(payload, EntranceEventMessage.class);
-
-                // 1. 创建实体并生成唯一eventId(防止被覆盖)
                 SasEntranceEvent event = new SasEntranceEvent();
-                String eventId = IdUtil.randomUUID();
-                event.setEventId(eventId);
 
-                // 调试日志
-                log.debug("生成的门禁事件eventId: {}", eventId);
+                String eventId = message.getId() != null && !message.getId().isEmpty()
+                        ? message.getId()
+                        : IdUtil.randomUUID();
+                event.setEventId(eventId);
 
-                // 2. 复制属性,忽略eventId字段
                 BeanUtil.copyProperties(message, event, "eventId");
-
-                // 3. 特殊字段映射和转换
-                event.setCardId(message.getIcId());  // icId映射为cardId(与USB事件一致)
-                event.setTriggerTime(parseTime(message.getTriggerTime()));  // 时间字符串转LocalDateTime
+                event.setCardId(message.getIcId());
+                event.setTriggerTime(parseTime(message.getTriggerTime()));
                 event.setCreateTime(LocalDateTime.now());
                 event.setUpdateTime(LocalDateTime.now());
 
-                // 最终检查:确保eventId不为null
-                if (event.getEventId() == null) {
-                    log.error("门禁事件eventId为null,重新生成");
-                    event.setEventId(IdUtil.randomUUID());
-                }
-
-                // 调试日志:保存前的最终状态
-                log.info("保存门禁事件: eventId={}, deviceId={}, eventCode={}, name={}",
-                        event.getEventId(), event.getDeviceId(), event.getEventCode(), event.getName());
-
-                // 保存到数据库
                 entranceEventService.save(event);
                 log.info("门禁事件保存成功, eventId={}", event.getEventId());
+            } else if ("heart".equals(method)) {
+                log.debug("收到门禁设备心跳, deviceId={}", extractDeviceId(topic));
             }
-            else if ("heart".equals(method)) {
-                String deviceId = extractDeviceId(topic);
-                log.info("收到门禁设备心跳, deviceId={}", deviceId);
-            }
-
         } catch (Exception e) {
             log.error("处理门禁事件失败: {}", e.getMessage(), e);
         }
     }
 
-    /**
-     * 处理停车场车牌抓拍事件
-     */
     private void handleParkingEvent(String payload, String topic) {
         try {
             JsonNode root = mapper.readTree(payload);
@@ -364,50 +281,28 @@ public class MqttService {
 
             if ("event".equals(method)) {
                 ParkingEventMessage message = mapper.readValue(payload, ParkingEventMessage.class);
-
-                // 1. 创建实体并生成唯一eventId(防止被覆盖)
                 SasParkingEvent event = new SasParkingEvent();
-                String eventId = IdUtil.randomUUID();
-                event.setEventId(eventId);
 
-                // 调试日志
-                log.debug("生成的停车场事件eventId: {}", eventId);
+                String eventId = message.getId() != null && !message.getId().isEmpty()
+                        ? message.getId()
+                        : IdUtil.randomUUID();
+                event.setEventId(eventId);
 
-                // 2. 复制属性,忽略eventId字段
                 BeanUtil.copyProperties(message, event, "eventId");
-
-                // 3. 特殊字段映射和转换
-                event.setTriggerTime(parseTime(message.getTriggerTime()));  // 时间字符串转LocalDateTime
+                event.setTriggerTime(parseTime(message.getTriggerTime()));
                 event.setCreateTime(LocalDateTime.now());
                 event.setUpdateTime(LocalDateTime.now());
 
-                // 最终检查:确保eventId不为null
-                if (event.getEventId() == null) {
-                    log.error("停车场事件eventId为null,重新生成");
-                    event.setEventId(IdUtil.randomUUID());
-                }
-
-                // 调试日志:保存前的最终状态
-                log.info("保存停车场事件: eventId={}, deviceId={}, plateNo={}, accessType={}",
-                        event.getEventId(), event.getDeviceId(), event.getPlateNo(), event.getAccessType());
-
-                // 保存到数据库
                 parkingEventService.save(event);
                 log.info("停车场事件保存成功, eventId={}", event.getEventId());
+            } else if ("heart".equals(method)) {
+                log.debug("收到停车场设备心跳, deviceId={}", extractDeviceId(topic));
             }
-            else if ("heart".equals(method)) {
-                String deviceId = extractDeviceId(topic);
-                log.info("收到停车场设备心跳, deviceId={}", deviceId);
-            }
-
         } catch (Exception e) {
             log.error("处理停车场事件失败: {}", e.getMessage(), e);
         }
     }
 
-    /**
-     * 处理阻车路障探测事件
-     */
     private void handleRoadblockEvent(String payload, String topic) {
         try {
             JsonNode root = mapper.readTree(payload);
@@ -415,50 +310,28 @@ public class MqttService {
 
             if ("event".equals(method)) {
                 RoadblockEventMessage message = mapper.readValue(payload, RoadblockEventMessage.class);
-
-                // 1. 创建实体并生成唯一eventId(防止被覆盖)
                 SasRoadblockEvent event = new SasRoadblockEvent();
-                String eventId = IdUtil.randomUUID();
-                event.setEventId(eventId);
 
-                // 调试日志
-                log.debug("生成的阻车路障事件eventId: {}", eventId);
+                String eventId = message.getId() != null && !message.getId().isEmpty()
+                        ? message.getId()
+                        : IdUtil.randomUUID();
+                event.setEventId(eventId);
 
-                // 2. 复制属性,忽略eventId字段
                 BeanUtil.copyProperties(message, event, "eventId");
-
-                // 3. 特殊字段映射和转换
-                event.setTriggerTime(parseTime(message.getTriggerTime()));  // 时间字符串转LocalDateTime
+                event.setTriggerTime(parseTime(message.getTriggerTime()));
                 event.setCreateTime(LocalDateTime.now());
                 event.setUpdateTime(LocalDateTime.now());
 
-                // 最终检查:确保eventId不为null
-                if (event.getEventId() == null) {
-                    log.error("阻车路障事件eventId为null,重新生成");
-                    event.setEventId(IdUtil.randomUUID());
-                }
-
-                // 调试日志:保存前的最终状态
-                log.info("保存阻车路障事件: eventId={}, deviceId={}, eventCode={}, val={}",
-                        event.getEventId(), event.getDeviceId(), event.getEventCode(), event.getVal());
-
-                // 保存到数据库
                 roadblockEventService.save(event);
                 log.info("阻车路障事件保存成功, eventId={}", event.getEventId());
+            } else if ("heart".equals(method)) {
+                log.debug("收到阻车路障设备心跳, deviceId={}", extractDeviceId(topic));
             }
-            else if ("heart".equals(method)) {
-                String deviceId = extractDeviceId(topic);
-                log.info("收到阻车路障设备心跳, deviceId={}", deviceId);
-            }
-
         } catch (Exception e) {
             log.error("处理阻车路障事件失败: {}", e.getMessage(), e);
         }
     }
 
-    /**
-     * 处理入侵紧急报警事件
-     */
     private void handleAlarsasEvent(String payload, String topic) {
         try {
             JsonNode root = mapper.readTree(payload);
@@ -466,50 +339,28 @@ public class MqttService {
 
             if ("event".equals(method)) {
                 AlarsasEventMessage message = mapper.readValue(payload, AlarsasEventMessage.class);
-
-                // 1. 创建实体并生成唯一eventId(防止被覆盖)
                 SasAlarsasEvent event = new SasAlarsasEvent();
-                String eventId = IdUtil.randomUUID();
-                event.setEventId(eventId);
 
-                // 调试日志
-                log.debug("生成的入侵报警事件eventId: {}", eventId);
+                String eventId = message.getId() != null && !message.getId().isEmpty()
+                        ? message.getId()
+                        : IdUtil.randomUUID();
+                event.setEventId(eventId);
 
-                // 2. 复制属性,忽略eventId字段
                 BeanUtil.copyProperties(message, event, "eventId");
-
-                // 3. 特殊字段映射和转换
-                event.setTriggerTime(parseTime(message.getTriggerTime()));  // 时间字符串转LocalDateTime
+                event.setTriggerTime(parseTime(message.getTriggerTime()));
                 event.setCreateTime(LocalDateTime.now());
                 event.setUpdateTime(LocalDateTime.now());
 
-                // 最终检查:确保eventId不为null
-                if (event.getEventId() == null) {
-                    log.error("入侵报警事件eventId为null,重新生成");
-                    event.setEventId(IdUtil.randomUUID());
-                }
-
-                // 调试日志:保存前的最终状态
-                log.info("保存入侵报警事件: eventId={}, deviceId={}, eventCode={}, relPerson={}",
-                        event.getEventId(), event.getDeviceId(), event.getEventCode(), event.getRelPerson());
-
-                // 保存到数据库
                 alarsasEventService.save(event);
                 log.info("入侵报警事件保存成功, eventId={}", event.getEventId());
+            } else if ("heart".equals(method)) {
+                log.debug("收到入侵报警设备心跳, deviceId={}", extractDeviceId(topic));
             }
-            else if ("heart".equals(method)) {
-                String deviceId = extractDeviceId(topic);
-                log.info("收到入侵报警设备心跳, deviceId={}", deviceId);
-            }
-
         } catch (Exception e) {
             log.error("处理入侵报警事件失败: {}", e.getMessage(), e);
         }
     }
 
-    /**
-     * 处理实时电子巡检事件
-     */
     private void handlePatrolEvent(String payload, String topic) {
         try {
             JsonNode root = mapper.readTree(payload);
@@ -517,50 +368,28 @@ public class MqttService {
 
             if ("event".equals(method)) {
                 PatrolEventMessage message = mapper.readValue(payload, PatrolEventMessage.class);
-
-                // 1. 创建实体并生成唯一eventId(防止被覆盖)
                 SasPatrolEvent event = new SasPatrolEvent();
-                String eventId = IdUtil.randomUUID();
-                event.setEventId(eventId);
 
-                // 调试日志
-                log.debug("生成的巡检事件eventId: {}", eventId);
+                String eventId = message.getId() != null && !message.getId().isEmpty()
+                        ? message.getId()
+                        : IdUtil.randomUUID();
+                event.setEventId(eventId);
 
-                // 2. 复制属性,忽略eventId字段
                 BeanUtil.copyProperties(message, event, "eventId");
-
-                // 3. 特殊字段映射和转换
-                event.setTriggerTime(parseTime(message.getTriggerTime()));  // 时间字符串转LocalDateTime
+                event.setTriggerTime(parseTime(message.getTriggerTime()));
                 event.setCreateTime(LocalDateTime.now());
                 event.setUpdateTime(LocalDateTime.now());
 
-                // 最终检查:确保eventId不为null
-                if (event.getEventId() == null) {
-                    log.error("巡检事件eventId为null,重新生成");
-                    event.setEventId(IdUtil.randomUUID());
-                }
-
-                // 调试日志:保存前的最终状态
-                log.info("保存巡检事件: eventId={}, deviceId={}, eventCode={}, name={}",
-                        event.getEventId(), event.getDeviceId(), event.getEventCode(), event.getName());
-
-                // 保存到数据库
                 patrolEventService.save(event);
                 log.info("巡检事件保存成功, eventId={}", event.getEventId());
+            } else if ("heart".equals(method)) {
+                log.debug("收到巡检设备心跳, deviceId={}", extractDeviceId(topic));
             }
-            else if ("heart".equals(method)) {
-                String deviceId = extractDeviceId(topic);
-                log.info("收到巡检设备心跳, deviceId={}", deviceId);
-            }
-
         } catch (Exception e) {
             log.error("处理巡检事件失败: {}", e.getMessage(), e);
         }
     }
 
-    /**
-     * 处理数据采集设备事件
-     */
     private void handleAcquisitionEvent(String payload, String topic) {
         try {
             JsonNode root = mapper.readTree(payload);
@@ -568,40 +397,28 @@ public class MqttService {
 
             if ("event".equals(method)) {
                 AcquisitionEventMessage message = mapper.readValue(payload, AcquisitionEventMessage.class);
-
-                // 生成eventId并创建实体
                 SasAcquisitionEvent event = new SasAcquisitionEvent();
-                String eventId = IdUtil.randomUUID();
+
+                String eventId = message.getId() != null && !message.getId().isEmpty()
+                        ? message.getId()
+                        : IdUtil.randomUUID();
                 event.setEventId(eventId);
 
-                // 复制属性(忽略eventId)
                 BeanUtil.copyProperties(message, event, "eventId");
-
-                // 时间转换和通用字段设置
                 event.setTriggerTime(parseTime(message.getTriggerTime()));
                 event.setCreateTime(LocalDateTime.now());
                 event.setUpdateTime(LocalDateTime.now());
 
-                // 兜底检查
-                if (event.getEventId() == null) {
-                    event.setEventId(IdUtil.randomUUID());
-                }
-
-                // 保存数据
                 acquisitionEventService.save(event);
-                log.info("数据采集事件保存成功, eventId={}, deviceId={}", event.getEventId(), event.getDeviceId());
+                log.info("数据采集事件保存成功, eventId={}", event.getEventId());
             } else if ("heart".equals(method)) {
-                String deviceId = extractDeviceId(topic);
-                log.info("收到数据采集设备心跳, deviceId={}", deviceId);
+                log.debug("收到数据采集设备心跳, deviceId={}", extractDeviceId(topic));
             }
         } catch (Exception e) {
             log.error("处理数据采集事件失败", e);
         }
     }
 
-    /**
-     * 处理状态感知探测事件
-     */
     private void handlePerceptionEvent(String payload, String topic) {
         try {
             JsonNode root = mapper.readTree(payload);
@@ -609,40 +426,28 @@ public class MqttService {
 
             if ("event".equals(method)) {
                 PerceptionEventMessage message = mapper.readValue(payload, PerceptionEventMessage.class);
-
-                // 生成eventId并创建实体
                 SasPerceptionEvent event = new SasPerceptionEvent();
-                String eventId = IdUtil.randomUUID();
+
+                String eventId = message.getId() != null && !message.getId().isEmpty()
+                        ? message.getId()
+                        : IdUtil.randomUUID();
                 event.setEventId(eventId);
 
-                // 复制属性(忽略eventId)
                 BeanUtil.copyProperties(message, event, "eventId");
-
-                // 时间转换和通用字段设置
                 event.setTriggerTime(parseTime(message.getTriggerTime()));
                 event.setCreateTime(LocalDateTime.now());
                 event.setUpdateTime(LocalDateTime.now());
 
-                // 兜底检查
-                if (event.getEventId() == null) {
-                    event.setEventId(IdUtil.randomUUID());
-                }
-
-                // 保存数据
                 perceptionEventService.save(event);
-                log.info("状态感知事件保存成功, eventId={}, deviceId={}", event.getEventId(), event.getDeviceId());
+                log.info("状态感知事件保存成功, eventId={}", event.getEventId());
             } else if ("heart".equals(method)) {
-                String deviceId = extractDeviceId(topic);
-                log.info("收到状态感知设备心跳, deviceId={}", deviceId);
+                log.debug("收到状态感知设备心跳, deviceId={}", extractDeviceId(topic));
             }
         } catch (Exception e) {
             log.error("处理状态感知事件失败", e);
         }
     }
 
-    /**
-     * 处理状态采集探测事件
-     */
     private void handleCollectionEvent(String payload, String topic) {
         try {
             JsonNode root = mapper.readTree(payload);
@@ -650,48 +455,33 @@ public class MqttService {
 
             if ("event".equals(method)) {
                 CollectionEventMessage message = mapper.readValue(payload, CollectionEventMessage.class);
-
-                // 生成eventId并创建实体
                 SasCollectionEvent event = new SasCollectionEvent();
-                String eventId = IdUtil.randomUUID();
+
+                String eventId = message.getId() != null && !message.getId().isEmpty()
+                        ? message.getId()
+                        : IdUtil.randomUUID();
                 event.setEventId(eventId);
 
-                // 复制属性(忽略eventId)
                 BeanUtil.copyProperties(message, event, "eventId");
-
-                // 时间转换和通用字段设置
                 event.setTriggerTime(parseTime(message.getTriggerTime()));
                 event.setCreateTime(LocalDateTime.now());
                 event.setUpdateTime(LocalDateTime.now());
 
-                // 兜底检查
-                if (event.getEventId() == null) {
-                    event.setEventId(IdUtil.randomUUID());
-                }
-
-                // 保存数据
                 collectionEventService.save(event);
-                log.info("状态采集事件保存成功, eventId={}, deviceId={}", event.getEventId(), event.getDeviceId());
+                log.info("状态采集事件保存成功, eventId={}", event.getEventId());
             } else if ("heart".equals(method)) {
-                String deviceId = extractDeviceId(topic);
-                log.info("收到状态采集设备心跳, deviceId={}", deviceId);
+                log.debug("收到状态采集设备心跳, deviceId={}", extractDeviceId(topic));
             }
         } catch (Exception e) {
             log.error("处理状态采集事件失败", e);
         }
     }
 
-    /**
-     * 从主题提取设备ID
-     */
     private String extractDeviceId(String topic) {
         String[] parts = topic.split("/");
         return parts.length > 0 ? parts[parts.length - 1] : "unknown";
     }
 
-    /**
-     * 解析时间字符串
-     */
     private LocalDateTime parseTime(String timeStr) {
         if (timeStr == null || timeStr.isEmpty()) {
             return LocalDateTime.now();
@@ -704,9 +494,6 @@ public class MqttService {
         }
     }
 
-    /**
-     * 订阅主题
-     */
     public void subscribe(String topic) {
         try {
             if (client != null && client.isConnected()) {
@@ -718,9 +505,6 @@ public class MqttService {
         }
     }
 
-    /**
-     * 断开连接
-     */
     @PreDestroy
     public void disconnect() {
         try {

+ 1 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/dto/AcquisitionEventMessage.java

@@ -10,6 +10,7 @@ import java.math.BigDecimal;
 public class AcquisitionEventMessage {
 
     private String method;          // "event" 或 "heart"
+    private String id;
     private String deviceId;
     private Integer channel;
     private String triggerTime;     // 字符串格式时间

+ 1 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/dto/AlarsasEventMessage.java

@@ -10,6 +10,7 @@ public class AlarsasEventMessage {
 
     // MQTT消息基础字段
     private String method;          // "event" 或 "heart"
+    private String id;
 
     // 入侵报警事件特有字段(与数据表字段对应)
     private String deviceId;

+ 1 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/dto/CollectionEventMessage.java

@@ -10,6 +10,7 @@ import java.math.BigDecimal;
 public class CollectionEventMessage {
 
     private String method;          // "event" 或 "heart"
+    private String id;
     private String deviceId;
     private Integer channel;
     private String triggerTime;     // 字符串格式时间

+ 1 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/dto/EntranceEventMessage.java

@@ -10,6 +10,7 @@ public class EntranceEventMessage {
 
     // MQTT消息基础字段
     private String method;          // "event" 或 "heart"
+    private String id;
 
     // 门禁事件特有字段(与数据表字段对应)
     private String deviceId;

+ 1 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/dto/ParkingEventMessage.java

@@ -10,6 +10,7 @@ public class ParkingEventMessage {
 
     // MQTT消息基础字段
     private String method;          // "event" 或 "heart"
+    private String id;
 
     // 停车场事件特有字段(与数据表字段对应)
     private String deviceId;

+ 1 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/dto/PatrolEventMessage.java

@@ -10,6 +10,7 @@ public class PatrolEventMessage {
 
     // MQTT消息基础字段
     private String method;          // "event" 或 "heart"
+    private String id;
 
     // 巡检事件特有字段(与数据表字段对应)
     private String deviceId;

+ 1 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/dto/PerceptionEventMessage.java

@@ -9,6 +9,7 @@ import lombok.Data;
 public class PerceptionEventMessage {
 
     private String method;          // "event" 或 "heart"
+    private String id;
     private String deviceId;
     private Integer channel;
     private String triggerTime;     // 字符串格式时间

+ 1 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/dto/RoadblockEventMessage.java

@@ -11,6 +11,7 @@ public class RoadblockEventMessage {
 
     // MQTT消息基础字段
     private String method;          // "event" 或 "heart"
+    private String id;
 
     // 阻车路障事件特有字段(与数据表字段对应)
     private String deviceId;

+ 1 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/dto/SnapEventMessage.java

@@ -10,6 +10,7 @@ public class SnapEventMessage {
 
     // MQTT消息基础字段
     private String method;          // "event" 或其他
+    private String id;
 
     // 抓拍事件特有字段(与数据表字段对应)
     private String deviceId;

+ 2 - 1
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/dto/UsbEventMessage.java

@@ -9,7 +9,8 @@ import lombok.Data;
 public class UsbEventMessage {
 
     // MQTT消息基础字段
-    private String method;          // "event" 或 "heart"
+    private String method;
+    private String id;// "event" 或 "heart"
 
     // USB事件特有字段(根据实际MQTT报文调整)
     private String deviceId;