From 0162f3730ca2e9644322a90450728b63243d40d0 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期六, 29 八月 2026 13:36:20 +0800
Subject: [PATCH] 修正采集器历史与实时快照模型

---
 ruoyi-admin/src/main/java/com/ruoyi/config/RedisBtsSimulatorStateStore.java |   39 ++++++++++++++++++++++++++++++++++++++-
 1 files changed, 38 insertions(+), 1 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/config/RedisBtsSimulatorStateStore.java b/ruoyi-admin/src/main/java/com/ruoyi/config/RedisBtsSimulatorStateStore.java
index 40a5707..0b9bb63 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/config/RedisBtsSimulatorStateStore.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/config/RedisBtsSimulatorStateStore.java
@@ -153,10 +153,16 @@
         requiredArray(object, "channels").forEach(item -> channels.add(collectorChannelState(item)));
         List<CollectorMeasurementRecord> history = new ArrayList<>();
         requiredArray(object, "history").forEach(item -> history.add(collectorMeasurementRecord(item)));
+        List<CollectorRealtimeMeasurement> latestMeasurements = new ArrayList<>();
+        JSONArray latest = object.getJSONArray("latestMeasurements");
+        if (latest != null)
+            latest.forEach(item -> latestMeasurements.add(collectorRealtimeMeasurement(item)));
+        else
+            latestMeasurements.addAll(latestMeasurementsFromLegacyHistory(history, channels));
         return new CollectorState(collectorId, deviceCode, ip, mac, name, manufacturer, model,
                 channelCount, online, requiredInteger(object, "sampleIntervalMs"),
                 requiredLong(object, "nextSequence"), optionalInstant(object, "lastSampledAt"),
-                channels, history, collectorHistoryFaults(object.get("historyFaults")));
+                channels, latestMeasurements, history, collectorHistoryFaults(object.get("historyFaults")));
     }
 
     private CollectorChannelState collectorChannelState(Object value)
@@ -187,6 +193,37 @@
                 measurement, object.getString("unit"));
     }
 
+    private CollectorRealtimeMeasurement collectorRealtimeMeasurement(Object value)
+    {
+        JSONObject object = jsonObject(value);
+        BigDecimal measurement = object.getBigDecimal("value");
+        if (measurement == null) throw new IllegalStateException("Missing BTS simulator state field: value");
+        return new CollectorRealtimeMeasurement(object.getString("adapterCode"), object.getString("collectorCode"),
+                object.getString("channelCode"), requiredLong(object, "sequenceId"),
+                requiredInstant(object, "deviceTime"), object.getString("deviceTimeRaw"),
+                requiredInstant(object, "serverReceivedAt"), object.getString("metricCode"),
+                measurement, object.getString("unit"));
+    }
+
+    /** 兼容 Ticket06 开发期间已写入但尚未拆分快照模型的状态。 */
+    private List<CollectorRealtimeMeasurement> latestMeasurementsFromLegacyHistory(
+            List<CollectorMeasurementRecord> history, List<CollectorChannelState> channels)
+    {
+        java.util.Set<String> configured = new java.util.HashSet<>();
+        channels.forEach(channel -> channel.metrics().forEach(metric ->
+                configured.add(channel.channelCode() + "\u0000" + metric.metricCode())));
+        java.util.Map<String, CollectorRealtimeMeasurement> latest = new java.util.LinkedHashMap<>();
+        for (CollectorMeasurementRecord record : history)
+        {
+            String key = record.channelCode() + "\u0000" + record.metricCode();
+            if (configured.contains(key))
+                latest.put(key, new CollectorRealtimeMeasurement(record.adapterCode(), record.collectorCode(),
+                        record.channelCode(), record.sequenceId(), record.deviceTime(), record.deviceTimeRaw(),
+                        record.serverReceivedAt(), record.metricCode(), record.value(), record.unit()));
+        }
+        return List.copyOf(latest.values());
+    }
+
     private CollectorHistoryFaults collectorHistoryFaults(Object value)
     {
         if (value == null) return CollectorHistoryFaults.none();

--
Gitblit v1.7.1