From 147428971be43eed90a79f3849f15000d3855390 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期一, 28 九月 2026 15:15:22 +0800
Subject: [PATCH] 实现新威 7.6 直连取数与逐行接收
---
battery-business/src/main/java/com/battery/business/service/impl/TDetectionCabinetServiceImpl.java | 51 ++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 48 insertions(+), 3 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 de81e9c..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;
@@ -39,6 +40,7 @@
private final TDetectionCabinetMapper detectionCabinetMapper;
private final DeviceDiscoveryCandidateStore candidateStore;
+ private final IDeviceAdapterService adapterService;
/**
* 构造检测柜业务服务。
@@ -48,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()));
}
/**
@@ -66,6 +102,7 @@
{
throw new ServiceException("检测柜不存在或已删除");
}
+ applyAdapterName(detectionCabinet, adapterNames());
return applyRealtimeState(detectionCabinet, candidatesByCode());
}
@@ -87,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)
@@ -97,8 +136,10 @@
}
/**
- * 读取未过期且未登记的候选,离线设备仍保留身份并可选择。
- * 发现只返回设备事实,不从通道工作状态推断系统测试关系。
+ * 读取未登记且未删除的候选,离线设备仍保留身份并可选择。
+ * 候选不按时间过期(厂商存储里的通道登记是长期事实),只按"已登记且未删除"排除;
+ * 每条附带最近数据时间并按它倒序,便于操作员判断哪几台真的在产出数据。
+ * 发现只返回设备事实,不从通道工作状态推断系统测试关系,也不自动判定"在用"。
*
* @return 可供选择的检测柜设备摘要
*/
@@ -110,7 +151,11 @@
.filter(candidate -> !registeredCodes.contains(candidate.deviceCode()))
.map(candidate -> new DiscoveredCabinetVo(
candidate.deviceCode(), candidate.ip(), candidate.mac(), candidate.name(),
- candidate.manufacturer(), candidate.model(), candidate.channels().size(), candidate.online() ? "在线" : "离线"))
+ 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();
}
--
Gitblit v1.7.1