package com.dji.sample.wayline.controller; import com.dji.sample.common.model.CustomClaim; import com.dji.sample.common.model.PaginationData; import com.dji.sample.common.model.ResponseResult; import com.dji.sample.common.util.MinioUrlUtils; import com.dji.sample.log.aspect.SysLogAnnotation; import com.dji.sample.wayline.model.dto.WaylineFileDTO; import com.dji.sample.wayline.model.dto.WaylineFileUploadDTO; import com.dji.sample.wayline.model.dto.WaylineListDTO; import com.dji.sample.wayline.model.entity.WaylineFileEntity; import com.dji.sample.wayline.model.param.WaylineQueryParam; import com.dji.sample.wayline.service.IWaylineFileService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URL; import java.sql.SQLException; import java.util.List; import java.util.Objects; import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM; /** * @author sean * @version 0.3 * @date 2021/12/22 */ @RestController @RequestMapping("${url.wayline.prefix}${url.wayline.version}/workspaces") public class WaylineFileController { @Autowired private IWaylineFileService waylineFileService; /** * 根据查询条件查询航路线文件的基本数据。 * pilot中的查询条件字段是固定的。 * * @param orderBy 排序的字段。在sql语句的末尾拼接。 * @param favorited 路径线文件是否为收藏夹。 * @param page * @param pageSize * @param templateType * @param workspaceId * @return */ @GetMapping("/{workspace_id}/waylines") @SysLogAnnotation(operModul = "航线库", operType = "查询", operDesc = "根据查询条件查询航路线文件的基本数据") public ResponseResult> getWaylinesPagination(@RequestParam(name = "order_by") String orderBy, @RequestParam(required = false) boolean favorited, @RequestParam Integer page, @RequestParam(name = "page_size", defaultValue = "10") Integer pageSize, @RequestParam(name = "template_type", required = false) Integer[] templateType, @PathVariable(name = "workspace_id") String workspaceId) { WaylineQueryParam param = WaylineQueryParam.builder() .favorited(favorited) .page(page) .pageSize(pageSize) .orderBy(orderBy) .templateType(templateType) .build(); PaginationData data = waylineFileService.getWaylinesByParam(workspaceId, param); return ResponseResult.success(data); } /** * 根据wayline文件id查询文件的下载地址; * 和重定向到此地址直接下载。 * * @param workspaceId * @param waylineId * @param response */ @GetMapping("/{workspace_id}/waylines/{wayline_id}/url") @SysLogAnnotation(operModul = "航线库", operType = "查询", operDesc = "根据wayline文件id查询文件的下载地址1") public void getFileUrl(@PathVariable(name = "workspace_id") String workspaceId, @PathVariable(name = "wayline_id") String waylineId, HttpServletResponse response) { try { URL url = waylineFileService.getObjectUrl(workspaceId, waylineId); response.sendRedirect(MinioUrlUtils.getUrl(url)); } catch (IOException | SQLException e) { e.printStackTrace(); } } @GetMapping("/{workspace_id}/waylines/{wayline_id}/urlData") @SysLogAnnotation(operModul = "航线库", operType = "查询", operDesc = "根据wayline文件id查询文件的下载地址2") public ResponseResult getFileUrlData(@PathVariable(name = "workspace_id") String workspaceId, @PathVariable(name = "wayline_id") String waylineId, HttpServletResponse response) { URL url = null; try { url = waylineFileService.getObjectUrl(workspaceId, waylineId); } catch (SQLException e) { throw new RuntimeException(e); } return ResponseResult.success(MinioUrlUtils.getUrl(url)); } /** * 当航路线文件被飞行员上传到存储服务器时, * 通过该接口报告文件的基本信息。 * * @param request * @param workspaceId * @param uploadFile * @return */ @PostMapping("/{workspace_id}/upload-callback") @SysLogAnnotation(operModul = "航线库", operType = "新增", operDesc = "当航路线文件被飞行员上传到存储服务器时,通过该接口报告文件的基本信息") public ResponseResult uploadCallBack(HttpServletRequest request, @PathVariable(name = "workspace_id") String workspaceId, @RequestBody WaylineFileUploadDTO uploadFile) { CustomClaim customClaim = (CustomClaim) request.getAttribute(TOKEN_CLAIM); WaylineFileDTO metadata = uploadFile.getMetadata(); metadata.setUsername(customClaim.getUsername()); metadata.setObjectKey(uploadFile.getObjectKey()); metadata.setName(uploadFile.getName()); int id = waylineFileService.saveWaylineFile(workspaceId, metadata); return id <= 0 ? ResponseResult.error() : ResponseResult.success(); } /** * 根据路径线文件id收藏路径线文件。 * * @param workspaceId * @param ids wayline file id * @return */ @PostMapping("/{workspace_id}/favorites") @SysLogAnnotation(operModul = "航线库", operType = "修改", operDesc = "根据路径线文件id收藏路径线文件") public ResponseResult markFavorite(@PathVariable(name = "workspace_id") String workspaceId, @RequestParam(name = "id") List ids) { boolean isMark = waylineFileService.markFavorite(workspaceId, ids, true); return isMark ? ResponseResult.success() : ResponseResult.error(); } /** * 根据航路线文件id删除此航路线文件的收藏夹。 * * @param workspaceId * @param ids wayline file id * @return */ @DeleteMapping("/{workspace_id}/favorites") @SysLogAnnotation(operModul = "航线库", operType = "删除", operDesc = "根据航路线文件id删除此航路线文件的收藏夹") public ResponseResult unmarkFavorite(@PathVariable(name = "workspace_id") String workspaceId, @RequestParam(name = "id") List ids) { boolean isMark = waylineFileService.markFavorite(workspaceId, ids, false); return isMark ? ResponseResult.success() : ResponseResult.error(); } /** * 根据航路线名称检查名称是否已经存在,必须保证航路线名称的唯一性。 * 此接口将在上传航路线时被调用,并且必须可用。 * * @param workspaceId * @param names * @return */ @GetMapping("/{workspace_id}/waylines/duplicate-names") @SysLogAnnotation(operModul = "航线库", operType = "查询", operDesc = "根据航路线名称检查名称是否已经存在") public ResponseResult checkDuplicateNames(@PathVariable(name = "workspace_id") String workspaceId, @RequestParam(name = "name") List names) { List existNamesList = waylineFileService.getDuplicateNames(workspaceId, names); return ResponseResult.success(existNamesList); } /** * 根据航路线id删除工作区中的航路线文件。 * * @param workspaceId * @param waylineId * @return */ @DeleteMapping("/{workspace_id}/waylines/{wayline_id}") @SysLogAnnotation(operModul = "航线库", operType = "删除", operDesc = "根据航路线id删除工作区中的航路线文件") public ResponseResult deleteWayline(@PathVariable(name = "workspace_id") String workspaceId, @PathVariable(name = "wayline_id") String waylineId) { boolean isDel = waylineFileService.deleteByWaylineId(workspaceId, waylineId); return isDel ? ResponseResult.success() : ResponseResult.error("航线删除失败"); } /** * 上传kmz航线文件 * * @param file * @return */ @PostMapping("/{workspace_id}/waylines/file/upload") @SysLogAnnotation(operModul = "航线库", operType = "上传", operDesc = "上传kmz航线文件") public ResponseResult importKmzFile(@PathVariable(name = "workspace_id") String workspaceId, HttpServletRequest request, MultipartFile file, @RequestParam(required = false) String patchesId, @RequestParam(required = false) String spotInFreckle ) { if (Objects.isNull(file)) { return ResponseResult.error("未上传文件"); } CustomClaim customClaim = (CustomClaim) request.getAttribute(TOKEN_CLAIM); String creator = customClaim.getUsername(); String back = waylineFileService.importKmzFile(file, workspaceId, creator, patchesId, spotInFreckle); if (back != null) { return ResponseResult.error(back); } return ResponseResult.success(back); } @GetMapping("/{workspace_id}/waylines_list") @SysLogAnnotation(operModul = "航线库", operType = "查询", operDesc = "查询当前工作区航线库列表") public ResponseResult> waylineList(@PathVariable(name = "workspace_id") String workspaceId, String droneName) { return ResponseResult.success(waylineFileService.waylineList(workspaceId, droneName)); } @PutMapping("/{workspace_id}/wayline_update") public ResponseResult upWayline(@RequestParam String waylineId, @RequestParam String name) { WaylineFileEntity entity = WaylineFileEntity .builder() .waylineId(waylineId) .name(name) .build(); if (waylineFileService.updateWayline(entity) == 0) { return ResponseResult.error("更新失败"); } else return ResponseResult.success(); } }