yeg
6 天以前 a04222c873e5e55f48c8d33b5c0bc46fa524ac8d
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++;
        }
    }