From b097f7539a7429a85cdda7959c9ecb83a37a2918 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Thu, 11 Jun 2026 14:49:28 +0800
Subject: [PATCH] 架次关联航线

---
 ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceImpl.java     |   16 ++++++++++++++++
 ard-work/src/main/resources/mapper/ArdFlightTaskMapper.xml                         |   12 ++++++++++++
 ard-work/src/main/java/com/ard/work/domain/entity/ArdFlightTask.java               |    9 +++++++++
 ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java |    8 +++++++-
 4 files changed, 44 insertions(+), 1 deletions(-)

diff --git a/ard-work/src/main/java/com/ard/work/domain/entity/ArdFlightTask.java b/ard-work/src/main/java/com/ard/work/domain/entity/ArdFlightTask.java
index 0556aba..fbbf3f4 100644
--- a/ard-work/src/main/java/com/ard/work/domain/entity/ArdFlightTask.java
+++ b/ard-work/src/main/java/com/ard/work/domain/entity/ArdFlightTask.java
@@ -30,6 +30,15 @@
     private Float aveSpeed;             // 平均速度
     private Float maxSpeed;             // 最大速度
     private String serverId;            // 服务器ID
+    private Integer flightMode;         // 飞行模式(来自飞控遥测)
+    private String routeId;             // 关联航线ID(ard_route_info.id),非空即为航线飞行
+
+    /**
+     * 判断是否为航线飞行
+     */
+    public boolean isRouteFlight() {
+        return routeId != null && !routeId.isEmpty();
+    }
 
     // 计算持续时长,单位:秒
     public Long getDuration() {
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 dc2658d..3544e79 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
@@ -2,8 +2,10 @@
 
 import cn.hutool.core.util.SerializeUtil;
 import com.ard.common.utils.DateUtils;
+
 import com.ard.work.domain.cache.UavStateCache;
 import com.ard.work.domain.cache.UavTelemetryDataCache;
+import com.ard.work.domain.cache.UavWaylineCache;
 import com.ard.work.domain.dto.UavFlightStateDTO;
 import com.ard.work.domain.dto.state.UavState;
 import com.ard.work.domain.dto.telemetry.TelemetryData;
@@ -77,7 +79,11 @@
                 log.debug("设备 {} 当前状态为:{}", boxSn, currentStatus);
                 // 只有飞行中才添加缓存
                 if (currentStatus == 2) {
-                    log.warn("设备 {} 当前状态为飞行中,添加遥测数据到缓存", boxSn);
+                    int flightMode = telemetryData.getFlightMode();
+                    if (flightMode != 14) {
+                        // 非航线模式 → 清理航线缓存,避免手动飞行被错绑 routeId
+                        UavWaylineCache.remove(boxSn);
+                    }
                     UavFlightStateDTO dto = new UavFlightStateDTO(uavState, telemetryData, dataTs);
                     addTelemetryData(dto);
                 }
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceImpl.java
index 35a510a..32c149a 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceImpl.java
@@ -5,6 +5,10 @@
 import com.ard.common.core.redis.RedisCache;
 import com.ard.common.utils.DateUtils;
 import com.ard.work.component.forest.TyClient;
+import com.ard.work.domain.cache.UavTelemetryDataCache;
+import com.ard.work.domain.cache.UavWaylineCache;
+import com.ard.work.domain.dto.telemetry.TelemetryData;
+import com.ard.work.domain.dto.wayline.WaylineInfo;
 import com.ard.work.domain.dto.BoxHistoryDTO;
 import com.ard.work.domain.entity.ArdFlightTask;
 import com.ard.work.domain.receiver.BoxHistoryReceiver;
@@ -130,6 +134,18 @@
                     .maxSpeed(boxHistoryReceiver.getMaxSpeed())
                     .build();
 
+            // 从遥测缓存和航线缓存直接获取 flightMode 和 routeId
+            // UavWaylineCache 在飞行中持续有效,仅在飞行中 flightMode!=14 时被清除
+            String boxSn = flightTask.getBoxSn();
+            WaylineInfo waylineInfo = UavWaylineCache.get(boxSn);
+            if (waylineInfo != null && waylineInfo.getWaylineId() != null) {
+                flightTask.setRouteId(waylineInfo.getWaylineId());
+            }
+            TelemetryData telemetryData = UavTelemetryDataCache.get(boxSn);
+            if (telemetryData != null && telemetryData.getFlightMode() > 0) {
+                flightTask.setFlightMode(telemetryData.getFlightMode());
+            }
+
             Long flyUserId = uavControlService.getCurrentController(flightTask.getBoxSn(), "fly");
             if (flyUserId != null) {
                 SysUser flyUser = redisCache.getCacheMapValue(CacheConstants.SYS_USER, flyUserId.toString());
diff --git a/ard-work/src/main/resources/mapper/ArdFlightTaskMapper.xml b/ard-work/src/main/resources/mapper/ArdFlightTaskMapper.xml
index 906d113..910a082 100644
--- a/ard-work/src/main/resources/mapper/ArdFlightTaskMapper.xml
+++ b/ard-work/src/main/resources/mapper/ArdFlightTaskMapper.xml
@@ -19,6 +19,8 @@
         <result property="aveSpeed" column="ave_speed"/>
         <result property="maxSpeed" column="max_speed"/>
         <result property="serverId" column="server_id"/>
+        <result property="flightMode" column="flight_mode"/>
+        <result property="routeId" column="route_id"/>
         <result property="createBy" column="create_by"/>
         <result property="createTime" column="create_time"/>
         <result property="updateBy" column="update_by"/>
@@ -42,6 +44,8 @@
         aft.ave_speed,
         aft.max_speed,
         aft.server_id,
+        aft.flight_mode,
+        aft.route_id,
         aft.create_by,
         aft.create_time,
         aft.update_by,
@@ -57,6 +61,8 @@
                 <if test="startTime != null">AND aft.start_time &gt;= #{startTime}</if>
                 <if test="endTime != null">AND aft.end_time &lt;= #{endTime}</if>
                 <if test="serverId != null">AND aft.server_id = #{serverId}</if>
+                <if test="routeId != null">AND aft.route_id = #{routeId}</if>
+                <if test="flightMode != null">AND aft.flight_mode = #{flightMode}</if>
                 <if test="params.beginTime != null"><!-- 开始时间检索 -->
                     AND aft.create_time &gt;= #{params.beginTime}
                 </if>
@@ -86,6 +92,8 @@
             <if test="aveSpeed != null">ave_speed,</if>
             <if test="maxSpeed != null">max_speed,</if>
             <if test="serverId != null">server_id,</if>
+            <if test="flightMode != null">flight_mode,</if>
+            <if test="routeId != null">route_id,</if>
             <if test="createBy != null">create_by,</if>
             <if test="createTime != null">create_time,</if>
             <if test="updateBy != null">update_by,</if>
@@ -107,6 +115,8 @@
             <if test="aveSpeed != null">#{aveSpeed},</if>
             <if test="maxSpeed != null">#{maxSpeed},</if>
             <if test="serverId != null">#{serverId},</if>
+            <if test="flightMode != null">#{flightMode},</if>
+            <if test="routeId != null">#{routeId},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="updateBy != null">#{updateBy},</if>
@@ -132,6 +142,8 @@
             <if test="aveSpeed != null">ave_speed = #{aveSpeed},</if>
             <if test="maxSpeed != null">max_speed = #{maxSpeed},</if>
             <if test="serverId != null">server_id = #{serverId},</if>
+            <if test="flightMode != null">flight_mode = #{flightMode},</if>
+            <if test="routeId != null">route_id = #{routeId},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="remark != null">remark = #{remark},</if>

--
Gitblit v1.9.3