zhaowenyu
2026-04-01 b8b5a3895e741d5348ecdd39ad2e5cbd443f8e89
ard-work/src/main/java/com/ard/work/aspect/UavControlAspect.java
@@ -23,7 +23,6 @@
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
@@ -88,7 +87,7 @@
     * 高度检查
     */
    @Before("@annotation(checkTakeoffAltitude)")
    public void takeoffAltitudeCheck(JoinPoint joinPoint, CheckTakeoffAltitude checkTakeoffAltitude) {
    public void takeoffAltitudeCheck(JoinPoint joinPoint, CheckTakeoffAltitude checkTakeoffAltitude){
        // 获取最小高度
        double minAltitude = checkTakeoffAltitude.minAltitude();
        // 获取方法参数
@@ -103,7 +102,7 @@
                    throw new ControlException("遥测数据异常,无法执行!");
                }
                // 检查高度
                if (uavTelemetryData.getAltitude() < minAltitude) {
                if (uavTelemetryData.getUltrasonic() < minAltitude) {
                    throw new ControlException("高度太低,无法执行!最低高度: " + minAltitude);
                }
            }
@@ -126,8 +125,9 @@
            }
            // 检查在线状态
            if (checkDroneStatus.checkOnline()) {
                Boolean online = redisCache.getCacheObject(CacheConstants.UAV_ONLINE_KEY + boxSn);
                if (online == null || !online) {
                // 3️⃣ 检查在线状态
                BoxInfoReceiver obj = redisCache.getCacheObject(CacheConstants.UAV_ONLINE_KEY + boxSn);
                if (obj == null || !obj.getOnLine().equals(1)) {
                    throw new ControlException("无人机离线,无法执行操作!boxSn: " + boxSn);
                }
            }
@@ -144,34 +144,61 @@
            return;
        }
        Double longitude = null;
        Double latitude = null;
        // ① 提取 boxSn(无人机编号)和目标点坐标
        String boxSn = null;
        Double targetLon = null, targetLat = null;
        for (Object arg : args) {
            if (arg == null) {
                continue;
            if (arg == null) continue;
            if (boxSn == null) {
                String sn = ReflectUtils.getFieldValue(arg, "boxSn");
                if (sn != null) boxSn = sn;
            }
            Double lon = ReflectUtils.getFieldValue(arg, "longitude");
            Double lat = ReflectUtils.getFieldValue(arg, "latitude");
            if (lon != null && lat != null) {
                longitude = lon;
                latitude = lat;
                break;
            if (targetLon == null || targetLat == null) {
                Double lon = ReflectUtils.getFieldValue(arg, "longitude");
                Double lat = ReflectUtils.getFieldValue(arg, "latitude");
                if (lon != null && lat != null) {
                    targetLon = lon;
                    targetLat = lat;
                }
            }
        }
        if (longitude == null || latitude == null) {
            throw new ControlException("方法参数中未找到有效经纬度字段,无法判断禁飞区!");
        if (targetLon == null || targetLat == null) {
            throw new ControlException("方法参数中未找到有效目标经纬度字段,无法判断禁飞区!");
        }
        List<ArdNoFlyZone> ardNoFlyZones = ardNoFlyZoneService.selectArdNoFlyZoneList(new ArdNoFlyZone());
        if (!ardNoFlyZones.isEmpty()) {
            Vertex vertex = new Vertex(longitude, latitude);
            boolean inNoFlyZones = NoFlyZoneUtils.isInNoFlyZones(vertex, ardNoFlyZones);
            if (inNoFlyZones) {
                throw new ControlException("目标点在禁飞区内,无法执行操作!");
        // ② 获取无人机当前位置(从缓存)
        Vertex current = null;
        if (boxSn != null) {
            TelemetryData telemetry = UavTelemetryDataCache.get(boxSn);
            if (telemetry != null) {
                current = new Vertex(telemetry.getLng(), telemetry.getLat());
                //current = new Vertex(125.03, 46.58);
            }
        }
        Vertex target = new Vertex(targetLon, targetLat);
        // ③ 查询禁飞区
        List<ArdNoFlyZone> zones = ardNoFlyZoneService.selectArdNoFlyZoneList(new ArdNoFlyZone());
        if (zones.isEmpty()) return;
        for (ArdNoFlyZone zone : zones) {
            List<Vertex> polygon = zone.getVertices();
            if (polygon == null || polygon.size() < 3) continue;
            // 检查目标点是否在禁飞区
            if (NoFlyZoneUtils.isPointInPolygon(target, polygon)) {
                throw new ControlException("目标点在禁飞区【" + zone.getName() + "】内,无法执行操作!");
            }
            // 检查路径是否穿越禁飞区
            if (current != null && NoFlyZoneUtils.isLineIntersectPolygon(current, target, polygon)) {
                throw new ControlException("路径穿越禁飞区【" + zone.getName() + "】,无法执行操作!");
            }
        }
    }
}