|
|
@@ -2,23 +2,38 @@ 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.common.util.CoordinateUtil;
|
|
|
+import com.dji.sample.common.util.PicExifUtil;
|
|
|
+import com.dji.sample.common.util.UserRequest;
|
|
|
import com.dji.sample.component.oss.model.OssConfiguration;
|
|
|
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.media.dao.IFileMapper;
|
|
|
-import com.dji.sample.media.model.MediaFileDTO;
|
|
|
-import com.dji.sample.media.model.MediaFileEntity;
|
|
|
+import com.dji.sample.media.model.*;
|
|
|
import com.dji.sample.media.service.IFileService;
|
|
|
+import com.dji.sample.media.service.IMediaDirService;
|
|
|
+import com.dji.sample.wayline.service.IWaylineFileService;
|
|
|
import com.dji.sdk.cloudapi.device.DeviceEnum;
|
|
|
import com.dji.sdk.cloudapi.media.MediaSubFileTypeEnum;
|
|
|
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.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
+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.time.Instant;
|
|
|
import java.time.LocalDateTime;
|
|
|
@@ -33,6 +48,7 @@ import java.util.stream.Collectors;
|
|
|
* @version 0.2
|
|
|
* @date 2021/12/9
|
|
|
*/
|
|
|
+@Slf4j
|
|
|
@Service
|
|
|
@Transactional
|
|
|
public class FileServiceImpl implements IFileService {
|
|
|
@@ -46,6 +62,12 @@ public class FileServiceImpl implements IFileService {
|
|
|
@Autowired
|
|
|
private OssServiceContext ossService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IMediaDirService mediaDirService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IWaylineFileService waylineFileService;
|
|
|
+
|
|
|
private Optional<MediaFileEntity> getMediaByFingerprint(String workspaceId, String fingerprint) {
|
|
|
MediaFileEntity fileEntity = mapper.selectOne(new LambdaQueryWrapper<MediaFileEntity>()
|
|
|
.eq(MediaFileEntity::getWorkspaceId, workspaceId)
|
|
|
@@ -53,6 +75,14 @@ public class FileServiceImpl implements IFileService {
|
|
|
return Optional.ofNullable(fileEntity);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public MediaFileDTO getMediaFileByFileId(String workspaceId, String fileId) {
|
|
|
+ MediaFileEntity fileEntity = mapper.selectOne(new LambdaQueryWrapper<MediaFileEntity>()
|
|
|
+ .eq(MediaFileEntity::getWorkspaceId, workspaceId)
|
|
|
+ .eq(MediaFileEntity::getFileId, fileId));
|
|
|
+ return entityConvertToDto(fileEntity);
|
|
|
+ }
|
|
|
+
|
|
|
private Optional<MediaFileEntity> getMediaByFileId(String workspaceId, String fileId) {
|
|
|
MediaFileEntity fileEntity = mapper.selectOne(new LambdaQueryWrapper<MediaFileEntity>()
|
|
|
.eq(MediaFileEntity::getWorkspaceId, workspaceId)
|
|
|
@@ -65,9 +95,44 @@ public class FileServiceImpl implements IFileService {
|
|
|
return this.getMediaByFingerprint(workspaceId, fingerprint).isPresent();
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void uploadMediaFile(MultipartFile file, String workspaceId, String dirId, String creator) {
|
|
|
+ try (InputStream is = file.getInputStream()) {
|
|
|
+ long size = is.available();
|
|
|
+
|
|
|
+ String fileId = UUID.randomUUID().toString();
|
|
|
+ String objectKey = OssConfiguration.objectDirPrefix + File.separator + file.getOriginalFilename();
|
|
|
+
|
|
|
+ MediaDirDTO dirDto = mediaDirService.getMediaDirById(workspaceId,dirId);
|
|
|
+ if(dirDto == null) {
|
|
|
+ throw new RuntimeException("文件夹不存在 ID:" + dirId);
|
|
|
+ }
|
|
|
+
|
|
|
+ ossService.putObject(OssConfiguration.bucket, objectKey, file.getInputStream());
|
|
|
+ log.info("上传成功. {}", file.getOriginalFilename());
|
|
|
+ MediaFileEntity fileEntity = MediaFileEntity.builder()
|
|
|
+ .dirId(Integer.valueOf(dirId))
|
|
|
+ .fileId(fileId)
|
|
|
+ .fileName(file.getOriginalFilename())
|
|
|
+ .filePath(dirDto.getDirName())
|
|
|
+ .workspaceId(workspaceId)
|
|
|
+ .objectKey(objectKey)
|
|
|
+ .subFileType(0)
|
|
|
+ .isOriginal(false)
|
|
|
+ .createTime(System.currentTimeMillis())
|
|
|
+ .updateTime(System.currentTimeMillis())
|
|
|
+ .build();
|
|
|
+
|
|
|
+ mapper.insert(fileEntity);
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public Integer saveFile(String workspaceId, MediaUploadCallbackRequest file) {
|
|
|
- MediaFileEntity fileEntity = this.fileUploadConvertToEntity(file);
|
|
|
+ MediaFileEntity fileEntity = this.fileUploadConvertToEntity(workspaceId,file);
|
|
|
fileEntity.setWorkspaceId(workspaceId);
|
|
|
fileEntity.setFileId(UUID.randomUUID().toString());
|
|
|
return mapper.insert(fileEntity);
|
|
|
@@ -116,15 +181,55 @@ public class FileServiceImpl implements IFileService {
|
|
|
.map(this::entityConvertToDto).collect(Collectors.toList());
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public PaginationData<MediaFileDTO> getMediaFilesPaginationByDirId(String dirId, long page, long pageSize) {
|
|
|
+ Page<MediaFileEntity> pageData = mapper.selectPage(
|
|
|
+ new Page<MediaFileEntity>(page, pageSize),
|
|
|
+ new LambdaQueryWrapper<MediaFileEntity>()
|
|
|
+ .eq(MediaFileEntity::getWorkspaceId, 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()));
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Convert the received file object into a database entity object.
|
|
|
* @param file
|
|
|
* @return
|
|
|
*/
|
|
|
- private MediaFileEntity fileUploadConvertToEntity(MediaUploadCallbackRequest file) {
|
|
|
+ private MediaFileEntity fileUploadConvertToEntity(String workspaceId, MediaUploadCallbackRequest file) {
|
|
|
+ //通过path 获取航线名称,文件夹名称
|
|
|
+ String waylineName = getWaylineName(file.getPath());
|
|
|
+ String dirName = getDirName(waylineName, file.getPath());
|
|
|
+ MediaDirDTO dirDto = mediaDirService.getMediaDirByName(workspaceId,dirName,null);
|
|
|
+ //文件夹不存在,则创建文件夹
|
|
|
+ if(dirDto == null) {
|
|
|
+ Optional<GetWaylineListResponse> waylineOpt = waylineFileService.getWaylineByWaylineName(workspaceId,waylineName);
|
|
|
+ MediaDirEntity.MediaDirEntityBuilder dirBuilder = MediaDirEntity.builder();
|
|
|
+ dirBuilder.dirName(dirName)
|
|
|
+ .workspaceId(workspaceId)
|
|
|
+ .waylineName(waylineName)
|
|
|
+ .createTime(System.currentTimeMillis())
|
|
|
+ .deviceName(getDeviceNameByModelKey(file.getExt().getDroneModelKey()))
|
|
|
+ .payload(getDeviceNameByModelKey(file.getExt().getPayloadModelKey()))
|
|
|
+ .username(UserRequest.getCurrentUser().getUsername());
|
|
|
+ if(waylineOpt.isPresent()) {
|
|
|
+ waylineOpt.ifPresent(wayline -> dirBuilder.templateType(wayline.getTemplateTypes().get(0).name()));
|
|
|
+ }
|
|
|
+ dirDto = mediaDirService.createDir(dirBuilder.build());
|
|
|
+ }
|
|
|
+
|
|
|
MediaFileEntity.MediaFileEntityBuilder builder = MediaFileEntity.builder();
|
|
|
|
|
|
if (file != null) {
|
|
|
+ //获取图片信息
|
|
|
+ MediaExifDTO exif = PicExifUtil.getPicExif(file.getObjectKey());
|
|
|
+ //经纬度转换
|
|
|
+ AMap aMap = CoordinateUtil.transform(file.getMetadata().getShootPosition().getLng(),file.getMetadata().getShootPosition().getLat());
|
|
|
builder.fileName(file.getName())
|
|
|
.filePath(file.getPath())
|
|
|
.fingerprint(file.getFingerprint())
|
|
|
@@ -134,18 +239,58 @@ public class FileServiceImpl implements IFileService {
|
|
|
.jobId(file.getExt().getFileGroupId())
|
|
|
.drone(file.getExt().getSn())
|
|
|
.tinnyFingerprint(file.getExt().getTinnyFingerprint())
|
|
|
- .payload(file.getExt().getPayloadModelKey().getDevice());
|
|
|
-
|
|
|
- // domain-type-subType
|
|
|
- DeviceEnum payloadModelKey = file.getExt().getPayloadModelKey();
|
|
|
- Optional<DeviceDictionaryDTO> payloadDict = deviceDictionaryService
|
|
|
- .getOneDictionaryInfoByTypeSubType(payloadModelKey.getDomain().getDomain(),
|
|
|
- payloadModelKey.getType().getType(), payloadModelKey.getSubType().getSubType());
|
|
|
- payloadDict.ifPresent(payload -> builder.payload(payload.getDeviceName()));
|
|
|
+ .payload(getDeviceNameByModelKey(file.getExt().getPayloadModelKey()))
|
|
|
+ .dirId(dirDto.getId())
|
|
|
+ .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))
|
|
|
+ .size(ossService.getObjectSize(OssConfiguration.bucket, file.getObjectKey()))
|
|
|
+ .pictureTime(file.getMetadata().getCreatedTime() != null ? file.getMetadata().getCreatedTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() : null)
|
|
|
+ ;
|
|
|
}
|
|
|
return builder.build();
|
|
|
}
|
|
|
|
|
|
+ private String getDeviceNameByModelKey(DeviceEnum modelKey) {
|
|
|
+ Optional<DeviceDictionaryDTO> payloadDict = deviceDictionaryService
|
|
|
+ .getOneDictionaryInfoByTypeSubType(modelKey.getDomain().getDomain(),
|
|
|
+ modelKey.getType().getType(), modelKey.getSubType().getSubType());
|
|
|
+ if(payloadDict.isPresent()) {
|
|
|
+ return payloadDict.get().getDeviceName();
|
|
|
+ }
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getWaylineName(String path) {
|
|
|
+ if(!StringUtils.isEmpty(path)) {
|
|
|
+ String[] pathSplit = path.split("-");
|
|
|
+ if(pathSplit.length > 1) {
|
|
|
+ return pathSplit[pathSplit.length - 1];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ //path:DJI_202406241424_027_项目编号0001-新建面状航线2
|
|
|
+ private String getDirName(String waylineName,String path) {
|
|
|
+ if(!StringUtils.isEmpty(path)) {
|
|
|
+ String[] pathSplit = path.split("_");
|
|
|
+ String datetime = pathSplit[1];
|
|
|
+ return (waylineName + " " + datetime.substring(0,4)+ "-"
|
|
|
+ + datetime.substring(4,6)+ "-"
|
|
|
+ + datetime.substring(6,8)+ "-"
|
|
|
+ + " "
|
|
|
+ + datetime.substring(8,10)+ ":"
|
|
|
+ + datetime.substring(10,12)).trim();
|
|
|
+ }
|
|
|
+ return "temp";
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Convert database entity objects into file data transfer object.
|
|
|
* @param entity
|