S0025136190 1 жил өмнө
parent
commit
dac3d3dfec
18 өөрчлөгдсөн 198 нэмэгдсэн , 73 устгасан
  1. 4 0
      Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/WaylineTypeEnum.java
  2. 6 6
      Backend/sample/pom.xml
  3. 2 0
      Backend/sample/src/main/java/com/dji/sample/component/redis/RedisConst.java
  4. 21 0
      Backend/sample/src/main/java/com/dji/sample/control/service/impl/SDKControlService.java
  5. 3 6
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceHmsServiceImpl.java
  6. 1 1
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceRedisServiceImpl.java
  7. 73 39
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java
  8. 1 1
      Backend/sample/src/main/java/com/dji/sample/map/service/impl/FlightTrackTaskServiceImpl.java
  9. 1 0
      Backend/sample/src/main/java/com/dji/sample/media/dao/IFileMapper.java
  10. 2 0
      Backend/sample/src/main/java/com/dji/sample/media/model/UpstreamMediaFileDTO.java
  11. 7 0
      Backend/sample/src/main/java/com/dji/sample/media/service/IMediaRedisService.java
  12. 7 3
      Backend/sample/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
  13. 5 1
      Backend/sample/src/main/java/com/dji/sample/media/service/impl/MediaDirServiceImpl.java
  14. 16 0
      Backend/sample/src/main/java/com/dji/sample/media/service/impl/MediaRedisServiceImpl.java
  15. 27 6
      Backend/sample/src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java
  16. 13 10
      Backend/sample/src/main/java/com/dji/sample/wayline/model/enums/WaylineTemplateTypeEnum.java
  17. 8 0
      Backend/sample/src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java
  18. 1 0
      Backend/sample/src/main/java/com/dji/sample/wayline/service/impl/SDKWaylineService.java

+ 4 - 0
Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/WaylineTypeEnum.java

@@ -42,6 +42,10 @@ public enum WaylineTypeEnum {
         return value;
     }
 
+    public String getType() {
+        return type;
+    }
+
     @JsonCreator
     public static WaylineTypeEnum find(int value) {
         return Arrays.stream(values()).filter(typeEnum -> typeEnum.value == value).findAny()

+ 6 - 6
Backend/sample/pom.xml

@@ -178,22 +178,22 @@
             <artifactId>opencv</artifactId>
             <version>4.7.0-1.5.9</version>
             <!--本机和Linux不同环境配置不一样 -->
-            <classifier>windows-x86_64</classifier>
-           <!-- <classifier>linux-x86_64</classifier>-->
+<!--            <classifier>windows-x86_64</classifier>-->
+            <classifier>linux-x86_64</classifier>
         </dependency>
         <dependency>
             <groupId>org.bytedeco</groupId>
             <artifactId>openblas</artifactId>
             <version>0.3.23-1.5.9</version>
-            <classifier>windows-x86_64</classifier>
-           <!--<classifier>linux-x86_64</classifier>-->
+<!--            <classifier>windows-x86_64</classifier>-->
+           <classifier>linux-x86_64</classifier>
         </dependency>
         <dependency>
             <groupId>org.bytedeco</groupId>
             <artifactId>ffmpeg</artifactId>
             <version>6.0-1.5.9</version>
-            <classifier>windows-x86_64</classifier>
-           <!--<classifier>linux-x86_64</classifier>-->
+<!--            <classifier>windows-x86_64</classifier>-->
+           <classifier>linux-x86_64</classifier>
         </dependency>
 
         <dependency>

+ 2 - 0
Backend/sample/src/main/java/com/dji/sample/component/redis/RedisConst.java

@@ -77,4 +77,6 @@ public final class RedisConst {
     public static final String DEVICE_STATUS = "device_status" + DELIMITER;
     //home 白名单过期时间
     public static final Integer WHITELIST_ALIVE_SECOND = 3600;
+    //相机模式
+    public static final String CAMERA_MODE_PREFIX = "camera_mode" + DELIMITER;
 }

+ 21 - 0
Backend/sample/src/main/java/com/dji/sample/control/service/impl/SDKControlService.java

@@ -6,9 +6,12 @@ import com.dji.sample.control.model.dto.ResultNotifyDTO;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.model.enums.UserTypeEnum;
 import com.dji.sample.manage.service.IDeviceRedisService;
+import com.dji.sample.media.service.IMediaRedisService;
 import com.dji.sdk.cloudapi.control.*;
 import com.dji.sdk.cloudapi.control.api.AbstractControlService;
+import com.dji.sdk.cloudapi.device.CameraModeEnum;
 import com.dji.sdk.mqtt.MqttReply;
+import com.dji.sdk.mqtt.events.EventsDataRequest;
 import com.dji.sdk.mqtt.events.TopicEventsRequest;
 import com.dji.sdk.mqtt.events.TopicEventsResponse;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -34,6 +37,9 @@ public class SDKControlService extends AbstractControlService {
     @Autowired
     private IDeviceRedisService deviceRedisService;
 
+    @Autowired
+    private IMediaRedisService mediaRedisService;
+
     @Autowired
     private ObjectMapper mapper;
 
@@ -115,4 +121,19 @@ public class SDKControlService extends AbstractControlService {
                         .result(eventsReceiver.getReason().getVal()).build());
         return new TopicEventsResponse<MqttReply>().setData(MqttReply.success());
     }
+
+    @Override
+    public TopicEventsResponse<MqttReply> cameraPhotoTakeProgress(TopicEventsRequest<EventsDataRequest<CameraPhotoTakeProgress>> request, MessageHeaders headers) {
+        String dockSn  = request.getGateway();
+
+        Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(dockSn);
+        if (deviceOpt.isEmpty()) {
+            log.error("The dock is offline.");
+            return null;
+        }
+        log.error("====================cameraPhotoTakeProgress=========:" + request.getData());
+        CameraModeEnum cameraModeEnum = request.getData().getOutput().getExt().getCameraMode();
+        mediaRedisService.setCameraMode(dockSn,cameraModeEnum);
+        return new TopicEventsResponse<MqttReply>().setData(MqttReply.success());
+    }
 }

+ 3 - 6
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceHmsServiceImpl.java

@@ -196,15 +196,12 @@ public class DeviceHmsServiceImpl extends AbstractHmsService implements IDeviceH
         HmsMessage hmsMessage = HmsJsonUtil.get(dto.getHmsKey());
         String zh;
         String en;
-        if (null != hmsMessage) {
-            zh = StringUtils.hasText(hmsMessage.getZh()) ? hmsMessage.getZh() : String.format("未知错误(%s)", dto.getHmsKey());
-            en = StringUtils.hasText(hmsMessage.getEn()) ? hmsMessage.getEn() : String.format("Unknown(%s)", dto.getHmsKey());//
-        } else {
+        if(!StringUtils.hasText(hmsMessage.getZh())) {
             String hmsKey = dto.getHmsKey().replace(HmsInTheSkyEnum.IN_THE_SKY.getText(),"");
             hmsMessage = HmsJsonUtil.get(hmsKey);
-            zh = StringUtils.hasText(hmsMessage.getZh()) ? hmsMessage.getZh() : String.format("未知错误(%s)", dto.getHmsKey());
-            en = StringUtils.hasText(hmsMessage.getEn()) ? hmsMessage.getEn() : String.format("Unknown(%s)", dto.getHmsKey());//
         }
+        zh = StringUtils.hasText(hmsMessage.getZh()) ? hmsMessage.getZh() : String.format("未知错误(%s)", dto.getHmsKey());
+        en = StringUtils.hasText(hmsMessage.getEn()) ? hmsMessage.getEn() : String.format("Unknown(%s)", dto.getHmsKey());//
 
 
         dto.setMessageZh(format(Locale.CHINESE.getLanguage(), zh, args));

+ 1 - 1
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceRedisServiceImpl.java

@@ -119,7 +119,7 @@ public class DeviceRedisServiceImpl implements IDeviceRedisService {
 
     @Override
     public void setDroneFlightTask(String deviceSn, FlightTaskDTO flightTaskDTO) {
-        RedisOpsUtils.setWithExpire(RedisConst.DRONE_FLIGHT_TASK + deviceSn, flightTaskDTO, RedisConst.DEVICE_ALIVE_SECOND);
+        RedisOpsUtils.setWithExpire(RedisConst.DRONE_FLIGHT_TASK + deviceSn, flightTaskDTO, RedisConst.DRONE_HOME_ALIVE_SECOND);
     }
 
     @Override

+ 73 - 39
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java

@@ -1,10 +1,16 @@
 package com.dji.sample.manage.service.impl;
 
 import cn.hutool.core.date.DateUtil;
+import com.dji.sample.component.mqtt.model.EventsReceiver;
 import com.dji.sample.manage.model.dto.OsdDroneDTO;
 import com.dji.sample.map.model.dto.FlightTrackDTO;
+import com.dji.sample.wayline.model.enums.WaylineJobStatusEnum;
+import com.dji.sample.wayline.service.IWaylineRedisService;
 import com.dji.sdk.cloudapi.property.DockDroneCommanderFlightHeight;
+import com.dji.sdk.cloudapi.property.DockDroneCommanderModeLostAction;
 import com.dji.sdk.cloudapi.property.DockDroneRthMode;
+import com.dji.sdk.cloudapi.wayline.FlighttaskProgress;
+import com.dji.sdk.cloudapi.wayline.FlighttaskProgressExt;
 import com.dji.sdk.common.CoordinateUtil;
 import com.dji.sample.common.util.UserRequest;
 import com.dji.sample.component.websocket.model.BizCodeEnum;
@@ -77,6 +83,9 @@ public class SDKDeviceService extends AbstractDeviceService {
     @Autowired
     private IFlightTrackTaskService flightTaskService;
 
+    @Autowired
+    private IWaylineRedisService waylineRedisService;
+
     @Override
     public TopicStatusResponse<MqttReply> updateTopoOnline(TopicStatusRequest<UpdateTopo> request, MessageHeaders headers) {
         UpdateTopoSubDevice updateTopoSubDevice = request.getData().getSubDevices().get(0);
@@ -201,7 +210,17 @@ public class SDKDeviceService extends AbstractDeviceService {
         OsdDroneDTO data = toDroneDto(request.getData());
         deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, request.getData());
         //添加航点轨迹信息
-        toAddFilghtPoint(from, device, data);
+        String jobId = null;
+        Optional<EventsReceiver<FlighttaskProgress>> runningDataOpt = waylineRedisService.getRunningWaylineJob(request.getGateway());
+        if (runningDataOpt.isPresent()) {
+            log.info("======jobId getSn:" +  runningDataOpt.map(EventsReceiver::getSn).get());
+            jobId = runningDataOpt.map(EventsReceiver::getOutput)
+                    .map(FlighttaskProgress::getExt)
+                    .map(FlighttaskProgressExt::getFlightId)
+                    .orElse(null);
+            log.info("======FlightId:" +  jobId);
+        }
+        toAddFilghtPoint(from, device, data,jobId);
     }
 
     @Override
@@ -262,11 +281,11 @@ public class SDKDeviceService extends AbstractDeviceService {
                         .setVerticalSpeed(data.getVerticalSpeed()));
         deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, data);
         //添加航点轨迹信息
-        toAddFilghtPoint(from, device, data);
+        toAddFilghtPoint(from, device, data,null);
 
     }
 
-    private void toAddFilghtPoint(String from, DeviceDTO device, OsdDroneDTO data) {
+    private void toAddFilghtPoint(String from, DeviceDTO device, OsdDroneDTO data,String jobId) {
 
         switch (data.getModeCode()) {
             case TAKEOFF_FINISHED:
@@ -291,7 +310,7 @@ public class SDKDeviceService extends AbstractDeviceService {
                     flightTask = createFlightTask(device);
                 }
                 //添加飞行轨迹
-                addFlightPoint(flightTask, device,data);
+                addFlightPoint(flightTask, device,data,false);
                 //推送实时轨迹信息
                 List<FlightTrackDTO> trackList = getRedisFlightPoint(flightTask,device,data);
                 pushFlyTrackToWeb(from,device,trackList);
@@ -309,7 +328,7 @@ public class SDKDeviceService extends AbstractDeviceService {
                     flightTask = opt.get();
                     log.info("==============飞机降落 执行添加飞行轨迹====:" + flightTask.toString());
                     //添加飞行轨迹
-                    FlightTaskDTO task = addFlightPoint(flightTask,device,data);
+                    FlightTaskDTO task = addFlightPoint(flightTask,device,data,true);
                     log.info("==============飞机降落 更新飞行任务====:" + task.toString());
                     //更新飞行任务
                     updateFlightTask(task);
@@ -361,7 +380,7 @@ public class SDKDeviceService extends AbstractDeviceService {
         deviceRedisService.setDroneFlyTrack(device.getDeviceSn(),flightPoints);
     }
 
-    private FlightTaskDTO addFlightPoint(FlightTaskDTO task, DeviceDTO device,OsdDroneDTO data) {
+    private FlightTaskDTO addFlightPoint(FlightTaskDTO task, DeviceDTO device,OsdDroneDTO data,boolean isFinished) {
         synchronized (device.getDeviceSn().intern()) {
             Optional<FlightTrackEntity> lastPoint = deviceRedisService.getLastDroneTrack(device.getDeviceSn());
             long curTime = System.currentTimeMillis();
@@ -383,26 +402,18 @@ public class SDKDeviceService extends AbstractDeviceService {
                             + ",飞行器状态:" + data.getModeCode().name() + ",经度:" + data.getLongitude() + ",维度:" + data.getLatitude()
                             + "高度:" + data.getHeight());
                 }
-                if(data.getModeCode().getCode() == 10) {
-                    isAdd = true;
-                    log.info("添加结束飞行轨迹: workspaceID:" + device.getWorkspaceId() + ",sn:" + device.getDeviceSn()
-                            + ",间隔时间(毫秒):" + btwTime + ",采集频率(秒)" + CustomConfiguration.frequency
-                            + ",飞行器状态:" + data.getModeCode().name() + ",经度:" + data.getLongitude() + ",维度:" + data.getLatitude()
-                            + "高度:" + data.getHeight());
-                }
-                if(isSamePoint(data,lastPoint.get())) {
+                if(isSamePoint(data,lastPoint.get()) || isEqualsPoint(data,lastPoint.get())) {
                     log.info("添加飞行轨迹:workspaceID:" + device.getWorkspaceId() + ",sn:" + device.getDeviceSn() +
                             "相同坐标,不做记录" + data.toString());
                     isAdd = false;
                 }
             }
-            if(isAdd) {
+            if(isAdd || isFinished) {
                 log.info("获取飞行轨迹任务:" + task.toString());
+                Optional<AMap> homeOpt = deviceRedisService.getDroneHomeChange(device.getDeviceSn());
                 //添加Home信息
-                if(!lastPoint.isPresent()) {
-                    Optional<AMap> homeOpt = deviceRedisService.getDroneHomeChange(device.getDeviceSn());
-                    if(homeOpt.isPresent()) {
-                        FlightTrackEntity flightTrackEntity = FlightTrackEntity.builder()
+                if(!lastPoint.isPresent() && homeOpt.isPresent()) {
+                    FlightTrackEntity flightTrackEntity = FlightTrackEntity.builder()
                                 .taskId(task.getId())
                                 .modeCode(data.getModeCode().getCode())
                                 .longitude(CoordinateUtil.checkValidVal(homeOpt.get().getLongitude()))
@@ -410,17 +421,10 @@ public class SDKDeviceService extends AbstractDeviceService {
                                 .type(FlightPointTypeEnum.HOME.getType())
                                 .createTime(System.currentTimeMillis()).build();
                         flightTaskService.addHomePoint(flightTrackEntity);
-                        //记录添加时间
-                        deviceRedisService.setLastDroneTrack(device.getDeviceSn(), flightTrackEntity);
-                    }
-                }
-                if(!lastPoint.isPresent()) {
-                    return null;
                 }
-                long btwTime = System.currentTimeMillis() - lastPoint.get().getCreateTime();
-                if(btwTime >= CustomConfiguration.frequency * 1000 || 10 == data.getModeCode().getCode()) {
-                    //添加轨迹信息
-                    FlightTrackEntity flightTrackEntity = FlightTrackEntity.builder()
+
+                //添加轨迹信息
+                FlightTrackEntity flightTrackEntity = FlightTrackEntity.builder()
                             .taskId(task.getId())
                             .modeCode(data.getModeCode().getCode())
                             .longitude(data.getLongitude().doubleValue())
@@ -429,12 +433,11 @@ public class SDKDeviceService extends AbstractDeviceService {
                             .elevation(data.getElevation().doubleValue())
                             .type(FlightPointTypeEnum.HAND.getType())
                             .createTime(System.currentTimeMillis()).build();
-                    flightTaskService.addFlightPoint(flightTrackEntity);
-                    log.info("添加轨迹完成: task:" + task.getTaskName());
-                    //记录添加时间
-                    deviceRedisService.setLastDroneTrack(device.getDeviceSn(), flightTrackEntity);
-                    return task;
-                }
+                flightTaskService.addFlightPoint(flightTrackEntity);
+                log.info("添加轨迹完成: task:" + task.getTaskName());
+                //记录添加时间
+                deviceRedisService.setLastDroneTrack(device.getDeviceSn(), flightTrackEntity);
+                return task;
 
             }
             return null;
@@ -449,6 +452,13 @@ public class SDKDeviceService extends AbstractDeviceService {
                 && data.getElevation().doubleValue() == lastPoint.getElevation();
     }
 
+    private boolean isEqualsPoint(OsdDroneDTO data,FlightTrackEntity lastPoint) {
+        return  new BigDecimal(data.getLongitude().doubleValue()).compareTo(new BigDecimal(lastPoint.getLongitude().doubleValue())) == 0
+                && new BigDecimal(data.getLatitude().doubleValue()).compareTo(new BigDecimal(lastPoint.getLatitude())) == 0
+                && new BigDecimal(data.getHeight().doubleValue()).compareTo(new BigDecimal(lastPoint.getAltitude())) == 0
+                && new BigDecimal(data.getElevation().doubleValue() ).compareTo(new BigDecimal(lastPoint.getElevation())) == 0;
+    }
+
     private int updateFlightTask(FlightTaskDTO task) {
         if(task != null && task.getId() != null) {
             log.info("飞行结束 更新轨迹任务: " + task.toString());
@@ -616,23 +626,47 @@ public class SDKDeviceService extends AbstractDeviceService {
     @Override
     public TopicStateResponse<MqttReply> dockDroneCurrentRthMode(TopicStateRequest<DockDroneCurrentRthMode> request, MessageHeaders headers) {
         log.info("==========dockDroneCurrentRthMode=========request:"+ request.toString() + ",headers:" + headers.toString());
-        return null;
+        return new TopicStateResponse<MqttReply>().setData(MqttReply.success());
     }
     @Override
     public TopicStateResponse<MqttReply> dockDroneCurrentCommanderFlightMode(TopicStateRequest<DockDroneCurrentCommanderFlightMode> request, MessageHeaders headers) {
         log.info("==========dockDroneCurrentCommanderFlightMode=========request:"+ request.toString() + ",headers:" + headers.toString());
-        return null;
+          return new TopicStateResponse<MqttReply>().setData(MqttReply.success());
     }
 
     @Override
     public TopicStateResponse<MqttReply> dockDroneCommanderFlightHeight(TopicStateRequest<DockDroneCommanderFlightHeight> request, MessageHeaders headers) {
         log.info("==========dockDroneCommanderFlightHeight=========request:"+ request.toString() + ",headers:" + headers.toString());
-        return null;
+        return new TopicStateResponse<MqttReply>().setData(MqttReply.success());
     }
     @Override
     public TopicStateResponse<MqttReply> dockDroneRthMode(TopicStateRequest<DockDroneRthMode> request, MessageHeaders headers) {
         log.info("==========dockDroneRthMode=========request:"+ request.toString() + ",headers:" + headers.toString());
-        return null;
+        return new TopicStateResponse<MqttReply>().setData(MqttReply.success());
+    }
+
+    @Override
+    public void dockWpmzVersionUpdate(TopicStateRequest<DockDroneWpmzVersion> request, MessageHeaders headers) {
+        log.info("==========dockWpmzVersionUpdate=========request:"+ request.toString() + ",headers:" + headers.toString());
+    }
+    @Override
+    public void dockLiveStatusUpdate(TopicStateRequest<DockLiveStatus> request, MessageHeaders headers) {
+        log.info("==========dockLiveStatusUpdate=========request:"+ request.toString() + ",headers:" + headers.toString());
+    }
+    @Override
+    public TopicStateResponse<MqttReply> dongleInfos(TopicStateRequest<DongleInfos> request, MessageHeaders headers) {
+        log.info("==========dongleInfos=========request:"+ request.toString() + ",headers:" + headers.toString());
+        return new TopicStateResponse<MqttReply>().setData(MqttReply.success());
+    }
+    @Override
+    public TopicStateResponse<MqttReply> dockDroneCommanderModeLostAction(TopicStateRequest<DockDroneCommanderModeLostAction> request, MessageHeaders headers) {
+        log.info("==========dockDroneCommanderModeLostAction=========request:"+ request.toString() + ",headers:" + headers.toString());
+        return new TopicStateResponse<MqttReply>().setData(MqttReply.success());
+    }
+    @Override
+    public TopicStateResponse<MqttReply> dockDroneModeCodeReason(TopicStateRequest<DockDroneModeCodeReason> request, MessageHeaders headers) {
+        log.info("==========dockDroneModeCodeReason=========request:"+ request.toString() + ",headers:" + headers.toString());
+        return new TopicStateResponse<MqttReply>().setData(MqttReply.success());
     }
 
     private void dockGoOnline(DeviceDTO gateway, DeviceDTO subDevice) {

+ 1 - 1
Backend/sample/src/main/java/com/dji/sample/map/service/impl/FlightTrackTaskServiceImpl.java

@@ -384,7 +384,7 @@ public class FlightTrackTaskServiceImpl implements IFlightTrackTaskService {
                     .flyTime(flightTaskEntity.getFlyTime())
                     .beginTime(flightTaskEntity.getBeginTime() != null ? LocalDateTime.ofInstant(Instant.ofEpochMilli(flightTaskEntity.getBeginTime()), ZoneId.systemDefault()) : null)
                     .endTime(flightTaskEntity.getEndTime() != null ? LocalDateTime.ofInstant(Instant.ofEpochMilli(flightTaskEntity.getEndTime()), ZoneId.systemDefault()) : null)
-                    .templateType( StringUtils.hasText(flightTaskEntity.getTemplateType()) ? WaylineTemplateTypeEnum.find(flightTaskEntity.getTemplateType()).get().getType() : "")
+                    .templateType( StringUtils.hasText(flightTaskEntity.getTemplateType()) ? WaylineTemplateTypeEnum.find(flightTaskEntity.getTemplateType()).getType() : "")
                     .createTime(LocalDateTime.ofInstant(Instant.ofEpochMilli(flightTaskEntity.getCreateTime()), ZoneId.systemDefault()))
                     .updateTime(flightTaskEntity.getUpdateTime() != null ? LocalDateTime.ofInstant(Instant.ofEpochMilli(flightTaskEntity.getUpdateTime()), ZoneId.systemDefault()) : null)
                     .username(flightTaskEntity.getUsername());

+ 1 - 0
Backend/sample/src/main/java/com/dji/sample/media/dao/IFileMapper.java

@@ -26,6 +26,7 @@ public interface IFileMapper extends BaseMapper<MediaFileEntity> {
             ",MF.picture_type pictureType " +
             ",MF.object_key fileUrl " +
             ",MF.file_name fileName " +
+            ",MF.file_id fileId " +
             "FROM MEDIA_FILE MF " +
             "LEFT JOIN MEDIA_DIR MD ON MF.DIR_ID = MD.ID " +
             "LEFT JOIN MANAGE_DEVICE DE ON MF.DRONE = DE.DEVICE_SN " +

+ 2 - 0
Backend/sample/src/main/java/com/dji/sample/media/model/UpstreamMediaFileDTO.java

@@ -41,6 +41,8 @@ public class UpstreamMediaFileDTO {
 
     private String fileName;
 
+    private String fileId;
+
 
 
 

+ 7 - 0
Backend/sample/src/main/java/com/dji/sample/media/service/IMediaRedisService.java

@@ -1,6 +1,7 @@
 package com.dji.sample.media.service;
 
 import com.dji.sample.media.model.MediaFileCountDTO;
+import com.dji.sdk.cloudapi.device.CameraModeEnum;
 
 /**
  * @author sean
@@ -23,4 +24,10 @@ public interface IMediaRedisService {
 
     boolean delMediaHighestPriority(String gatewaySn);
 
+    void setCameraMode(String gatewaySn, CameraModeEnum cameraModeEnum);
+
+    CameraModeEnum getCameraMode(String gatewaySn);
+
+    boolean delCameraMode(String gatewaySn);
+
 }

+ 7 - 3
Backend/sample/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java

@@ -378,6 +378,9 @@ public class FileServiceImpl implements IFileService {
         return listData;
     }
 
+    private String getUserName() {
+        return UserRequest.getCurrentUser() == null ? "System" : UserRequest.getCurrentUser().getUsername();
+    }
     /**
      * Convert the received file object into a database entity object.
      * @param file
@@ -389,6 +392,7 @@ public class FileServiceImpl implements IFileService {
 //        String dirName = getDirName(waylineName, file.getPath());
         String dirName = file.getPath();
         MediaDirDTO dirDto = null;
+
         synchronized(dirName.intern()) {
             dirDto = mediaDirService.getMediaDirByName(workspaceId, dirName, null);
             //文件夹不存在,则创建文件夹
@@ -401,9 +405,9 @@ public class FileServiceImpl implements IFileService {
                         .createTime(System.currentTimeMillis())
                         .deviceName(getDeviceNameByModelKey(file.getExt().getDroneModelKey()))
                         .payload(getDeviceNameByModelKey(file.getExt().getPayloadModelKey()))
-                        .username(UserRequest.getCurrentUser().getUsername());
+                        .username(getUserName());
                 if (waylineOpt.isPresent()) {
-                    waylineOpt.ifPresent(wayline -> dirBuilder.templateType(wayline.getTemplateTypes().get(0).name()));
+                    waylineOpt.ifPresent(wayline -> dirBuilder.templateType(wayline.getTemplateTypes().get(0).getType()));
                 }
                 dirDto = mediaDirService.createDir(dirBuilder.build());
             }
@@ -777,7 +781,7 @@ public class FileServiceImpl implements IFileService {
                 .groupId(groupOpt.get().getId())
                 .elementId(elementId)
                 .elementName(mediaFileDTO.getFileName())
-                .username(UserRequest.getCurrentUser().getUsername())
+                .username(getUserName())
                 .elementType(ElementResourceTypeEnum.MEDIA.getType())
                 .elementFrom(elementFrom)
                 .build();

+ 5 - 1
Backend/sample/src/main/java/com/dji/sample/media/service/impl/MediaDirServiceImpl.java

@@ -11,8 +11,10 @@ import com.dji.sample.media.model.MediaFileEntity;
 import com.dji.sample.media.service.IFileService;
 import com.dji.sample.media.service.IMediaDirService;
 import com.dji.sample.wayline.model.enums.WaylineTemplateTypeEnum;
+import com.dji.sdk.cloudapi.wayline.WaylineTypeEnum;
 import com.dji.sdk.common.Pagination;
 import com.dji.sdk.common.PaginationData;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -29,6 +31,7 @@ import java.util.stream.Collectors;
  * @version 1.0
  * @date 2024/7/2
  */
+@Slf4j
 @Service
 @Transactional
 public class MediaDirServiceImpl implements IMediaDirService {
@@ -88,6 +91,7 @@ public class MediaDirServiceImpl implements IMediaDirService {
 
     @Override
     public MediaDirDTO createDir(MediaDirEntity dirEntity) {
+        log.info("===============createDir  getTemplateType =====:" + dirEntity.getTemplateType());
         int result = mapper.insert(dirEntity);
         if(result > 0) {
             return entityToDto(dirEntity);
@@ -130,7 +134,7 @@ public class MediaDirServiceImpl implements IMediaDirService {
                     .deviceName(mediaDirEntity.getDeviceName())
                     .payload(mediaDirEntity.getPayload())
                     .waylineName(mediaDirEntity.getWaylineName())
-                    .templateType( StringUtils.hasText(mediaDirEntity.getTemplateType()) ? WaylineTemplateTypeEnum.find(mediaDirEntity.getTemplateType()).get().getType() : "")
+                    .templateType( StringUtils.hasText(mediaDirEntity.getTemplateType()) ? WaylineTemplateTypeEnum.find(mediaDirEntity.getTemplateType()).getType() : "")
                     .createTime(LocalDateTime.ofInstant(Instant.ofEpochMilli(mediaDirEntity.getCreateTime()), ZoneId.systemDefault()))
                     .username(mediaDirEntity.getUsername());
         }

+ 16 - 0
Backend/sample/src/main/java/com/dji/sample/media/service/impl/MediaRedisServiceImpl.java

@@ -4,6 +4,7 @@ import com.dji.sample.component.redis.RedisConst;
 import com.dji.sample.component.redis.RedisOpsUtils;
 import com.dji.sample.media.model.MediaFileCountDTO;
 import com.dji.sample.media.service.IMediaRedisService;
+import com.dji.sdk.cloudapi.device.CameraModeEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -51,4 +52,19 @@ public class MediaRedisServiceImpl implements IMediaRedisService {
     public boolean delMediaHighestPriority(String gatewaySn) {
         return RedisOpsUtils.del(RedisConst.MEDIA_HIGHEST_PRIORITY_PREFIX + gatewaySn);
     }
+
+    @Override
+    public void setCameraMode(String gatewaySn, CameraModeEnum cameraMode) {
+        RedisOpsUtils.set(RedisConst.CAMERA_MODE_PREFIX + gatewaySn, cameraMode);
+    }
+
+    @Override
+    public CameraModeEnum getCameraMode(String gatewaySn) {
+        return (CameraModeEnum) RedisOpsUtils.get(RedisConst.CAMERA_MODE_PREFIX + gatewaySn);
+    }
+
+    @Override
+    public boolean delCameraMode(String gatewaySn) {
+        return RedisOpsUtils.del(RedisConst.CAMERA_MODE_PREFIX + gatewaySn);
+    }
 }

+ 27 - 6
Backend/sample/src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java

@@ -1,5 +1,7 @@
 package com.dji.sample.media.service.impl;
 
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
 import com.dji.sample.component.oss.model.OssConfiguration;
 import com.dji.sample.component.websocket.model.BizCodeEnum;
 import com.dji.sample.component.websocket.service.IWebSocketMessageService;
@@ -12,7 +14,9 @@ import com.dji.sample.media.model.MediaFileDTO;
 import com.dji.sample.media.service.IFileService;
 import com.dji.sample.media.service.IMediaRedisService;
 import com.dji.sample.media.service.IMediaService;
+import com.dji.sample.wayline.model.dto.WaylineJobDTO;
 import com.dji.sample.wayline.service.IWaylineJobService;
+import com.dji.sdk.cloudapi.device.CameraModeEnum;
 import com.dji.sdk.cloudapi.media.*;
 import com.dji.sdk.cloudapi.media.api.AbstractMediaService;
 import com.dji.sdk.mqtt.MqttReply;
@@ -25,6 +29,8 @@ import org.springframework.messaging.MessageHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import java.text.DateFormat;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -93,7 +99,7 @@ public class MediaServiceImpl extends AbstractMediaService implements IMediaServ
         FileUploadCallback callback = request.getData();
 
         if (MqttReply.CODE_SUCCESS != callback.getResult()) {
-            log.error("Media file upload failed!");
+            log.error("媒体文件上传失败!");
             return null;
         }
 
@@ -111,7 +117,7 @@ public class MediaServiceImpl extends AbstractMediaService implements IMediaServ
         DeviceDTO device = deviceOpt.get();
         boolean isSave = parseMediaFile(callback, device);
         if (!isSave) {
-            log.error("Failed to save the file to the database, please check the data manually.");
+            log.error("保存媒体文件失败,确认媒体文件数据是否正确.");
             return null;
         }
 
@@ -154,11 +160,24 @@ public class MediaServiceImpl extends AbstractMediaService implements IMediaServ
         // Set the drone sn that shoots the media
         file.getExt().setSn(device.getChildDeviceSn());
 
+        String jobId = callback.getFile().getExt().getFlightId();
+        Optional<WaylineJobDTO> jobOpt = waylineJobService.getJobByJobId(device.getWorkspaceId(),jobId);
+        if(jobOpt.isPresent()) {
+            file.setPath(jobOpt.get().getJobName() + " " + DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMAT));
+        } else {
+            file.setPath(device.getDeviceName() + " " + DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMAT));
+        }
+        CameraModeEnum cameraModeEnum = mediaRedisService.getCameraMode(device.getDeviceSn());
+        if(CameraModeEnum.PANORAMA == cameraModeEnum) {
+            file.setSubFileType(MediaSubFileTypeEnum.PANORAMA);
+        } else {
+            file.setSubFileType(MediaSubFileTypeEnum.NORMAL);
+        }
         // set path
-        String objectKey = file.getObjectKey();
-        file.setPath(objectKey.substring(Optional.of(objectKey.indexOf(OssConfiguration.objectDirPrefix))
-                .filter(index -> index > 0).map(index -> index++).orElse(0),
-                objectKey.lastIndexOf("/")));
+//        String objectKey = file.getObjectKey();
+//        file.setPath(objectKey.substring(Optional.of(objectKey.indexOf(OssConfiguration.objectDirPrefix))
+//                .filter(index -> index > 0).map(index -> index++).orElse(0),
+//                objectKey.lastIndexOf("/")));
 
         return fileService.saveFile(device.getWorkspaceId(), file) > 0;
     }
@@ -181,6 +200,8 @@ public class MediaServiceImpl extends AbstractMediaService implements IMediaServ
             if (Objects.nonNull(fileCount) && jobId.equals(fileCount.getJobId())) {
                 mediaRedisService.delMediaHighestPriority(request.getGateway());
             }
+
+            mediaRedisService.delCameraMode(request.getGateway());
         } else {
             mediaRedisService.setMediaCount(request.getGateway(), jobId, mediaFileCount);
         }

+ 13 - 10
Backend/sample/src/main/java/com/dji/sample/wayline/model/enums/WaylineTemplateTypeEnum.java

@@ -13,23 +13,26 @@ import java.util.Optional;
  */
 public enum WaylineTemplateTypeEnum {
 
-    WAYPOINT(0, "航点航线"),
 
-    MAPPING_2D(1, "二维正射"),
+    WAYPOINT(0, "航点航线","waypoint"),
 
-    MAPPING_3D(2, "倾斜摄影"),
+    MAPPING_2D(1, "二维正射","mapping2d"),
 
-    MAPPING_STRIP(4, "带状航线"),
+    MAPPING_3D(2, "倾斜摄影","mapping3d"),
 
-    UNKNOWN(-1, "未知");
+    MAPPING_STRIP(3, "带状航线","mappingStrip"),
+
+    UNKNOWN(-1, "未知","");
 
     int val;
 
-    String type;
+    private final String text;
+    private final String type;
 
-    WaylineTemplateTypeEnum(int val, String type) {
-        this.val = val;
+    WaylineTemplateTypeEnum(int value,String text, String type) {
+        this.val = value;
         this.type = type;
+        this.text = text;
     }
 
     @JsonValue
@@ -47,7 +50,7 @@ public enum WaylineTemplateTypeEnum {
         return Arrays.stream(values()).filter(templateTypeEnum -> templateTypeEnum.val == val).findAny().orElse(UNKNOWN);
     }
 
-    public static Optional<WaylineTemplateTypeEnum> find(String type) {
-        return Arrays.stream(values()).filter(templateTypeEnum -> templateTypeEnum.type.equals(type)).findAny();
+    public static WaylineTemplateTypeEnum find(String type) {
+        return Arrays.stream(values()).filter(templateTypeEnum -> templateTypeEnum.type.equalsIgnoreCase(type)).findAny().orElse(UNKNOWN);
     }
 }

+ 8 - 0
Backend/sample/src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java

@@ -29,6 +29,8 @@ import com.dji.sdk.common.SDKManager;
 import com.dji.sdk.mqtt.MqttReply;
 import com.dji.sdk.mqtt.events.TopicEventsRequest;
 import com.dji.sdk.mqtt.events.TopicEventsResponse;
+import com.dji.sdk.mqtt.requests.TopicRequestsRequest;
+import com.dji.sdk.mqtt.requests.TopicRequestsResponse;
 import com.dji.sdk.mqtt.services.ServicesReplyData;
 import com.dji.sdk.mqtt.services.TopicServicesResponse;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -615,6 +617,12 @@ public class FlightTaskServiceImpl extends AbstractWaylineService implements IFl
         return new TopicEventsResponse<>();
     }
 
+    @Override
+    public TopicRequestsResponse<MqttReply> returnHomeInfo(TopicRequestsRequest<ReturnHomeInfo> response, MessageHeaders headers) {
+        log.info("===============FlightTaskServiceImpl returnHomeInfo: {}", response.toString());
+        return new TopicRequestsResponse<>();
+    }
+
     public static void main(String[] args) {
         // 假设 date 是一个 LocalDate 对象,taskPeriod.get(0) 是一个 Long 类型的秒数
         LocalDate date = LocalDate.ofInstant(Instant.ofEpochSecond(1728748800000L), ZoneId.systemDefault());

+ 1 - 0
Backend/sample/src/main/java/com/dji/sample/wayline/service/impl/SDKWaylineService.java

@@ -147,6 +147,7 @@ public class SDKWaylineService extends AbstractWaylineService {
         return new TopicEventsResponse<>();
     }
 
+    @Override
     public TopicRequestsResponse<MqttReply> returnHomeInfo(TopicRequestsRequest<ReturnHomeInfo> response, MessageHeaders headers) {
         log.info("returnHomeInfo: {}", response.toString());
         return new TopicRequestsResponse<>();