From b78295e8da96c3e5e76befeef9582ce5273dbb74 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期二, 29 九月 2026 13:10:23 +0800
Subject: [PATCH] 按代码规范检查整改实体注释、Service Javadoc 与分层边界

---
 battery-business/src/main/java/com/battery/business/service/impl/TDetectionCabinetServiceImpl.java |   67 ++++++++++++++++++++++++---------
 1 files changed, 49 insertions(+), 18 deletions(-)

diff --git a/battery-business/src/main/java/com/battery/business/service/impl/TDetectionCabinetServiceImpl.java b/battery-business/src/main/java/com/battery/business/service/impl/TDetectionCabinetServiceImpl.java
index 7e8ce2b..9c485e1 100644
--- a/battery-business/src/main/java/com/battery/business/service/impl/TDetectionCabinetServiceImpl.java
+++ b/battery-business/src/main/java/com/battery/business/service/impl/TDetectionCabinetServiceImpl.java
@@ -18,6 +18,7 @@
 import com.battery.business.domain.TDetectionChannel;
 import com.battery.business.domain.vo.DiscoveredCabinetVo;
 import com.battery.business.mapper.TDetectionCabinetMapper;
+import com.battery.business.service.IDeviceAdapterService;
 import com.battery.business.service.ITDetectionCabinetService;
 import com.battery.device.api.discovery.DeviceDiscoveryCandidateStore;
 import com.battery.device.api.discovery.DeviceDiscoveryCandidateStore.CabinetCandidate;
@@ -36,13 +37,10 @@
     private static final String TESTING = "1";
     private static final String ONLINE = "0";
     private static final String OFFLINE = "1";
-    private static final Set<DeviceWorkStatus> ACTIVE_WORK_STATUSES = Set.of(DeviceWorkStatus.WORKING,
-            DeviceWorkStatus.PAUSED, DeviceWorkStatus.PROTECTED, DeviceWorkStatus.SYNCHRONIZING,
-            DeviceWorkStatus.LIT, DeviceWorkStatus.WAITING_TIMEOUT, DeviceWorkStatus.WAITING_START,
-            DeviceWorkStatus.LOCKED);
 
     private final TDetectionCabinetMapper detectionCabinetMapper;
     private final DeviceDiscoveryCandidateStore candidateStore;
+    private final IDeviceAdapterService adapterService;
 
     /**
      * 构造检测柜业务服务。
@@ -52,8 +50,42 @@
     public TDetectionCabinetServiceImpl(TDetectionCabinetMapper detectionCabinetMapper,
             DeviceDiscoveryCandidateStore candidateStore)
     {
+        this(detectionCabinetMapper, candidateStore, null);
+    }
+
+    /**
+     * 构造检测柜业务服务。
+     *
+     * @param detectionCabinetMapper 检测柜数据访问对象
+     * @param candidateStore 发现候选存储
+     * @param adapterService 适配器实例服务;为空时列表不展示数据来源名称
+     */
+    @org.springframework.beans.factory.annotation.Autowired
+    public TDetectionCabinetServiceImpl(TDetectionCabinetMapper detectionCabinetMapper,
+            DeviceDiscoveryCandidateStore candidateStore,
+            @org.springframework.lang.Nullable IDeviceAdapterService adapterService)
+    {
         this.detectionCabinetMapper = detectionCabinetMapper;
         this.candidateStore = candidateStore;
+        this.adapterService = adapterService;
+    }
+
+    /** 数据来源名称按适配器编码解析;代码装配实例没有数据库记录时退回展示编码。 */
+    private Map<String, String> adapterNames()
+    {
+        if (adapterService == null) return Map.of();
+        return adapterService.selectList(new com.battery.business.domain.TDeviceAdapter()).stream()
+                .filter(item -> item.getAdapterCode() != null && item.getAdapterName() != null)
+                .collect(java.util.stream.Collectors.toMap(
+                        com.battery.business.domain.TDeviceAdapter::getAdapterCode,
+                        com.battery.business.domain.TDeviceAdapter::getAdapterName, (left, right) -> right));
+    }
+
+    /** 适配器编码可能缺失(历史登记),缺失时不查询来源名称。 */
+    private void applyAdapterName(TDetectionCabinet cabinet, Map<String, String> adapterNames)
+    {
+        if (cabinet == null || cabinet.getAdapterCode() == null) return;
+        cabinet.setAdapterName(adapterNames.get(cabinet.getAdapterCode()));
     }
 
     /**
@@ -70,6 +102,7 @@
         {
             throw new ServiceException("检测柜不存在或已删除");
         }
+        applyAdapterName(detectionCabinet, adapterNames());
         return applyRealtimeState(detectionCabinet, candidatesByCode());
     }
 
@@ -91,8 +124,10 @@
         detectionCabinet.setOnlineStatus(null);
         detectionCabinet.setTestStatus(null);
         Map<String, CabinetCandidate> candidates = candidatesByCode();
+        Map<String, String> adapterNames = adapterNames();
         return detectionCabinetMapper.selectDetectionCabinetList(detectionCabinet).stream()
                 .map(item -> applyRealtimeState(item, candidates))
+                .peek(item -> applyAdapterName(item, adapterNames))
                 .filter(item -> StringUtils.isBlank(requestedOnlineStatus)
                         || requestedOnlineStatus.equals(item.getOnlineStatus()))
                 .filter(item -> StringUtils.isBlank(requestedTestStatus)
@@ -101,8 +136,10 @@
     }
 
     /**
-     * 读取未过期且未登记的候选,离线设备仍保留身份并可选择。
-     * 测试占用状态由实时通道工作状态聚合;测试归属留待后续绑定闭环确认。
+     * 读取未登记且未删除的候选,离线设备仍保留身份并可选择。
+     * 候选不按时间过期(厂商存储里的通道登记是长期事实),只按"已登记且未删除"排除;
+     * 每条附带最近数据时间并按它倒序,便于操作员判断哪几台真的在产出数据。
+     * 发现只返回设备事实,不从通道工作状态推断系统测试关系,也不自动判定"在用"。
      *
      * @return 可供选择的检测柜设备摘要
      */
@@ -112,14 +149,13 @@
         Set<String> registeredCodes = Set.copyOf(detectionCabinetMapper.selectRegisteredCabinetCodes());
         return candidateStore.snapshot(Instant.now()).cabinets().stream()
                 .filter(candidate -> !registeredCodes.contains(candidate.deviceCode()))
-                .map(candidate -> {
-                    boolean active = candidate.online() && isActive(candidate);
-                    return new DiscoveredCabinetVo(
+                .map(candidate -> new DiscoveredCabinetVo(
                             candidate.deviceCode(), candidate.ip(), candidate.mac(), candidate.name(),
-                            candidate.manufacturer(), candidate.model(), candidate.channels().size(), candidate.online() ? "在线" : "离线",
-                            active ? "测试中" : "空闲",
-                            active ? "待确认" : "-");
-                })
+                            candidate.manufacturer(), candidate.model(), candidate.channels().size(),
+                            candidate.online() ? "在线" : "离线", candidate.lastDataAt()))
+                .sorted(java.util.Comparator.comparing(DiscoveredCabinetVo::lastDataAt,
+                        java.util.Comparator.nullsLast(java.util.Comparator.reverseOrder()))
+                        .thenComparing(DiscoveredCabinetVo::deviceCode))
                 .toList();
     }
 
@@ -394,11 +430,6 @@
     private String stableCandidateKey(String adapterCode, Integer devtype, Integer devid)
     {
         return adapterCode + "-" + devtype + "-" + devid;
-    }
-
-    private boolean isActive(CabinetCandidate candidate)
-    {
-        return candidate.channels().stream().anyMatch(channel -> ACTIVE_WORK_STATUSES.contains(channel.workStatus()));
     }
 
     /** 将设备观测状态转换为最终数据库允许的通道事实状态。 */

--
Gitblit v1.7.1