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; }