From ba8b1496ba9881719e522d0a60a8c86baa7be08b Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Sat, 20 Dec 2025 10:34:23 +0800
Subject: [PATCH] 优化飞行状态

---
 ard-work/src/main/java/com/ard/work/domain/dto/state/CameraState.java              |    5 +
 ard-work/src/main/java/com/ard/work/domain/dto/state/PtzState.java                 |    5 +
 ard-work/src/main/java/com/ard/work/domain/dto/state/PointData.java                |   50 ++++++++++++----
 ard-work/src/main/java/com/ard/work/domain/dto/state/UavState.java                 |    5 +
 ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java |    6 +-
 ard-work/src/main/java/com/ard/work/domain/dto/state/BatteryState.java             |    6 +
 ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java         |    4 
 ard-work/src/main/java/com/ard/work/service/IArdFlightTaskPartService.java         |    2 
 ard-work/src/main/java/com/ard/work/domain/dto/state/HmsAlarmData.java             |    5 +
 ard-work/src/main/java/com/ard/work/domain/dto/state/MissionState.java             |    5 +
 ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java      |    8 +-
 ard-work/src/main/java/com/ard/work/domain/dto/UavFlightStateDTO.java              |    5 +
 ard-work/src/main/java/com/ard/work/domain/dto/state/FlightControllerState.java    |    5 +
 ard-work/src/main/java/com/ard/work/domain/dto/state/AvoidanceData.java            |    5 +
 ard-work/src/main/java/com/ard/work/domain/dto/state/BatteryStateInfo.java         |    7 +
 15 files changed, 86 insertions(+), 37 deletions(-)

diff --git a/ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java b/ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java
index 0c5821c..626e421 100644
--- a/ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java
+++ b/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);
     }
 
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/UavFlightStateDTO.java b/ard-work/src/main/java/com/ard/work/domain/dto/UavFlightStateDTO.java
index f176a20..721f28d 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/UavFlightStateDTO.java
+++ b/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;
 }
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/state/AvoidanceData.java b/ard-work/src/main/java/com/ard/work/domain/dto/state/AvoidanceData.java
index fa6c176..5a15289 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/state/AvoidanceData.java
+++ b/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;                       // 前方健康状态
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/state/BatteryState.java b/ard-work/src/main/java/com/ard/work/domain/dto/state/BatteryState.java
index 4e54884..a77e1ea 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/state/BatteryState.java
+++ b/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)
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/state/BatteryStateInfo.java b/ard-work/src/main/java/com/ard/work/domain/dto/state/BatteryStateInfo.java
index 98c407a..e376189 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/state/BatteryStateInfo.java
+++ b/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)
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/state/CameraState.java b/ard-work/src/main/java/com/ard/work/domain/dto/state/CameraState.java
index d061e74..dc7abf6 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/state/CameraState.java
+++ b/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;        // 录制时长(单位:秒)
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/state/FlightControllerState.java b/ard-work/src/main/java/com/ard/work/domain/dto/state/FlightControllerState.java
index 6b3a6bb..5452459 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/state/FlightControllerState.java
+++ b/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; // 飞行模式
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/state/HmsAlarmData.java b/ard-work/src/main/java/com/ard/work/domain/dto/state/HmsAlarmData.java
index 2cc36eb..937f7ba 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/state/HmsAlarmData.java
+++ b/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; // 报警信息描述(支持中文和英文版本,默认中文,如需切换请联系技术支持)
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/state/MissionState.java b/ard-work/src/main/java/com/ard/work/domain/dto/state/MissionState.java
index 6c7ea44..b1d0036 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/state/MissionState.java
+++ b/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未完成(此值废弃)
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/state/PointData.java b/ard-work/src/main/java/com/ard/work/domain/dto/state/PointData.java
index daab7cc..42a1bd8 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/state/PointData.java
+++ b/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;
 
 }
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/state/PtzState.java b/ard-work/src/main/java/com/ard/work/domain/dto/state/PtzState.java
index 7232105..663f7b1 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/state/PtzState.java
+++ b/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°
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/state/UavState.java b/ard-work/src/main/java/com/ard/work/domain/dto/state/UavState.java
index 5caf6b6..2050bfe 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/state/UavState.java
+++ b/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;                            // 云台状态
diff --git a/ard-work/src/main/java/com/ard/work/service/IArdFlightTaskPartService.java b/ard-work/src/main/java/com/ard/work/service/IArdFlightTaskPartService.java
index 2dbf3c2..c906ed2 100644
--- a/ard-work/src/main/java/com/ard/work/service/IArdFlightTaskPartService.java
+++ b/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);
 
 }
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java
index 78e3352..053cfa6 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java
+++ b/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);
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java
index 9985e7e..b7ca8e4 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java
+++ b/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);

--
Gitblit v1.9.3