130 lines
5.2 KiB
Java
130 lines
5.2 KiB
Java
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<String, VehicleLocation> getGeosition() {
|
||
log.debug("接收到地理坐标请求 - 航空器数据不再持久化存储");
|
||
|
||
try {
|
||
// 航空器数据不再存储在数据库中,返回空映射
|
||
// 前端需要从实时数据流或其他方式获取航空器位置信息
|
||
Map<String, VehicleLocation> 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<String, VehicleLocation> getAllVehiclePositions() {
|
||
log.debug("接收到全部车辆位置请求 - 仅返回无人车数据");
|
||
|
||
try {
|
||
// 只获取无人车数据,因为其他车辆数据不再持久化存储
|
||
List<VehicleLocation> unmannedVehicles = vehicleLocationService
|
||
.getActiveVehiclesByType(MovingObjectType.UNMANNED_VEHICLE, 5);
|
||
|
||
// 转换为Map格式
|
||
Map<String, VehicleLocation> 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<String, VehicleLocation> getVehiclesByType(MovingObjectType vehicleType) {
|
||
log.debug("接收到按类型查询车辆位置请求,类型: {}", vehicleType);
|
||
|
||
try {
|
||
List<VehicleLocation> vehicles;
|
||
|
||
if (MovingObjectType.UNMANNED_VEHICLE.equals(vehicleType)) {
|
||
// 无人车数据从数据库获取
|
||
vehicles = vehicleLocationService.getActiveVehiclesByType(vehicleType, 5);
|
||
log.debug("查询无人车数据: {} 条记录", vehicles.size());
|
||
} else {
|
||
// 航空器和特种车辆数据不持久化,返回空列表
|
||
vehicles = List.of();
|
||
log.debug("类型 {} 的数据不持久化存储,返回空数据", vehicleType);
|
||
}
|
||
|
||
Map<String, VehicleLocation> 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();
|
||
}
|
||
}
|
||
}
|