Просмотр исходного кода

refactor(serial/MQTT display & backend): 优化数据展示布局与后端设备处理逻辑

1. 重构SerialDataDisplay和MQTTDataDisplay组件的CSS布局,使用flex布局替代固定高度实现自适应滚动
2. 重构后端modbus广播查询逻辑,提取设备处理逻辑到process_responses方法中
3. 补充设备离线检测的设备更新逻辑,完善面板设备的心跳记录
wenhongquan 1 день назад
Родитель
Сommit
dab2875d86

+ 14 - 7
backend/app.py

@@ -2365,15 +2365,18 @@ def modbus_broadcast_query():
             return jsonify({'success': False, 'message': '串口未连接'}), 400
 
         responses = address_config.broadcast_query(timeout)
-        for r in responses:
-            uid = r.get('uid', '').lower()
-            if uid and uid not in address_config.get_stored_devices():
-                addr = len(address_config.get_stored_devices()) + 1
-                address_config.add_stored_device(uid, addr)
-                logger.info(f"自动保存发现设备: UID={uid}, 地址={addr}")
+        assign_results = []
         if responses:
+            assign_results = address_config.process_responses(responses)
+            for r in assign_results:
+                uid_bytes = r.get('uid', r.get('request', ''))
             save_device_config()
-        return jsonify({'success': True, 'responses': responses, 'count': len(responses)})
+        return jsonify({
+            'success': True,
+            'responses': responses,
+            'assign_results': assign_results,
+            'count': len(responses)
+        })
 
     except Exception as e:
         logger.error(f'广播查询失败: {str(e)}')
@@ -3414,6 +3417,8 @@ if __name__ == '__main__':
                     now = time.time()
                     for uid in address_config.get_stored_devices():
                         device_last_seen[uid] = now
+                    for pid in panel_config:
+                        device_last_seen[pid] = now
                 except Exception as e:
                     logger.error(f"自动发现异常: {str(e)}")
         import threading
@@ -3491,6 +3496,8 @@ if __name__ == '__main__':
 
                         if panel_ok:
                             online += 1
+                            device_last_seen[panel_id] = time.time()
+                            device_last_seen[cfg.get('panel_uid', '')] = time.time()
                             dtu_publish_panel_status(panel_id, addr, panel_ports)
                         else:
                             offline += 1

+ 6 - 3
frontend/src/components/MQTTDataDisplay.vue

@@ -147,7 +147,8 @@ h2 {
 
 .data-display-container {
   height: 300px;
-  overflow: hidden;
+  display: flex;
+  flex-direction: column;
   border: 1px solid var(--border-color);
   border-radius: var(--radius);
   background-color: var(--bg-secondary);
@@ -155,8 +156,10 @@ h2 {
 }
 
 .data-display {
-  height: 100%;
-  overflow-y: auto;
+  flex: 1;
+  min-height: 0;
+  overflow-y: scroll;
+  overflow-x: hidden;
   padding: var(--space-sm);
   font-family: var(--font-mono);
   font-size: 14px;

+ 6 - 3
frontend/src/components/SerialDataDisplay.vue

@@ -128,7 +128,8 @@ h2 {
 
 .data-display-container {
   height: 280px;
-  overflow: hidden;
+  display: flex;
+  flex-direction: column;
   border: 1px solid #ddd;
   border-radius: 4px;
   background-color: #f5f5f5;
@@ -136,8 +137,10 @@ h2 {
 }
 
 .data-display {
-  height: 100%;
-  overflow-y: auto;
+  flex: 1;
+  min-height: 0;
+  overflow-y: scroll;
+  overflow-x: hidden;
   padding: 10px;
   font-family: 'Courier New', Courier, monospace;
   font-size: 14px;