refactor(ems): 重构监控信息树构建逻辑

- 新增优化后的 buildMonitorInfoTree 方法,替换原有逻辑
- 添加 setChildren 方法实现递归设置子节点
- 优化温度数据查询和存储逻辑
- 调整前端 API 接口
- 更新温度数据查询 SQL
IOT
zch 9 months ago
parent c601a0b710
commit 04978908b6

@ -148,6 +148,86 @@ public class EmsBaseMonitorInfoServiceImpl implements IEmsBaseMonitorInfoService
* @return
*/
@Override
public List<EmsBaseMonitorInfo> buildMonitorInfoTree(List<EmsBaseMonitorInfo> baseMonitorInfos) {
// 创建一个List来存储设备编号只获取监控类型为1L的设备编号
List<String> monitorCodes = baseMonitorInfos.stream()
.filter(item -> !ObjectUtils.isEmpty(item) && item.getMonitorType() == 1L)
.map(EmsBaseMonitorInfo::getMonitorCode)
.collect(Collectors.toList());
// 创建温度数据Map
Map<String, BigDecimal> tempDataMap = new HashMap<>();
// 如果设备编号列表不为空,批量查询温度数据
if (CollectionUtils.isNotEmpty(monitorCodes)) {
// 根据设备编号列表查询最新的温度数据
List<TWTempertureData> tempDatas = tWTempertureDataMapper.selectLastTWTempertureDataByMonitorCodes(monitorCodes);
// 将温度数据存入Map优化查找效率
tempDataMap = tempDatas.stream()
.filter(data -> !ObjectUtils.isEmpty(data) && data.getTempreture() != null)
.collect(Collectors.toMap(
TWTempertureData::getMonitorId,
TWTempertureData::getTempreture,
(v1, v2) -> v1)); // 如果有重复键,保留第一个值
}
// 获取所有设备ID用于确定顶级节点
Set<Long> allIds = baseMonitorInfos.stream()
.map(EmsBaseMonitorInfo::getObjId)
.collect(Collectors.toSet());
// 预处理:为设备设置温度值,构建父子关系映射
Map<Long, List<EmsBaseMonitorInfo>> parentChildMap = new HashMap<>();
for (EmsBaseMonitorInfo info : baseMonitorInfos) {
// 设置温度值
if (info.getMonitorType() == 1L) {
BigDecimal temperature = tempDataMap.get(info.getMonitorCode());
if (temperature != null) {
info.setTemperature(temperature);
}
}
// 构建父子关系映射
Long parentId = info.getParentId();
if (parentId != null) {
parentChildMap.computeIfAbsent(parentId, k -> new ArrayList<>()).add(info);
}
}
// 找出所有顶级节点
List<EmsBaseMonitorInfo> rootNodes = baseMonitorInfos.stream()
.filter(info -> info.getParentId() == null || !allIds.contains(info.getParentId()))
.collect(Collectors.toList());
// 为顶级节点设置子节点(递归)
for (EmsBaseMonitorInfo root : rootNodes) {
setChildren(root, parentChildMap);
}
return rootNodes.isEmpty() ? baseMonitorInfos : rootNodes;
}
/**
*
*/
private void setChildren(EmsBaseMonitorInfo node, Map<Long, List<EmsBaseMonitorInfo>> parentChildMap) {
List<EmsBaseMonitorInfo> children = parentChildMap.get(node.getObjId());
if (children != null) {
node.setChildren(children);
for (EmsBaseMonitorInfo child : children) {
setChildren(child, parentChildMap);
}
}
}
/**
*
*
* @param
* @return
*/
/* @Override
public List<EmsBaseMonitorInfo> buildMonitorInfoTree(List<EmsBaseMonitorInfo> baseMonitorInfos) {
// 创建一个Map来存储温度数据键为监控ID值为TWTempertureData对象
@ -208,9 +288,9 @@ public class EmsBaseMonitorInfoServiceImpl implements IEmsBaseMonitorInfoService
}
return returnList;
}
/**
*//**
*
*/
*//*
private void recursionFn(List<EmsBaseMonitorInfo> list, EmsBaseMonitorInfo t)
{
// 得到子节点列表
@ -223,7 +303,9 @@ public class EmsBaseMonitorInfoServiceImpl implements IEmsBaseMonitorInfoService
recursionFn(list, tChild);
}
}
}
}*/
/**
*
*/

@ -228,8 +228,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
LIMIT 1
</select>
<select id="selectLastTWTempertureDataByMonitorCodes" parameterType="list" resultMap="TWTempertureDataResult">
SELECT t.objid, t.monitorId, t.tempreture, t.recodeTime,
t.collectTime, t.humidity, t.illuminance, t.noise,
t.concentration, t.alarmType, t.pm1, t.pm2, t.pm10, t.standby
FROM T_W_TempertureData t
INNER JOIN (
SELECT monitorId, MAX(objid) as maxObjId
FROM T_W_TempertureData
WHERE monitorId IN
<foreach item="monitorCode" collection="list" open="(" separator="," close=")">
#{monitorCode}
</foreach>
GROUP BY monitorId
) m ON t.monitorId = m.monitorId AND t.objid = m.maxObjId
</select>
<!-- <select id="selectLastTWTempertureDataByMonitorCodes" parameterType="list" resultMap="TWTempertureDataResult">
SELECT twtd.*
FROM (
SELECT *,
@ -242,7 +256,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
) twtd
LEFT JOIN ems_base_monitor_info ebmi ON twtd.monitorId = ebmi.monitor_code
WHERE twtd.rownum = 1;
</select>
</select>-->
<select id="selectLastTWTempertureData" parameterType="TWTempertureData" resultMap="TWTempertureDataResult">

@ -3,8 +3,8 @@ import request from '@/utils/request'
export function baseBusbarInfolist(query) {
return request({
url: '/ems/base/baseBusbarInfo/baseBusbarInfolist',
method: 'get',
url: '/base/baseBusbarInfo/baseBusbarInfolist',
method: 'post',
timeout:1000*60,
data: query
})

Loading…
Cancel
Save