| | |
| | | /** upsert 本轮检测柜观测,未返回设备保留到逻辑过期。 */ |
| | | void recordCabinets(List<CabinetCandidate> candidates); |
| | | |
| | | /** 替换指定适配器的采集器观测,使已删除模拟采集器立即消失。 */ |
| | | void replaceCollectors(String adapterCode, List<CollectorCandidate> candidates); |
| | | |
| | | /** 删除指定适配器的全部发现候选;仅供人工重置或实机联调清理。 */ |
| | | void removeAdapter(String adapterCode); |
| | | |
| | |
| | | return snapshot(now).cabinets().stream().filter(item -> item.deviceCode().equals(deviceCode)).findFirst(); |
| | | } |
| | | |
| | | /** 按设备编码查询指定时刻未过期的采集器观测;在线和登记状态由业务层校验。 */ |
| | | default Optional<CollectorCandidate> findCollector(String deviceCode, Instant now) |
| | | { |
| | | return snapshot(now).collectors().stream().filter(item -> item.deviceCode().equals(deviceCode)).findFirst(); |
| | | } |
| | | |
| | | record CandidateSnapshot(List<CabinetCandidate> cabinets, List<CollectorCandidate> collectors) |
| | | record CandidateSnapshot(List<CabinetCandidate> cabinets) |
| | | { |
| | | public CandidateSnapshot |
| | | { |
| | | cabinets = List.copyOf(cabinets); |
| | | collectors = List.copyOf(collectors); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | /** 通道候选;{@code lastDataAt} 是该通道来源里最近一次采样行的设备时间。 */ |
| | | /** |
| | | * 通道候选;{@code lastDataAt} 是该通道来源里最近一次采样行的设备时间。 |
| | | * {@code sourceDisplayNo} 是来源自己的通道叫法(见 {@code DetectedChannel}), |
| | | * 只用于界面与登记显示,不参与通道身份。 |
| | | */ |
| | | record ChannelCandidate(ChannelIdentity identity, boolean online, DeviceWorkStatus workStatus, |
| | | Instant observedAt, RealtimeSnapshot latestSnapshot, Instant lastDataAt) |
| | | Instant observedAt, RealtimeSnapshot latestSnapshot, Instant lastDataAt, String sourceDisplayNo) |
| | | { |
| | | /** 兼容仅有状态的旧发现候选。 */ |
| | | public ChannelCandidate(ChannelIdentity identity, boolean online, DeviceWorkStatus workStatus, |
| | | Instant observedAt) |
| | | { |
| | | this(identity, online, workStatus, observedAt, null, null); |
| | | this(identity, online, workStatus, observedAt, null, null, null); |
| | | } |
| | | |
| | | /** 兼容不含最近数据时间的既有候选。 */ |
| | | public ChannelCandidate(ChannelIdentity identity, boolean online, DeviceWorkStatus workStatus, |
| | | Instant observedAt, RealtimeSnapshot latestSnapshot) |
| | | { |
| | | this(identity, online, workStatus, observedAt, latestSnapshot, null); |
| | | this(identity, online, workStatus, observedAt, latestSnapshot, null, null); |
| | | } |
| | | |
| | | /** 兼容不带来源通道叫法的既有候选。 */ |
| | | public ChannelCandidate(ChannelIdentity identity, boolean online, DeviceWorkStatus workStatus, |
| | | Instant observedAt, RealtimeSnapshot latestSnapshot, Instant lastDataAt) |
| | | { |
| | | this(identity, online, workStatus, observedAt, latestSnapshot, lastDataAt, null); |
| | | } |
| | | } |
| | | |
| | | record CollectorCandidate(String adapterCode, String deviceCode, String ip, String mac, String name, |
| | | String manufacturer, String model, int channelCount, boolean online, |
| | | Instant observedAt, Instant expiresAt) { } |
| | | } |