| | |
| | | /** |
| | | * 拓扑上报:声明该来源当前有哪些通道。行里只有厂商自己的通道号,身份映射在本方法里完成。 |
| | | * 拓扑是"这个通道还在"的长期声明,重复上报被幂等忽略(不多占空间,也不改写既有行)。 |
| | | * |
| | | * <p>行里可以额外带 {@code channelNo}:来源自己软件里显示的通道号。 |
| | | * 它只用于界面显示与登记(操作员要拿它跟厂商软件对上),不参与通道身份,所以缺了也不影响接收。 |
| | | */ |
| | | private void storeTopology(String adapterCode, String timezoneId, JSONObject payload, Instant receivedAt, |
| | | Counters counters) |
| | |
| | | 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++; |
| | | } |
| | | } |
| | | |