Browse Source

1.地图元素问题修复
2.地图图片元素显示文件夹
3.航线实时推送

S0025136190 1 year ago
parent
commit
1fd99651ad
18 changed files with 367 additions and 29 deletions
  1. 0 1
      Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementContent.java
  2. 27 1
      Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementPicture.java
  3. 13 0
      Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/GetMapElementsResponse.java
  4. 97 0
      Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapChildGroup.java
  5. 6 6
      Backend/sample/pom.xml
  6. 30 8
      Backend/sample/src/main/java/com/dji/sample/common/util/PicExifUtil.java
  7. 2 0
      Backend/sample/src/main/java/com/dji/sample/component/redis/RedisConst.java
  8. 2 0
      Backend/sample/src/main/java/com/dji/sample/component/websocket/model/BizCodeEnum.java
  9. 8 0
      Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceRedisService.java
  10. 17 0
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceRedisServiceImpl.java
  11. 1 0
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/LiveStreamServiceImpl.java
  12. 50 9
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java
  13. 4 0
      Backend/sample/src/main/java/com/dji/sample/map/service/IFlightTrackTaskService.java
  14. 44 1
      Backend/sample/src/main/java/com/dji/sample/map/service/impl/FlightTrackTaskServiceImpl.java
  15. 3 0
      Backend/sample/src/main/java/com/dji/sample/map/service/impl/GroupServiceImpl.java
  16. 43 3
      Backend/sample/src/main/java/com/dji/sample/map/service/impl/WorkspaceElementServiceImpl.java
  17. 2 0
      Backend/sample/src/main/java/com/dji/sample/media/service/IFileService.java
  18. 18 0
      Backend/sample/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java

+ 0 - 1
Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementContent.java

@@ -25,7 +25,6 @@ public class ElementContent {
     @NotNull
     private ElementGeometryType geometry;
 
-    @Valid
     private ElementPicture picture;
 
 

+ 27 - 1
Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementPicture.java

@@ -14,7 +14,6 @@ import javax.validation.constraints.Pattern;
 @Schema(description = "picture of the element")
 public class ElementPicture {
 
-    @NotNull
     @Schema(description = "file id")
     private String fileId;
 
@@ -24,6 +23,13 @@ public class ElementPicture {
     @Schema(description = "媒体类型")
     private String mediaType;
 
+    @Schema(description = "元素ID")
+    private String elementId;
+
+    @Schema(description = "文件夹ID")
+    private Integer dirId;
+
+
 
     public ElementPicture() {
     }
@@ -34,6 +40,8 @@ public class ElementPicture {
                 "fileId='" + fileId + '\'' +
                 ", thumbnailUrl=" + thumbnailUrl +
                 ", mediaType=" + mediaType +
+                ", elementId=" + elementId +
+                ", dirId=" + dirId +
                 '}';
     }
 
@@ -63,4 +71,22 @@ public class ElementPicture {
         this.mediaType = mediaType;
         return this;
     }
+
+    public String getElementId() {
+        return elementId;
+    }
+
+    public ElementPicture setElementId(String elementId) {
+        this.elementId = elementId;
+        return this;
+    }
+    public Integer getDirId() {
+        return dirId;
+    }
+
+    public ElementPicture setDirId(Integer dirId) {
+        this.dirId = dirId;
+        return this;
+    }
+
 }

+ 13 - 0
Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/GetMapElementsResponse.java

@@ -33,6 +33,9 @@ public class GetMapElementsResponse extends BaseModel {
     @Schema(description = "data collection of elements")
     private List<@Valid MapGroupElement> elements;
 
+    private List<MapChildGroup> childGroups;
+
+
     @JsonProperty(value = "is_lock")
     @NotNull
     @Schema(description = "Whether the element group is locked.")
@@ -49,6 +52,7 @@ public class GetMapElementsResponse extends BaseModel {
                 ", type=" + type +
                 ", elements=" + elements +
                 ", lock=" + lock +
+                ", childGroups=" + childGroups +
                 '}';
     }
 
@@ -96,4 +100,13 @@ public class GetMapElementsResponse extends BaseModel {
         this.lock = lock;
         return this;
     }
+
+    public List<MapChildGroup> getChildGroups() {
+        return childGroups;
+    }
+
+    public GetMapElementsResponse setChildGroups(List<MapChildGroup> childGroups) {
+        this.childGroups = childGroups;
+        return this;
+    }
 }

+ 97 - 0
Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapChildGroup.java

@@ -0,0 +1,97 @@
+package com.dji.sdk.cloudapi.map;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.util.List;
+
+/**
+ * @author hqjiang
+ * @version 0.1
+ * @date 2024/7/31
+ */
+@Schema(description = "picture dir")
+public class MapChildGroup {
+
+    @NotNull
+    @Schema(description = "dir id")
+    private String id;
+
+    @NotNull
+    @Schema(description = "dir name")
+    private String name;
+
+    @NotNull
+    @Schema(description = "data collection of elements")
+    private List<@Valid MapGroupElement> elements;
+
+
+    private Long createTime;
+
+    private Long updateTime;
+
+
+    public MapChildGroup() {
+    }
+
+    @Override
+    public String toString() {
+        return "MapGroupElement{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", elements=" + elements +
+                ", createTime=" + createTime +
+                ", updateTime=" + updateTime +
+                '}';
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public MapChildGroup setId(String id) {
+        this.id = id;
+        return this;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public MapChildGroup setName(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public MapChildGroup setCreateTime(Long createTime) {
+        this.createTime = createTime;
+        return this;
+    }
+
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    public MapChildGroup setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+        return this;
+    }
+
+
+    public List<MapGroupElement> getElements() {
+        return elements;
+    }
+
+    public MapChildGroup setElements(List<MapGroupElement> elements) {
+        this.elements = elements;
+        return this;
+    }
+}

+ 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>
 
     </dependencies>

+ 30 - 8
Backend/sample/src/main/java/com/dji/sample/common/util/PicExifUtil.java

@@ -6,6 +6,7 @@ import com.dji.sample.component.oss.service.impl.OssServiceContext;
 import com.dji.sample.manage.model.common.AMap;
 import com.dji.sample.media.model.MediaExifDTO;
 import com.drew.imaging.ImageMetadataReader;
+import com.drew.imaging.mp4.Mp4MetadataReader;
 import com.drew.metadata.Metadata;
 import com.drew.metadata.exif.*;
 import com.drew.metadata.file.FileTypeDirectory;
@@ -23,9 +24,7 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 import org.springframework.stereotype.Component;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 import java.text.DecimalFormat;
 
 /**
@@ -57,12 +56,28 @@ public class PicExifUtil {
         return getPicExif(inputStream,objectKey.endsWith(MP4));
     }
 
+    public static void main(String[] args) {
+        //全景图
+//        File file = new File("C:\\Users\\86139\\Desktop\\DJI_20240709132723_0001_V.JPG");
+        File file = new File("C:\\Users\\86139\\Desktop\\DJI_20231011154344_0003_V.jpg");
+
+
+//        File file = new File("C:\\Users\\86139\\Desktop\\DJI_20240711181155_0001_V.JPG");
+        try {
+            InputStream inputStream = new FileInputStream(file);
+            MediaExifDTO mediaExifDTO = getPicExif(inputStream,false);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
+
     public static MediaExifDTO getPicExif(InputStream inputStream,boolean isVideo) {
         try {
             MediaExifDTO.MediaExifDTOBuilder builder = MediaExifDTO.builder();
-            Metadata metadata = ImageMetadataReader.readMetadata(inputStream);
+
             //视频
             if(isVideo) {
+                Metadata metadata = Mp4MetadataReader.readMetadata(inputStream);
                 //视频宽高
                 Mp4VideoDirectory mp4VideoDirectory = metadata.getFirstDirectoryOfType(Mp4VideoDirectory.class);
                 builder.imageWidth(mp4VideoDirectory.getInteger(Mp4VideoDirectory.TAG_WIDTH));
@@ -75,7 +90,13 @@ public class PicExifUtil {
                 builder.durationSeconds(mp4Directory.getInteger(Mp4Directory.TAG_DURATION_SECONDS));
                 builder.createTime(mp4Directory.getDate(Mp4Directory.TAG_CREATION_TIME).getTime());
 
+                //媒体类型
+                FileTypeDirectory fileTypeDirectory = metadata.getFirstDirectoryOfType(FileTypeDirectory.class);
+                builder.mediaType(fileTypeDirectory.getString(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE));
+                builder.pictureType(fileTypeDirectory.getString(FileTypeDirectory.TAG_DETECTED_FILE_TYPE_NAME));
+
             } else {
+                Metadata metadata = ImageMetadataReader.readMetadata(inputStream);
                 //经纬度
                 GpsDirectory gpsDirectory = metadata.getFirstDirectoryOfType(GpsDirectory.class);
                 builder.absoluteAltitude(gpsDirectory.getDouble(GpsDirectory.TAG_ALTITUDE));
@@ -91,11 +112,12 @@ public class PicExifUtil {
                 ExifSubIFDDirectory exifSubIFDDirectory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class);
                 builder.imageWidth(exifSubIFDDirectory.getInteger(ExifSubIFDDirectory.TAG_EXIF_IMAGE_WIDTH));
                 builder.imageHeight(exifSubIFDDirectory.getInteger(ExifSubIFDDirectory.TAG_EXIF_IMAGE_HEIGHT));
+                //媒体类型
+                FileTypeDirectory fileTypeDirectory = metadata.getFirstDirectoryOfType(FileTypeDirectory.class);
+                builder.mediaType(fileTypeDirectory.getString(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE));
+                builder.pictureType(fileTypeDirectory.getString(FileTypeDirectory.TAG_DETECTED_FILE_TYPE_NAME));
             }
-            //媒体类型
-            FileTypeDirectory fileTypeDirectory = metadata.getFirstDirectoryOfType(FileTypeDirectory.class);
-            builder.mediaType(fileTypeDirectory.getString(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE));
-            builder.pictureType(fileTypeDirectory.getString(FileTypeDirectory.TAG_DETECTED_FILE_TYPE_NAME));
+
             return builder.build();
         } catch (Exception e) {
             e.printStackTrace();

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

@@ -70,4 +70,6 @@ public final class RedisConst {
     public static final String DRONE_HOME = "drone_home" + DELIMITER;
     //home 经纬度过期时间
     public static final Integer DRONE_HOME_ALIVE_SECOND = 3600;
+    //飞行航线
+    public static final String DRONE_FLY_TRACK = "drone_fly_track" + DELIMITER;
 }

+ 2 - 0
Backend/sample/src/main/java/com/dji/sample/component/websocket/model/BizCodeEnum.java

@@ -81,6 +81,8 @@ public enum BizCodeEnum {
 
     HOME_CHANGE("home_change"),
 
+    DRONE_FLY_TRACK("drone_fly_track"),
+
     ;
 
     private String code;

+ 8 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceRedisService.java

@@ -4,9 +4,11 @@ import com.dji.sample.component.mqtt.model.EventsReceiver;
 import com.dji.sample.manage.model.common.AMap;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.map.model.dto.FlightTaskDTO;
+import com.dji.sample.map.model.dto.FlightTrackDTO;
 import com.dji.sample.map.model.entity.FlightTrackEntity;
 import com.dji.sdk.cloudapi.firmware.OtaProgress;
 
+import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 
@@ -130,4 +132,10 @@ public interface IDeviceRedisService {
     Optional<AMap> getDroneHomeChange(String sn);
 
     Boolean delDroneHomeChange(String sn);
+
+    void setDroneFlyTrack(String deviceSn, List<FlightTrackDTO> points);
+
+    Optional<List<FlightTrackDTO>> getDroneFlyTrack(String sn);
+
+    Boolean delDroneFlyTrack(String sn);
 }

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

@@ -8,11 +8,13 @@ import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.service.ICapacityCameraService;
 import com.dji.sample.manage.service.IDeviceRedisService;
 import com.dji.sample.map.model.dto.FlightTaskDTO;
+import com.dji.sample.map.model.dto.FlightTrackDTO;
 import com.dji.sample.map.model.entity.FlightTrackEntity;
 import com.dji.sdk.cloudapi.firmware.OtaProgress;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -155,5 +157,20 @@ public class DeviceRedisServiceImpl implements IDeviceRedisService {
         return RedisOpsUtils.del(RedisConst.DRONE_HOME + sn);
     }
 
+    @Override
+    public void setDroneFlyTrack(String deviceSn, List<FlightTrackDTO> points) {
+        RedisOpsUtils.setWithExpire(RedisConst.DRONE_FLY_TRACK + deviceSn, points, RedisConst.DRONE_HOME_ALIVE_SECOND);
+    }
+
+    @Override
+    public Optional<List<FlightTrackDTO>> getDroneFlyTrack(String sn) {
+        return Optional.ofNullable((List<FlightTrackDTO>) RedisOpsUtils.get(RedisConst.DRONE_FLY_TRACK + sn));
+    }
+
+    @Override
+    public Boolean delDroneFlyTrack(String sn) {
+        return RedisOpsUtils.del(RedisConst.DRONE_FLY_TRACK + sn);
+    }
+
 
 }

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

@@ -94,6 +94,7 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
             case AGORA:
                 break;
             case RTMP:
+//                live.setUrl("http://smsp.jkec.info:4443/flv/live/stream_27.flv");
                 live.setUrl("webrtc://smsp.jkec.info:18000/rtc/stream_27");
                 //live.setUrl("webrtcs://smsp.jkec.info:4443/rtc/stream_27");
 //                live.setUrl(url.toString().replace("rtmp", "webrtc"));

+ 50 - 9
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java

@@ -37,14 +37,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.support.AbstractCacheManager;
 import org.springframework.messaging.MessageHeaders;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.time.LocalDateTime;
 import java.time.ZoneId;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -256,11 +254,11 @@ public class SDKDeviceService extends AbstractDeviceService {
                         .setVerticalSpeed(data.getVerticalSpeed()));
         deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, data);
         //添加航点轨迹信息
-        toAddFilghtPoint(device, data);
+        toAddFilghtPoint(from, device, data);
 
     }
 
-    private void toAddFilghtPoint(DeviceDTO device,OsdRcDrone data) {
+    private void toAddFilghtPoint(String from, DeviceDTO device,OsdRcDrone data) {
 
         switch (data.getModeCode()) {
             case TAKEOFF_FINISHED:
@@ -275,6 +273,9 @@ public class SDKDeviceService extends AbstractDeviceService {
             case LANDING_THREE_PROPELLER:
                 //添加飞行轨迹
                 addFlightPoint(device,data);
+                //推送实时轨迹信息
+                pushFlyTrackToWeb(from,device,data);
+
                 break;
             case LANDING_AUTO:
             case LANDING_FORCED:
@@ -282,17 +283,55 @@ public class SDKDeviceService extends AbstractDeviceService {
 
                 //添加飞行轨迹
                 FlightTaskDTO task = addFlightPoint(device,data);
+                //推送实时轨迹信息
+                pushFlyTrackToWeb(from,device,data);
+
                 //更新飞行任务
                 if(task != null) {
                     updateFlightTask(task);
                 }
                 //移除redis
                 deviceRedisService.delDroneFlightTask(device.getDeviceSn());
+                deviceRedisService.delDroneFlyTrack(device.getDeviceSn());
                 break;
 
         }
     }
 
+    private void pushFlyTrackToWeb(String from, DeviceDTO device,OsdRcDrone data) {
+        //推送实时轨迹信息
+        List<FlightTrackDTO> trackList = getFlightLine(device,data);
+        if(!CollectionUtils.isEmpty(trackList)) {
+            deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DRONE_FLY_TRACK, from, data);
+        }
+    }
+
+    private List<FlightTrackDTO> getFlightLine(DeviceDTO device,OsdRcDrone data) {
+        Optional<List<FlightTrackDTO>> optList = deviceRedisService.getDroneFlyTrack(device.getDeviceSn());
+        if(!optList.isPresent() || optList.get().isEmpty()) {
+            //获取飞行任务(轨迹)
+            FlightTaskDTO task = getFlightTask(device, data, false);
+            if(task == null) {
+                return null;
+            }
+            List<FlightTrackDTO> flightPoints =  flightTaskService.getRTFlightTrackByTaskId(task.getId());
+            deviceRedisService.setDroneFlyTrack(device.getDeviceSn(),flightPoints);
+            return flightPoints;
+        } else {
+            return optList.get();
+        }
+    }
+
+    private void addRedisFlightPoint(String sn,FlightTrackDTO point) {
+        List<FlightTrackDTO> flightPoints = new ArrayList<FlightTrackDTO>();
+        Optional<List<FlightTrackDTO>> optList = deviceRedisService.getDroneFlyTrack(sn);
+        if(optList.isPresent()) {
+            flightPoints = optList.get();
+        }
+        flightPoints.add(point);
+        deviceRedisService.setDroneFlyTrack(sn,flightPoints);
+    }
+
     private FlightTaskDTO addFlightPoint(DeviceDTO device,OsdRcDrone data) {
         synchronized (device.getDeviceSn().intern()) {
             Optional<FlightTrackEntity> lastPoint = deviceRedisService.getLastDroneTrack(device.getDeviceSn());
@@ -323,7 +362,7 @@ public class SDKDeviceService extends AbstractDeviceService {
             }
             if(isAdd) {
                 //获取飞行任务(轨迹)
-                FlightTaskDTO task = getFlightTask(device, data);
+                FlightTaskDTO task = getFlightTask(device, data, true);
                 log.info("获取飞行轨迹任务:" + task.toString());
                 //添加Home信息
                 if(!lastPoint.isPresent()) {
@@ -337,6 +376,7 @@ public class SDKDeviceService extends AbstractDeviceService {
                                 .type(FlightPointTypeEnum.HOME.getType())
                                 .createTime(System.currentTimeMillis()).build();
                         flightTaskService.addHomePoint(flightTrackEntity);
+                        addRedisFlightPoint(device.getDeviceSn(),flightTaskService.flightTrackEntityToDto(flightTrackEntity));
                     }
                 }
                 //添加轨迹信息
@@ -350,6 +390,7 @@ public class SDKDeviceService extends AbstractDeviceService {
                         .type(FlightPointTypeEnum.HAND.getType())
                         .createTime(System.currentTimeMillis()).build();
                 flightTaskService.addFlightPoint(flightTrackEntity);
+                addRedisFlightPoint(device.getDeviceSn(),flightTaskService.flightTrackEntityToDto(flightTrackEntity));
                 log.info("添加轨迹完成: task:" + task.getTaskName());
                 //记录添加时间
                 deviceRedisService.setLastDroneTrack(device.getDeviceSn(), flightTrackEntity);
@@ -381,7 +422,7 @@ public class SDKDeviceService extends AbstractDeviceService {
         return 0;
     }
 
-    private FlightTaskDTO getFlightTask(DeviceDTO device,OsdRcDrone data) {
+    private FlightTaskDTO getFlightTask(DeviceDTO device,OsdRcDrone data,boolean isCreate) {
         //获取任务名称
         FlightTaskDTO flightTaskDTO = null;
         Optional<FlightTaskDTO> opt = deviceRedisService.getDroneFlightTask(device.getDeviceSn());
@@ -391,7 +432,7 @@ public class SDKDeviceService extends AbstractDeviceService {
             //查询当天未完成的任务
             flightTaskDTO = flightTaskService.getCurrentFlightTask(device.getWorkspaceId(),device.getDeviceSn());
         }
-        if(flightTaskDTO == null) {
+        if(flightTaskDTO == null && isCreate) {
             Date curTime = new Date();
             String taskName = getTaskName(curTime, device.getDeviceSn());
             flightTaskDTO = flightTaskService.createFlightTask(FlightTaskEntity.builder()

+ 4 - 0
Backend/sample/src/main/java/com/dji/sample/map/service/IFlightTrackTaskService.java

@@ -38,6 +38,8 @@ public interface IFlightTrackTaskService {
      */
     List<FlightTrackDTO> getFlightTrackByTaskId(String taskId);
 
+    List<FlightTrackDTO> getRTFlightTrackByTaskId(Integer taskId);
+
     /**
      * 创建飞行任务
      * @param flightTaskDTO
@@ -55,4 +57,6 @@ public interface IFlightTrackTaskService {
     FlightTaskDTO createFlightTask(FlightTaskEntity flightTaskEntity);
 
     FlightTaskEntity dtoToEntity(FlightTaskDTO flightTask);
+
+    FlightTrackDTO flightTrackEntityToDto(FlightTrackEntity flightTrackEntity);
 }

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

@@ -122,6 +122,11 @@ public class FlightTrackTaskServiceImpl implements IFlightTrackTaskService {
     }
 
 
+    /**
+     * 通过taskId获取轨迹回放
+     * @param taskId
+     * @return
+     */
     @Override
     public List<FlightTrackDTO> getFlightTrackByTaskId(String taskId) {
         List<FlightTrackEntity> filghtPoints = trackMapper.selectList(new LambdaQueryWrapper<FlightTrackEntity>()
@@ -180,6 +185,43 @@ public class FlightTrackTaskServiceImpl implements IFlightTrackTaskService {
         return null;
     }
 
+    /**
+     * 通过taskId获取实时飞行轨迹
+     * @param taskId
+     * @return
+     */
+    @Override
+    public List<FlightTrackDTO> getRTFlightTrackByTaskId(Integer taskId) {
+        //飞行坐标
+        List<FlightTrackEntity> filghtPoints = trackMapper.selectList(new LambdaQueryWrapper<FlightTrackEntity>()
+                .eq(FlightTrackEntity::getTaskId, taskId)
+                .and(wrapper ->
+                        wrapper.isNull(FlightTrackEntity::getType).or()
+                                .eq(FlightTrackEntity::getType,FlightPointTypeEnum.HAND.getType().intValue()).or()
+                                .eq(FlightTrackEntity::getType,FlightPointTypeEnum.HOME.getType().intValue()))
+                .orderByAsc(FlightTrackEntity::getCreateTime));
+        if(!CollectionUtils.isEmpty(filghtPoints)) {
+            //Home点
+            Optional<FlightTrackEntity> homePointOpt = filghtPoints.stream().filter(fp ->FlightPointTypeEnum.HOME.getType().intValue() == fp.getType().intValue()).findFirst();
+            FlightTrackEntity homePoint = null;
+            if(homePointOpt.isPresent()) {
+                homePoint = homePointOpt.get();
+            } else {
+                homePoint = FlightTrackEntity.builder().type(FlightPointTypeEnum.HOME.getType())
+                        .latitude(filghtPoints.get(0).getLatitude())
+                        .longitude(filghtPoints.get(0).getLongitude())
+                        .createTime(filghtPoints.get(0).getCreateTime())
+                        .build();
+            }
+            List<FlightTrackEntity> newFilghtTrackList = null;
+            newFilghtTrackList = filghtPoints;
+            newFilghtTrackList.add(0,homePoint);
+
+            return newFilghtTrackList.stream().map(this::flightTrackEntityToDto).collect(Collectors.toList());
+        }
+        return null;
+    }
+
     private FlightTrackEntity mediaDTOToFlightTrackDTO(Integer taskId, MediaFileEntity mediaFileEntity) {
         return FlightTrackEntity.builder().taskId(taskId)
                 .longitude(mediaFileEntity.getLongitude().doubleValue())
@@ -261,7 +303,8 @@ public class FlightTrackTaskServiceImpl implements IFlightTrackTaskService {
         return builder.build();
     }
 
-    private FlightTrackDTO flightTrackEntityToDto(FlightTrackEntity flightTrackEntity) {
+    @Override
+    public FlightTrackDTO flightTrackEntityToDto(FlightTrackEntity flightTrackEntity) {
         FlightTrackDTO.FlightTrackDTOBuilder builder = FlightTrackDTO.builder();
         if (flightTrackEntity != null) {
             builder.taskId(flightTrackEntity.getTaskId())

+ 3 - 0
Backend/sample/src/main/java/com/dji/sample/map/service/impl/GroupServiceImpl.java

@@ -8,6 +8,7 @@ import com.dji.sample.map.service.IGroupElementService;
 import com.dji.sample.map.service.IGroupService;
 import com.dji.sdk.cloudapi.map.GetMapElementsResponse;
 import com.dji.sdk.cloudapi.map.GroupTypeEnum;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -24,6 +25,7 @@ import java.util.stream.Collectors;
  * @version 0.2
  * @date 2021/11/29
  */
+@Slf4j
 @Service
 @Transactional
 public class GroupServiceImpl implements IGroupService {
@@ -59,6 +61,7 @@ public class GroupServiceImpl implements IGroupService {
         int count = mapper.selectCount(new LambdaQueryWrapper<GroupEntity>()
                 .eq(GroupEntity::getWorkspaceId, workspaceId));
         if(count <= 0 && StringUtils.hasText(workspaceId)) {
+            log.info("========创建默认文件夹=============workspaceId:" + workspaceId);
             //创建默认文件夹
             mapper.insert(GroupEntity.builder().groupId(UUID.randomUUID().toString())
                     .groupName(PILOT_SHARE_LAYER)

+ 43 - 3
Backend/sample/src/main/java/com/dji/sample/map/service/impl/WorkspaceElementServiceImpl.java

@@ -1,19 +1,25 @@
 package com.dji.sample.map.service.impl;
 
+import com.dji.sample.common.model.CustomClaim;
+import com.dji.sample.common.util.UserRequest;
 import com.dji.sample.component.websocket.model.BizCodeEnum;
 import com.dji.sample.component.websocket.service.IWebSocketMessageService;
+import com.dji.sample.manage.model.enums.UserTypeEnum;
 import com.dji.sample.map.model.dto.GroupElementDTO;
 import com.dji.sample.map.service.IElementCoordinateService;
 import com.dji.sample.map.service.IGroupElementService;
 import com.dji.sample.map.service.IGroupService;
 import com.dji.sample.map.service.IWorkspaceElementService;
 import com.dji.sample.media.service.IFileService;
+import com.dji.sample.media.service.IMediaDirService;
 import com.dji.sdk.cloudapi.map.*;
 import com.dji.sdk.common.HttpResultResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
@@ -42,14 +48,48 @@ public class WorkspaceElementServiceImpl implements IWorkspaceElementService {
     @Autowired
     private IFileService fileService;
 
+    @Autowired
+    private IMediaDirService mediaDirService;
+
     @Override
     public List<GetMapElementsResponse> getAllGroupsByWorkspaceId(String workspaceId, String groupId, Boolean isDistributed) {
         List<GetMapElementsResponse> groupList = groupService.getAllGroupsByWorkspaceId(workspaceId, groupId, isDistributed);
         groupList.forEach(group -> group.setElements(groupElementService.getElementsByGroupId(group.getId())));
-        groupList.forEach(group -> group.getElements().stream().filter(
-                e -> ElementResourceTypeEnum.MEDIA.getType() == e.getElementType()).collect(Collectors.toList())
-                .forEach(e -> e.getResource().getContent().setPicture(fileService.getMediaFileByElementId(workspaceId,e.getId()))));
+        CustomClaim customClaim = UserRequest.getCurrentUser();
+        if(customClaim != null && UserTypeEnum.PILOT.getVal() == customClaim.getUserType()) {
+            return groupList.stream().filter(g -> GroupTypeEnum.PICTURE != g.getType()).collect(Collectors.toList());
+        }
 
+        List<GetMapElementsResponse> mediaGroup = groupList.stream().filter(g -> GroupTypeEnum.PICTURE == g.getType()).collect(Collectors.toList());
+
+        if(!CollectionUtils.isEmpty(mediaGroup)) {
+            //获取媒体图片
+            List<ElementPicture> epList = fileService.getElementMediaFiles(workspaceId);
+            //设置媒体图片
+            mediaGroup.get(0).getElements().forEach(
+                    e -> e.getResource().getContent().setPicture(epList.stream().filter(ep -> ep.getElementId().equals(e.getId())).findFirst().orElse(null)));
+            //文件夹拆分
+            if(!CollectionUtils.isEmpty(epList)) {
+                long curTime = System.currentTimeMillis();
+                List <MapChildGroup> childGroups = new ArrayList<MapChildGroup>();
+                epList.stream().map(ElementPicture::getDirId).distinct().collect(Collectors.toList()).forEach(dirId -> {
+                    List<MapGroupElement> dirElements =  mediaGroup.get(0).getElements().stream().filter(
+                            e -> e.getResource().getContent().getPicture() != null && e.getResource().getContent().getPicture().getDirId().intValue() == dirId).collect(Collectors.toList());
+
+                    if(!CollectionUtils.isEmpty(dirElements)) {
+                        String dirIdStr = String.valueOf(dirId);
+                        childGroups.add(new MapChildGroup()
+                                .setId(dirIdStr)
+                                .setName(mediaDirService.getMediaDirById(workspaceId,dirIdStr).getDirName())
+                                .setElements(dirElements)
+                                .setCreateTime(curTime)
+                                .setUpdateTime(curTime));
+                    }
+                });
+                mediaGroup.get(0).setChildGroups(childGroups).setElements(null);
+            }
+
+        }
         return groupList;
     }
 

+ 2 - 0
Backend/sample/src/main/java/com/dji/sample/media/service/IFileService.java

@@ -24,6 +24,8 @@ public interface IFileService {
 
     ElementPicture getMediaFileByElementId(String workspaceId, String elementId);
 
+    List<ElementPicture> getElementMediaFiles(String workspaceId);
+
     /**
      * Query if the file already exists based on the workspace id and the fingerprint of the file.
      * @param workspaceId

+ 18 - 0
Backend/sample/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java

@@ -121,6 +121,24 @@ public class FileServiceImpl implements IFileService {
         return new ElementPicture().setFileId(fileEntity.getFileId()).setMediaType(fileEntity.getMediaType()).setThumbnailUrl(thumbnailURL);
     }
 
+    @Override
+    public List<ElementPicture> getElementMediaFiles(String workspaceId) {
+        List<MediaFileEntity> fileEntity = mapper.selectList(new LambdaQueryWrapper<MediaFileEntity>()
+                .eq(MediaFileEntity::getWorkspaceId, workspaceId)
+                .isNotNull(MediaFileEntity::getElementId));
+        List<ElementPicture> ePList = new ArrayList<>();
+        fileEntity.forEach(f -> {
+            String thumbnailURL = getThumbnailURL(f);
+            ePList.add(new ElementPicture()
+                    .setFileId(f.getFileId())
+                    .setMediaType(f.getMediaType())
+                    .setThumbnailUrl(thumbnailURL)
+                    .setElementId(f.getElementId())
+                    .setDirId(f.getDirId()));
+        });
+        return ePList;
+    }
+
     private Optional<MediaFileEntity> getMediaByFileId(String workspaceId, String fileId) {
         MediaFileEntity fileEntity = mapper.selectOne(new LambdaQueryWrapper<MediaFileEntity>()
                 .eq(MediaFileEntity::getWorkspaceId, workspaceId)