From 69f4eab5670f9aa5b5325e6d4d3a8e97f63106cc Mon Sep 17 00:00:00 2001
From: xieb <vip_xiaobin810@163.com>
Date: Sat, 28 Oct 2023 15:23:33 +0800
Subject: [PATCH] 保存无人机飞行轨迹

---
 src/main/java/com/dji/sample/log/model/entity/DroneFlightLogEntity.java          |   42 ++++++++
 src/main/java/com/dji/sample/log/model/entity/DroneFlightLogInfoEntity.java      |   35 +++++++
 src/main/java/com/dji/sample/log/service/IDroneFlightLogService.java             |   17 +++
 src/main/java/com/dji/sample/log/dao/IDroneFlightLogInfoMapper.java              |   13 ++
 src/main/java/com/dji/sample/log/service/impl/DroneFlightLogServiceImpl.java     |   31 ++++++
 src/main/java/com/dji/sample/manage/service/impl/DeviceOSDServiceImpl.java       |   57 +++++++++++
 src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.java                  |   13 ++
 src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java          |    2 
 src/main/java/com/dji/sample/log/service/impl/DroneFlightLogInfoServiceImpl.java |   26 +++++
 src/main/java/com/dji/sample/component/redis/RedisConst.java                     |    3 
 src/main/java/com/dji/sample/log/service/IDroneFlightLogInfoService.java         |   15 +++
 11 files changed, 253 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/dji/sample/component/redis/RedisConst.java b/src/main/java/com/dji/sample/component/redis/RedisConst.java
index 574ae62..cd64f22 100644
--- a/src/main/java/com/dji/sample/component/redis/RedisConst.java
+++ b/src/main/java/com/dji/sample/component/redis/RedisConst.java
@@ -64,4 +64,7 @@
     public static final String FILE_UPLOADING_PREFIX = "file_uploading" + DELIMITER;
 
     public static final String DRONE_CONTROL_PREFiX = "control_source" + DELIMITER;
+
+    //飞行日志
+    public static final String FLIGHT_LOG = "flight_log"+ DELIMITER;
 }
\ No newline at end of file
diff --git a/src/main/java/com/dji/sample/log/dao/IDroneFlightLogInfoMapper.java b/src/main/java/com/dji/sample/log/dao/IDroneFlightLogInfoMapper.java
new file mode 100644
index 0000000..ee7bc65
--- /dev/null
+++ b/src/main/java/com/dji/sample/log/dao/IDroneFlightLogInfoMapper.java
@@ -0,0 +1,13 @@
+package com.dji.sample.log.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dji.sample.log.model.entity.DroneFlightLogInfoEntity;
+
+/**
+ * @PROJECT_NAME: iot_drone_api
+ * @DESCRIPTION:
+ * @USER: aix
+ * @DATE: 2023/10/27 17:54
+ */
+public interface IDroneFlightLogInfoMapper extends BaseMapper<DroneFlightLogInfoEntity> {
+}
diff --git a/src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.java b/src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.java
new file mode 100644
index 0000000..f523e22
--- /dev/null
+++ b/src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.java
@@ -0,0 +1,13 @@
+package com.dji.sample.log.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dji.sample.log.model.entity.DroneFlightLogEntity;
+
+/**
+ * @PROJECT_NAME: iot_drone_api
+ * @DESCRIPTION:
+ * @USER: aix
+ * @DATE: 2023/10/27 17:53
+ */
+public interface IDroneFlightLogMapper extends BaseMapper<DroneFlightLogEntity> {
+}
diff --git a/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogEntity.java b/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogEntity.java
new file mode 100644
index 0000000..dad73d2
--- /dev/null
+++ b/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogEntity.java
@@ -0,0 +1,42 @@
+package com.dji.sample.log.model.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @PROJECT_NAME: iot_drone_api
+ * @DESCRIPTION:
+ * @USER: aix
+ * @DATE: 2023/10/27 17:40
+ */
+@TableName("drone_flight_log")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class DroneFlightLogEntity implements Serializable {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    @TableField("workspace_id")
+    private String workspaceId;
+    @TableField("device_sn")
+    private String deviceSn;
+    @TableField("device_name")
+    private String deviceName;
+    @TableField("nickname")
+    private String nickname;
+    @TableField("title")
+    private String title;
+    @TableField(value = "start_time", fill = FieldFill.INSERT)
+    private Long startTime;
+    @TableField(value = "end_time", fill = FieldFill.INSERT_UPDATE)
+    private Long endTime;
+
+}
diff --git a/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogInfoEntity.java b/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogInfoEntity.java
new file mode 100644
index 0000000..6055d8e
--- /dev/null
+++ b/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogInfoEntity.java
@@ -0,0 +1,35 @@
+package com.dji.sample.log.model.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @PROJECT_NAME: iot_drone_api
+ * @DESCRIPTION:
+ * @USER: aix
+ * @DATE: 2023/10/27 17:41
+ */
+@TableName("drone_flight_log_info")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class DroneFlightLogInfoEntity implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    @TableField("flight_id")
+    private Long flightId;
+    @TableField("latitude")
+    private Double latitude;
+    @TableField("longitude")
+    private Double longitude;
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private Long createTime;
+
+}
diff --git a/src/main/java/com/dji/sample/log/service/IDroneFlightLogInfoService.java b/src/main/java/com/dji/sample/log/service/IDroneFlightLogInfoService.java
new file mode 100644
index 0000000..5e22de7
--- /dev/null
+++ b/src/main/java/com/dji/sample/log/service/IDroneFlightLogInfoService.java
@@ -0,0 +1,15 @@
+package com.dji.sample.log.service;
+
+import com.dji.sample.log.model.entity.DroneFlightLogInfoEntity;
+
+/**
+ * @PROJECT_NAME: iot_drone_api
+ * @DESCRIPTION:
+ * @USER: aix
+ * @DATE: 2023/10/28 10:57
+ */
+public interface IDroneFlightLogInfoService {
+
+    void save(DroneFlightLogInfoEntity entity);
+
+}
diff --git a/src/main/java/com/dji/sample/log/service/IDroneFlightLogService.java b/src/main/java/com/dji/sample/log/service/IDroneFlightLogService.java
new file mode 100644
index 0000000..896b3e3
--- /dev/null
+++ b/src/main/java/com/dji/sample/log/service/IDroneFlightLogService.java
@@ -0,0 +1,17 @@
+package com.dji.sample.log.service;
+
+import com.dji.sample.log.model.entity.DroneFlightLogEntity;
+
+/**
+ * @PROJECT_NAME: iot_drone_api
+ * @DESCRIPTION:
+ * @USER: aix
+ * @DATE: 2023/10/27 17:55
+ */
+public interface IDroneFlightLogService {
+
+    void save(DroneFlightLogEntity entity);
+
+    void update(DroneFlightLogEntity entity);
+
+}
diff --git a/src/main/java/com/dji/sample/log/service/impl/DroneFlightLogInfoServiceImpl.java b/src/main/java/com/dji/sample/log/service/impl/DroneFlightLogInfoServiceImpl.java
new file mode 100644
index 0000000..a48d4bb
--- /dev/null
+++ b/src/main/java/com/dji/sample/log/service/impl/DroneFlightLogInfoServiceImpl.java
@@ -0,0 +1,26 @@
+package com.dji.sample.log.service.impl;
+
+import com.dji.sample.log.dao.IDroneFlightLogInfoMapper;
+import com.dji.sample.log.model.entity.DroneFlightLogInfoEntity;
+import com.dji.sample.log.service.IDroneFlightLogInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @PROJECT_NAME: iot_drone_api
+ * @DESCRIPTION:
+ * @USER: aix
+ * @DATE: 2023/10/28 10:58
+ */
+@Service
+public class DroneFlightLogInfoServiceImpl implements IDroneFlightLogInfoService {
+
+    @Autowired
+    private IDroneFlightLogInfoMapper mapper;
+
+    @Override
+    public void save(DroneFlightLogInfoEntity entity) {
+        mapper.insert(entity);
+    }
+
+}
diff --git a/src/main/java/com/dji/sample/log/service/impl/DroneFlightLogServiceImpl.java b/src/main/java/com/dji/sample/log/service/impl/DroneFlightLogServiceImpl.java
new file mode 100644
index 0000000..5a2c659
--- /dev/null
+++ b/src/main/java/com/dji/sample/log/service/impl/DroneFlightLogServiceImpl.java
@@ -0,0 +1,31 @@
+package com.dji.sample.log.service.impl;
+
+import com.dji.sample.log.dao.IDroneFlightLogMapper;
+import com.dji.sample.log.model.entity.DroneFlightLogEntity;
+import com.dji.sample.log.service.IDroneFlightLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @PROJECT_NAME: iot_drone_api
+ * @DESCRIPTION:
+ * @USER: aix
+ * @DATE: 2023/10/27 17:58
+ */
+@Service
+public class DroneFlightLogServiceImpl implements IDroneFlightLogService {
+
+    @Autowired
+    private IDroneFlightLogMapper mapper;
+
+    @Override
+    public void save(DroneFlightLogEntity entity) {
+        mapper.insert(entity);
+    }
+
+    @Override
+    public void update(DroneFlightLogEntity entity) {
+        mapper.updateById(entity);
+    }
+
+}
diff --git a/src/main/java/com/dji/sample/manage/service/impl/DeviceOSDServiceImpl.java b/src/main/java/com/dji/sample/manage/service/impl/DeviceOSDServiceImpl.java
index e5a596e..6c19fd9 100644
--- a/src/main/java/com/dji/sample/manage/service/impl/DeviceOSDServiceImpl.java
+++ b/src/main/java/com/dji/sample/manage/service/impl/DeviceOSDServiceImpl.java
@@ -6,11 +6,16 @@
 import com.dji.sample.component.websocket.config.ConcurrentWebSocketSession;
 import com.dji.sample.component.websocket.model.BizCodeEnum;
 import com.dji.sample.component.websocket.model.CustomWebSocketMessage;
+import com.dji.sample.log.model.entity.DroneFlightLogEntity;
+import com.dji.sample.log.model.entity.DroneFlightLogInfoEntity;
+import com.dji.sample.log.service.IDroneFlightLogInfoService;
+import com.dji.sample.log.service.IDroneFlightLogService;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.model.dto.DevicePayloadDTO;
 import com.dji.sample.manage.model.dto.TelemetryDTO;
 import com.dji.sample.manage.model.dto.TelemetryDeviceDTO;
 import com.dji.sample.manage.model.enums.DeviceDomainEnum;
+import com.dji.sample.manage.model.enums.DeviceModeCodeEnum;
 import com.dji.sample.manage.model.receiver.OsdPayloadReceiver;
 import com.dji.sample.manage.model.receiver.OsdSubDeviceReceiver;
 import lombok.extern.slf4j.Slf4j;
@@ -31,6 +36,12 @@
 @Service
 @Slf4j
 public class DeviceOSDServiceImpl extends AbstractTSAService {
+
+    @Autowired
+    private IDroneFlightLogService droneFlightLogService;
+
+    @Autowired
+    private IDroneFlightLogInfoService droneFlightLogInfoService;
 
     protected DeviceOSDServiceImpl(@Autowired @Qualifier("dockOSDServiceImpl") AbstractTSAService tsaService) {
         super(tsaService);
@@ -63,6 +74,52 @@
             wsMessage.setBizCode(BizCodeEnum.DEVICE_OSD.getCode());
 
             OsdSubDeviceReceiver data = mapper.convertValue(receiver.getData(), OsdSubDeviceReceiver.class);
+
+            //保存飞行日志 状态启动 "3":"手动飞行","4":"自动起飞","5":"航线飞行"
+            if (DeviceModeCodeEnum.MANUAL.getVal() == data.getModeCode().getVal() ||
+                    DeviceModeCodeEnum.TAKEOFF_AUTO.getVal() == data.getModeCode().getVal() ||
+                    DeviceModeCodeEnum.WAYLINE.getVal() == data.getModeCode().getVal() ) {
+                if (!RedisOpsUtils.checkExist(RedisConst.FLIGHT_LOG + device.getDeviceSn())) {
+                    // 开始记录日志
+                    DroneFlightLogEntity dflPo = DroneFlightLogEntity.builder()
+                            .deviceSn(device.getDeviceSn())
+                            .deviceName(device.getDeviceName())
+                            .nickname(device.getNickname())
+                            .workspaceId(device.getWorkspaceId())
+                            .title(data.getModeCode().getVal() == 3?"手动飞行":data.getModeCode().getVal() == 4?"自动起飞":data.getModeCode().getVal() == 5?"航线飞行":"未知")
+                            .startTime(System.currentTimeMillis())
+                            .build();
+                    droneFlightLogService.save(dflPo);
+                    //缓存对象用于关联数据
+                    RedisOpsUtils.set(RedisConst.FLIGHT_LOG + device.getDeviceSn(),dflPo);
+                }
+            }
+
+            //状态0时取消
+            if (DeviceModeCodeEnum.IDLE.getVal() == data.getModeCode().getVal()) {
+                //如果存在则删除并保存结束时间
+                if (RedisOpsUtils.checkExist(RedisConst.FLIGHT_LOG + device.getDeviceSn())) {
+
+                    DroneFlightLogEntity dflPo = (DroneFlightLogEntity) RedisOpsUtils.get(RedisConst.FLIGHT_LOG + device.getDeviceSn());
+                    dflPo.setEndTime(System.currentTimeMillis());
+                    droneFlightLogService.update(dflPo);
+
+                    RedisOpsUtils.del(RedisConst.FLIGHT_LOG + device.getDeviceSn());
+                }
+
+            }
+
+            //保存无人机实时位置信息
+            if (RedisOpsUtils.checkExist(RedisConst.FLIGHT_LOG + device.getDeviceSn())) {
+                DroneFlightLogEntity dflPo = (DroneFlightLogEntity) RedisOpsUtils.get(RedisConst.FLIGHT_LOG + device.getDeviceSn());
+                DroneFlightLogInfoEntity dfliPo = DroneFlightLogInfoEntity.builder()
+                        .latitude(data.getLatitude())
+                        .longitude(data.getLongitude())
+                        .flightId(dflPo.getId())
+                        .build();
+                droneFlightLogInfoService.save(dfliPo);
+            }
+
             List<DevicePayloadDTO> payloadsList = device.getPayloadsList();
             try {
                 Map<String, Object> receiverData = (Map<String, Object>) receiver.getData();
diff --git a/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java b/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
index e332f43..1d767ce 100644
--- a/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
@@ -451,7 +451,7 @@
             if (deviceOpt.isEmpty()) {
                 deviceOpt = this.getDeviceBySn(from);
                 if (deviceOpt.isEmpty()) {
-                    log.error("Please restart the drone.");
+                    log.error("请重新启动无人机.");
                     return;
                 }
 

--
Gitblit v1.9.3