package com.dongni.collisionavoidance.websocket.controller; import com.dongni.collisionavoidance.common.model.MovingObjectType; import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation; import com.dongni.collisionavoidance.common.service.VehicleLocationService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.stereotype.Controller; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * WebSocket地理位置控制器 * 提供实时车辆位置数据的WebSocket接口,基于PostGIS数据库 */ @Slf4j @Controller @RequiredArgsConstructor public class GeopositionController { private final VehicleLocationService vehicleLocationService; /** * 获取所有航空器的最新位置信息 * * 注意:航空器数据不再存储在数据库中,仅用于实时处理 * 此接口将返回空数据,需要从实时数据流获取航空器位置 * * @return 空的位置数据映射(航空器数据不持久化) */ @MessageMapping("/getGeoposition") @SendTo("/topic/geoSition") public Map getGeosition() { log.debug("接收到地理坐标请求 - 航空器数据不再持久化存储"); try { // 航空器数据不再存储在数据库中,返回空映射 // 前端需要从实时数据流或其他方式获取航空器位置信息 Map resultMap = Map.of(); log.debug("返回空的航空器位置信息(数据不持久化)"); return resultMap; } catch (Exception e) { log.error("获取航空器地理位置数据时发生异常", e); return Map.of(); // 返回空映射而不是null } } /** * 获取所有类型车辆的最新位置信息 * * 注意:只返回无人车位置数据,因为其他车辆数据不再持久化 * * @return 无人车位置数据映射 (vehicleId -> VehicleLocation) */ @MessageMapping("/getAllVehiclePositions") @SendTo("/topic/allVehiclePositions") public Map getAllVehiclePositions() { log.debug("接收到全部车辆位置请求 - 仅返回无人车数据"); try { // 只获取无人车数据,因为其他车辆数据不再持久化存储 List unmannedVehicles = vehicleLocationService .getActiveVehiclesByType(MovingObjectType.UNMANNED_VEHICLE, 5); // 转换为Map格式 Map resultMap = unmannedVehicles.stream() .collect(Collectors.toMap( VehicleLocation::getVehicleId, location -> location, (existing, replacement) -> replacement )); log.debug("返回 {} 个无人车位置信息(航空器和特种车辆数据不持久化)", resultMap.size()); return resultMap; } catch (Exception e) { log.error("获取车辆地理位置数据时发生异常", e); return Map.of(); } } /** * 根据车辆类型获取位置信息 * * 注意:只有UNMANNED_VEHICLE类型会返回数据,其他类型返回空数据 * * @param vehicleType 车辆类型 * @return 指定类型车辆位置数据(仅无人车有持久化数据) */ @MessageMapping("/getVehiclesByType") @SendTo("/topic/vehiclesByType") public Map getVehiclesByType(MovingObjectType vehicleType) { log.debug("接收到按类型查询车辆位置请求,类型: {}", vehicleType); try { List vehicles; if (MovingObjectType.UNMANNED_VEHICLE.equals(vehicleType)) { // 无人车数据从数据库获取 vehicles = vehicleLocationService.getActiveVehiclesByType(vehicleType, 5); log.debug("查询无人车数据: {} 条记录", vehicles.size()); } else { // 航空器和特种车辆数据不持久化,返回空列表 vehicles = List.of(); log.debug("类型 {} 的数据不持久化存储,返回空数据", vehicleType); } Map resultMap = vehicles.stream() .collect(Collectors.toMap( VehicleLocation::getVehicleId, location -> location, (existing, replacement) -> replacement )); log.debug("返回 {} 个 {} 类型车辆位置信息", resultMap.size(), vehicleType); return resultMap; } catch (Exception e) { log.error("根据类型获取车辆地理位置数据时发生异常,类型: {}", vehicleType, e); return Map.of(); } } }