From 27428b31edee97703b529559146cdd7eef87a7a9 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期六, 05 九月 2026 11:00:58 +0800
Subject: [PATCH] 完成测试数据接收持久化与查询
---
battery-device-api/src/main/java/com/battery/device/api/DeviceAdapter.java | 44 +++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 43 insertions(+), 1 deletions(-)
diff --git a/battery-device-api/src/main/java/com/battery/device/api/DeviceAdapter.java b/battery-device-api/src/main/java/com/battery/device/api/DeviceAdapter.java
index 3330443..2afca49 100644
--- a/battery-device-api/src/main/java/com/battery/device/api/DeviceAdapter.java
+++ b/battery-device-api/src/main/java/com/battery/device/api/DeviceAdapter.java
@@ -10,8 +10,10 @@
import com.battery.device.model.HistoryAvailability;
import com.battery.device.model.HistoryPage;
import com.battery.device.model.RealtimeSnapshot;
+import com.battery.device.model.DeviceObservation;
+import com.battery.device.model.ObservationFailureReason;
-public interface DeviceAdapter extends AutoCloseable
+public interface DeviceAdapter extends DeviceObservationAdapter
{
/** 返回适配器实例的稳定代码。 */
String adapterCode();
@@ -25,6 +27,46 @@
/** 批量查询通道实时快照,不形成最终原始采集数据。 */
Map<ChannelIdentity, RealtimeSnapshot> inquire(Set<ChannelIdentity> channels);
+ /** 返回厂商无关的观测结果;失败也以离线事实返回,不把协议异常泄漏给业务。 */
+ default Map<ChannelIdentity, DeviceObservation> observe(Set<ChannelIdentity> channels)
+ {
+ if (channels == null || channels.isEmpty()) return Map.of();
+ try
+ {
+ Map<ChannelIdentity, RealtimeSnapshot> snapshots = inquire(channels);
+ Map<ChannelIdentity, DeviceObservation> observations = new java.util.LinkedHashMap<>();
+ channels.forEach(channel -> {
+ RealtimeSnapshot snapshot = snapshots.get(channel);
+ observations.put(channel, snapshot == null
+ ? DeviceObservation.offline(channel, "OFFLINE") : DeviceObservation.from(snapshot));
+ });
+ return Map.copyOf(observations);
+ }
+ catch (DeviceAdapterException exception)
+ {
+ ObservationFailureReason reason = normalizeFailureReason(exception.failureCode());
+ Map<ChannelIdentity, DeviceObservation> offline = new java.util.LinkedHashMap<>();
+ channels.forEach(channel -> offline.put(channel, DeviceObservation.offline(channel, reason)));
+ return Map.copyOf(offline);
+ }
+ }
+
+ /** 将适配器实现细节收敛为业务可识别的失败分类。 */
+ private static ObservationFailureReason normalizeFailureReason(String failureCode)
+ {
+ if (failureCode == null || failureCode.isBlank()) return ObservationFailureReason.INVALID_RESPONSE;
+ return switch (failureCode.trim().toUpperCase(java.util.Locale.ROOT))
+ {
+ case "CONNECTION_FAILED" -> ObservationFailureReason.CONNECTION_FAILED;
+ case "TIMEOUT" -> ObservationFailureReason.TIMEOUT;
+ case "DISCONNECTED" -> ObservationFailureReason.DISCONNECTED;
+ case "UNSUPPORTED" -> ObservationFailureReason.UNSUPPORTED;
+ case "MALFORMED_XML", "MISSING_FIELD", "INVALID_VALUE", "IDENTITY_MISMATCH",
+ "UNEXPECTED_COMMAND" -> ObservationFailureReason.PARSE_FAILED;
+ default -> ObservationFailureReason.TRANSPORT_FAILED;
+ };
+ }
+
/** 查询通道当前 BTS 测试的历史数据上传进度。 */
List<HistoryAvailability> inquireHistory(Set<ChannelIdentity> channels);
--
Gitblit v1.7.1