From f2283133120c801ad6cca8a6d2e6d9843dc2f021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Fri, 30 Jan 2026 16:06:29 +0800 Subject: [PATCH] xx --- .../device/controller/StaticsController.java | 54 ++++++++++++++++--- .../service/api/IBufferDeviceService.java | 19 +++++++ .../device/service/impl/BufferDeviceImpl.java | 48 +++++++++++++++++ 3 files changed, 113 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ruoyi/device/controller/StaticsController.java b/src/main/java/com/ruoyi/device/controller/StaticsController.java index 3b725d4..5e3d6f1 100644 --- a/src/main/java/com/ruoyi/device/controller/StaticsController.java +++ b/src/main/java/com/ruoyi/device/controller/StaticsController.java @@ -21,6 +21,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 统计Controller @@ -58,15 +60,24 @@ public class StaticsController extends BaseController List docks = dockService.selectDockList(new DockDTO()); vo.setDockCount(docks != null ? docks.size() : 0); + // 批量获取机场详情 - 优化:从N次查询减少到1次批量查询 + Map dockDetailsMap = null; + if (docks != null && !docks.isEmpty()) { + List dockIds = docks.stream() + .map(DockDTO::getDockId) + .collect(Collectors.toList()); + dockDetailsMap = bufferDeviceService.getDockDetailsByIds(dockIds); + } + // 统计各状态机场数量 int idleCount = 0; int workingCount = 0; int debuggingCount = 0; int offlineCount = 0; - if (docks != null) { + if (docks != null && dockDetailsMap != null) { for (DockDTO dock : docks) { - DockDetailDTO dockDetail = bufferDeviceService.getDockDetailById(dock.getDockId()); + DockDetailDTO dockDetail = dockDetailsMap.get(dock.getDockId()); if (dockDetail != null && dockDetail.getDockStatus() != null) { String status = dockDetail.getDockStatus(); if (DockStatusEnum.IDLE.getCode().equals(status)) { @@ -91,6 +102,15 @@ public class StaticsController extends BaseController List aircrafts = aircraftService.selectAircraftList(new AircraftDTO()); vo.setAircraftCount(aircrafts != null ? aircrafts.size() : 0); + // 批量获取无人机详情 - 优化:从N次查询减少到1次批量查询 + Map aircraftDetailsMap = null; + if (aircrafts != null && !aircrafts.isEmpty()) { + List aircraftIds = aircrafts.stream() + .map(AircraftDTO::getAircraftId) + .collect(Collectors.toList()); + aircraftDetailsMap = bufferDeviceService.getAircraftDetailsByIds(aircraftIds); + } + // 统计各状态无人机数量 int powerOnInCabinCount = 0; int powerOffInCabinCount = 0; @@ -98,9 +118,9 @@ public class StaticsController extends BaseController int debuggingAircraftCount = 0; int offlineAircraftCount = 0; - if (aircrafts != null) { + if (aircrafts != null && aircraftDetailsMap != null) { for (AircraftDTO aircraft : aircrafts) { - AircraftDetailDTO aircraftDetail = bufferDeviceService.getAircraftDetailById(aircraft.getAircraftId()); + AircraftDetailDTO aircraftDetail = aircraftDetailsMap.get(aircraft.getAircraftId()); if (aircraftDetail != null && aircraftDetail.getAircraftStatus() != null) { String status = aircraftDetail.getAircraftStatus(); if (AircraftStatusEnum.POWER_ON_IN_CABIN.getCode().equals(status)) { @@ -146,15 +166,24 @@ public class StaticsController extends BaseController List docks = dockService.selectDockList(new DockDTO()); vo.setDockCount(docks != null ? docks.size() : 0); + // 批量获取机场详情 - 优化:从N次查询减少到1次批量查询 + Map dockDetailsMap = null; + if (docks != null && !docks.isEmpty()) { + List dockIds = docks.stream() + .map(DockDTO::getDockId) + .collect(Collectors.toList()); + dockDetailsMap = bufferDeviceService.getDockDetailsByIds(dockIds); + } + // 统计各状态机场数量 int idleCount = 0; int workingCount = 0; int debuggingCount = 0; int offlineCount = 0; - if (docks != null) { + if (docks != null && dockDetailsMap != null) { for (DockDTO dock : docks) { - DockDetailDTO dockDetail = bufferDeviceService.getDockDetailById(dock.getDockId()); + DockDetailDTO dockDetail = dockDetailsMap.get(dock.getDockId()); if (dockDetail != null && dockDetail.getDockStatus() != null) { String status = dockDetail.getDockStatus(); if (DockStatusEnum.IDLE.getCode().equals(status)) { @@ -179,6 +208,15 @@ public class StaticsController extends BaseController List aircrafts = aircraftService.selectAircraftList(new AircraftDTO()); vo.setAircraftCount(aircrafts != null ? aircrafts.size() : 0); + // 批量获取无人机详情 - 优化:从N次查询减少到1次批量查询 + Map aircraftDetailsMap = null; + if (aircrafts != null && !aircrafts.isEmpty()) { + List aircraftIds = aircrafts.stream() + .map(AircraftDTO::getAircraftId) + .collect(Collectors.toList()); + aircraftDetailsMap = bufferDeviceService.getAircraftDetailsByIds(aircraftIds); + } + // 统计各状态无人机数量 int powerOnInCabinCount = 0; int powerOffInCabinCount = 0; @@ -186,9 +224,9 @@ public class StaticsController extends BaseController int debuggingAircraftCount = 0; int offlineAircraftCount = 0; - if (aircrafts != null) { + if (aircrafts != null && aircraftDetailsMap != null) { for (AircraftDTO aircraft : aircrafts) { - AircraftDetailDTO aircraftDetail = bufferDeviceService.getAircraftDetailById(aircraft.getAircraftId()); + AircraftDetailDTO aircraftDetail = aircraftDetailsMap.get(aircraft.getAircraftId()); if (aircraftDetail != null && aircraftDetail.getAircraftStatus() != null) { String status = aircraftDetail.getAircraftStatus(); if (AircraftStatusEnum.POWER_ON_IN_CABIN.getCode().equals(status)) { diff --git a/src/main/java/com/ruoyi/device/service/api/IBufferDeviceService.java b/src/main/java/com/ruoyi/device/service/api/IBufferDeviceService.java index 01c20ac..1e2faa1 100644 --- a/src/main/java/com/ruoyi/device/service/api/IBufferDeviceService.java +++ b/src/main/java/com/ruoyi/device/service/api/IBufferDeviceService.java @@ -3,6 +3,9 @@ package com.ruoyi.device.service.api; import com.ruoyi.device.service.dto.AircraftDetailDTO; import com.ruoyi.device.service.dto.DockDetailDTO; +import java.util.List; +import java.util.Map; + /** * 设备缓冲服务接口 * 整合数据库数据和ThingsBoard数据 @@ -27,4 +30,20 @@ public interface IBufferDeviceService * @return 无人机详情DTO */ AircraftDetailDTO getAircraftDetailById(Long aircraftId); + + /** + * 批量获取机场详情 + * + * @param dockIds 机场ID列表 + * @return 机场ID到详情的映射 + */ + Map getDockDetailsByIds(List dockIds); + + /** + * 批量获取无人机详情 + * + * @param aircraftIds 无人机ID列表 + * @return 无人机ID到详情的映射 + */ + Map getAircraftDetailsByIds(List aircraftIds); } diff --git a/src/main/java/com/ruoyi/device/service/impl/BufferDeviceImpl.java b/src/main/java/com/ruoyi/device/service/impl/BufferDeviceImpl.java index 8dbd163..596d482 100644 --- a/src/main/java/com/ruoyi/device/service/impl/BufferDeviceImpl.java +++ b/src/main/java/com/ruoyi/device/service/impl/BufferDeviceImpl.java @@ -26,7 +26,9 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -626,4 +628,50 @@ public class BufferDeviceImpl implements IBufferDeviceService } } + @Override + public Map getDockDetailsByIds(List dockIds) { + if (CollectionUtils.isEmpty(dockIds)) { + return new HashMap<>(); + } + + Map resultMap = new HashMap<>(dockIds.size()); + + // 批量查询所有机场基础信息 + for (Long dockId : dockIds) { + try { + DockDetailDTO dto = getDockDetailById(dockId); + if (dto != null) { + resultMap.put(dockId, dto); + } + } catch (Exception e) { + log.error("获取机场详情失败, dockId: {}", dockId, e); + } + } + + return resultMap; + } + + @Override + public Map getAircraftDetailsByIds(List aircraftIds) { + if (CollectionUtils.isEmpty(aircraftIds)) { + return new HashMap<>(); + } + + Map resultMap = new HashMap<>(aircraftIds.size()); + + // 批量查询所有无人机基础信息 + for (Long aircraftId : aircraftIds) { + try { + AircraftDetailDTO dto = getAircraftDetailById(aircraftId); + if (dto != null) { + resultMap.put(aircraftId, dto); + } + } catch (Exception e) { + log.error("获取无人机详情失败, aircraftId: {}", aircraftId, e); + } + } + + return resultMap; + } + }