From a04222c873e5e55f48c8d33b5c0bc46fa524ac8d Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期四, 08 十月 2026 13:20:39 +0800
Subject: [PATCH] 界面显示号改为来源自报,并给出无歧义的来源定位

---
 battery-business/src/main/java/com/battery/business/service/impl/DeviceIngestServiceImpl.java |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/battery-business/src/main/java/com/battery/business/service/impl/DeviceIngestServiceImpl.java b/battery-business/src/main/java/com/battery/business/service/impl/DeviceIngestServiceImpl.java
index bb44aeb..78083e4 100644
--- a/battery-business/src/main/java/com/battery/business/service/impl/DeviceIngestServiceImpl.java
+++ b/battery-business/src/main/java/com/battery/business/service/impl/DeviceIngestServiceImpl.java
@@ -165,6 +165,9 @@
     /**
      * 拓扑上报:声明该来源当前有哪些通道。行里只有厂商自己的通道号,身份映射在本方法里完成。
      * 拓扑是"这个通道还在"的长期声明,重复上报被幂等忽略(不多占空间,也不改写既有行)。
+     *
+     * <p>行里可以额外带 {@code channelNo}:来源自己软件里显示的通道号。
+     * 它只用于界面显示与登记(操作员要拿它跟厂商软件对上),不参与通道身份,所以缺了也不影响接收。
      */
     private void storeTopology(String adapterCode, String timezoneId, JSONObject payload, Instant receivedAt,
             Counters counters)
@@ -177,9 +180,13 @@
             if (channel == null || channel < 1) throw payloadInvalid("第 " + index + " 行的 channel 不合法:" + row);
             TDeviceIngestRecord value = base(adapterCode, timezoneId, TDeviceIngestRecord.KIND_TOPOLOGY, channel,
                     receivedAt);
+            value.setVendorChannelNo(row.containsKey("channelNo") ? row.getInteger("channelNo") : null);
             value.setRecordKey("topology:" + channel);
             value.setPayloadJson(JSON.toJSONString(row));
-            store(value, counters);
+            // 拓扑是声明不是设备事实:重复上报刷新声明内容(例如这次才带上的来源通道号),
+            // 不追加新行、也不按"内容不同即冲突"处理——声明本来就允许被刷新。
+            value.setContentSha256(canonicalHash(value.getPayloadJson()));
+            if (records.upsertTopology(value) > 0) counters.accepted++; else counters.ignored++;
         }
     }
 

--
Gitblit v1.7.1