package com.ruoyi.device.controller; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.device.api.domain.StatisticsVO; import com.ruoyi.device.api.enums.AircraftStatusEnum; import com.ruoyi.device.api.enums.DockStatusEnum; import com.ruoyi.device.api.enums.PayloadStatusEnum; import com.ruoyi.device.service.api.IAircraftService; import com.ruoyi.device.service.api.IBufferDeviceService; import com.ruoyi.device.service.api.IDockService; import com.ruoyi.device.service.api.IPayloadService; import com.ruoyi.device.service.dto.AircraftDTO; import com.ruoyi.device.service.dto.AircraftDetailDTO; import com.ruoyi.device.service.dto.DockDTO; import com.ruoyi.device.service.dto.DockDetailDTO; import com.ruoyi.device.service.dto.PayloadDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; 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 * * @author ruoyi * @date 2026-01-23 */ @RestController @RequestMapping("/statistics") public class StaticsController extends BaseController { @Autowired private IDockService dockService; @Autowired private IAircraftService aircraftService; @Autowired private IPayloadService payloadService; @Autowired private IBufferDeviceService bufferDeviceService; /** * 获取系统统计信息 * * @return 统计信息 */ @GetMapping public R getStatistics() { StatisticsVO vo = new StatisticsVO(); // 获取所有机场 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 && dockDetailsMap != null) { for (DockDTO dock : docks) { DockDetailDTO dockDetail = dockDetailsMap.get(dock.getDockId()); if (dockDetail != null && dockDetail.getDockStatus() != null) { String status = dockDetail.getDockStatus(); if (DockStatusEnum.IDLE.getCode().equals(status)) { idleCount++; } else if (DockStatusEnum.WORKING.getCode().equals(status)) { workingCount++; } else if (DockStatusEnum.Debugging.getCode().equals(status)) { debuggingCount++; } else { offlineCount++; } } } } vo.setIdleDockCount(idleCount); vo.setWorkingDockCount(workingCount); vo.setDebuggingDockCount(debuggingCount); vo.setOfflineDockCount(offlineCount); // 获取所有无人机 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; int inMissionCount = 0; int debuggingAircraftCount = 0; int offlineAircraftCount = 0; if (aircrafts != null && aircraftDetailsMap != null) { for (AircraftDTO aircraft : aircrafts) { 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)) { powerOnInCabinCount++; } else if (AircraftStatusEnum.POWER_OFF_IN_CABIN.getCode().equals(status)) { powerOffInCabinCount++; } else if (AircraftStatusEnum.IN_MISSION.getCode().equals(status)) { inMissionCount++; } else if (AircraftStatusEnum.DEBUGGING.getCode().equals(status)) { debuggingAircraftCount++; } else if (AircraftStatusEnum.OFFLINE.getCode().equals(status)) { offlineAircraftCount++; } else { offlineAircraftCount++; } } } } vo.setPowerOnInCabinCount(powerOnInCabinCount); vo.setPowerOffInCabinCount(powerOffInCabinCount); vo.setInMissionCount(inMissionCount); vo.setDebuggingAircraftCount(debuggingAircraftCount); vo.setOfflineAircraftCount(offlineAircraftCount); // 获取所有挂载 List payloads = payloadService.selectPayloadList(new PayloadDTO()); vo.setPayloadCount(payloads != null ? payloads.size() : 0); // 统计离线挂载数量(暂时设置为0,因为挂载状态需要从实时数据获取) vo.setOfflinePayloadCount(0); return R.ok(vo); } @GetMapping("/dji") public R getDjiStatistics() { StatisticsVO vo = new StatisticsVO(); // 获取所有机场 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 && dockDetailsMap != null) { for (DockDTO dock : docks) { DockDetailDTO dockDetail = dockDetailsMap.get(dock.getDockId()); if (dockDetail != null && dockDetail.getDockStatus() != null) { String status = dockDetail.getDockStatus(); if (DockStatusEnum.IDLE.getCode().equals(status)) { idleCount++; } else if (DockStatusEnum.WORKING.getCode().equals(status)) { workingCount++; } else if (DockStatusEnum.Debugging.getCode().equals(status)) { debuggingCount++; } else { offlineCount++; } } } } vo.setIdleDockCount(idleCount); vo.setWorkingDockCount(workingCount); vo.setDebuggingDockCount(debuggingCount); vo.setOfflineDockCount(offlineCount); // 获取所有无人机 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; int inMissionCount = 0; int debuggingAircraftCount = 0; int offlineAircraftCount = 0; if (aircrafts != null && aircraftDetailsMap != null) { for (AircraftDTO aircraft : aircrafts) { 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)) { powerOnInCabinCount++; } else if (AircraftStatusEnum.POWER_OFF_IN_CABIN.getCode().equals(status)) { powerOffInCabinCount++; } else if (AircraftStatusEnum.IN_MISSION.getCode().equals(status)) { inMissionCount++; } else if (AircraftStatusEnum.DEBUGGING.getCode().equals(status)) { debuggingAircraftCount++; } else if (AircraftStatusEnum.OFFLINE.getCode().equals(status)) { offlineAircraftCount++; } else { offlineAircraftCount++; } } } } vo.setPowerOnInCabinCount(powerOnInCabinCount); vo.setPowerOffInCabinCount(powerOffInCabinCount); vo.setInMissionCount(inMissionCount); vo.setDebuggingAircraftCount(debuggingAircraftCount); vo.setOfflineAircraftCount(offlineAircraftCount); // 获取所有挂载 List payloads = payloadService.selectPayloadList(new PayloadDTO()); vo.setPayloadCount(payloads != null ? payloads.size() : 0); // 统计离线挂载数量(暂时设置为0,因为挂载状态需要从实时数据获取) vo.setOfflinePayloadCount(0); return R.ok(vo); } @GetMapping("/th") public R getThStatistics() { StatisticsVO vo = new StatisticsVO(); // 机场统计 vo.setDockCount(0); vo.setIdleDockCount(0); vo.setWorkingDockCount(0); vo.setDebuggingDockCount(0); vo.setOfflineDockCount(0); // 无人机统计 vo.setAircraftCount(0); vo.setPowerOnInCabinCount(0); vo.setPowerOffInCabinCount(0); vo.setInMissionCount(0); vo.setDebuggingAircraftCount(0); vo.setOfflineAircraftCount(0); // 挂载统计 vo.setPayloadCount(0); vo.setOfflinePayloadCount(0); return R.ok(vo); } }