From 147428971be43eed90a79f3849f15000d3855390 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期一, 28 九月 2026 15:15:22 +0800
Subject: [PATCH] 实现新威 7.6 直连取数与逐行接收

---
 battery-device-api/src/main/java/com/battery/device/api/discovery/DeviceDiscoveryCandidateStore.java |   27 ++++++++++++++++++++++++---
 1 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/battery-device-api/src/main/java/com/battery/device/api/discovery/DeviceDiscoveryCandidateStore.java b/battery-device-api/src/main/java/com/battery/device/api/discovery/DeviceDiscoveryCandidateStore.java
index 54e5663..733965b 100644
--- a/battery-device-api/src/main/java/com/battery/device/api/discovery/DeviceDiscoveryCandidateStore.java
+++ b/battery-device-api/src/main/java/com/battery/device/api/discovery/DeviceDiscoveryCandidateStore.java
@@ -43,22 +43,43 @@
         }
     }
 
+    /**
+     * 未登记的候选设备。{@code lastDataAt} 取该设备各通道最近的采样行时间,
+     * 供操作员判断哪几台设备现在真的在产出数据;它不改变候选的取舍,登记范围由操作员决定。
+     */
     record CabinetCandidate(String adapterCode, Long adapterId, String deviceCode, int devtype, int devid,
             String ip, String mac, String name, String manufacturer, String model,
-            List<ChannelCandidate> channels, Instant observedAt, Instant expiresAt)
+            List<ChannelCandidate> channels, Instant observedAt, Instant expiresAt, Instant lastDataAt)
     {
         public CabinetCandidate { channels = List.copyOf(channels); }
         public boolean online() { return channels.stream().anyMatch(ChannelCandidate::online); }
+
+        /** 兼容不含最近数据时间的既有候选。 */
+        public CabinetCandidate(String adapterCode, Long adapterId, String deviceCode, int devtype, int devid,
+                String ip, String mac, String name, String manufacturer, String model,
+                List<ChannelCandidate> channels, Instant observedAt, Instant expiresAt)
+        {
+            this(adapterCode, adapterId, deviceCode, devtype, devid, ip, mac, name, manufacturer, model,
+                    channels, observedAt, expiresAt, null);
+        }
     }
 
+    /** 通道候选;{@code lastDataAt} 是该通道来源里最近一次采样行的设备时间。 */
     record ChannelCandidate(ChannelIdentity identity, boolean online, DeviceWorkStatus workStatus,
-            Instant observedAt, RealtimeSnapshot latestSnapshot)
+            Instant observedAt, RealtimeSnapshot latestSnapshot, Instant lastDataAt)
     {
         /** 兼容仅有状态的旧发现候选。 */
         public ChannelCandidate(ChannelIdentity identity, boolean online, DeviceWorkStatus workStatus,
                 Instant observedAt)
         {
-            this(identity, online, workStatus, observedAt, null);
+            this(identity, online, workStatus, observedAt, null, null);
+        }
+
+        /** 兼容不含最近数据时间的既有候选。 */
+        public ChannelCandidate(ChannelIdentity identity, boolean online, DeviceWorkStatus workStatus,
+                Instant observedAt, RealtimeSnapshot latestSnapshot)
+        {
+            this(identity, online, workStatus, observedAt, latestSnapshot, null);
         }
     }
 

--
Gitblit v1.7.1