From bc9a169ce3648467136a279d167f72c4fbab9595 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期六, 05 九月 2026 00:53:48 +0800
Subject: [PATCH] 完成设备发现登记与状态事实

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceDiscoveryPersistenceService.java |   20 ++++++++++++++++++++
 1 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceDiscoveryPersistenceService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceDiscoveryPersistenceService.java
index 95e56b2..b0ebda9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceDiscoveryPersistenceService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceDiscoveryPersistenceService.java
@@ -65,6 +65,13 @@
         return testMapper == null || testMapper.hasReceivingTestForAdapter(adapterCode) > 0;
     }
 
+    /** 发现失败或返回空拓扑时,清除该适配器下已登记设备的过期运行事实。 */
+    public void markUnavailable(String adapterCode)
+    {
+        detectionCabinetMapper.markRegisteredFactsUnobservable(adapterCode);
+        detectionCabinetMapper.markRegisteredCabinetsOffline(adapterCode);
+    }
+
     private AdapterDiscoveryResult discoverNow(DeviceAdapterRegistry registry, DiscoverySource source)
     {
         DiscoveryObservation observation = registry.execute(source.adapterCode(), runtime -> {
@@ -97,6 +104,7 @@
                         observedAt, observedAt.plus(lifetime)))
                 .toList();
         candidateStore.recordCabinets(candidates);
+        if (detected.isEmpty()) markUnavailable(source.adapterCode());
         synchronizeRegisteredFacts(source, detected, snapshots, observedAt);
         return new AdapterDiscoveryResult(grouped.size(), detected.size(), observedAt);
     }
@@ -132,6 +140,9 @@
             detectionCabinetMapper.updateRegisteredChannelObservation(source.adapterCode(), identity.devtype(),
                     identity.devid(), identity.subdevid(), identity.chlid(), channel.available() ? "ONLINE" : "OFFLINE",
                     workStatus.name(), observedAt, successfulObservation);
+            if (channel.available() && !successfulObservation)
+                detectionCabinetMapper.touchRegisteredChannelObservation(source.adapterCode(), identity.devtype(),
+                        identity.devid(), identity.subdevid(), identity.chlid(), observedAt);
             CabinetKey cabinet = new CabinetKey(identity.devtype(), identity.devid());
             cabinetOnline.merge(cabinet, channel.available(), Boolean::logicalOr);
         }
@@ -141,6 +152,15 @@
                         && channel.identity().devtype() == cabinet.devtype()
                         && channel.identity().devid() == cabinet.devid()
                         && snapshots.containsKey(channel.identity()))));
+        cabinetOnline.forEach((cabinet, online) -> {
+            boolean successfulSnapshot = online && detected.stream().anyMatch(channel -> channel.available()
+                    && channel.identity().devtype() == cabinet.devtype()
+                    && channel.identity().devid() == cabinet.devid()
+                    && snapshots.containsKey(channel.identity()));
+            if (online && !successfulSnapshot)
+                detectionCabinetMapper.touchRegisteredCabinetObservation(source.adapterCode(), cabinet.devtype(),
+                        cabinet.devid(), observedAt);
+        });
     }
 
     private CabinetCandidate toCandidate(DiscoverySource source, CabinetKey key, List<DetectedChannel> channels,

--
Gitblit v1.7.1