From bad9e733bc75b3888ceebed204459c5ef016ee76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Wed, 4 Feb 2026 16:36:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/controller/AircraftController.java | 53 +----- .../device/controller/DockController.java | 55 +----- .../device/controller/GroupController.java | 49 +----- .../device/controller/StaticsController.java | 8 +- ...Impl.java => DaJiangBufferDeviceImpl.java} | 6 +- .../service/impl/DefaultBufferDeviceImpl.java | 158 ++++++++++++++++++ .../service/impl/TuohengBufferDeviceImpl.java | 2 +- .../device/websocket/StatisticsWebSocket.java | 4 +- 8 files changed, 179 insertions(+), 156 deletions(-) rename src/main/java/com/ruoyi/device/service/impl/{BufferDeviceImpl.java => DaJiangBufferDeviceImpl.java} (99%) create mode 100644 src/main/java/com/ruoyi/device/service/impl/DefaultBufferDeviceImpl.java diff --git a/src/main/java/com/ruoyi/device/controller/AircraftController.java b/src/main/java/com/ruoyi/device/controller/AircraftController.java index 77ac6e7..e96e4b1 100644 --- a/src/main/java/com/ruoyi/device/controller/AircraftController.java +++ b/src/main/java/com/ruoyi/device/controller/AircraftController.java @@ -7,14 +7,9 @@ import com.ruoyi.device.api.domain.AircraftDetailVO; import com.ruoyi.device.api.domain.AircraftUpdateRequest; import com.ruoyi.device.controller.convert.AircraftDetailVOConvert; import com.ruoyi.device.service.api.IAircraftService; -import com.ruoyi.device.service.impl.BufferDeviceImpl; -import com.ruoyi.device.service.impl.TuohengBufferDeviceImpl; +import com.ruoyi.device.service.impl.DefaultBufferDeviceImpl; import com.ruoyi.device.service.dto.AircraftDetailDTO; import com.ruoyi.device.service.dto.AircraftDTO; -import com.ruoyi.device.domain.api.IAircraftDomain; -import com.ruoyi.device.domain.api.IDeviceDomain; -import com.ruoyi.device.domain.model.Aircraft; -import com.ruoyi.device.domain.model.Device; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -32,16 +27,7 @@ public class AircraftController extends BaseController private IAircraftService aircraftService; @Autowired - private BufferDeviceImpl bufferDeviceService; - - @Autowired - private TuohengBufferDeviceImpl tuohengBufferDeviceService; - - @Autowired - private IAircraftDomain aircraftDomain; - - @Autowired - private IDeviceDomain deviceDomain; + private DefaultBufferDeviceImpl bufferDeviceService; /** * 查看无人机详情 @@ -53,7 +39,7 @@ public class AircraftController extends BaseController @GetMapping("/detail/{aircraftId}") public R getAircraftDetail(@PathVariable("aircraftId") Long aircraftId) { - AircraftDetailDTO dto = getAircraftDetailByManufacturer(aircraftId); + AircraftDetailDTO dto = bufferDeviceService.getAircraftDetailById(aircraftId); AircraftDetailVO vo = AircraftDetailVOConvert.from(dto); return R.ok(vo); } @@ -74,37 +60,4 @@ public class AircraftController extends BaseController aircraftService.updateAircraft(dto); return R.ok(); } - - /** - * 根据无人机ID获取无人机详情(自动选择大疆或拓恒服务) - * - * @param aircraftId 无人机ID - * @return 无人机详情DTO - */ - private AircraftDetailDTO getAircraftDetailByManufacturer(Long aircraftId) { - // 查询无人机信息 - Aircraft aircraft = aircraftDomain.selectAircraftByAircraftId(aircraftId); - if (aircraft == null) { - logger.warn("无人机不存在: aircraftId={}", aircraftId); - return null; - } - - // 查询设备信息,获取厂商 - Device device = deviceDomain.selectDeviceByDeviceId(aircraft.getDeviceId()); - if (device == null) { - logger.warn("无人机对应的设备不存在: deviceId={}", aircraft.getDeviceId()); - return null; - } - - // 根据厂商选择对应的服务 - String manufacturer = device.getDeviceManufacturer(); - if ("tuoheng".equals(manufacturer)) { - logger.debug("使用拓恒服务获取无人机详情: aircraftId={}", aircraftId); - return tuohengBufferDeviceService.getAircraftDetailById(aircraftId); - } else { - logger.debug("使用大疆服务获取无人机详情: aircraftId={}, manufacturer={}", - aircraftId, manufacturer); - return bufferDeviceService.getAircraftDetailById(aircraftId); - } - } } diff --git a/src/main/java/com/ruoyi/device/controller/DockController.java b/src/main/java/com/ruoyi/device/controller/DockController.java index a6a3bee..12fe68d 100644 --- a/src/main/java/com/ruoyi/device/controller/DockController.java +++ b/src/main/java/com/ruoyi/device/controller/DockController.java @@ -9,14 +9,9 @@ import com.ruoyi.device.api.domain.DockVO; import com.ruoyi.device.api.domain.DockWithGPSVO; import com.ruoyi.device.controller.convert.DockWithGPSVOConvert; import com.ruoyi.device.service.api.IDockService; -import com.ruoyi.device.service.impl.BufferDeviceImpl; -import com.ruoyi.device.service.impl.TuohengBufferDeviceImpl; +import com.ruoyi.device.service.impl.DefaultBufferDeviceImpl; import com.ruoyi.device.service.dto.DockDetailDTO; import com.ruoyi.device.service.dto.DockDTO; -import com.ruoyi.device.domain.api.IDockDomain; -import com.ruoyi.device.domain.api.IDeviceDomain; -import com.ruoyi.device.domain.model.Dock; -import com.ruoyi.device.domain.model.Device; import com.ruoyi.device.controller.convert.DockVOConvert; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -39,16 +34,7 @@ public class DockController extends BaseController private IDockService dockService; @Autowired - private BufferDeviceImpl bufferDeviceService; - - @Autowired - private TuohengBufferDeviceImpl tuohengBufferDeviceService; - - @Autowired - private IDockDomain dockDomain; - - @Autowired - private IDeviceDomain deviceDomain; + private DefaultBufferDeviceImpl bufferDeviceService; /** * 搜索机场 @@ -76,7 +62,7 @@ public class DockController extends BaseController @GetMapping("/detail/{dockId}") public R getDockDetail(@PathVariable("dockId") Long dockId) { - DockDetailDTO dockDetailDTO = getDockDetailByManufacturer(dockId); + DockDetailDTO dockDetailDTO = bufferDeviceService.getDockDetailById(dockId); if (dockDetailDTO == null) { return R.fail("机场不存在: dockId=" + dockId); } @@ -116,44 +102,11 @@ public class DockController extends BaseController List dockDTOs = dockService.selectDockList(new DockDTO()); List dtoList = new ArrayList<>(); for (DockDTO dockDTO : dockDTOs) { - DockDetailDTO dockDetailDTO = getDockDetailByManufacturer(dockDTO.getDockId()); + DockDetailDTO dockDetailDTO = bufferDeviceService.getDockDetailById(dockDTO.getDockId()); if (dockDetailDTO != null) { dtoList.add(dockDetailDTO); } } return R.ok(DockWithGPSVOConvert.fromList(dtoList)); } - - /** - * 根据机场ID获取机场详情(自动选择大疆或拓恒服务) - * - * @param dockId 机场ID - * @return 机场详情DTO - */ - private DockDetailDTO getDockDetailByManufacturer(Long dockId) { - // 查询机场信息 - Dock dock = dockDomain.selectDockByDockId(dockId); - if (dock == null) { - logger.warn("机场不存在: dockId={}", dockId); - return null; - } - - // 查询设备信息,获取厂商 - Device device = deviceDomain.selectDeviceByDeviceId(dock.getDeviceId()); - if (device == null) { - logger.warn("机场对应的设备不存在: deviceId={}", dock.getDeviceId()); - return null; - } - - // 根据厂商选择对应的服务 - String manufacturer = device.getDeviceManufacturer(); - if ("tuoheng".equals(manufacturer)) { - logger.debug("使用拓恒服务获取机场详情: dockId={}", dockId); - return tuohengBufferDeviceService.getDockDetailById(dockId); - } else { - logger.debug("使用大疆服务获取机场详情: dockId={}, manufacturer={}", - dockId, manufacturer); - return bufferDeviceService.getDockDetailById(dockId); - } - } } diff --git a/src/main/java/com/ruoyi/device/controller/GroupController.java b/src/main/java/com/ruoyi/device/controller/GroupController.java index 7f39544..edec073 100644 --- a/src/main/java/com/ruoyi/device/controller/GroupController.java +++ b/src/main/java/com/ruoyi/device/controller/GroupController.java @@ -8,11 +8,8 @@ import com.ruoyi.device.controller.convert.DockWithGPSVOConvert; import com.ruoyi.device.controller.convert.GroupVOConvert; import com.ruoyi.device.domain.api.IDockDomain; import com.ruoyi.device.domain.model.Dock; -import com.ruoyi.device.service.impl.BufferDeviceImpl; -import com.ruoyi.device.service.impl.TuohengBufferDeviceImpl; +import com.ruoyi.device.service.impl.DefaultBufferDeviceImpl; import com.ruoyi.device.service.api.IGroupService; -import com.ruoyi.device.domain.api.IDeviceDomain; -import com.ruoyi.device.domain.model.Device; import com.ruoyi.device.service.dto.DockDetailDTO; import com.ruoyi.device.service.dto.DockGroupDTO; import com.ruoyi.device.service.dto.GroupDTO; @@ -36,16 +33,10 @@ public class GroupController extends BaseController private IGroupService groupService; @Autowired - private BufferDeviceImpl bufferDeviceService; - - @Autowired - private TuohengBufferDeviceImpl tuohengBufferDeviceService; + private DefaultBufferDeviceImpl bufferDeviceService; @Autowired private IDockDomain dockDomain; - - @Autowired - private IDeviceDomain deviceDomain; /** * 创建分组 * @@ -145,7 +136,7 @@ public class GroupController extends BaseController if (allDocks != null) { for (Dock dock : allDocks) { if (dock.getLastActiveTime() != null) { - DockDetailDTO dockDetailDTO = getDockDetailByManufacturer(dock.getDockId()); + DockDetailDTO dockDetailDTO = bufferDeviceService.getDockDetailById(dock.getDockId()); if (dockDetailDTO != null) { dockDetailDTO.setLastActiveTime(dock.getLastActiveTime()); dtoList.add(dockDetailDTO); @@ -160,7 +151,7 @@ public class GroupController extends BaseController List groupDTOS = groupService.getDocksByGroupId(groupId); List dtoList = new ArrayList<>(); for (DockGroupDTO dockGroupDTO : groupDTOS) { - DockDetailDTO dockDetailDTO = getDockDetailByManufacturer(dockGroupDTO.getDockId()); + DockDetailDTO dockDetailDTO = bufferDeviceService.getDockDetailById(dockGroupDTO.getDockId()); if (dockDetailDTO != null) { dtoList.add(dockDetailDTO); } @@ -213,36 +204,4 @@ public class GroupController extends BaseController return R.ok(groupVOS); } - - /** - * 根据机场ID获取机场详情(自动选择大疆或拓恒服务) - * - * @param dockId 机场ID - * @return 机场详情DTO - */ - private DockDetailDTO getDockDetailByManufacturer(Long dockId) { - // 查询机场信息 - Dock dock = dockDomain.selectDockByDockId(dockId); - if (dock == null) { - logger.warn("机场不存在: dockId={}", dockId); - return null; - } - - // 查询设备信息,获取厂商 - Device device = deviceDomain.selectDeviceByDeviceId(dock.getDeviceId()); - if (device == null) { - logger.warn("机场对应的设备不存在: deviceId={}", dock.getDeviceId()); - return null; - } - - // 根据厂商选择对应的服务 - String manufacturer = device.getDeviceManufacturer(); - if ("tuoheng".equals(manufacturer)) { - logger.debug("使用拓恒服务获取机场详情: dockId={}", dockId); - return tuohengBufferDeviceService.getDockDetailById(dockId); - } else { - logger.debug("使用大疆服务获取机场详情: dockId={}, manufacturer={}", dockId, manufacturer); - return bufferDeviceService.getDockDetailById(dockId); - } - } } diff --git a/src/main/java/com/ruoyi/device/controller/StaticsController.java b/src/main/java/com/ruoyi/device/controller/StaticsController.java index 9663c3d..1592681 100644 --- a/src/main/java/com/ruoyi/device/controller/StaticsController.java +++ b/src/main/java/com/ruoyi/device/controller/StaticsController.java @@ -7,7 +7,7 @@ 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.impl.BufferDeviceImpl; +import com.ruoyi.device.service.impl.DaJiangBufferDeviceImpl; import com.ruoyi.device.service.impl.TuohengBufferDeviceImpl; import com.ruoyi.device.service.api.IDockService; import com.ruoyi.device.domain.api.IDeviceDomain; @@ -51,7 +51,7 @@ public class StaticsController extends BaseController private IPayloadService payloadService; @Autowired - private BufferDeviceImpl bufferDeviceService; + private DaJiangBufferDeviceImpl daJiangBufferDeviceService; @Autowired private TuohengBufferDeviceImpl tuohengBufferDeviceService; @@ -137,7 +137,7 @@ public class StaticsController extends BaseController List dockIds = docks.stream() .map(DockDTO::getDockId) .collect(Collectors.toList()); - dockDetailsMap = bufferDeviceService.getDockDetailsByIds(dockIds); + dockDetailsMap = daJiangBufferDeviceService.getDockDetailsByIds(dockIds); } // 统计各状态机场数量 @@ -188,7 +188,7 @@ public class StaticsController extends BaseController List aircraftIds = aircrafts.stream() .map(AircraftDTO::getAircraftId) .collect(Collectors.toList()); - aircraftDetailsMap = bufferDeviceService.getAircraftDetailsByIds(aircraftIds); + aircraftDetailsMap = daJiangBufferDeviceService.getAircraftDetailsByIds(aircraftIds); } // 统计各状态无人机数量 diff --git a/src/main/java/com/ruoyi/device/service/impl/BufferDeviceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DaJiangBufferDeviceImpl.java similarity index 99% rename from src/main/java/com/ruoyi/device/service/impl/BufferDeviceImpl.java rename to src/main/java/com/ruoyi/device/service/impl/DaJiangBufferDeviceImpl.java index 58f84e5..c2afcf0 100644 --- a/src/main/java/com/ruoyi/device/service/impl/BufferDeviceImpl.java +++ b/src/main/java/com/ruoyi/device/service/impl/DaJiangBufferDeviceImpl.java @@ -33,15 +33,15 @@ import java.util.Map; import java.util.stream.Collectors; /** - * 设备缓冲服务实现 + * 大疆设备缓冲服务实现 * 整合数据库数据和ThingsBoard数据 * * @author ruoyi * @date 2026-01-20 */ -@Service +@Service("daJiangBufferDeviceService") @Slf4j -public class BufferDeviceImpl implements IBufferDeviceService +public class DaJiangBufferDeviceImpl implements IBufferDeviceService { @Autowired private IDockDomain dockDomain; diff --git a/src/main/java/com/ruoyi/device/service/impl/DefaultBufferDeviceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DefaultBufferDeviceImpl.java new file mode 100644 index 0000000..2b680be --- /dev/null +++ b/src/main/java/com/ruoyi/device/service/impl/DefaultBufferDeviceImpl.java @@ -0,0 +1,158 @@ +package com.ruoyi.device.service.impl; + +import com.ruoyi.device.domain.api.IAircraftDomain; +import com.ruoyi.device.domain.api.IDeviceDomain; +import com.ruoyi.device.domain.api.IDockDomain; +import com.ruoyi.device.domain.model.Aircraft; +import com.ruoyi.device.domain.model.Device; +import com.ruoyi.device.domain.model.Dock; +import com.ruoyi.device.service.api.IBufferDeviceService; +import com.ruoyi.device.service.dto.AircraftDetailDTO; +import com.ruoyi.device.service.dto.DockDetailDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 默认设备缓冲服务实现 + * 根据设备厂商自动路由到对应的服务实现 + * + * @author ruoyi + * @date 2026-02-04 + */ +@Service +@Primary +@Slf4j +public class DefaultBufferDeviceImpl implements IBufferDeviceService { + + @Autowired + @Qualifier("daJiangBufferDeviceService") + private IBufferDeviceService daJiangBufferDeviceService; + + @Autowired + @Qualifier("tuohengBufferDeviceService") + private IBufferDeviceService tuohengBufferDeviceService; + + @Autowired + private IDockDomain dockDomain; + + @Autowired + private IDeviceDomain deviceDomain; + + @Autowired + private IAircraftDomain aircraftDomain; + + @Override + public DockDetailDTO getDockDetailById(Long dockId) { + log.debug("DefaultBufferDeviceImpl.getDockDetailById: dockId={}", dockId); + + // 查询机场信息 + Dock dock = dockDomain.selectDockByDockId(dockId); + if (dock == null) { + log.warn("机场不存在: dockId={}", dockId); + return null; + } + + // 查询设备信息,获取厂商 + Device device = deviceDomain.selectDeviceByDeviceId(dock.getDeviceId()); + if (device == null) { + log.warn("机场对应的设备不存在: deviceId={}", dock.getDeviceId()); + return null; + } + + // 根据厂商选择对应的服务 + String manufacturer = device.getDeviceManufacturer(); + if ("tuoheng".equals(manufacturer)) { + log.debug("路由到拓恒服务: dockId={}", dockId); + return tuohengBufferDeviceService.getDockDetailById(dockId); + } else { + log.debug("路由到大疆服务: dockId={}, manufacturer={}", dockId, manufacturer); + return daJiangBufferDeviceService.getDockDetailById(dockId); + } + } + + @Override + public AircraftDetailDTO getAircraftDetailById(Long aircraftId) { + log.debug("DefaultBufferDeviceImpl.getAircraftDetailById: aircraftId={}", aircraftId); + + // 查询无人机信息 + Aircraft aircraft = aircraftDomain.selectAircraftByAircraftId(aircraftId); + if (aircraft == null) { + log.warn("无人机不存在: aircraftId={}", aircraftId); + return null; + } + + // 查询设备信息,获取厂商 + Device device = deviceDomain.selectDeviceByDeviceId(aircraft.getDeviceId()); + if (device == null) { + log.warn("无人机对应的设备不存在: deviceId={}", aircraft.getDeviceId()); + return null; + } + + // 根据厂商选择对应的服务 + String manufacturer = device.getDeviceManufacturer(); + if ("tuoheng".equals(manufacturer)) { + log.debug("路由到拓恒服务: aircraftId={}", aircraftId); + return tuohengBufferDeviceService.getAircraftDetailById(aircraftId); + } else { + log.debug("路由到大疆服务: aircraftId={}, manufacturer={}", aircraftId, manufacturer); + return daJiangBufferDeviceService.getAircraftDetailById(aircraftId); + } + } + + @Override + public Map getDockDetailsByIds(List dockIds) { + log.debug("DefaultBufferDeviceImpl.getDockDetailsByIds: dockIds.size={}", + dockIds != null ? dockIds.size() : 0); + + if (dockIds == null || dockIds.isEmpty()) { + 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) { + log.debug("DefaultBufferDeviceImpl.getAircraftDetailsByIds: aircraftIds.size={}", + aircraftIds != null ? aircraftIds.size() : 0); + + if (aircraftIds == null || aircraftIds.isEmpty()) { + 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; + } +} diff --git a/src/main/java/com/ruoyi/device/service/impl/TuohengBufferDeviceImpl.java b/src/main/java/com/ruoyi/device/service/impl/TuohengBufferDeviceImpl.java index 69317a0..6ad65f0 100644 --- a/src/main/java/com/ruoyi/device/service/impl/TuohengBufferDeviceImpl.java +++ b/src/main/java/com/ruoyi/device/service/impl/TuohengBufferDeviceImpl.java @@ -24,7 +24,7 @@ import java.util.Map; * 专门处理拓恒设备的数据整合 * * @author ruoyi - * @date 2026-02-04 + * @date 2026-02-04Ï */ @Service("tuohengBufferDeviceService") @Slf4j diff --git a/src/main/java/com/ruoyi/device/websocket/StatisticsWebSocket.java b/src/main/java/com/ruoyi/device/websocket/StatisticsWebSocket.java index 06359ec..fcff49b 100644 --- a/src/main/java/com/ruoyi/device/websocket/StatisticsWebSocket.java +++ b/src/main/java/com/ruoyi/device/websocket/StatisticsWebSocket.java @@ -1,7 +1,7 @@ package com.ruoyi.device.websocket; import com.alibaba.fastjson2.JSON; -import com.ruoyi.device.service.api.IBufferDeviceService; +import com.ruoyi.device.service.impl.DefaultBufferDeviceImpl; import com.ruoyi.device.service.dto.DockDetailDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,7 +60,7 @@ public class StatisticsWebSocket { } @Autowired - private IBufferDeviceService bufferDeviceService; + private DefaultBufferDeviceImpl bufferDeviceService; public void broadcast(String dockerId) {