Commit 744cfdef by gdj

wayline航线增加文件夹结构。

parent 15078c7f
...@@ -2,6 +2,7 @@ package com.dji.sample.wayline.controller; ...@@ -2,6 +2,7 @@ package com.dji.sample.wayline.controller;
import com.dji.sample.common.model.CustomClaim; import com.dji.sample.common.model.CustomClaim;
import com.dji.sample.wayline.model.dto.WaylineFileDTO; import com.dji.sample.wayline.model.dto.WaylineFileDTO;
import com.dji.sample.wayline.model.dto.WaylineFileTreeVO;
import com.dji.sample.wayline.service.IWaylineFileService; import com.dji.sample.wayline.service.IWaylineFileService;
import com.dji.sdk.cloudapi.device.DeviceEnum; import com.dji.sdk.cloudapi.device.DeviceEnum;
import com.dji.sdk.cloudapi.wayline.*; import com.dji.sdk.cloudapi.wayline.*;
...@@ -9,10 +10,7 @@ import com.dji.sdk.cloudapi.wayline.api.IHttpWaylineService; ...@@ -9,10 +10,7 @@ import com.dji.sdk.cloudapi.wayline.api.IHttpWaylineService;
import com.dji.sdk.common.HttpResultResponse; import com.dji.sdk.common.HttpResultResponse;
import com.dji.sdk.common.PaginationData; import com.dji.sdk.common.PaginationData;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
...@@ -168,4 +166,110 @@ public class WaylineFileController implements IHttpWaylineService { ...@@ -168,4 +166,110 @@ public class WaylineFileController implements IHttpWaylineService {
return isMark ? HttpResultResponse.success() : HttpResultResponse.error(); return isMark ? HttpResultResponse.success() : HttpResultResponse.error();
} }
/**
* Import kmz wayline files with parentId.
* @param file
* @return
*/
@PostMapping("${url.wayline.prefix}${url.wayline.version}/workspaces/{workspace_id}/waylines/file/uploadWithParentId")
public HttpResultResponse importKmzFileWithParentId(HttpServletRequest request, MultipartFile file,
@RequestParam(name = "parent_id", required = false) String parentId) {
if (Objects.isNull(file)) {
return HttpResultResponse.error("No file received.");
}
CustomClaim customClaim = (CustomClaim)request.getAttribute(TOKEN_CLAIM);
String workspaceId = customClaim.getWorkspaceId();
String creator = customClaim.getUsername();
waylineFileService.importKmzFile(file, workspaceId, creator, parentId);
return HttpResultResponse.success();
}
/**
* add new directory
* @param workspaceId
* @param waylineFileDTO
* @return
*/
@PostMapping(PREFIX + "/workspaces/{workspace_id}/addDirectory")
public HttpResultResponse addDirectory(@PathVariable("workspace_id") String workspaceId,
@RequestBody WaylineFileDTO waylineFileDTO) {
Integer addDirId = waylineFileService.addDirectory(workspaceId, waylineFileDTO);
return addDirId > 0 ? HttpResultResponse.success() : HttpResultResponse.error();
}
/**
* get directory tree
* @param workspaceId
* @return
*/
@GetMapping(PREFIX + "/workspaces/{workspace_id}/getDirectoryTree")
public HttpResultResponse getDirectoryTree(@PathVariable("workspace_id") String workspaceId) {
List<WaylineFileTreeVO> treeVOS = waylineFileService.getDirectoryTree(workspaceId);
return HttpResultResponse.success(treeVOS);
}
/**
* get directory tree
* @param workspaceId
* @return
*/
@GetMapping(PREFIX + "/workspaces/{workspace_id}/getWaylineFileTree")
public HttpResultResponse getWaylineFileTree(@PathVariable("workspace_id") String workspaceId,
@RequestParam(name = "waylineFileId") String id) {
List<WaylineFileTreeVO> treeVOS = waylineFileService.getWaylineFileTree(workspaceId, id);
return HttpResultResponse.success(treeVOS);
}
/**
* get directory tree
* @param workspaceId
* @return
*/
@PostMapping(PREFIX + "/workspaces/{workspace_id}/updateParent")
public HttpResultResponse updateParent(@PathVariable("workspace_id") String workspaceId,
@RequestBody WaylineFileDTO waylineFileDTO) {
waylineFileService.updateParentId(waylineFileDTO.getWaylineId(), waylineFileDTO.getParentId());
return HttpResultResponse.success();
}
/**
* get directory tree
* @param workspaceId
* @return
*/
@DeleteMapping(PREFIX + "/workspaces/{workspace_id}/deleteDirectory")
public HttpResultResponse deleteDirectory(@PathVariable("workspace_id") String workspaceId,
@RequestParam(name = "waylineFileId") String id) {
waylineFileService.deleteDirectory(workspaceId, id);
return HttpResultResponse.success();
}
/**
* Query the basic data of the wayline file according to the query conditions.
* The query condition field in pilot is fixed.
* @param request
* @param workspaceId
* @return
*/
@GetMapping(PREFIX + "/workspaces/{workspace_id}/getFileListByParentId")
public HttpResultResponse<PaginationData<GetWaylineListResponse>> getFileListByParentId(
@Valid GetWaylineListRequest request,
@PathVariable("workspace_id") String workspaceId,
@RequestParam(name = "parent_id", defaultValue = "0") String parentId,
HttpServletRequest req,
HttpServletResponse rsp) {
PaginationData<GetWaylineListResponse> data = waylineFileService.getWaylinesByParam(workspaceId, parentId, request);
return HttpResultResponse.success(data);
}
} }
package com.dji.sample.wayline.model.dto; package com.dji.sample.wayline.model.dto;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
...@@ -37,7 +38,17 @@ public class WaylineFileDTO { ...@@ -37,7 +38,17 @@ public class WaylineFileDTO {
private String objectKey; private String objectKey;
@JsonProperty("user_name") @JsonProperty("user_name")
@JsonAlias("username")
private String username; private String username;
private Long updateTime; private Long updateTime;
@JsonAlias("parentId")
private String parentId;
private String ancestors;
@JsonAlias("isDir")
private Integer isDir;
} }
package com.dji.sample.wayline.model.dto;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author sean
* @version 0.3
* @date 2021/12/22
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class WaylineFileTreeVO {
private String name;
@JsonProperty("id")
private String waylineId;
private String droneModelKey;
private String sign;
private List<String> payloadModelKeys;
private Boolean favorited;
private List<Integer> templateTypes;
private String objectKey;
@JsonProperty("user_name")
@JsonAlias("username")
private String username;
private Long updateTime;
@JsonAlias("parentId")
private String parentId;
private String ancestors;
@JsonAlias("isDir")
private Integer isDir;
private List<WaylineFileTreeVO> children;
}
...@@ -59,4 +59,19 @@ public class WaylineFileEntity implements Serializable { ...@@ -59,4 +59,19 @@ public class WaylineFileEntity implements Serializable {
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Long updateTime; private Long updateTime;
@TableField("parent_id")
private String parentId;
@TableField("ancestors")
private String ancestors;
/**
* 0 file 1 dir
*/
@TableField("is_dir")
private Integer isDir;
// @TableLogic
@TableField("is_deleted")
private Boolean isDeleted;
} }
package com.dji.sample.wayline.model.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import java.util.Arrays;
import java.util.Optional;
/**
* @author guan
* @version 9.23
* @date 2025/3/21
*/
public enum WaylineFileTypeEnum {
FILE(0, "file"),
DIRECTORY(1, "directory");
int val;
String type;
WaylineFileTypeEnum(int val, String type) {
this.val = val;
this.type = type;
}
@JsonValue
public int getVal() {
return val;
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static WaylineFileTypeEnum find(Integer val) {
return Arrays.stream(values()).filter(fileTypeEnum -> fileTypeEnum.val == val).findAny().get();
}
public static Optional<WaylineFileTypeEnum> find(String type) {
return Arrays.stream(values()).filter(fileTypeEnum -> fileTypeEnum.type.equals(type)).findAny();
}
}
package com.dji.sample.wayline.service; package com.dji.sample.wayline.service;
import com.dji.sample.wayline.model.dto.WaylineFileDTO; import com.dji.sample.wayline.model.dto.WaylineFileDTO;
import com.dji.sample.wayline.model.dto.WaylineFileTreeVO;
import com.dji.sdk.cloudapi.wayline.GetWaylineListRequest; import com.dji.sdk.cloudapi.wayline.GetWaylineListRequest;
import com.dji.sdk.cloudapi.wayline.GetWaylineListResponse; import com.dji.sdk.cloudapi.wayline.GetWaylineListResponse;
import com.dji.sdk.common.PaginationData; import com.dji.sdk.common.PaginationData;
...@@ -82,4 +83,51 @@ public interface IWaylineFileService { ...@@ -82,4 +83,51 @@ public interface IWaylineFileService {
* @return * @return
*/ */
void importKmzFile(MultipartFile file, String workspaceId, String creator); void importKmzFile(MultipartFile file, String workspaceId, String creator);
/**
* Import kmz wayline file.
* @param file
* @param workspaceId
* @param creator
* @param fileParentId
* @return
*/
void importKmzFile(MultipartFile file, String workspaceId, String creator, String fileParentId);
/**
* add directory
* @param workspaceId
* @param waylineFileDTO
* @return
*/
Integer addDirectory(String workspaceId, WaylineFileDTO waylineFileDTO);
/**
* get directory tree
* @param workspaceId
*/
List<WaylineFileTreeVO> getDirectoryTree(String workspaceId);
/**
* get directory tree List<WaylineFileTreeVO> getDirectoryTree(String workspaceId);
* @param workspaceId
*/
List<WaylineFileTreeVO> getWaylineFileTree(String workspaceId, String waylineFileId);
/**
* update file parentId
* @param waylineFileId
* @param parentId
*/
boolean updateParentId(String waylineFileId, String parentId);
/**
* del waylineFile with child
* @param workspaceId
* @param waylineFileId
* @return
*/
boolean deleteDirectory(String workspaceId, String waylineFileId);
PaginationData<GetWaylineListResponse> getWaylinesByParam(String workspaceId, String parentId, GetWaylineListRequest param);
} }
...@@ -2,13 +2,16 @@ package com.dji.sample.wayline.service.impl; ...@@ -2,13 +2,16 @@ package com.dji.sample.wayline.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dji.sample.component.oss.model.OssConfiguration; import com.dji.sample.component.oss.model.OssConfiguration;
import com.dji.sample.component.oss.service.impl.OssServiceContext; import com.dji.sample.component.oss.service.impl.OssServiceContext;
import com.dji.sample.wayline.dao.IWaylineFileMapper; import com.dji.sample.wayline.dao.IWaylineFileMapper;
import com.dji.sample.wayline.model.dto.KmzFileProperties; import com.dji.sample.wayline.model.dto.KmzFileProperties;
import com.dji.sample.wayline.model.dto.WaylineFileDTO; import com.dji.sample.wayline.model.dto.WaylineFileDTO;
import com.dji.sample.wayline.model.dto.WaylineFileTreeVO;
import com.dji.sample.wayline.model.entity.WaylineFileEntity; import com.dji.sample.wayline.model.entity.WaylineFileEntity;
import com.dji.sample.wayline.model.enums.WaylineFileTypeEnum;
import com.dji.sample.wayline.service.IWaylineFileService; import com.dji.sample.wayline.service.IWaylineFileService;
import com.dji.sdk.cloudapi.device.DeviceDomainEnum; import com.dji.sdk.cloudapi.device.DeviceDomainEnum;
import com.dji.sdk.cloudapi.device.DeviceEnum; import com.dji.sdk.cloudapi.device.DeviceEnum;
...@@ -23,9 +26,11 @@ import org.dom4j.Document; ...@@ -23,9 +26,11 @@ import org.dom4j.Document;
import org.dom4j.DocumentException; import org.dom4j.DocumentException;
import org.dom4j.Node; import org.dom4j.Node;
import org.dom4j.io.SAXReader; import org.dom4j.io.SAXReader;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.DigestUtils; import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -64,6 +69,7 @@ public class WaylineFileServiceImpl implements IWaylineFileService { ...@@ -64,6 +69,7 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
Page<WaylineFileEntity> page = mapper.selectPage( Page<WaylineFileEntity> page = mapper.selectPage(
new Page<WaylineFileEntity>(param.getPage(), param.getPageSize()), new Page<WaylineFileEntity>(param.getPage(), param.getPageSize()),
new LambdaQueryWrapper<WaylineFileEntity>() new LambdaQueryWrapper<WaylineFileEntity>()
.eq(WaylineFileEntity::getIsDir, WaylineFileTypeEnum.FILE.getVal())
.eq(WaylineFileEntity::getWorkspaceId, workspaceId) .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
.eq(Objects.nonNull(param.getFavorited()), WaylineFileEntity::getFavorited, param.getFavorited()) .eq(Objects.nonNull(param.getFavorited()), WaylineFileEntity::getFavorited, param.getFavorited())
.and(param.getTemplateType() != null, wrapper -> { .and(param.getTemplateType() != null, wrapper -> {
...@@ -104,6 +110,17 @@ public class WaylineFileServiceImpl implements IWaylineFileService { ...@@ -104,6 +110,17 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
.eq(WaylineFileEntity::getWaylineId, waylineId)))); .eq(WaylineFileEntity::getWaylineId, waylineId))));
} }
public WaylineFileEntity getWaylineFileEntityByWaylineId(String workspaceId, String waylineId) {
LambdaQueryWrapper<WaylineFileEntity> fileQueryWrapper = new LambdaQueryWrapper<WaylineFileEntity>()
.eq(WaylineFileEntity::getWorkspaceId, workspaceId)
.eq(WaylineFileEntity::getWaylineId, waylineId);
WaylineFileEntity waylineFileEntity = mapper.selectOne(fileQueryWrapper);
return waylineFileEntity;
}
@Override @Override
public URL getObjectUrl(String workspaceId, String waylineId) throws SQLException { public URL getObjectUrl(String workspaceId, String waylineId) throws SQLException {
Optional<GetWaylineListResponse> waylineOpt = this.getWaylineByWaylineId(workspaceId, waylineId); Optional<GetWaylineListResponse> waylineOpt = this.getWaylineByWaylineId(workspaceId, waylineId);
...@@ -115,6 +132,13 @@ public class WaylineFileServiceImpl implements IWaylineFileService { ...@@ -115,6 +132,13 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
@Override @Override
public Integer saveWaylineFile(String workspaceId, WaylineFileDTO metadata) { public Integer saveWaylineFile(String workspaceId, WaylineFileDTO metadata) {
// 航线文件 一定是文件
metadata.setIsDir(WaylineFileTypeEnum.FILE.getVal());
if (!StringUtils.hasText(metadata.getParentId())) {
metadata.setParentId("0");
metadata.setAncestors("0");
}
WaylineFileEntity file = this.dtoConvertToEntity(metadata); WaylineFileEntity file = this.dtoConvertToEntity(metadata);
file.setWaylineId(UUID.randomUUID().toString()); file.setWaylineId(UUID.randomUUID().toString());
file.setWorkspaceId(workspaceId); file.setWorkspaceId(workspaceId);
...@@ -177,6 +201,11 @@ public class WaylineFileServiceImpl implements IWaylineFileService { ...@@ -177,6 +201,11 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
@Override @Override
public void importKmzFile(MultipartFile file, String workspaceId, String creator) { public void importKmzFile(MultipartFile file, String workspaceId, String creator) {
importKmzFile(file, workspaceId, creator, null);
}
@Override
public void importKmzFile(MultipartFile file, String workspaceId, String creator, String fileParentId) {
Optional<WaylineFileDTO> waylineFileOpt = validKmzFile(file); Optional<WaylineFileDTO> waylineFileOpt = validKmzFile(file);
if (waylineFileOpt.isEmpty()) { if (waylineFileOpt.isEmpty()) {
throw new RuntimeException("The file format is incorrect."); throw new RuntimeException("The file format is incorrect.");
...@@ -185,6 +214,23 @@ public class WaylineFileServiceImpl implements IWaylineFileService { ...@@ -185,6 +214,23 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
try { try {
WaylineFileDTO waylineFile = waylineFileOpt.get(); WaylineFileDTO waylineFile = waylineFileOpt.get();
waylineFile.setUsername(creator); waylineFile.setUsername(creator);
// 查询 fileParentId
if (StringUtils.hasText(fileParentId) && !"0".equals(fileParentId)) {
LambdaQueryWrapper<WaylineFileEntity> fileQueryWrapper = new LambdaQueryWrapper<>();
fileQueryWrapper.eq(WaylineFileEntity::getWaylineId, fileParentId);
WaylineFileEntity parentWaylineFile = mapper.selectOne(fileQueryWrapper);
if (parentWaylineFile.getIsDir() != WaylineFileTypeEnum.DIRECTORY.getVal()) {
throw new RuntimeException("parent structure is not a directory");
}
waylineFile.setParentId(parentWaylineFile.getWaylineId());
waylineFile.setAncestors(parentWaylineFile.getAncestors() + StringPool.COMMA + parentWaylineFile.getWaylineId());
} else {
waylineFile.setParentId("0");
waylineFile.setAncestors("0");
}
ossService.putObject(OssConfiguration.bucket, waylineFile.getObjectKey(), file.getInputStream()); ossService.putObject(OssConfiguration.bucket, waylineFile.getObjectKey(), file.getInputStream());
this.saveWaylineFile(workspaceId, waylineFile); this.saveWaylineFile(workspaceId, waylineFile);
...@@ -193,6 +239,119 @@ public class WaylineFileServiceImpl implements IWaylineFileService { ...@@ -193,6 +239,119 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
} }
} }
@Override
public Integer addDirectory(String workspaceId, WaylineFileDTO waylineDirDTO) {
WaylineFileEntity dir = dirDtoConvertToEntity(waylineDirDTO);
// 获取parent
if (StringUtils.hasText(waylineDirDTO.getParentId()) && !"0".equals(waylineDirDTO.getParentId())) {
String parentId = waylineDirDTO.getParentId();
WaylineFileEntity parent = this.getWaylineFileEntityByWaylineId(workspaceId, parentId);
if (parent != null) {
if (parent.getIsDir() != WaylineFileTypeEnum.DIRECTORY.getVal()) {
throw new RuntimeException("parent structure is not a directory");
}
String ancestors = StringUtils.hasText(parent.getAncestors()) ? parent.getAncestors() : "0";
dir.setAncestors(ancestors + StringPool.COMMA + parentId);
} else {
throw new RuntimeException("parent directory is not found");
}
} else {
dir.setParentId("0");
dir.setAncestors("0");
}
dir.setIsDir(WaylineFileTypeEnum.DIRECTORY.getVal());
dir.setWaylineId(UUID.randomUUID().toString());
dir.setWorkspaceId(workspaceId);
int insertId = mapper.insert(dir);
return insertId > 0 ? dir.getId() : insertId;
}
@Override
public List<WaylineFileTreeVO> getDirectoryTree(String workspaceId) {
return getDirectoryTree(workspaceId, "0");
}
/**
* get directory tree
* @param workspaceId
*/
@Override
public List<WaylineFileTreeVO> getWaylineFileTree(String workspaceId, String rootId) {
LambdaQueryWrapper<WaylineFileEntity> fileQueryWrapper = new LambdaQueryWrapper<>();
fileQueryWrapper.eq(WaylineFileEntity::getWorkspaceId, workspaceId);
fileQueryWrapper.like(WaylineFileEntity::getAncestors, rootId);
// fileQueryWrapper.eq(WaylineFileEntity::getIsDir, WaylineFileTypeEnum.DIRECTORY.getVal());
List<WaylineFileEntity> waylineFiles = mapper.selectList(fileQueryWrapper);
return getWaylineFileTree(waylineFiles, rootId);
}
public List<WaylineFileTreeVO> getDirectoryTree(String workspaceId, String rootId) {
LambdaQueryWrapper<WaylineFileEntity> fileQueryWrapper = new LambdaQueryWrapper<>();
fileQueryWrapper.eq(WaylineFileEntity::getWorkspaceId, workspaceId);
fileQueryWrapper.like(WaylineFileEntity::getAncestors, rootId);
fileQueryWrapper.eq(WaylineFileEntity::getIsDir, WaylineFileTypeEnum.DIRECTORY.getVal());
List<WaylineFileEntity> waylineFiles = mapper.selectList(fileQueryWrapper);
return getWaylineFileTree(waylineFiles, rootId);
}
public List<WaylineFileTreeVO> getWaylineFileTree(List<WaylineFileEntity> waylineFiles, String rootId) {
// 转换一下
List<WaylineFileTreeVO> waylineFileTreeVOS = waylineFiles.stream().map(x -> {
WaylineFileTreeVO vo = new WaylineFileTreeVO();
BeanUtils.copyProperties(x, vo); // 复制属性
return vo;
}).collect(Collectors.toList());
Map<String, List<WaylineFileTreeVO>> waylineFileMapByParentId = waylineFileTreeVOS.stream().collect(Collectors.groupingBy(WaylineFileTreeVO::getParentId));
// 返回 一个树结构
if (!StringUtils.hasText(rootId)) {
rootId = "0";
}
Map<String, WaylineFileTreeVO> nodeMap = new HashMap<>();
List<WaylineFileTreeVO> roots = new ArrayList<>();
// 1. 先存入 Map
for (WaylineFileTreeVO item : waylineFileTreeVOS) {
nodeMap.put(item.getWaylineId(), item);
}
// 2. 建立父子关系
for (WaylineFileTreeVO item : waylineFileTreeVOS) {
String parentId = item.getParentId();
WaylineFileTreeVO node = nodeMap.get(item.getWaylineId());
if (rootId.equals(parentId)) {
// 多个根节点
roots.add(node);
} else {
if (Objects.isNull(nodeMap.get(parentId))) {
continue;
}
// 归属于父节点
if (CollectionUtils.isEmpty(nodeMap.get(parentId).getChildren())) {
nodeMap.get(parentId).setChildren(new ArrayList<>());
}
nodeMap.get(parentId).getChildren().add(node);
}
}
return roots;
}
private Optional<WaylineFileDTO> validKmzFile(MultipartFile file) { private Optional<WaylineFileDTO> validKmzFile(MultipartFile file) {
String filename = file.getOriginalFilename(); String filename = file.getOriginalFilename();
if (Objects.nonNull(filename) && !filename.endsWith(WAYLINE_FILE_SUFFIX)) { if (Objects.nonNull(filename) && !filename.endsWith(WAYLINE_FILE_SUFFIX)) {
...@@ -274,6 +433,10 @@ public class WaylineFileServiceImpl implements IWaylineFileService { ...@@ -274,6 +433,10 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
* @return * @return
*/ */
private WaylineFileEntity dtoConvertToEntity(WaylineFileDTO file) { private WaylineFileEntity dtoConvertToEntity(WaylineFileDTO file) {
if (file.getIsDir() != null && file.getIsDir() == WaylineFileTypeEnum.DIRECTORY.getVal()) {
return dirDtoConvertToEntity(file);
}
WaylineFileEntity.WaylineFileEntityBuilder builder = WaylineFileEntity.builder(); WaylineFileEntity.WaylineFileEntityBuilder builder = WaylineFileEntity.builder();
if (file != null) { if (file != null) {
...@@ -288,9 +451,145 @@ public class WaylineFileServiceImpl implements IWaylineFileService { ...@@ -288,9 +451,145 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
.collect(Collectors.joining(","))) .collect(Collectors.joining(",")))
.favorited(file.getFavorited()) .favorited(file.getFavorited())
.sign(file.getSign()) .sign(file.getSign())
.isDir(file.getIsDir())
.parentId(file.getParentId())
.ancestors(file.getAncestors())
.build(); .build();
} }
return builder.build(); return builder.build();
} }
/**
* Convert the received directory object into a database entity object.
* @param file
* @return
*/
private WaylineFileEntity dirDtoConvertToEntity(WaylineFileDTO file) {
WaylineFileEntity.WaylineFileEntityBuilder builder = WaylineFileEntity.builder();
if (file != null) {
builder.droneModelKey(file.getDroneModelKey())
.name(file.getName())
.username(file.getUsername())
.objectKey(file.getObjectKey())
// Separate multiple payload data with ",".
// .payloadModelKeys(String.join(",", file.getPayloadModelKeys()))
// .templateTypes(file.getTemplateTypes().stream()
// .map(String::valueOf)
// .collect(Collectors.joining(",")))
.favorited(file.getFavorited())
.sign(file.getSign())
.isDir(file.getIsDir())
.parentId(file.getParentId())
.ancestors(file.getAncestors())
.build();
}
return builder.build();
}
@Transactional(rollbackFor = Exception.class)
@Override
public boolean updateParentId(String waylineFileId, String parentId) {
// 查询数据库
LambdaQueryWrapper<WaylineFileEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(WaylineFileEntity::getWaylineId, waylineFileId, parentId);
List<WaylineFileEntity> waylineFileEntity = this.mapper.selectList(lambdaQueryWrapper);
WaylineFileEntity updateEntity = new WaylineFileEntity();
WaylineFileEntity parentEntity = new WaylineFileEntity();
for (WaylineFileEntity item : waylineFileEntity) {
if (item.getWaylineId().equals(waylineFileId)) {
updateEntity = item;
}
if (item.getWaylineId().equals(parentId)) {
parentEntity = item;
}
}
LambdaUpdateWrapper<WaylineFileEntity> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(WaylineFileEntity::getWaylineId, waylineFileId);
WaylineFileEntity update1 = new WaylineFileEntity();
update1.setParentId(parentId);
if (StringUtils.hasText(parentId) && !"0".equals(parentId)) {
update1.setAncestors(parentEntity.getAncestors() + StringPool.COMMA + parentId);
} else {
update1.setAncestors("0");
}
// updateWrapper.set(WaylineFileEntity::getParentId, parentId);
// updateWrapper.set(WaylineFileEntity::getAncestors, parentEntity.getAncestors() + StringPool.COMMA + parentId);
// 除了修改这些数据 还得修改 子节点的数据
int result1 = mapper.update(update1, updateWrapper);
// 修改 子节点数据
// List<WaylineFileEntity> children = this.mapper.selectList(new LambdaQueryWrapper<WaylineFileEntity>().eq(WaylineFileEntity::getParentId, waylineFileId));
LambdaUpdateWrapper<WaylineFileEntity> updateChildWrapper = new LambdaUpdateWrapper<>();
updateChildWrapper.eq(WaylineFileEntity::getParentId, waylineFileId);
WaylineFileEntity update2 = new WaylineFileEntity();
if (StringUtils.hasText(parentId) && !"0".equals(parentId)) {
update2.setAncestors(parentEntity.getAncestors() + StringPool.COMMA + parentId + StringPool.COMMA + waylineFileId);
} else {
update2.setAncestors("0" + StringPool.COMMA + waylineFileId);
}
int result2 = mapper.update(update2, updateChildWrapper);
return result1 > 0 && result2 > 0;
}
@Transactional(rollbackFor = Exception.class)
@Override
public boolean deleteDirectory(String workspaceId, String waylineFileId) {
int delete1 = this.mapper.delete(new LambdaQueryWrapper<WaylineFileEntity>().eq(WaylineFileEntity::getWaylineId, waylineFileId));
// 删除后续子节点
int delete2 = this.mapper.delete(new LambdaQueryWrapper<WaylineFileEntity>().like(WaylineFileEntity::getAncestors, waylineFileId));
return true;
}
@Override
public PaginationData<GetWaylineListResponse> getWaylinesByParam(String workspaceId, String parentId, GetWaylineListRequest param) {
// Paging Query
LambdaQueryWrapper<WaylineFileEntity> waylineFileQueryWrapper = new LambdaQueryWrapper<>();
waylineFileQueryWrapper.eq(WaylineFileEntity::getIsDir, WaylineFileTypeEnum.FILE.getVal())
.eq(WaylineFileEntity::getWorkspaceId, workspaceId)
.eq(Objects.nonNull(param.getFavorited()), WaylineFileEntity::getFavorited, param.getFavorited());
waylineFileQueryWrapper.and(param.getTemplateType() != null, wrapper -> {
for (WaylineTypeEnum type : param.getTemplateType()) {
wrapper.like(WaylineFileEntity::getTemplateTypes, type.getValue()).or();
}
})
.and(param.getPayloadModelKey() != null, wrapper -> {
for (DeviceEnum type : param.getPayloadModelKey()) {
wrapper.like(WaylineFileEntity::getPayloadModelKeys, type.getType()).or();
}
})
.and(param.getDroneModelKeys() != null, wrapper -> {
for (DeviceEnum type : param.getDroneModelKeys()) {
wrapper.eq(WaylineFileEntity::getDroneModelKey, type.getType()).or();
}
});
if (StringUtils.hasText(parentId)) {
waylineFileQueryWrapper.eq(WaylineFileEntity::getParentId, parentId);
}
waylineFileQueryWrapper.like(Objects.nonNull(param.getKey()), WaylineFileEntity::getName, param.getKey());
// There is a risk of SQL injection
waylineFileQueryWrapper.last(Objects.nonNull(param.getOrderBy()), " order by " + param.getOrderBy().toString());
Page<WaylineFileEntity> page = mapper.selectPage(new Page<>(param.getPage(), param.getPageSize()),waylineFileQueryWrapper);
// Wrap the results of a paging query into a custom paging object.
List<GetWaylineListResponse> records = page.getRecords()
.stream()
.map(this::entityConvertToDTO)
.collect(Collectors.toList());
return new PaginationData<>(records, new Pagination(page.getCurrent(), page.getSize(), page.getTotal()));
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment