Browse Source

媒体文件处理1.exif解析优化(坐标,视频) 2.坐标转换优化 3.拍摄负载列表接口 4.文件夹接口优化(检索,字段补充) 5.文件接口优化(检索,字段补充) 6.文件夹压缩下载,文件压缩下载接口 7.文件删除接口

S0025136190 1 year ago
parent
commit
646b8a9307
24 changed files with 600 additions and 98 deletions
  1. 1 1
      Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileMetadata.java
  2. 4 4
      Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/WaylineTypeEnum.java
  3. 16 0
      Backend/cloud-sdk/src/main/java/com/dji/sdk/common/PaginationData.java
  4. 5 0
      Backend/sample/pom.xml
  5. 14 1
      Backend/sample/src/main/java/com/dji/sample/common/util/CoordinateUtil.java
  6. 38 10
      Backend/sample/src/main/java/com/dji/sample/common/util/PicExifUtil.java
  7. 16 0
      Backend/sample/src/main/java/com/dji/sample/manage/controller/DeviceController.java
  8. 2 0
      Backend/sample/src/main/java/com/dji/sample/manage/service/IDevicePayloadService.java
  9. 12 0
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DevicePayloadServiceImpl.java
  10. 28 0
      Backend/sample/src/main/java/com/dji/sample/map/model/param/MediaDirQueryParam.java
  11. 25 0
      Backend/sample/src/main/java/com/dji/sample/map/model/param/MediaFileQueryParam.java
  12. 50 11
      Backend/sample/src/main/java/com/dji/sample/media/controller/FileController.java
  13. 5 4
      Backend/sample/src/main/java/com/dji/sample/media/model/MediaDirDTO.java
  14. 18 0
      Backend/sample/src/main/java/com/dji/sample/media/model/MediaExifDTO.java
  15. 16 0
      Backend/sample/src/main/java/com/dji/sample/media/model/MediaFileDTO.java
  16. 20 0
      Backend/sample/src/main/java/com/dji/sample/media/model/MediaFileEntity.java
  17. 37 0
      Backend/sample/src/main/java/com/dji/sample/media/model/MediaTypeEnum.java
  18. 14 1
      Backend/sample/src/main/java/com/dji/sample/media/service/IFileService.java
  19. 2 1
      Backend/sample/src/main/java/com/dji/sample/media/service/IMediaDirService.java
  20. 239 19
      Backend/sample/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
  21. 16 31
      Backend/sample/src/main/java/com/dji/sample/media/service/impl/MediaDirServiceImpl.java
  22. 12 5
      Backend/sample/src/main/java/com/dji/sample/wayline/model/enums/WaylineTemplateTypeEnum.java
  23. 6 6
      Backend/sample/src/main/resources/application-prd.yml
  24. 4 4
      Backend/sample/src/main/resources/application.yml

+ 1 - 1
Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileMetadata.java

@@ -22,7 +22,7 @@ public class MediaFileMetadata {
     private Double absoluteAltitude;
 
     @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssVV")
-    @NotNull
+    //@NotNull
     @Schema(description = "media create time", example = "2023-01-01T20:00:00+08:00")
     @JsonProperty("created_time")
     private LocalDateTime createdTime;

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

@@ -16,13 +16,13 @@ import java.util.Arrays;
         description = "<p>0: waypoint<p/><p>1: mapping2d<p/><p>2: mapping3d<p/><p>3: mappingStrip</p>")
 public enum WaylineTypeEnum {
 
-    WAYPOINT(0, "waypoint"),
+    WAYPOINT(0, "航点航线"),
 
-    MAPPING_2D(1, "mapping2d"),
+    MAPPING_2D(1, "二维正射"),
 
-    MAPPING_3D(2, "mapping3d"),
+    MAPPING_3D(2, "倾斜摄影"),
 
-    MAPPING_STRIP(3, "mappingStrip");
+    MAPPING_STRIP(3, "带状航线");
 
     private final int value;
 

+ 16 - 0
Backend/cloud-sdk/src/main/java/com/dji/sdk/common/PaginationData.java

@@ -22,6 +22,8 @@ public class PaginationData<T> {
     @Schema(description = "Used for paging display. These field names cannot be changed. Because they need to be the same as the pilot.")
     private Pagination pagination;
 
+    private String groupName;
+
     public PaginationData() {
     }
 
@@ -30,6 +32,12 @@ public class PaginationData<T> {
         this.pagination = pagination;
     }
 
+    public PaginationData(String groupName, List<T> list, Pagination pagination) {
+        this.list = list;
+        this.pagination = pagination;
+        this.groupName = groupName;
+    }
+
     @Override
     public String toString() {
         return "PaginationData{" +
@@ -55,4 +63,12 @@ public class PaginationData<T> {
         this.pagination = pagination;
         return this;
     }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
 }

+ 5 - 0
Backend/sample/pom.xml

@@ -149,6 +149,11 @@
             <artifactId>metadata-extractor</artifactId>
             <version>2.19.0</version>
         </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.9</version>
+        </dependency>
 
     </dependencies>
 

+ 14 - 1
Backend/sample/src/main/java/com/dji/sample/common/util/CoordinateUtil.java

@@ -91,6 +91,15 @@ public class CoordinateUtil {
      * @return 转化后的经纬度坐标
      */
     public static AMap transform(double wgLon, double wgLat) {
+        String logStr = String.valueOf(wgLon);
+        if(logStr.indexOf("E") > 0) {
+            wgLon = Double.valueOf(logStr.substring(0, logStr.indexOf(".") + 6));
+        }
+        String latStr = String.valueOf(wgLat);
+        if(latStr.indexOf("E") > 0) {
+            wgLat = Double.valueOf(latStr.substring(0, latStr.indexOf(".") + 6));
+        }
+
         if (outOfChina(wgLat, wgLon)) {
             return new AMap(wgLon, wgLat);
         }
@@ -106,7 +115,7 @@ public class CoordinateUtil {
         double transLat = wgLat + dLat;
         double transLon = wgLon + dLon;
 
-        DecimalFormat df = new DecimalFormat("#.00000");
+        DecimalFormat df = new DecimalFormat("#.000000");
         transLon = Double.parseDouble(df.format(transLon));
         transLat = Double.parseDouble(df.format(transLat));
 
@@ -114,6 +123,10 @@ public class CoordinateUtil {
         return new AMap(transLon, transLat);
     }
 
+    private boolean isTooLong(double value) {
+        return String.valueOf(value).indexOf("E") > 0;
+    }
+
     /**
      * 判断是否为国外坐标,,不在国内不做偏移
      *

+ 38 - 10
Backend/sample/src/main/java/com/dji/sample/common/util/PicExifUtil.java

@@ -8,6 +8,9 @@ import com.dji.sample.media.model.MediaExifDTO;
 import com.drew.imaging.ImageMetadataReader;
 import com.drew.metadata.Metadata;
 import com.drew.metadata.exif.*;
+import com.drew.metadata.file.FileTypeDirectory;
+import com.drew.metadata.mp4.Mp4Directory;
+import com.drew.metadata.mp4.media.Mp4VideoDirectory;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonParser;
 import lombok.extern.slf4j.Slf4j;
@@ -34,24 +37,49 @@ import java.text.DecimalFormat;
 @Component
 public class PicExifUtil {
 
+    private static final String MP4 = ".MP4";
+
     public static MediaExifDTO getPicExif(String objectKey) {
         try {
             MediaExifDTO.MediaExifDTOBuilder builder = MediaExifDTO.builder();
             OssServiceContext ossService = SpringBeanUtilsTest.getBean(OssServiceContext.class);
             InputStream inputStream = ossService.getObject(OssConfiguration.bucket, objectKey);
             Metadata metadata = ImageMetadataReader.readMetadata(inputStream);
+            //视频
+            if(objectKey.endsWith(MP4)) {
+                //视频宽高
+                Mp4VideoDirectory mp4VideoDirectory = metadata.getFirstDirectoryOfType(Mp4VideoDirectory.class);
+                builder.imageWidth(mp4VideoDirectory.getInteger(Mp4VideoDirectory.TAG_WIDTH));
+                builder.imageHeight(mp4VideoDirectory.getInteger(Mp4VideoDirectory.TAG_HEIGHT));
+                builder.xResolution(mp4VideoDirectory.getInteger(Mp4VideoDirectory.TAG_HORIZONTAL_RESOLUTION));
+                builder.yResolution(mp4VideoDirectory.getInteger(Mp4VideoDirectory.TAG_VERTICAL_RESOLUTION));
 
-            ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
-            ExifSubIFDDirectory exifSubIFDDirectory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class);
-            GpsDirectory gpsDirectory = metadata.getFirstDirectoryOfType(GpsDirectory.class);
-
-            ExifIFD0Descriptor exifIFD0Descriptor = new ExifIFD0Descriptor(exifIFD0Directory);
-            builder.xResolution(Integer.valueOf(exifIFD0Descriptor.getXResolutionDescription().split(" ")[0]));
-            builder.yResolution(Integer.valueOf(exifIFD0Descriptor.getYResolutionDescription().split(" ")[0]));
+                //视频时长
+                Mp4Directory mp4Directory = metadata.getFirstDirectoryOfType(Mp4Directory.class);
+                builder.durationSeconds(mp4Directory.getInteger(Mp4Directory.TAG_DURATION_SECONDS));
+                builder.createTime(mp4Directory.getDate(Mp4Directory.TAG_CREATION_TIME).getTime());
 
-            ExifSubIFDDescriptor exifSubIFDDescriptor = new ExifSubIFDDescriptor(exifSubIFDDirectory);
-            builder.imageWidth(Integer.valueOf(exifSubIFDDescriptor.getExifImageWidthDescription().split(" ")[0]));
-            builder.imageHeight(Integer.valueOf(exifSubIFDDescriptor.getExifImageHeightDescription().split(" ")[0]));
+            } else {
+                //经纬度
+                GpsDirectory gpsDirectory = metadata.getFirstDirectoryOfType(GpsDirectory.class);
+                builder.absoluteAltitude(gpsDirectory.getDouble(GpsDirectory.TAG_ALTITUDE));
+                builder.longitude(gpsDirectory.getGeoLocation().getLongitude());
+                builder.longitudeRef(gpsDirectory.getString(GpsDirectory.TAG_LONGITUDE_REF));
+                builder.latitude(gpsDirectory.getGeoLocation().getLatitude());
+                builder.latitudeRef(gpsDirectory.getString(GpsDirectory.TAG_LATITUDE_REF));
+                //分辨率
+                ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
+                builder.xResolution(exifIFD0Directory.getInteger(ExifIFD0Directory.TAG_X_RESOLUTION));
+                builder.yResolution(exifIFD0Directory.getInteger(ExifIFD0Directory.TAG_Y_RESOLUTION));
+                //图片宽高
+                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));
             return builder.build();
         } catch (Exception e) {
             e.printStackTrace();

+ 16 - 0
Backend/sample/src/main/java/com/dji/sample/manage/controller/DeviceController.java

@@ -2,6 +2,8 @@ package com.dji.sample.manage.controller;
 
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.model.dto.DeviceFirmwareUpgradeDTO;
+import com.dji.sample.manage.model.dto.DevicePayloadDTO;
+import com.dji.sample.manage.service.IDevicePayloadService;
 import com.dji.sample.manage.service.IDeviceService;
 import com.dji.sdk.common.HttpResultResponse;
 import com.dji.sdk.common.PaginationData;
@@ -28,6 +30,9 @@ public class DeviceController {
     @Autowired
     private IDeviceService deviceService;
 
+    @Autowired
+    private IDevicePayloadService devicePayloadService;
+
     /**
      * Get the topology list of all online devices in one workspace.
      * @param workspaceId
@@ -141,4 +146,15 @@ public class DeviceController {
         return PropertySetReplyResultEnum.SUCCESS.getResult() == result ?
                 HttpResultResponse.success() : HttpResultResponse.error(result, String.valueOf(result));
     }
+
+    /**
+     * 获取拍摄负责信息
+     * @param workspaceId
+     * @return
+     */
+    @GetMapping("/{workspace_id}/payloads")
+    public HttpResultResponse getPayloads(@PathVariable("workspace_id") String workspaceId) {
+        List<DevicePayloadDTO> payloadList = devicePayloadService.getDevicePayloadEntities();
+        return HttpResultResponse.success(payloadList);
+    }
 }

+ 2 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/IDevicePayloadService.java

@@ -43,6 +43,8 @@ public interface IDevicePayloadService {
      */
     List<DevicePayloadDTO> getDevicePayloadEntitiesByDeviceSn(String deviceSn);
 
+    List<DevicePayloadDTO> getDevicePayloadEntities();
+
     /**
      * Delete all payload data on these devices based on the collection of device sns.
      * @param deviceSns

+ 12 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DevicePayloadServiceImpl.java

@@ -113,6 +113,18 @@ public class DevicePayloadServiceImpl implements IDevicePayloadService {
                 .collect(Collectors.toList());
     }
 
+    @Override
+    public List<DevicePayloadDTO> getDevicePayloadEntities() {
+        return mapper.selectList(
+                        new LambdaQueryWrapper<DevicePayloadEntity>().orderByAsc(DevicePayloadEntity::getPayloadName))
+                .stream()
+                .collect(Collectors.toMap(DevicePayloadEntity::getPayloadName, p -> p,(p1,p2) -> p1))//根据名称去重
+                .values()
+                .stream()
+                .map(this::payloadEntityConvertToDTO)
+                .collect(Collectors.toList());
+    }
+
     @Override
     public void deletePayloadsByDeviceSn(List<String> deviceSns) {
         deviceSns.forEach(deviceSn -> {

+ 28 - 0
Backend/sample/src/main/java/com/dji/sample/map/model/param/MediaDirQueryParam.java

@@ -0,0 +1,28 @@
+package com.dji.sample.map.model.param;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * @author hqjiang
+ * @version 1.0
+ * @date 2024/7/8
+ */
+@Data
+public class MediaDirQueryParam {
+
+    @JsonProperty("begin_time")
+    private Long beginTime;
+
+    @JsonProperty("end_time")
+    private Long endTime;
+
+    @JsonProperty("template_type")
+    private String templateType;
+
+    @JsonProperty("payload")
+    private String payload;
+
+    @JsonProperty("search_info")
+    private String searchInfo;
+}

+ 25 - 0
Backend/sample/src/main/java/com/dji/sample/map/model/param/MediaFileQueryParam.java

@@ -0,0 +1,25 @@
+package com.dji.sample.map.model.param;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * @author hqjiang
+ * @version 1.0
+ * @date 2024/7/8
+ */
+@Data
+public class MediaFileQueryParam {
+
+    @JsonProperty("begin_time")
+    private Long beginTime;
+
+    @JsonProperty("end_time")
+    private Long endTime;
+
+    @JsonProperty("media_type")
+    private Integer mediaType;
+
+    @JsonProperty("search_info")
+    private String searchInfo;
+}

+ 50 - 11
Backend/sample/src/main/java/com/dji/sample/media/controller/FileController.java

@@ -1,7 +1,10 @@
 package com.dji.sample.media.controller;
 
 import com.dji.sample.common.model.CustomClaim;
+import com.dji.sample.common.util.PicExifUtil;
 import com.dji.sample.manage.model.dto.DeviceDTO;
+import com.dji.sample.map.model.param.MediaDirQueryParam;
+import com.dji.sample.map.model.param.MediaFileQueryParam;
 import com.dji.sample.media.model.MediaDirDTO;
 import com.dji.sample.media.model.MediaFileDTO;
 import com.dji.sample.media.service.IFileService;
@@ -9,15 +12,18 @@ import com.dji.sample.media.service.IMediaDirService;
 import com.dji.sdk.common.HttpResultResponse;
 import com.dji.sdk.common.PaginationData;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
 import java.io.IOException;
 import java.net.URL;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM;
 
@@ -42,12 +48,20 @@ public class FileController {
      * @return
      */
     @GetMapping("/{workspace_id}/dirs")
-    public HttpResultResponse<PaginationData<MediaDirDTO>> getDirList(@RequestBody MediaDirDTO mediaDirDTO,
-                                                                         @RequestParam(defaultValue = "1") Long page,
-                                                                         @RequestParam(name = "page_size", defaultValue = "10") Long pageSize,
-                                                                         @PathVariable(name = "workspace_id") String workspaceId
+    public HttpResultResponse<PaginationData<MediaDirDTO>> getDirList(MediaDirQueryParam mediaDirQueryParam,
+                                                                      @RequestParam(defaultValue = "1") Long page,
+                                                                      @RequestParam(name = "page_size", defaultValue = "10") Long pageSize,
+                                                                      @PathVariable(name = "workspace_id") String workspaceId
     ) {
-        PaginationData<MediaDirDTO> dirList = dirService.getMediaDirsPaginationByWorkspaceId(workspaceId, mediaDirDTO,page, pageSize);
+        //PicExifUtil.getPicExif("test/全景图测试.jpg");
+        PaginationData<MediaDirDTO> dirList = dirService.getMediaDirsPaginationByWorkspaceId(workspaceId, mediaDirQueryParam,page, pageSize);
+        //补充容量大小
+        if(!CollectionUtils.isEmpty(dirList.getList())) {
+            Map<Integer, Long> sizeMap = fileService.getParentDirSize(dirList.getList().stream().map(dir -> dir.getId()).collect(Collectors.toList()));
+            for(MediaDirDTO mediaDirDTO : dirList.getList()) {
+                mediaDirDTO.setSize(sizeMap.get(mediaDirDTO.getId()));
+            }
+        }
         return HttpResultResponse.success(dirList);
     }
 
@@ -57,10 +71,11 @@ public class FileController {
      * @return
      */
     @GetMapping("/{workspace_id}/files")
-    public HttpResultResponse<PaginationData<MediaFileDTO>> getFilesList(@RequestParam(defaultValue = "1") Long page,
+    public HttpResultResponse<PaginationData<MediaFileDTO>> getFilesList(MediaFileQueryParam mediaFileQueryParam,
+                                                                         @RequestParam(defaultValue = "1") Long page,
                                                                          @RequestParam(name = "page_size", defaultValue = "10") Long pageSize,
                                                                          @PathVariable(name = "workspace_id") String workspaceId) {
-        PaginationData<MediaFileDTO> filesList = fileService.getMediaFilesPaginationByWorkspaceId(workspaceId, page, pageSize);
+        PaginationData<MediaFileDTO> filesList = fileService.getMediaFilesPaginationByWorkspaceId(workspaceId, mediaFileQueryParam, page, pageSize);
         return HttpResultResponse.success(filesList);
     }
 
@@ -70,11 +85,11 @@ public class FileController {
      * @return
      */
     @GetMapping("/{workspace_id}/files/{dir_id}")
-    public HttpResultResponse<PaginationData<MediaFileDTO>> getFilesList(@RequestParam(defaultValue = "1") Long page,
+    public HttpResultResponse<PaginationData<MediaFileDTO>> getDirFilesList(@RequestParam(defaultValue = "1") Long page,
                                                                          @RequestParam(name = "page_size", defaultValue = "10") Long pageSize,
                                                                          @PathVariable(name = "workspace_id") String workspaceId,
                                                                          @PathVariable(name = "dir_id") String dirId) {
-        PaginationData<MediaFileDTO> filesList = fileService.getMediaFilesPaginationByWorkspaceId(dirId, page, pageSize);
+        PaginationData<MediaFileDTO> filesList = fileService.getMediaFilesPaginationByDirId(dirId, page, pageSize);
         return HttpResultResponse.success(filesList);
     }
 
@@ -125,4 +140,28 @@ public class FileController {
         fileService.uploadMediaFile(file, workspaceId,dirId, creator);
         return HttpResultResponse.success();
     }
+
+    @GetMapping("/{workspace_id}/fileDownList")
+    public void getFileStreamListByDirs(@PathVariable(name = "workspace_id") String workspaceId,
+                                  @NotNull @Size(min = 1) @RequestParam(name = "id") List<String> ids,
+                                    HttpServletResponse response) throws Exception {
+        //String[] dirArray = dirIds.split(",");
+        fileService.dowloadDirsToZip(workspaceId,ids,response);
+    }
+
+    @GetMapping("/{workspace_id}/downloadFiles")
+    public void getFileStreamList(@PathVariable(name = "workspace_id") String workspaceId,
+                                  @NotNull @Size(min = 1) @RequestParam(name = "id") List<String> ids,
+                                  HttpServletResponse response) throws Exception {
+        fileService.dowloadFilesToZip(workspaceId,ids,response);
+    }
+
+    @DeleteMapping("/{workspace_id}/deleteFiles")
+    public HttpResultResponse deleteFiles(@PathVariable(name = "workspace_id") String workspaceId,
+                                  @NotNull @Size(min = 1) @RequestParam(name = "id") List<String> ids,
+                                          HttpServletResponse response) throws Exception {
+        //String[] fileArray = fileIds.split(",");
+        fileService.deleteFiles(ids);
+        return HttpResultResponse.success();
+    }
 }

+ 5 - 4
Backend/sample/src/main/java/com/dji/sample/media/model/MediaDirDTO.java

@@ -1,6 +1,5 @@
 package com.dji.sample.media.model;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -10,9 +9,9 @@ import java.time.LocalDateTime;
 import java.util.List;
 
 /**
- * @author sean
- * @version 0.2
- * @date 2021/12/9
+ * @author hqjiang
+ * @version 1.0
+ * @date 2024/7/2
  */
 @Data
 @Builder
@@ -41,4 +40,6 @@ public class MediaDirDTO {
     private String username;
 
     private List<MediaDirDTO> children;
+
+    private Long size;
 }

+ 18 - 0
Backend/sample/src/main/java/com/dji/sample/media/model/MediaExifDTO.java

@@ -26,4 +26,22 @@ public class MediaExifDTO {
     private Integer imageWidth;
 
     private Integer imageHeight;
+
+    private double longitude;
+
+    private String longitudeRef;
+
+    private double latitude;
+
+    private String latitudeRef;
+
+    private double absoluteAltitude;
+
+    private String mediaType;
+
+    private String pictureType;
+
+    private Integer durationSeconds;
+
+    private Long createTime;
 }

+ 16 - 0
Backend/sample/src/main/java/com/dji/sample/media/model/MediaFileDTO.java

@@ -74,4 +74,20 @@ public class MediaFileDTO {
 
     private Integer yResolution;
 
+    private String url;
+
+    private String longitudeRef;
+
+    private String latitudeRef;
+
+    private Integer mediaType;
+
+    private String mediaTypeText;
+
+    private String pictureType;
+
+    private String templateType;
+
+    private Integer durationSeconds;
+
 }

+ 20 - 0
Backend/sample/src/main/java/com/dji/sample/media/model/MediaFileEntity.java

@@ -111,5 +111,25 @@ public class MediaFileEntity implements Serializable {
     @TableField("y_resolution")
     private Integer yResolution;
 
+    @TableField("longitude_ref")
+    private String longitudeRef;
+
+    @TableField("latitude_ref")
+    private String latitudeRef;
+
+    @TableField("media_type")
+    private String mediaType;
+
+    @TableField("picture_type")
+    private String pictureType;
+
+    @TableField("duration_seconds")
+    private Integer durationSeconds;
+
+    @TableField("sum(size)")
+    private Long sumSize;
+
+
+
 }
 

+ 37 - 0
Backend/sample/src/main/java/com/dji/sample/media/model/MediaTypeEnum.java

@@ -0,0 +1,37 @@
+package com.dji.sample.media.model;
+
+import lombok.Getter;
+
+import java.util.Arrays;
+
+/**
+ * @author hqjiang
+ * @version 1.0
+ * @date 2024/7/2
+ */
+@Getter
+public enum MediaTypeEnum {
+
+    PIC_ORIGIN(1, "原图"),
+
+    PIC_SHOT(2, "截图"),
+
+    PIC_PANORAMA(3, "全景图"),
+
+    VIDEO(4, "视频"),
+
+    UNKNOWN(-1, "其他");
+
+    int val;
+
+    String text;
+
+    MediaTypeEnum(int val, String text) {
+        this.text = text;
+        this.val = val;
+    }
+
+    public static MediaTypeEnum find(int val) {
+        return Arrays.stream(MediaTypeEnum.values()).filter(statue -> statue.val == val).findAny().orElse(UNKNOWN);
+    }
+}

+ 14 - 1
Backend/sample/src/main/java/com/dji/sample/media/service/IFileService.java

@@ -1,12 +1,15 @@
 package com.dji.sample.media.service;
 
+import com.dji.sample.map.model.param.MediaFileQueryParam;
 import com.dji.sample.media.model.MediaFileDTO;
 import com.dji.sdk.cloudapi.media.MediaUploadCallbackRequest;
 import com.dji.sdk.common.PaginationData;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.net.URL;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author sean
@@ -49,7 +52,7 @@ public interface IFileService {
      * @param pageSize
      * @return
      */
-    PaginationData<MediaFileDTO> getMediaFilesPaginationByWorkspaceId(String workspaceId, long page, long pageSize);
+    PaginationData<MediaFileDTO> getMediaFilesPaginationByWorkspaceId(String workspaceId, MediaFileQueryParam mediaFileQueryParam, long page, long pageSize);
 
     /**
      * Get the download address of the file.
@@ -75,4 +78,14 @@ public interface IFileService {
      * @return
      */
     PaginationData<MediaFileDTO> getMediaFilesPaginationByDirId(String dirId, long page, long pageSize);
+
+    List<MediaFileDTO> getMediaFilesByDirId(String dirId);
+
+    void deleteFiles(List<String> fileIds);
+
+    void dowloadDirsToZip(String workspaceId, List<String> dirIds, HttpServletResponse response) throws Exception;
+
+    void dowloadFilesToZip(String workspaceId, List<String> fileIds, HttpServletResponse response) throws Exception;
+
+    Map<Integer,Long> getParentDirSize(List<Integer> dirIds);
 }

+ 2 - 1
Backend/sample/src/main/java/com/dji/sample/media/service/IMediaDirService.java

@@ -1,5 +1,6 @@
 package com.dji.sample.media.service;
 
+import com.dji.sample.map.model.param.MediaDirQueryParam;
 import com.dji.sample.media.model.MediaDirDTO;
 import com.dji.sample.media.model.MediaDirEntity;
 import com.dji.sample.media.model.MediaFileDTO;
@@ -16,7 +17,7 @@ import java.util.List;
  */
 public interface IMediaDirService {
 
-    PaginationData<MediaDirDTO> getMediaDirsPaginationByWorkspaceId(String workspaceId, MediaDirDTO mediaDirDTO, long page, long pageSize);
+    PaginationData<MediaDirDTO> getMediaDirsPaginationByWorkspaceId(String workspaceId, MediaDirQueryParam param, long page, long pageSize);
 
     /**
      * 通过目录名称查找目录

+ 239 - 19
Backend/sample/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java

@@ -1,5 +1,6 @@
 package com.dji.sample.media.service.impl;
 
+import cn.hutool.core.util.ZipUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dji.sample.common.util.CoordinateUtil;
@@ -10,6 +11,7 @@ import com.dji.sample.component.oss.service.impl.OssServiceContext;
 import com.dji.sample.manage.model.common.AMap;
 import com.dji.sample.manage.model.dto.DeviceDictionaryDTO;
 import com.dji.sample.manage.service.IDeviceDictionaryService;
+import com.dji.sample.map.model.param.MediaFileQueryParam;
 import com.dji.sample.media.dao.IFileMapper;
 import com.dji.sample.media.model.*;
 import com.dji.sample.media.service.IFileService;
@@ -21,26 +23,26 @@ import com.dji.sdk.cloudapi.media.MediaUploadCallbackRequest;
 import com.dji.sdk.cloudapi.wayline.GetWaylineListResponse;
 import com.dji.sdk.common.Pagination;
 import com.dji.sdk.common.PaginationData;
-import com.drew.metadata.exif.ExifSubIFDDescriptor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.net.URL;
+import java.net.URLEncoder;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -68,6 +70,9 @@ public class FileServiceImpl implements IFileService {
     @Autowired
     private  IWaylineFileService waylineFileService;
 
+    private static final String IMAGE = "image";
+    private static final String VIDEO = "video";
+
     private Optional<MediaFileEntity> getMediaByFingerprint(String workspaceId, String fingerprint) {
         MediaFileEntity fileEntity = mapper.selectOne(new LambdaQueryWrapper<MediaFileEntity>()
                 .eq(MediaFileEntity::getWorkspaceId, workspaceId)
@@ -148,12 +153,29 @@ public class FileServiceImpl implements IFileService {
     }
 
     @Override
-    public PaginationData<MediaFileDTO> getMediaFilesPaginationByWorkspaceId(String workspaceId, long page, long pageSize) {
+    public PaginationData<MediaFileDTO> getMediaFilesPaginationByWorkspaceId(String workspaceId, MediaFileQueryParam param, long page, long pageSize) {
         Page<MediaFileEntity> pageData = mapper.selectPage(
                 new Page<MediaFileEntity>(page, pageSize),
                 new LambdaQueryWrapper<MediaFileEntity>()
                         .eq(MediaFileEntity::getWorkspaceId, workspaceId)
-                        .orderByDesc(MediaFileEntity::getId));
+                        .ge(param != null && param.getBeginTime() != null, MediaFileEntity::getCreateTime,param.getBeginTime())
+                        .le(param != null && param.getEndTime() != null, MediaFileEntity::getCreateTime,param.getEndTime())
+                        .and(StringUtils.hasText(param.getSearchInfo()),
+                                wrapper -> wrapper.like( MediaFileEntity::getFileName, param.getSearchInfo())
+                                        .or().like( MediaFileEntity::getPayload, param.getSearchInfo())
+                        ).and(MediaTypeEnum.PIC_ORIGIN.getVal() == param.getMediaType(),
+                                wrapper -> wrapper.like( MediaFileEntity::getMediaType, IMAGE)
+                                        .eq( MediaFileEntity::getIsOriginal, true)
+                        ).and(MediaTypeEnum.PIC_SHOT.getVal() == param.getMediaType(),
+                                wrapper -> wrapper.like( MediaFileEntity::getMediaType, IMAGE)
+                                        .eq( MediaFileEntity::getIsOriginal, false)
+                        ).and(MediaTypeEnum.VIDEO.getVal() == param.getMediaType(),
+                                wrapper -> wrapper.like( MediaFileEntity::getMediaType, VIDEO)
+                        ).and(MediaTypeEnum.UNKNOWN.getVal() == param.getMediaType(),
+                                wrapper -> wrapper.notLike(MediaFileEntity::getMediaType, VIDEO)
+                                        .notLike(MediaFileEntity::getMediaType, IMAGE)
+                        )
+                        .orderByDesc(MediaFileEntity::getCreateTime));
         List<MediaFileDTO> records = pageData.getRecords()
                 .stream()
                 .map(this::entityConvertToDto)
@@ -186,14 +208,29 @@ public class FileServiceImpl implements IFileService {
         Page<MediaFileEntity> pageData = mapper.selectPage(
                 new Page<MediaFileEntity>(page, pageSize),
                 new LambdaQueryWrapper<MediaFileEntity>()
-                        .eq(MediaFileEntity::getWorkspaceId, dirId)
+                        .eq(MediaFileEntity::getDirId, dirId)
                         .orderByDesc(MediaFileEntity::getId));
         List<MediaFileDTO> records = pageData.getRecords()
                 .stream()
                 .map(this::entityConvertToDto)
                 .collect(Collectors.toList());
 
-        return new PaginationData<MediaFileDTO>(records, new Pagination(pageData.getCurrent(), pageData.getSize(), pageData.getTotal()));
+        MediaDirDTO mediaDirDTO = mediaDirService.getMediaDirById(null,String.valueOf(dirId));
+        return new PaginationData<MediaFileDTO>(mediaDirDTO.getDirName(), records, new Pagination(pageData.getCurrent(), pageData.getSize(), pageData.getTotal()));
+    }
+
+    @Override
+    public List<MediaFileDTO> getMediaFilesByDirId(String dirId) {
+        List<MediaFileEntity> listData = mapper.selectList(
+                new LambdaQueryWrapper<MediaFileEntity>()
+                        .eq(MediaFileEntity::getDirId, dirId)
+                        .orderByDesc(MediaFileEntity::getId));
+        List<MediaFileDTO> records = listData
+                .stream()
+                .map(this::entityConvertToDto)
+                .collect(Collectors.toList());
+
+        return records;
     }
 
     /**
@@ -201,7 +238,7 @@ public class FileServiceImpl implements IFileService {
      * @param file
      * @return
      */
-    private MediaFileEntity fileUploadConvertToEntity(String workspaceId, MediaUploadCallbackRequest file) {
+    private synchronized MediaFileEntity fileUploadConvertToEntity(String workspaceId, MediaUploadCallbackRequest file) {
         //通过path 获取航线名称,文件夹名称
         String waylineName = getWaylineName(file.getPath());
         String dirName = getDirName(waylineName, file.getPath());
@@ -229,7 +266,8 @@ public class FileServiceImpl implements IFileService {
             //获取图片信息
             MediaExifDTO exif = PicExifUtil.getPicExif(file.getObjectKey());
             //经纬度转换
-            AMap aMap = CoordinateUtil.transform(file.getMetadata().getShootPosition().getLng(),file.getMetadata().getShootPosition().getLat());
+            //AMap aMap = CoordinateUtil.transform(file.getMetadata().getShootPosition().getLng(),file.getMetadata().getShootPosition().getLat());
+            AMap aMap = CoordinateUtil.transform(exif.getLongitude(),exif.getLatitude());
             builder.fileName(file.getName())
                     .filePath(file.getPath())
                     .fingerprint(file.getFingerprint())
@@ -241,16 +279,23 @@ public class FileServiceImpl implements IFileService {
                     .tinnyFingerprint(file.getExt().getTinnyFingerprint())
                     .payload(getDeviceNameByModelKey(file.getExt().getPayloadModelKey()))
                     .dirId(dirDto.getId())
+                    .waylineName(waylineName)
                     .imageWidth(exif.getImageWidth())
                     .imageHeight(exif.getImageHeight())
                     .xResolution(exif.getXResolution())
                     .yResolution(exif.getYResolution())
-                    .latitude(new BigDecimal(aMap.getLatitude()).setScale(6, RoundingMode.DOWN))
-                    .longitude(new BigDecimal(aMap.getLongitude()).setScale(6, RoundingMode.DOWN))
-                    .absoluteAltitude(new BigDecimal(file.getMetadata().getAbsoluteAltitude()).setScale(6, RoundingMode.DOWN))
-                    .relativeAltitude(new BigDecimal(file.getMetadata().getRelativeAltitude()).setScale(6, RoundingMode.DOWN))
+                    .latitude(BigDecimal.valueOf(aMap.getLatitude()).setScale(6, RoundingMode.DOWN))
+                    .longitude( BigDecimal.valueOf(aMap.getLongitude()).setScale(6, RoundingMode.DOWN))
+                    .absoluteAltitude(BigDecimal.valueOf(file.getMetadata().getAbsoluteAltitude()).setScale(6, RoundingMode.DOWN))
+                    .relativeAltitude(BigDecimal.valueOf(file.getMetadata().getRelativeAltitude()).setScale(6, RoundingMode.DOWN))
                     .size(ossService.getObjectSize(OssConfiguration.bucket, file.getObjectKey()))
-                    .pictureTime(file.getMetadata().getCreatedTime() != null ? file.getMetadata().getCreatedTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() : null)
+                    .pictureTime(file.getMetadata().getCreatedTime() != null ? file.getMetadata().getCreatedTime().atZone(ZoneId.of("UTC+0")).toInstant().toEpochMilli() : null)
+                    .longitudeRef(exif.getLongitudeRef())
+                    .latitudeRef(exif.getLatitudeRef())
+                    .mediaType(exif.getPictureType())
+                    .pictureType(exif.getPictureType())
+                    .durationSeconds(exif.getDurationSeconds())
+                    .taskName(dirDto.getDirName())//先取远程计划任务名称,没有就取文件夹名称
             ;
         }
         return builder.build();
@@ -267,7 +312,7 @@ public class FileServiceImpl implements IFileService {
     }
 
     private String getWaylineName(String path) {
-        if(!StringUtils.isEmpty(path)) {
+        if(StringUtils.hasText(path)) {
             String[] pathSplit = path.split("-");
             if(pathSplit.length > 1) {
                 return pathSplit[pathSplit.length - 1];
@@ -278,7 +323,7 @@ public class FileServiceImpl implements IFileService {
 
     //path:DJI_202406241424_027_项目编号0001-新建面状航线2
     private String getDirName(String waylineName,String path) {
-        if(!StringUtils.isEmpty(path)) {
+        if(StringUtils.hasText(path)) {
             String[] pathSplit = path.split("_");
             String datetime = pathSplit[1];
             return (waylineName + " " + datetime.substring(0,4)+ "-"
@@ -300,6 +345,12 @@ public class FileServiceImpl implements IFileService {
         MediaFileDTO.MediaFileDTOBuilder builder = MediaFileDTO.builder();
 
         if (entity != null) {
+            String taskName = entity.getTaskName();
+            if(!StringUtils.hasText(taskName)) {
+                MediaDirDTO mediaDirDTO = mediaDirService.getMediaDirById(null,String.valueOf(entity.getDirId()));
+                taskName = mediaDirDTO.getDirName();
+            }
+            MediaTypeEnum mediaTypeEnum = convertMediaType(entity);
             builder.fileName(entity.getFileName())
                     .fileId(entity.getFileId())
                     .filePath(entity.getFilePath())
@@ -311,11 +362,180 @@ public class FileServiceImpl implements IFileService {
                     .createTime(LocalDateTime.ofInstant(
                             Instant.ofEpochMilli(entity.getCreateTime()), ZoneId.systemDefault()))
                     .drone(entity.getDrone())
-                    .jobId(entity.getJobId());
+                    .jobId(entity.getJobId())
+                    .dirId(entity.getDirId())
+                    .waylineName(entity.getWaylineName())
+                    .size(entity.getSize())
+                    .longitude(entity.getLongitude())
+                    .latitude(entity.getLatitude())
+                    .imageWidth(entity.getImageWidth())
+                    .imageHeight(entity.getImageHeight())
+                    .absoluteAltitude(entity.getAbsoluteAltitude())
+                    .gimbalYawDegree(entity.getGimbalYawDegree())
+                    .relativeAltitude(entity.getRelativeAltitude())
+                    .taskName(taskName)
+                    .sourceFrom(entity.getSourceFrom())
+                    .pictureTime(LocalDateTime.ofInstant(
+                            Instant.ofEpochMilli(entity.getCreateTime()), ZoneId.systemDefault()))
+                    .xResolution(entity.getXResolution())
+                    .yResolution(entity.getYResolution())
+                    .url(ossService.getObjectUrl(OssConfiguration.bucket, entity.getObjectKey()).toString())
+                    .longitudeRef(entity.getLongitudeRef())
+                    .latitudeRef(entity.getLatitudeRef())
+                    .mediaType(mediaTypeEnum.getVal())
+                    .mediaTypeText(mediaTypeEnum.getText())
+                    .pictureType(entity.getPictureType())
+                    .durationSeconds(entity.getDurationSeconds());
 
         }
 
         return builder.build();
     }
 
+    private MediaTypeEnum convertMediaType(MediaFileEntity entity) {
+        if(entity.getMediaType().startsWith(IMAGE)) {
+            if(entity.getIsOriginal()) {
+                return MediaTypeEnum.PIC_ORIGIN;
+            } else {
+                return MediaTypeEnum.PIC_SHOT;
+            }
+        } else if(entity.getMediaType().startsWith(VIDEO)) {
+            return MediaTypeEnum.VIDEO;
+        } else if(entity.getMediaType().startsWith("jfif")) {
+            return MediaTypeEnum.PIC_PANORAMA;
+        }
+        return MediaTypeEnum.UNKNOWN;
+    }
+
+    @Override
+    public void deleteFiles(List<String> fileIds) {
+        List<MediaFileEntity> listData = mapper.selectList(
+                new LambdaQueryWrapper<MediaFileEntity>()
+                        .in(MediaFileEntity::getFileId, fileIds));
+        for(MediaFileEntity entity : listData) {
+            try {
+                mapper.delete(new LambdaQueryWrapper<MediaFileEntity>().eq(MediaFileEntity::getFileId, entity.getFileId()));
+                ossService.deleteObject(OssConfiguration.bucket, entity.getObjectKey());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 下载多个文件夹转zip压缩包
+     *
+     * @param workspaceId
+     * @param dirIds
+     * @param response
+     * @throws Exception
+     */
+    @Override
+    public void dowloadDirsToZip(String workspaceId, List<String> dirIds, HttpServletResponse response) throws Exception {
+        dowloadToZip(workspaceId,dirIds,response);
+    }
+
+    /**
+     * 下载多个文件转zip压缩包
+     *
+     * @param workspaceId
+     * @param fileIds
+     * @param response
+     * @throws Exception
+     */
+    @Override
+    public void dowloadFilesToZip(String workspaceId, List<String> fileIds, HttpServletResponse response) throws Exception {
+        try {
+            //被压缩文件名称
+            List<String> srcFileNames = new ArrayList<String>();
+            //被压缩文件流集合
+            List<InputStream> srcFiles = new ArrayList<InputStream>();
+
+            List<MediaFileEntity> listData = mapper.selectList(
+                    new LambdaQueryWrapper<MediaFileEntity>()
+                            .in(MediaFileEntity::getFileId, fileIds)
+                            .orderByDesc(MediaFileEntity::getId));
+
+            //如果有附件 进行zip处理
+            String dirName = "";
+            if (listData != null && listData.size() > 0) {
+                MediaDirDTO mediaDirDTO = mediaDirService.getMediaDirById(workspaceId,String.valueOf(listData.get(0).getDirId()));
+                dirName = mediaDirDTO.getDirName();
+                for (MediaFileEntity entity : listData) {
+                    //以下代码为获取图片inputStream
+                    InputStream ins = ossService.getObject(OssConfiguration.bucket, entity.getObjectKey());
+                    if (ins == null) {
+                        continue;
+                    }
+                    //塞入流数组中
+                    srcFiles.add(ins);
+                    srcFileNames.add(dirName + "/" + entity.getFileName());
+                }
+            }
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            response.setCharacterEncoding("UTF-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(dirName + ".zip", "UTF-8"));
+            //多个文件压缩成压缩包返回
+            ZipUtil.zip(response.getOutputStream(), srcFileNames.toArray(new String[srcFileNames.size()]), srcFiles.toArray(new InputStream[srcFiles.size()]));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 下载多个文件转zip压缩包
+     * @param workspaceId
+     * @param dirIds
+     * @param response
+     * @throws Exception
+     */
+    private void dowloadToZip(String workspaceId,List<String> dirIds, HttpServletResponse response) throws Exception {
+        try {
+            //被压缩文件名称
+            List<String> srcFileNames = new ArrayList<String>();
+            //被压缩文件流集合
+            List<InputStream> srcFiles = new ArrayList<InputStream>();
+            for(String dirId : dirIds) {
+                if(StringUtils.isEmpty(dirId)) {
+                    continue;
+                }
+                MediaDirDTO mediaDirDTO = mediaDirService.getMediaDirById(workspaceId, dirId);
+                List<MediaFileEntity> listData = mapper.selectList(
+                        new LambdaQueryWrapper<MediaFileEntity>()
+                                .eq(MediaFileEntity::getDirId, dirId)
+                                .orderByDesc(MediaFileEntity::getId));
+                //如果有附件 进行zip处理
+                if (listData != null && listData.size() > 0) {
+                    for (MediaFileEntity entity : listData) {
+                        //以下代码为获取图片inputStream
+                        InputStream ins = ossService.getObject(OssConfiguration.bucket, entity.getObjectKey());
+                        if (ins == null) {
+                            continue;
+                        }
+                        //塞入流数组中
+                        srcFiles.add(ins);
+                        srcFileNames.add(mediaDirDTO.getDirName() + "/" + entity.getFileName());
+                    }
+                }
+            }
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            response.setCharacterEncoding("UTF-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("下载.zip", "UTF-8"));
+            //多个文件压缩成压缩包返回
+            ZipUtil.zip(response.getOutputStream(), srcFileNames.toArray(new String[srcFileNames.size()]), srcFiles.toArray(new InputStream[srcFiles.size()]));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public Map<Integer, Long> getParentDirSize(List<Integer> dirIds) {
+        return mapper.selectList( new LambdaQueryWrapper<MediaFileEntity>()
+                .select(MediaFileEntity::getDirId,MediaFileEntity::getSumSize)
+                .in(MediaFileEntity::getDirId, dirIds)
+                .groupBy(MediaFileEntity::getDirId)
+                ).stream()
+                .collect(Collectors.toMap(a -> a.getDirId(), MediaFileEntity::getSumSize));
+    }
+
 }

+ 16 - 31
Backend/sample/src/main/java/com/dji/sample/media/service/impl/MediaDirServiceImpl.java

@@ -2,17 +2,20 @@ package com.dji.sample.media.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dji.sample.map.model.param.MediaDirQueryParam;
 import com.dji.sample.media.dao.IMediaDirMapper;
 import com.dji.sample.media.model.MediaDirDTO;
 import com.dji.sample.media.model.MediaDirEntity;
 import com.dji.sample.media.model.MediaFileDTO;
 import com.dji.sample.media.model.MediaFileEntity;
 import com.dji.sample.media.service.IMediaDirService;
+import com.dji.sample.wayline.model.enums.WaylineTemplateTypeEnum;
 import com.dji.sdk.common.Pagination;
 import com.dji.sdk.common.PaginationData;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 
 import java.time.Instant;
 import java.time.LocalDateTime;
@@ -33,12 +36,21 @@ public class MediaDirServiceImpl implements IMediaDirService {
     private IMediaDirMapper mapper;
 
     @Override
-    public PaginationData<MediaDirDTO> getMediaDirsPaginationByWorkspaceId(String workspaceId, MediaDirDTO mediaDirDTO, long page, long pageSize) {
+    public PaginationData<MediaDirDTO> getMediaDirsPaginationByWorkspaceId(String workspaceId, MediaDirQueryParam param, long page, long pageSize) {
         Page<MediaDirEntity> pageData = mapper.selectPage(
                 new Page<MediaDirEntity>(page, pageSize),
                 new LambdaQueryWrapper<MediaDirEntity>()
                         .eq(MediaDirEntity::getWorkspaceId, workspaceId)
-                        .orderByDesc(MediaDirEntity::getId));
+                        .ge(param != null && param.getBeginTime() != null, MediaDirEntity::getCreateTime,param.getBeginTime())
+                        .le(param != null && param.getEndTime() != null, MediaDirEntity::getCreateTime,param.getEndTime())
+                        .eq(param != null && StringUtils.hasText(param.getTemplateType()), MediaDirEntity::getTemplateType,param.getTemplateType())
+                        .eq(param != null && StringUtils.hasText(param.getPayload()), MediaDirEntity::getPayload,param.getPayload())
+                        .and(StringUtils.hasText(param.getSearchInfo()),
+                                wrapper -> wrapper .like( MediaDirEntity::getDirName, param.getSearchInfo())
+                                        .or().like( MediaDirEntity::getPayload, param.getSearchInfo())
+                                        .or().like( MediaDirEntity::getDeviceName, param.getSearchInfo())
+                        )
+                        .orderByDesc(MediaDirEntity::getCreateTime));
         List<MediaDirDTO> records = pageData.getRecords()
                 .stream()
                 .map(this::entityToDto)
@@ -62,7 +74,7 @@ public class MediaDirServiceImpl implements IMediaDirService {
     @Override
     public MediaDirDTO getMediaDirById(String workspaceId, String dirId) {
         MediaDirEntity mediaDirEntity = mapper.selectOne(new LambdaQueryWrapper<MediaDirEntity>()
-                .eq(MediaDirEntity::getWorkspaceId, workspaceId)
+                .eq(StringUtils.hasText(workspaceId), MediaDirEntity::getWorkspaceId, workspaceId)
                 .eq(MediaDirEntity::getId, dirId));
         return entityToDto(mediaDirEntity);
     }
@@ -110,38 +122,11 @@ public class MediaDirServiceImpl implements IMediaDirService {
                     .deviceName(mediaDirEntity.getDeviceName())
                     .payload(mediaDirEntity.getPayload())
                     .waylineName(mediaDirEntity.getWaylineName())
-                    .templateType(mediaDirEntity.getTemplateType())
+                    .templateType( StringUtils.hasText(mediaDirEntity.getTemplateType()) ? WaylineTemplateTypeEnum.find(mediaDirEntity.getTemplateType()).get().getType() : "")
                     .createTime(LocalDateTime.ofInstant(Instant.ofEpochMilli(mediaDirEntity.getCreateTime()), ZoneId.systemDefault()))
                     .username(mediaDirEntity.getUsername());
         }
         return builder.build();
     }
 
-    /**
-     * Convert database entity objects into file data transfer object.
-     * @param entity
-     * @return
-     */
-    private MediaFileDTO entityConvertToDto(MediaFileEntity entity) {
-        MediaFileDTO.MediaFileDTOBuilder builder = MediaFileDTO.builder();
-
-        if (entity != null) {
-            builder.fileName(entity.getFileName())
-                    .fileId(entity.getFileId())
-                    .filePath(entity.getFilePath())
-                    .isOriginal(entity.getIsOriginal())
-                    .fingerprint(entity.getFingerprint())
-                    .objectKey(entity.getObjectKey())
-                    .tinnyFingerprint(entity.getTinnyFingerprint())
-                    .payload(entity.getPayload())
-                    .createTime(LocalDateTime.ofInstant(
-                            Instant.ofEpochMilli(entity.getCreateTime()), ZoneId.systemDefault()))
-                    .drone(entity.getDrone())
-                    .jobId(entity.getJobId());
-
-        }
-
-        return builder.build();
-    }
-
 }

+ 12 - 5
Backend/sample/src/main/java/com/dji/sample/wayline/model/enums/WaylineTemplateTypeEnum.java

@@ -13,13 +13,15 @@ import java.util.Optional;
  */
 public enum WaylineTemplateTypeEnum {
 
-    WAYPOINT(0, "waypoint"),
+    WAYPOINT(0, "航点航线"),
 
-    MAPPING_2D(1, "mapping2d"),
+    MAPPING_2D(1, "二维正射"),
 
-    MAPPING_3D(2, "mapping3d"),
+    MAPPING_3D(2, "倾斜摄影"),
 
-    MAPPING_STRIP(4, "mappingStrip");
+    MAPPING_STRIP(4, "带状航线"),
+
+    UNKNOWN(-1, "未知");
 
     int val;
 
@@ -35,9 +37,14 @@ public enum WaylineTemplateTypeEnum {
         return val;
     }
 
+    @JsonValue
+    public String getType() {
+        return type;
+    }
+
     @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
     public static WaylineTemplateTypeEnum find(Integer val) {
-        return Arrays.stream(values()).filter(templateTypeEnum -> templateTypeEnum.val == val).findAny().get();
+        return Arrays.stream(values()).filter(templateTypeEnum -> templateTypeEnum.val == val).findAny().orElse(UNKNOWN);
     }
 
     public static Optional<WaylineTemplateTypeEnum> find(String type) {

+ 6 - 6
Backend/sample/src/main/resources/application-prd.yml

@@ -49,7 +49,7 @@ mqtt:
     port: 1883
     username: mqttUser
     password: 123456
-    client-id: hqjiang
+    client-id: testServer
     # If the protocol is ws/wss, this value is required.
     path:
   DRC:
@@ -115,17 +115,17 @@ url:
 oss:
   enable: true
   provider: minio
-  endpoint: http://xia0miduo.gicp.net:9000
-  access-key: fileadmin
-  secret-key: fileadmin
-  bucket: papbtest
+  endpoint: http://60.204.184.98:39000
+  access-key: dji_minio2
+  secret-key: 12345678
+  bucket: dji-cloudapi
   expire: 3600
   region: us-east-1
   object-dir-prefix: wayline
 
 logging:
   level:
-    com.dji: debug
+    com.dji: info
   file:
     name: logs/cloud-api-sample.log
 

+ 4 - 4
Backend/sample/src/main/resources/application.yml

@@ -117,10 +117,10 @@ url:
 oss:
   enable: true
   provider: minio
-  endpoint: http://xia0miduo.gicp.net:9000
-  access-key: fileadmin
-  secret-key: fileadmin
-  bucket: papbtest
+  endpoint: http://60.204.184.98:39000
+  access-key: dji_minio2
+  secret-key: 12345678
+  bucket: dji-cloudapi
   expire: 3600
   region: us-east-1
   object-dir-prefix: wayline