package com.battery.device.api.discovery; import java.time.Instant; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** 测试使用的候选存储,实现与 Redis 适配器相同的逻辑过期语义。 */ public final class InMemoryDeviceDiscoveryCandidateStore implements DeviceDiscoveryCandidateStore { private final Map cabinets = new LinkedHashMap<>(); /** 按设备编码 upsert 本轮检测柜观测;本轮未返回的候选保留到逻辑过期。 */ @Override public synchronized void recordCabinets(List candidates) { candidates.forEach(item -> cabinets.put(item.deviceCode(), item)); } /** 删除指定适配器名下的检测柜候选;仅供人工重置或联调清理。 */ @Override public synchronized void removeAdapter(String adapterCode) { cabinets.values().removeIf(item -> item.adapterCode().equals(adapterCode)); } /** 返回指定时刻尚未过期的候选,并清理已过期条目。 */ @Override public synchronized CandidateSnapshot snapshot(Instant now) { cabinets.values().removeIf(item -> !item.expiresAt().isAfter(now)); return new CandidateSnapshot(List.copyOf(cabinets.values())); } }