yeg
6 天以前 a04222c873e5e55f48c8d33b5c0bc46fa524ac8d
battery-device-api/src/main/java/com/battery/device/api/discovery/DeviceDiscoveryCandidateStore.java
@@ -43,22 +43,54 @@
        }
    }
    /**
     * 未登记的候选设备。{@code lastDataAt} 取该设备各通道最近的采样行时间,
     * 供操作员判断哪几台设备现在真的在产出数据;它不改变候选的取舍,登记范围由操作员决定。
     */
    record CabinetCandidate(String adapterCode, Long adapterId, String deviceCode, int devtype, int devid,
            String ip, String mac, String name, String manufacturer, String model,
            List<ChannelCandidate> channels, Instant observedAt, Instant expiresAt)
            List<ChannelCandidate> channels, Instant observedAt, Instant expiresAt, Instant lastDataAt)
    {
        public CabinetCandidate { channels = List.copyOf(channels); }
        public boolean online() { return channels.stream().anyMatch(ChannelCandidate::online); }
        /** 兼容不含最近数据时间的既有候选。 */
        public CabinetCandidate(String adapterCode, Long adapterId, String deviceCode, int devtype, int devid,
                String ip, String mac, String name, String manufacturer, String model,
                List<ChannelCandidate> channels, Instant observedAt, Instant expiresAt)
        {
            this(adapterCode, adapterId, deviceCode, devtype, devid, ip, mac, name, manufacturer, model,
                    channels, observedAt, expiresAt, null);
        }
    }
    /**
     * 通道候选;{@code lastDataAt} 是该通道来源里最近一次采样行的设备时间。
     * {@code sourceDisplayNo} 是来源自己的通道叫法(见 {@code DetectedChannel}),
     * 只用于界面与登记显示,不参与通道身份。
     */
    record ChannelCandidate(ChannelIdentity identity, boolean online, DeviceWorkStatus workStatus,
            Instant observedAt, RealtimeSnapshot latestSnapshot)
            Instant observedAt, RealtimeSnapshot latestSnapshot, Instant lastDataAt, String sourceDisplayNo)
    {
        /** 兼容仅有状态的旧发现候选。 */
        public ChannelCandidate(ChannelIdentity identity, boolean online, DeviceWorkStatus workStatus,
                Instant observedAt)
        {
            this(identity, online, workStatus, observedAt, 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, null);
        }
        /** 兼容不带来源通道叫法的既有候选。 */
        public ChannelCandidate(ChannelIdentity identity, boolean online, DeviceWorkStatus workStatus,
                Instant observedAt, RealtimeSnapshot latestSnapshot, Instant lastDataAt)
        {
            this(identity, online, workStatus, observedAt, latestSnapshot, lastDataAt, null);
        }
    }