liusuyi
2025-12-20 ba8b1496ba9881719e522d0a60a8c86baa7be08b
优化飞行状态
15 files modified
123 ■■■■■ changed files
ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java 4 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/UavFlightStateDTO.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/state/AvoidanceData.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/state/BatteryState.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/state/BatteryStateInfo.java 7 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/state/CameraState.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/state/FlightControllerState.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/state/HmsAlarmData.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/state/MissionState.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/state/PointData.java 50 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/state/PtzState.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/state/UavState.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/IArdFlightTaskPartService.java 2 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java 8 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java 6 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java
@@ -6,6 +6,7 @@
import com.ard.work.domain.dto.BoxHistoryDTO;
import com.ard.work.domain.dto.BoxPhotosDTO;
import com.ard.work.domain.dto.BoxSettingsDTO;
import com.ard.work.domain.dto.UavFlightStateDTO;
import com.ard.work.domain.dto.telemetry.TelemetryData;
import com.ard.work.domain.entity.ArdFlightTask;
import com.ard.work.domain.entity.ArdFlightTaskPart;
@@ -89,8 +90,7 @@
    @ApiOperationSupport(order = 4)
    @GetMapping("/getCompleteFlightData")
    public TableDataInfo getCompleteFlightData(ArdFlightTaskPart ardFlightTaskPart){
        startPage();
        List<TelemetryData> completeFlightData = ardFlightTaskPartService.getCompleteFlightData(ardFlightTaskPart);
        List<UavFlightStateDTO> completeFlightData = ardFlightTaskPartService.getCompleteFlightData(ardFlightTaskPart);
        return getDataTable(completeFlightData);
    }
ard-work/src/main/java/com/ard/work/domain/dto/UavFlightStateDTO.java
@@ -6,6 +6,8 @@
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
 * Description: 无人机飞行状态DTO
 * Author: lsy
@@ -14,7 +16,8 @@
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UavFlightStateDTO {
public class UavFlightStateDTO implements Serializable {
    private static final long serialVersionUID = 1L;
    private UavState uavState;
    private TelemetryData telemetryData;
}
ard-work/src/main/java/com/ard/work/domain/dto/state/AvoidanceData.java
@@ -2,9 +2,12 @@
import lombok.Data;
import java.io.Serializable;
// 避障数据类
@Data
public class AvoidanceData {
public class AvoidanceData implements Serializable {
    private static final long serialVersionUID = 1L;
    private int downHealth;                        // 下方健康状态
    private float down;                            // 距下障碍物的距离(单位:米),downHealth 为 1 时值有效
    private int frontHealth;                       // 前方健康状态
ard-work/src/main/java/com/ard/work/domain/dto/state/BatteryState.java
@@ -5,12 +5,14 @@
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BatteryState {
public class BatteryState implements Serializable {
    private static final long serialVersionUID = 1L;
    private int batteryNum;                // 电池数量
    private String batteryPower;           // 电池电量,多个电池用下划线分割
    private String batteryVoltage;         // 电池电压,多个电池用下划线分割(单位: V)
ard-work/src/main/java/com/ard/work/domain/dto/state/BatteryStateInfo.java
@@ -4,6 +4,8 @@
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
 * BatteryStateDto
 *
@@ -13,8 +15,9 @@
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BatteryStateInfo {
    private int isBatteryEmbed;        // 电池插入飞机状态:0=插入,1=未插入
public class BatteryStateInfo implements Serializable {
    private static final long serialVersionUID = 1L;
    private int isBatteryEmbed;         // 电池插入飞机状态:0=插入,1=未插入
    private int batteryCapacityPercent; // 电池电量百分比
    private int currentVoltage;         // 电池电压 (单位: mV)
    private int currentElectric;        // 当前电池电流 (单位: mA)
ard-work/src/main/java/com/ard/work/domain/dto/state/CameraState.java
@@ -2,9 +2,12 @@
import lombok.Data;
import java.io.Serializable;
// 相机状态类
@Data
public class CameraState {
public class CameraState implements Serializable {
    private static final long serialVersionUID = 1L;
    private int mode;                  // 相机模式:1=拍照模式,2=录像模式,0=未知
    private int isRecording;           // 是否录制中:1=录制中,0=未录制
    private int recordDuration;        // 录制时长(单位:秒)
ard-work/src/main/java/com/ard/work/domain/dto/state/FlightControllerState.java
@@ -2,8 +2,11 @@
import lombok.Data;
import java.io.Serializable;
@Data
public class FlightControllerState {
public class FlightControllerState implements Serializable {
    private static final long serialVersionUID = 1L;
    private int satelliteCount; // 卫星计数
    private int gpsSignalLevel; // GPS信号级别 (0-5)
    private int flightMode; // 飞行模式
ard-work/src/main/java/com/ard/work/domain/dto/state/HmsAlarmData.java
@@ -2,9 +2,12 @@
import lombok.Data;
import java.io.Serializable;
// Hms报警信息类
@Data
public class HmsAlarmData {
public class HmsAlarmData implements Serializable {
    private static final long serialVersionUID = 1L;
    private int alarmId;        // 报警信息ID
    private int reportLevel;    // 等级 [1/2-警告 3/4/5-错误]
    private String alarmMssInfo; // 报警信息描述(支持中文和英文版本,默认中文,如需切换请联系技术支持)
ard-work/src/main/java/com/ard/work/domain/dto/state/MissionState.java
@@ -2,9 +2,12 @@
import lombok.Data;
import java.io.Serializable;
// 任务状态类
@Data
public class MissionState {
public class MissionState implements Serializable {
    private static final long serialVersionUID = 1L;
    private int isPause;                // 航线是否暂停中:0=未暂停,1=暂停中
    private int targetWaypointIndex;     // 目标航点下标
    private int isWaypointFinished;      // 是否航点完成:1完成、0未完成(此值废弃)
ard-work/src/main/java/com/ard/work/domain/dto/state/PointData.java
@@ -3,28 +3,40 @@
import com.ard.work.domain.dto.wayline.PointAction;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
// 假设 PointData 类定义如下
@Data
public class PointData {
    /** 纬度 */
public class PointData implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 纬度
     */
    private double lat;
    /** 经度 */
    /**
     * 经度
     */
    private double lng;
    /** 高度(单位:米,范围0~遥控器限高) */
    /**
     * 高度(单位:米,范围0~遥控器限高)
     */
    private float height;
    /** 速度(单位:米/秒,范围0~15),默认8 */
    /**
     * 速度(单位:米/秒,范围0~15),默认8
     */
    private float speed;
    /** 动作数组 */
    /**
     * 动作数组
     */
    private List<PointAction> actions;
    /** 航线飞行模式:
    /**
     * 航线飞行模式:
     * 1=直线飞行,
     * 2=协调转弯,
     * 3=曲线飞行(停),
@@ -32,16 +44,20 @@
     */
    private int flightPathMode;
    /** 转弯半径(仅协调转弯模式下有效),取值范围1~655.35单位:米 */
    /**
     * 转弯半径(仅协调转弯模式下有效),取值范围1~655.35单位:米
     */
    private float dampingDistance;
    /** 是否为安全返航点
    /**
     * 是否为安全返航点
     * 0=不是,
     * 1=是
     */
    private int safeGohomeFlag;
    /** 偏航模式
    /**
     * 偏航模式
     * 0=自动,
     * 1=锁定,
     * 2=遥控器控制,
@@ -51,13 +67,19 @@
     */
    private int headingMode;
    /** 航点偏航 -180~180 */
    /**
     * 航点偏航 -180~180
     */
    private float heading;
    /** 兴趣点下标,默认-1 */
    /**
     * 兴趣点下标,默认-1
     */
    private int interestIndex;
    /** 组下标 */
    /**
     * 组下标
     */
    private int groupIndex;
}
ard-work/src/main/java/com/ard/work/domain/dto/state/PtzState.java
@@ -2,9 +2,12 @@
import lombok.Data;
import java.io.Serializable;
// 云台状态类
@Data
public class PtzState {
public class PtzState implements Serializable {
    private static final long serialVersionUID = 1L;
    private float pitch; // 俯仰角,范围:-120° ~ 30°
    private float roll;  // 横滚角,范围:-90° ~ 60°
    private float yaw;   // 偏航角,范围:-180° ~ 180°
ard-work/src/main/java/com/ard/work/domain/dto/state/UavState.java
@@ -3,6 +3,7 @@
import com.ard.work.util.CameraUtil;
import lombok.*;
import java.io.Serializable;
import java.util.List;
@Data
@@ -10,8 +11,8 @@
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class UavState {
public class UavState implements Serializable {
    private static final long serialVersionUID = 1L;
    private FlightControllerState flightControllerState;  // 飞控状态
    private BatteryState batteryState;                    // 电池状态
    private PtzState ptzState;                            // 云台状态
ard-work/src/main/java/com/ard/work/service/IArdFlightTaskPartService.java
@@ -22,6 +22,6 @@
    /**
     * 获取完整轨迹(合并所有分片)
     */
    List<TelemetryData> getCompleteFlightData(ArdFlightTaskPart ardFlightTaskPart);
    List<UavFlightStateDTO> getCompleteFlightData(ArdFlightTaskPart ardFlightTaskPart);
}
ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java
@@ -320,11 +320,12 @@
                String redisKey = CacheConstants.UAV_ONLINE_KEY + boxSn;
                boolean currentOnline = remote.getOnLine() == 1;
                // 获取上次状态
                boolean lastOnline = redisCache.getCacheObject(redisKey) != null;
                ArdDroneInfo local = localMap.get(boxSn);
                boolean dbOnline = local != null && local.getOnLine() == 1;
                boolean needUpdate = (dbOnline != currentOnline);
                // 如果状态变化才更新
                if (lastOnline != currentOnline) {
                if (needUpdate){
                    // 更新 Redis
                    if (currentOnline) {
                        redisCache.setCacheObject(redisKey, remote);
@@ -334,7 +335,6 @@
                    // 发布事件
                    eventPublisher.publishEvent(new DeviceStatusEvent(boxSn, currentOnline));
                    // 更新数据库
                    ArdDroneInfo local = localMap.get(boxSn);
                    if (local != null) {
                        local.setOnLine(currentOnline ? 1 : 0);
                        updateArdDrone(local);
ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java
@@ -123,13 +123,13 @@
     * 获取完整航线轨迹(合并所有分片)
     */
    @Override
    public List<TelemetryData> getCompleteFlightData(ArdFlightTaskPart ardFlightTaskPart) {
        List<TelemetryData> allData = new ArrayList<>();
    public List<UavFlightStateDTO> getCompleteFlightData(ArdFlightTaskPart ardFlightTaskPart) {
        List<UavFlightStateDTO> allData = new ArrayList<>();
        String boxSn = ardFlightTaskPart.getBoxSn();
        List<ArdFlightTaskPart> parts = ardflightTaskPartMapper.selectByTaskStartTime(ardFlightTaskPart);
        for (ArdFlightTaskPart part : parts) {
            try {
                List<TelemetryData> partData = SerializeUtil.deserialize(part.getDataPart());
                List<UavFlightStateDTO> partData = SerializeUtil.deserialize(part.getDataPart());
                allData.addAll(partData);
            } catch (Exception e) {
                log.error("反序列化 boxSn={} 分片数据失败", boxSn, e);