From de98fe81cca90dd855e0519f065e77fce56333ef Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期三, 26 八月 2026 16:28:30 +0800
Subject: [PATCH] fix(device): address adapter discovery review

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceAdapterServiceImpl.java |   36 +++++++++++++++++++++++++-----------
 1 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceAdapterServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceAdapterServiceImpl.java
index 5b06844..6d26688 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceAdapterServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceAdapterServiceImpl.java
@@ -3,16 +3,21 @@
 import java.time.Duration;
 import java.time.Instant;
 import java.time.ZoneId;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.device.api.DeviceAdapterException;
-import com.ruoyi.device.bts.BtsProtocolException;
-import com.ruoyi.device.bts.BtsTransportException;
 import com.ruoyi.device.model.AdapterCapabilities;
+import com.ruoyi.device.model.ChannelIdentity;
+import com.ruoyi.device.model.DetectedChannel;
+import com.ruoyi.device.model.RealtimeSnapshot;
 import com.ruoyi.device.registry.AdapterInstanceConfig;
 import com.ruoyi.device.registry.AdapterRegistryException;
 import com.ruoyi.device.registry.DeviceAdapterRegistry;
@@ -110,21 +115,25 @@
         try
         {
             registry.synchronize(toRuntimeConfig(adapter));
-            List<com.ruoyi.device.model.DetectedChannel> channels = registry.require(adapter.getAdapterCode()).discoverChannels();
+            DiscoveryObservation observation = registry.execute(adapter.getAdapterCode(), runtime -> {
+                List<DetectedChannel> channels = runtime.discoverChannels();
+                Set<ChannelIdentity> available = channels.stream()
+                        .filter(DetectedChannel::available)
+                        .map(DetectedChannel::identity)
+                        .collect(Collectors.toCollection(LinkedHashSet::new));
+                return new DiscoveryObservation(channels, runtime.inquire(available));
+            });
             Instant observedAt = Instant.now();
-            AdapterDiscoveryResult result = persistence.persist(adapter, channels, observedAt);
+            AdapterDiscoveryResult result = persistence.persist(adapter, observation.channels(),
+                    observation.snapshots(), observedAt);
             mapper.updateDiscoverySuccess(adapterId, observedAt);
             return result;
         }
-        catch (BtsTransportException exception)
+        catch (DeviceAdapterException exception)
         {
-            return failDiscovery(adapterId, exception.reason().name(), exception);
+            return failDiscovery(adapterId, exception.failureCode(), exception);
         }
-        catch (BtsProtocolException exception)
-        {
-            return failDiscovery(adapterId, exception.reason().name(), exception);
-        }
-        catch (DeviceAdapterException | AdapterRegistryException exception)
+        catch (AdapterRegistryException exception)
         {
             return failDiscovery(adapterId, "ADAPTER_FAILURE", exception);
         }
@@ -196,4 +205,9 @@
     }
 
     private ServiceException error(String message, int code) { return new ServiceException(message, code); }
+
+    private record DiscoveryObservation(List<DetectedChannel> channels,
+            Map<ChannelIdentity, RealtimeSnapshot> snapshots)
+    {
+    }
 }

--
Gitblit v1.7.1