From e0a6ad18bb69cdba48064327a439efca5673dcf1 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Fri, 19 Dec 2025 09:57:01 +0800
Subject: [PATCH] 增加无人机在线离线事件监听 增加飞行轨迹业务处理
---
ard-work/src/main/java/com/ard/work/mapper/ArdFlightTaskMapper.java | 1
ard-work/src/main/resources/mapper/ArdFlightTaskPartMapper.xml | 27 +++
ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java | 7
ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java | 128 ++++++++++++++++++
ard-work/src/main/java/com/ard/work/domain/cache/UavTelemetryDataCache.java | 13 -
ard-work/src/main/java/com/ard/work/config/RouteStateMachineListener.java | 1
ard-admin/src/main/java/com/ard/web/controller/work/UavBaseController.java | 25 ++
ard-work/src/main/java/com/ard/work/domain/event/DeviceStatusEvent.java | 17 ++
ard-work/src/main/java/com/ard/work/listener/DeviceStatusEventListener.java | 38 +++++
ard-work/src/main/java/com/ard/work/service/IArdFlightTaskPartService.java | 26 +++
ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java | 1
ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java | 60 ++++++--
ard-work/src/main/java/com/ard/work/domain/entity/ArdFlightTaskPart.java | 16 ++
ard-work/src/main/java/com/ard/work/domain/dto/telemetry/TelemetryData.java | 4
ard-work/src/main/java/com/ard/work/mapper/ArdFlightTaskPartMapper.java | 26 +++
15 files changed, 356 insertions(+), 34 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 2ca21ae..0c5821c 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,13 +6,15 @@
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.entity.ArdDroneInfo;
+import com.ard.work.domain.dto.telemetry.TelemetryData;
import com.ard.work.domain.entity.ArdFlightTask;
+import com.ard.work.domain.entity.ArdFlightTaskPart;
import com.ard.work.domain.entity.ArdMedia;
import com.ard.work.domain.receiver.BoxHistoryReceiver;
-import com.ard.work.domain.receiver.BoxPhotosReceiver;
import com.ard.work.domain.receiver.BoxInfoReceiver;
+import com.ard.work.domain.receiver.BoxPhotosReceiver;
import com.ard.work.domain.receiver.BoxStreamUrlReceiver;
+import com.ard.work.service.IArdFlightTaskPartService;
import com.ard.work.service.IArdFlightTaskService;
import com.ard.work.service.IArdMediaService;
import com.ard.work.service.ITyService;
@@ -20,11 +22,13 @@
import com.github.xiaoymin.knife4j.annotations.ApiSort;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
+import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import java.util.List;
-import static com.ard.common.utils.PageUtils.startPage;
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
/**
* UavBaseController
@@ -42,6 +46,8 @@
private ITyService tyService;
@Resource
private IArdFlightTaskService ardFlightTaskService;
+ @Resource
+ private IArdFlightTaskPartService ardFlightTaskPartService;
@Resource
private IArdMediaService ardMediaService;
@@ -79,6 +85,15 @@
return getDataTable(list);
}
+ @ApiOperation("获取架次飞行轨迹")
+ @ApiOperationSupport(order = 4)
+ @GetMapping("/getCompleteFlightData")
+ public TableDataInfo getCompleteFlightData(ArdFlightTaskPart ardFlightTaskPart){
+ startPage();
+ List<TelemetryData> completeFlightData = ardFlightTaskPartService.getCompleteFlightData(ardFlightTaskPart);
+ return getDataTable(completeFlightData);
+ }
+
@ApiOperation("获取媒体数据")
@ApiOperationSupport(order = 4)
@GetMapping("/getMediaList")
diff --git a/ard-work/src/main/java/com/ard/work/config/RouteStateMachineListener.java b/ard-work/src/main/java/com/ard/work/config/RouteStateMachineListener.java
index 1f44591..1ac6cc8 100644
--- a/ard-work/src/main/java/com/ard/work/config/RouteStateMachineListener.java
+++ b/ard-work/src/main/java/com/ard/work/config/RouteStateMachineListener.java
@@ -31,5 +31,4 @@
log.info("boxSn={} 状态变更为 {}", boxSn, target);
}
-
}
diff --git a/ard-work/src/main/java/com/ard/work/domain/cache/UavTelemetryDataCache.java b/ard-work/src/main/java/com/ard/work/domain/cache/UavTelemetryDataCache.java
index abb7da0..870845b 100644
--- a/ard-work/src/main/java/com/ard/work/domain/cache/UavTelemetryDataCache.java
+++ b/ard-work/src/main/java/com/ard/work/domain/cache/UavTelemetryDataCache.java
@@ -3,7 +3,9 @@
import com.ard.work.domain.dto.state.UavState;
import com.ard.work.domain.dto.telemetry.TelemetryData;
+import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.BiConsumer;
/**
* 无人机遥测数据缓存
@@ -31,12 +33,9 @@
cache.remove(boxSn);
}
- // 定时任务使用:判断状遥测数据是否变化,但不更新缓存
- public static boolean hasChanged(String boxSn, TelemetryData telemetryData) {
- TelemetryData oldTelemetryData= cache.get(boxSn);
- if (oldTelemetryData == null) {
- return true; // 没有缓存,算作变化
- }
- return !oldTelemetryData.equals(telemetryData); // true = 有变化
+
+ // 遍历并处理每条 TelemetryData
+ public static void forEach(BiConsumer<String, TelemetryData> consumer) {
+ cache.forEach(consumer);
}
}
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/telemetry/TelemetryData.java b/ard-work/src/main/java/com/ard/work/domain/dto/telemetry/TelemetryData.java
index 8111ec1..d8be871 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/telemetry/TelemetryData.java
+++ b/ard-work/src/main/java/com/ard/work/domain/dto/telemetry/TelemetryData.java
@@ -2,12 +2,14 @@
import lombok.*;
+import java.io.Serializable;
+
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
-public class TelemetryData {
+public class TelemetryData implements Serializable {
private double lng; // 经度
private double lat; // 纬度
diff --git a/ard-work/src/main/java/com/ard/work/domain/entity/ArdFlightTaskPart.java b/ard-work/src/main/java/com/ard/work/domain/entity/ArdFlightTaskPart.java
new file mode 100644
index 0000000..7f18ee1
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/work/domain/entity/ArdFlightTaskPart.java
@@ -0,0 +1,16 @@
+package com.ard.work.domain.entity;
+
+import com.ard.common.core.domain.BaseEntity;
+import lombok.*;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ArdFlightTaskPart extends BaseEntity {
+ private Long id;
+ private String boxSn;
+ private Integer count;
+ private byte[] dataPart;
+}
diff --git a/ard-work/src/main/java/com/ard/work/domain/event/DeviceStatusEvent.java b/ard-work/src/main/java/com/ard/work/domain/event/DeviceStatusEvent.java
new file mode 100644
index 0000000..c8ef016
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/work/domain/event/DeviceStatusEvent.java
@@ -0,0 +1,17 @@
+package com.ard.work.domain.event;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class DeviceStatusEvent {
+ private String boxSn; // 设备唯一标识符
+ @Builder.Default
+ private boolean isOnline = false; // true表示在线,false表示离线
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/work/listener/DeviceStatusEventListener.java b/ard-work/src/main/java/com/ard/work/listener/DeviceStatusEventListener.java
new file mode 100644
index 0000000..bfc6653
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/work/listener/DeviceStatusEventListener.java
@@ -0,0 +1,38 @@
+package com.ard.work.listener;
+
+import com.ard.work.domain.event.DeviceStatusEvent;
+import com.ard.work.service.IArdFlightTaskPartService;
+import lombok.extern.java.Log;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * 无人机状态事件监听
+ *
+ * @author lsy
+ * @date 2025/12/19
+ */
+
+@Component
+@Slf4j
+public class DeviceStatusEventListener {
+
+ @Autowired
+ private IArdFlightTaskPartService ardFlightTaskPartService;
+
+ @EventListener
+ public void handleDeviceStatusEvent(DeviceStatusEvent event) {
+ String boxSn = event.getBoxSn();
+ boolean isOnline = event.isOnline();
+
+ if (isOnline) {
+ log.info("设备 {} 已上线", boxSn);
+ } else {
+ log.info("设备 {} 已离线", boxSn);
+ //将剩余轨迹分片数据入库
+ ardFlightTaskPartService.flushRemaining(boxSn);
+ }
+ }
+}
diff --git a/ard-work/src/main/java/com/ard/work/mapper/ArdFlightTaskMapper.java b/ard-work/src/main/java/com/ard/work/mapper/ArdFlightTaskMapper.java
index d6683b3..91e12cb 100644
--- a/ard-work/src/main/java/com/ard/work/mapper/ArdFlightTaskMapper.java
+++ b/ard-work/src/main/java/com/ard/work/mapper/ArdFlightTaskMapper.java
@@ -22,7 +22,6 @@
// 获取某个时间戳后的任务
List<ArdFlightTask> getTasksAfter(@Param("lastSyncTime") String lastSyncTime);
-
// 获取最大 startTime
Date findMaxStartTimeByServerId(String serverId);
}
diff --git a/ard-work/src/main/java/com/ard/work/mapper/ArdFlightTaskPartMapper.java b/ard-work/src/main/java/com/ard/work/mapper/ArdFlightTaskPartMapper.java
new file mode 100644
index 0000000..db94cd2
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/work/mapper/ArdFlightTaskPartMapper.java
@@ -0,0 +1,26 @@
+package com.ard.work.mapper;
+
+import com.ard.work.domain.entity.ArdFlightTaskPart;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+
+@Mapper
+public interface ArdFlightTaskPartMapper {
+
+ /**
+ * 根据 taskId 查询分片
+ */
+ List<ArdFlightTaskPart> selectByTaskId(int taskId);
+ /**
+ * 根据 boxSn 和航线开始结束时间查询分片
+ * @return 对应时间段的分片列表
+ */
+ List<ArdFlightTaskPart> selectByTaskStartTime(ArdFlightTaskPart ardFlightTaskPart);
+
+ int insert(ArdFlightTaskPart entity);
+}
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
new file mode 100644
index 0000000..8d1d87a
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/work/service/IArdFlightTaskPartService.java
@@ -0,0 +1,26 @@
+package com.ard.work.service;
+
+import com.ard.work.domain.dto.telemetry.TelemetryData;
+import com.ard.work.domain.entity.ArdFlightTaskPart;
+
+import java.util.List;
+
+/**
+ * 飞行任务分片服务接口
+ */
+public interface IArdFlightTaskPartService {
+
+ /**
+ * 添加一条遥测数据到缓存
+ */
+ void addTelemetryData(TelemetryData telemetryData);
+ /**
+ * 将剩余缓存分片保存
+ */
+ void flushRemaining(String boxSn);
+ /**
+ * 获取完整航线轨迹(合并所有分片)
+ */
+ List<TelemetryData> 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 cdc212c..78e3352 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
@@ -11,6 +11,7 @@
import com.ard.work.domain.dto.BoxSettingsDTO;
import com.ard.work.domain.entity.ArdDroneInfo;
import com.ard.work.domain.entity.ArdServerInfo;
+import com.ard.work.domain.event.DeviceStatusEvent;
import com.ard.work.domain.receiver.BoxInfoReceiver;
import com.ard.work.domain.receiver.BoxStreamUrlReceiver;
import com.ard.work.mapper.ArdDroneInfoMapper;
@@ -19,6 +20,7 @@
import com.ard.work.service.ITyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@@ -51,6 +53,10 @@
@Autowired
private IArdServerInfoService ardServerInfoService;
+
+ // 自动注入 ApplicationEventPublisher
+ @Autowired
+ private ApplicationEventPublisher eventPublisher;
/**
* 查询无人机盒子
@@ -282,44 +288,63 @@
/**
* 同步盒子属性
*/
- @Scheduled(fixedRate = 1000 * 5)
+ @Scheduled(fixedRate = 5000)
public void syncBoxInfo() {
ArdServerInfo ardServerInfo = new ArdServerInfo();
ardServerInfo.setUseDataScope(false);
List<ArdServerInfo> servers = ardServerInfoService.selectArdServerInfoList(ardServerInfo);
+
for (ArdServerInfo server : servers) {
ArdDroneInfo droneInfo = new ArdDroneInfo();
droneInfo.setServerId(server.getId());
droneInfo.setUseDataScope(false);
List<ArdDroneInfo> localList = selectArdDroneList(droneInfo);
- Map<String, ArdDroneInfo> localMap = localList.stream()
- .collect(Collectors.toMap(ArdDroneInfo::getBoxSn, drone -> drone));
+ Map<String, ArdDroneInfo> localMap = localList.stream().collect(Collectors.toMap(ArdDroneInfo::getBoxSn,
+ d -> d));
List<BoxInfoReceiver> boxList = tyService.getBoxList(server.getId());
- if (boxList == null) {
- updateArdDrone(ArdDroneInfo.builder().serverId(server.getId()).onLine(0).build());
+ // server 没有返回设备列表 → 全部离线
+ if (boxList == null || boxList.isEmpty()) {
+ for (ArdDroneInfo local : localList) {
+ if (local.getOnLine() != 0) { // 仅当状态变化才更新
+ local.setOnLine(0);
+ ArdDroneInfoMapper.updateArdDrone(local);
+ eventPublisher.publishEvent(new DeviceStatusEvent(local.getBoxSn(), false));
+ redisCache.deleteObject(CacheConstants.UAV_ONLINE_KEY + local.getBoxSn());
+ }
+ }
continue;
}
+ // server 返回设备列表 → 通过缓存判断状态
for (BoxInfoReceiver remote : boxList) {
String boxSn = remote.getBoxSn();
String redisKey = CacheConstants.UAV_ONLINE_KEY + boxSn;
+ boolean currentOnline = remote.getOnLine() == 1;
- // 只处理在线的 Redis
- if (remote.getOnLine() == 1) {
- redisCache.setCacheObject(redisKey, remote, 30, TimeUnit.SECONDS);
- } else {
- redisCache.deleteObject(redisKey);
- }
+ // 获取上次状态
+ boolean lastOnline = redisCache.getCacheObject(redisKey) != null;
- // 数据库同步
- ArdDroneInfo local = localMap.get(boxSn);
- if (local == null) continue;
-
- if (updateChangedAttributes(local, remote)) {
- updateArdDrone(local); // 只有真的有变化才更新数据库
+ // 如果状态变化才更新
+ if (lastOnline != currentOnline) {
+ // 更新 Redis
+ if (currentOnline) {
+ redisCache.setCacheObject(redisKey, remote);
+ } else {
+ redisCache.deleteObject(redisKey);
+ }
+ // 发布事件
+ eventPublisher.publishEvent(new DeviceStatusEvent(boxSn, currentOnline));
+ // 更新数据库
+ ArdDroneInfo local = localMap.get(boxSn);
+ if (local != null) {
+ local.setOnLine(currentOnline ? 1 : 0);
+ updateArdDrone(local);
+ }
}
}
}
}
+
+
/**
* 更新 localBoxInfo 的字段,如果有变化返回 true,否则返回 false
*/
@@ -347,4 +372,5 @@
return changed;
}
+
}
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
new file mode 100644
index 0000000..9d56393
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java
@@ -0,0 +1,128 @@
+package com.ard.work.service.impl;
+
+import cn.hutool.core.util.SerializeUtil;
+import com.ard.work.domain.cache.UavTelemetryDataCache;
+import com.ard.work.domain.dto.telemetry.TelemetryData;
+import com.ard.work.domain.entity.ArdFlightTaskPart;
+import com.ard.work.mapper.ArdFlightTaskPartMapper;
+import com.ard.work.service.IArdFlightTaskPartService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+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;
+import java.util.concurrent.ConcurrentHashMap;
+/**
+ * 轨迹分片处理业务
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ArdFlightTaskPartServiceImpl implements IArdFlightTaskPartService {
+
+ private final ArdFlightTaskPartMapper ardflightTaskPartMapper;
+
+ /**
+ * 缓存:boxSn -> 当前分片数据
+ */
+ private final ConcurrentHashMap<String, List<TelemetryData>> cacheMap = new ConcurrentHashMap<>();
+
+ /**
+ * 分片保存阈值条数
+ */
+ private static final int CHUNK_SIZE = 300;
+
+ /**
+ * 定时任务:每秒读取一次设备状态数据
+ * 注意:这里模拟读取状态,实际应该调用设备接口或缓存
+ */
+ @Scheduled(fixedRate = 1000)
+ public void readTelemetryTask() {
+ UavTelemetryDataCache.forEach((boxSn, telemetryData) -> {
+ addTelemetryData(telemetryData);
+ });
+ }
+
+ /**
+ * 添加一条遥测数据到缓存
+ */
+ @Override
+ public void addTelemetryData(TelemetryData telemetryData) {
+ String boxSn = telemetryData.getBoxSn();
+ List<TelemetryData> list = cacheMap.computeIfAbsent(boxSn, k -> new ArrayList<>());
+ list.add(telemetryData);
+
+ // 当缓存条数达到阈值 或 时间间隔超过 CHUNK_INTERVAL 时,分片保存
+ if (list.size() >= CHUNK_SIZE) {
+ saveChunk(boxSn); // taskId 可根据你的业务传入
+ }
+ }
+
+ /**
+ * 分片保存缓存数据到数据库
+ */
+ @Async
+ public void saveChunk(String boxSn) {
+ List<TelemetryData> dataList = cacheMap.getOrDefault(boxSn, new ArrayList<>());
+ if (dataList.isEmpty()) {
+ return;
+ }
+
+ try {
+ byte[] blobData = SerializeUtil.serialize(dataList);
+
+ ArdFlightTaskPart part = ArdFlightTaskPart.builder()
+ .boxSn(boxSn)
+ .count(dataList.size())
+ .dataPart(blobData)
+ .build();
+ part.setCreateTime(new Date());
+ ardflightTaskPartMapper.insert(part);
+
+ log.info("设备 {} 分片保存 {} 条飞行数据到数据库成功", boxSn, dataList.size());
+
+ // 清空缓存,更新上次保存时间
+ cacheMap.put(boxSn, new ArrayList<>());
+
+ } catch (Exception e) {
+ log.error("设备 {} 分片保存飞行数据失败", boxSn, e);
+ }
+ }
+
+
+ /**
+ * 将剩余缓存分片保存
+ */
+ @Override
+ public void flushRemaining(String boxSn) {
+ List<TelemetryData> dataList = cacheMap.getOrDefault(boxSn, new ArrayList<>());
+ if (!dataList.isEmpty()) {
+ saveChunk(boxSn);
+ }
+ }
+
+ /**
+ * 获取完整航线轨迹(合并所有分片)
+ */
+ @Override
+ public List<TelemetryData> getCompleteFlightData(ArdFlightTaskPart ardFlightTaskPart) {
+ List<TelemetryData> 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());
+ allData.addAll(partData);
+ } catch (Exception e) {
+ log.error("反序列化 boxSn={} 分片数据失败", boxSn, e);
+ }
+ }
+ return allData;
+ }
+}
+
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java
index 70f86ab..567e7f7 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java
@@ -452,7 +452,6 @@
}
}
-
// 获取文件大小
private long getFileSizeByUrl(String fileUrl) {
try {
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
index 949e296..3d134e3 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
@@ -54,6 +54,7 @@
import com.ard.work.domain.message.UavControlType;
import com.ard.work.domain.receiver.*;
import com.ard.work.service.IArdDroneInfoService;
+import com.ard.work.service.IArdFlightTaskPartService;
import com.ard.work.service.IArdServerInfoService;
import com.ard.work.service.ITyService;
import lombok.extern.slf4j.Slf4j;
@@ -62,6 +63,7 @@
import javax.annotation.Resource;
import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -82,6 +84,8 @@
private TyClient tyClient;
@Autowired
private RouteStateMachineService stateMachineService;
+ @Autowired
+ private IArdFlightTaskPartService ardFlightTaskPartService;
/**
* 获取边缘服务器token信息
@@ -952,7 +956,8 @@
case (byte) 0xA9:
// 处理无人机遥测消息
UavTelemetryDataCmd uavTelemetryDataCmd = (UavTelemetryDataCmd) tyCommand;
- UavTelemetryDataCache.put(uavTelemetryDataCmd.getTelemetryData());
+ TelemetryData telemetryData = uavTelemetryDataCmd.getTelemetryData();
+ UavTelemetryDataCache.put(telemetryData);
//logPrint("无人机遥测", uavTelemetryDataCmd.getTelemetryData().getBoxSn());
//WebSocketUtil.sendMessageAll(uavTelemetryDataCmd.getTelemetryData());
break;
diff --git a/ard-work/src/main/resources/mapper/ArdFlightTaskPartMapper.xml b/ard-work/src/main/resources/mapper/ArdFlightTaskPartMapper.xml
new file mode 100644
index 0000000..7260136
--- /dev/null
+++ b/ard-work/src/main/resources/mapper/ArdFlightTaskPartMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.ard.work.mapper.ArdFlightTaskPartMapper">
+
+ <!-- 插入一条分片数据 -->
+ <insert id="insert" parameterType="ArdFlightTaskPart" useGeneratedKeys="true" keyProperty="id">
+ INSERT INTO ard_flight_task_part
+ (box_sn, count, data_part, create_time)
+ VALUES
+ (#{boxSn}, #{count}, #{dataPart}, #{createTime})
+ </insert>
+ <select id="selectByTaskStartTime" resultType="ArdFlightTaskPart">
+ SELECT *
+ FROM ard_flight_task_part u
+ WHERE u.box_sn = #{boxSn}
+ <if test="params.beginTime != null"><!-- 开始时间检索 -->
+ AND u.create_time >= #{params.beginTime}
+ </if>
+ <if test="params.endTime != null"><!-- 结束时间检索 -->
+ AND u.create_time <= #{params.endTime}
+ </if>
+ </select>
+
+</mapper>
--
Gitblit v1.9.3