liusuyi
2025-12-19 c00093644d9e0bd126f23cd826982f09e55c2051
优化飞行状态
1 files added
3 files modified
1 files renamed
76 ■■■■■ changed files
ard-work/src/main/java/com/ard/work/domain/cache/UavStateCache.java 12 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/UavFlightStateDTO.java 20 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/IArdFlightTaskPartService.java 7 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java 35 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/cache/UavStateCache.java
@@ -1,8 +1,10 @@
package com.ard.work.domain.cache;
import com.ard.work.domain.dto.state.UavState;
import com.ard.work.domain.dto.telemetry.TelemetryData;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiConsumer;
/**
 * 无人机状态缓存
@@ -28,12 +30,8 @@
        cache.remove(boxSn);
    }
    // 定时任务使用:判断状态是否变化,但不更新缓存
    public static boolean hasChanged(String boxSn, UavState newState) {
        UavState oldState = cache.get(boxSn);
        if (oldState == null) {
            return true; // 没有缓存,算作变化
        }
        return !oldState.equals(newState); // true = 有变化
    // 遍历并处理每条 UavState
    public static void forEach(BiConsumer<String, UavState> consumer) {
        cache.forEach(consumer);
    }
}
ard-work/src/main/java/com/ard/work/domain/dto/UavFlightStateDTO.java
New file
@@ -0,0 +1,20 @@
package com.ard.work.domain.dto;
import com.ard.work.domain.dto.state.UavState;
import com.ard.work.domain.dto.telemetry.TelemetryData;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * Description: 无人机飞行状态DTO
 * Author: lsy
 * Date: 2025年12月19日16:32
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UavFlightStateDTO {
    private UavState uavState;
    private TelemetryData telemetryData;
}
ard-work/src/main/java/com/ard/work/service/IArdFlightTaskPartService.java
@@ -1,5 +1,6 @@
package com.ard.work.service;
import com.ard.work.domain.dto.UavFlightStateDTO;
import com.ard.work.domain.dto.telemetry.TelemetryData;
import com.ard.work.domain.entity.ArdFlightTaskPart;
@@ -11,15 +12,15 @@
public interface IArdFlightTaskPartService {
    /**
     * 添加一条遥测数据到缓存
     * 添加一条飞行状态数据到缓存
     */
    void addTelemetryData(TelemetryData telemetryData);
    void addTelemetryData(UavFlightStateDTO uavFlightStateDTO);
    /**
     * 将剩余缓存分片保存
     */
    void flushRemaining(String boxSn);
    /**
     * 获取完整航线轨迹(合并所有分片)
     * 获取完整轨迹(合并所有分片)
     */
    List<TelemetryData> getCompleteFlightData(ArdFlightTaskPart ardFlightTaskPart);
ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java
@@ -1,7 +1,10 @@
package com.ard.work.service.impl;
import cn.hutool.core.util.SerializeUtil;
import com.ard.work.domain.cache.UavStateCache;
import com.ard.work.domain.cache.UavTelemetryDataCache;
import com.ard.work.domain.dto.UavFlightStateDTO;
import com.ard.work.domain.dto.state.UavState;
import com.ard.work.domain.dto.telemetry.TelemetryData;
import com.ard.work.domain.entity.ArdFlightTaskPart;
import com.ard.work.mapper.ArdFlightTaskPartMapper;
@@ -11,8 +14,6 @@
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -30,7 +31,7 @@
    /**
     * 缓存:boxSn -> 当前分片数据
     */
    private final ConcurrentHashMap<String, List<TelemetryData>> cacheMap = new ConcurrentHashMap<>();
    private final ConcurrentHashMap<String, List<UavFlightStateDTO>> cacheMap = new ConcurrentHashMap<>();
    /**
     * 分片保存阈值条数
@@ -44,11 +45,19 @@
    @Scheduled(fixedRate = 1000)
    public void readTelemetryTask() {
        UavTelemetryDataCache.forEach((boxSn, telemetryData) -> {
            // 只记录相对高度大于1米的数据
            float relativeHeight = telemetryData.getUltrasonic(); // 或者 telemetryData.getRelativeHeight(),根据你的字段
            if (relativeHeight > 1) {
                addTelemetryData(telemetryData);
            // 从状态缓存里取当前状态
            UavState uavState = UavStateCache.get(boxSn);
            if (uavState == null) {
                return; // 状态不存在,不记录
            }
            UavFlightStateDTO dto = new UavFlightStateDTO(
                    uavState,
                    telemetryData
            );
            addTelemetryData(dto);
        });
    }
@@ -56,10 +65,10 @@
     * 添加一条遥测数据到缓存
     */
    @Override
    public void addTelemetryData(TelemetryData telemetryData) {
        String boxSn = telemetryData.getBoxSn();
        List<TelemetryData> list = cacheMap.computeIfAbsent(boxSn, k -> new ArrayList<>());
        list.add(telemetryData);
    public void addTelemetryData(UavFlightStateDTO uavFlightStateDTO) {
        String boxSn = uavFlightStateDTO.getTelemetryData().getBoxSn();
        List<UavFlightStateDTO> list = cacheMap.computeIfAbsent(boxSn, k -> new ArrayList<>());
        list.add(uavFlightStateDTO);
        // 当缓存条数达到阈值 或 时间间隔超过 CHUNK_INTERVAL 时,分片保存
        if (list.size() >= CHUNK_SIZE) {
@@ -72,7 +81,7 @@
     */
    @Async
    public void saveChunk(String boxSn) {
        List<TelemetryData> dataList = cacheMap.getOrDefault(boxSn, new ArrayList<>());
        List<UavFlightStateDTO> dataList = cacheMap.getOrDefault(boxSn, new ArrayList<>());
        if (dataList.isEmpty()) {
            return;
        }
@@ -104,7 +113,7 @@
     */
    @Override
    public void flushRemaining(String boxSn) {
        List<TelemetryData> dataList = cacheMap.getOrDefault(boxSn, new ArrayList<>());
        List<UavFlightStateDTO> dataList = cacheMap.getOrDefault(boxSn, new ArrayList<>());
        if (!dataList.isEmpty()) {
            saveChunk(boxSn);
        }
ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceImpl.java
File was renamed from ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java
@@ -48,7 +48,7 @@
@Slf4j
@Service
public class ArdFlightTaskServiceServiceImpl implements IArdFlightTaskService {
public class ArdFlightTaskServiceImpl implements IArdFlightTaskService {
    @Resource
    private ArdFlightTaskMapper ardFlightTaskMapper;