From 7259e265b9237286996b09da03038ea5a133e1e0 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期六, 05 九月 2026 17:45:07 +0800
Subject: [PATCH] 收敛模拟器为设备事实与实时观测

---
 battery-business/src/main/java/com/battery/business/service/impl/DeviceDiscoveryPersistenceService.java |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/battery-business/src/main/java/com/battery/business/service/impl/DeviceDiscoveryPersistenceService.java b/battery-business/src/main/java/com/battery/business/service/impl/DeviceDiscoveryPersistenceService.java
index f2f4e1c..94dfd63 100644
--- a/battery-business/src/main/java/com/battery/business/service/impl/DeviceDiscoveryPersistenceService.java
+++ b/battery-business/src/main/java/com/battery/business/service/impl/DeviceDiscoveryPersistenceService.java
@@ -68,6 +68,15 @@
     /** 发现失败或返回空拓扑时,清除该适配器下已登记设备的过期运行事实。 */
     public void markUnavailable(String adapterCode)
     {
+        Instant failedAt = Instant.now();
+        // 失败立即撤下旧测量,但保留来源身份,不能等候选 TTL 到期才停止展示成功值。
+        candidateStore.recordCabinets(candidateStore.snapshot(failedAt).cabinets().stream()
+                .filter(item -> item.adapterCode().equals(adapterCode))
+                .map(item -> new CabinetCandidate(item.adapterCode(), item.adapterId(), item.deviceCode(),
+                        item.devtype(), item.devid(), item.ip(), item.mac(), item.name(), item.manufacturer(), item.model(),
+                        item.channels().stream().map(channel -> new ChannelCandidate(channel.identity(), false,
+                                DeviceWorkStatus.UNOBSERVABLE, failedAt)).toList(), failedAt, item.expiresAt()))
+                .toList());
         detectionCabinetMapper.markRegisteredFactsUnobservable(adapterCode);
         detectionCabinetMapper.markRegisteredCabinetsOffline(adapterCode);
     }

--
Gitblit v1.7.1