xieb
2023-10-28 69f4eab5670f9aa5b5325e6d4d3a8e97f63106cc
保存无人机飞行轨迹
3 files modified
8 files added
254 ■■■■■ changed files
src/main/java/com/dji/sample/component/redis/RedisConst.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/log/dao/IDroneFlightLogInfoMapper.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/log/model/entity/DroneFlightLogEntity.java 42 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/log/model/entity/DroneFlightLogInfoEntity.java 35 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/log/service/IDroneFlightLogInfoService.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/log/service/IDroneFlightLogService.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/log/service/impl/DroneFlightLogInfoServiceImpl.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/log/service/impl/DroneFlightLogServiceImpl.java 31 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/manage/service/impl/DeviceOSDServiceImpl.java 57 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java 2 ●●● patch | view | raw | blame | history
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;
}
src/main/java/com/dji/sample/log/dao/IDroneFlightLogInfoMapper.java
New file
@@ -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> {
}
src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.java
New file
@@ -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> {
}
src/main/java/com/dji/sample/log/model/entity/DroneFlightLogEntity.java
New file
@@ -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;
}
src/main/java/com/dji/sample/log/model/entity/DroneFlightLogInfoEntity.java
New file
@@ -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;
}
src/main/java/com/dji/sample/log/service/IDroneFlightLogInfoService.java
New file
@@ -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);
}
src/main/java/com/dji/sample/log/service/IDroneFlightLogService.java
New file
@@ -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);
}
src/main/java/com/dji/sample/log/service/impl/DroneFlightLogInfoServiceImpl.java
New file
@@ -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);
    }
}
src/main/java/com/dji/sample/log/service/impl/DroneFlightLogServiceImpl.java
New file
@@ -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);
    }
}
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();
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;
                }