航线管理
Pilot2
功能概述
主要是提供同一个工作空间下的航线文件下载上传,用户通过Pilot2登录到服务端后,可以拉取航线列表,显示在Pilot2的航线库中,Pilot2 可以直接查看云端的航线,如果要修改航线,需要先将航线下载到本地,然后进行编辑,本地编辑不影响云端航线,如果需要将修改后的航线共享,则需要将航线重新命名,然后再次上传。
接口说明
- 获取上传临时凭证
每次航线文件上传时,需要向服务端获取临时文件上传凭证,Pilot2在上传时会带上该凭证用于校验
com.zdjjrj.storage.controller.StorageController#getTemporaryCredential
@Override
public HttpResultResponse<StsCredentialsResponse> getTemporaryCredential(String workspaceId, HttpServletRequest req, HttpServletResponse rsp) {
StsCredentialsResponse stsCredentials = storageService.getSTSCredentials();
return HttpResultResponse.success(stsCredentials);
}
com.zdjjrj.storage.service.impl.StorageServiceImpl#getSTSCredentials
@Service
public class StorageServiceImpl extends AbstractMediaService implements IStorageService {
@Autowired
private OssServiceContext ossService;
@Override
public StsCredentialsResponse getSTSCredentials() {
return new StsCredentialsResponse()
.setEndpoint(OssConfiguration.endpoint)
.setBucket(OssConfiguration.bucket)
.setCredentials(ossService.getCredentials())
.setProvider(OssConfiguration.provider)
.setObjectKeyPrefix(OssConfiguration.objectDirPrefix)
.setRegion(OssConfiguration.region);
}
@Override
public TopicRequestsResponse<MqttReply<StsCredentialsResponse>> storageConfigGet(TopicRequestsRequest<StorageConfigGet> response, MessageHeaders headers) {
return new TopicRequestsResponse<MqttReply<StsCredentialsResponse>>().setData(MqttReply.success(getSTSCredentials()));
}
}
-
获取航线文件列表
DJI Pilot 2通过http向服务端拉取航线文件列表,并显示在DJI Pilot 2航线库中
com.zdjjrj.sdk.cloudapi.wayline.api.IHttpWaylineService.getWaylineList@Override public HttpResultResponse<PaginationData<GetWaylineListResponse>> getWaylineList(@Valid GetWaylineListRequest request, String workspaceId, HttpServletRequest req, HttpServletResponse rsp) { PaginationData<GetWaylineListResponse> data = waylineFileService.getWaylinesByParam(workspaceId, request); return HttpResultResponse.success(data); }
com.zdjjrj.wayline.service.impl.WaylineFileServiceImpl#getWaylinesByParam
@Override public PaginationData<GetWaylineListResponse> getWaylinesByParam(String workspaceId, GetWaylineListRequest param) { // Paging Query Page<WaylineFileEntity> page = mapper.selectPage( new Page<WaylineFileEntity>(param.getPage(), param.getPageSize()), new LambdaQueryWrapper<WaylineFileEntity>() .eq(WaylineFileEntity::getWorkspaceId, workspaceId) .eq(Objects.nonNull(param.getFavorited()), WaylineFileEntity::getFavorited, param.getFavorited()) .like(Objects.nonNull(param.getJobName()), WaylineFileEntity::getName, param.getJobName()) .ge(Objects.nonNull(param.getStartTime()), WaylineFileEntity::getCreateTime, param.getStartTime()) .le(Objects.nonNull(param.getEndTime()), WaylineFileEntity::getCreateTime, param.getEndTime()) .and(param.getTemplateType() != null, wrapper -> { for (WaylineTypeEnum type : param.getTemplateType()) { wrapper.like(WaylineFileEntity::getTemplateTypes, type.getValue()).or(); } }) // There is a risk of SQL injection .last(StringUtils.hasText(param.getOrderBy()), " order by " + param.getOrderBy())); // 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)); }
-
获取航线文件下载地址
当用户点击下载DJI Pilot 2中航线列表的某个航线时,DJI Pilot 2会发起获取航线下载地址的请求。
com.zdjjrj.wayline.controller.WaylineFileController#getWaylineFileDownloadAddress@Override public void getWaylineFileDownloadAddress(String workspaceId, String waylineId, HttpServletRequest req, HttpServletResponse rsp) { try { URL url = waylineFileService.getObjectUrl(workspaceId, waylineId); rsp.sendRedirect(url.toString()); } catch (IOException | SQLException e) { e.printStackTrace(); } }
com.zdjjrj.wayline.service.impl.WaylineFileServiceImpl#getObjectUrl
@Override public URL getObjectUrl(String workspaceId, String waylineId) throws SQLException { Optional<GetWaylineListResponse> waylineOpt = this.getWaylineByWaylineId(workspaceId, waylineId); if (waylineOpt.isEmpty()) { throw new SQLException(waylineId + " does not exist."); } return ossService.getObjectUrl(OssConfiguration.bucket, waylineOpt.get().getObjectKey()); } @Override public Optional<GetWaylineListResponse> getWaylineByWaylineId(String workspaceId, String waylineId) { return Optional.ofNullable( this.entityConvertToDTO( mapper.selectOne( new LambdaQueryWrapper<WaylineFileEntity>() .eq(WaylineFileEntity::getWorkspaceId, workspaceId) .eq(WaylineFileEntity::getWaylineId, waylineId)))); }
-
获取重复的航线文件名称
DJI Pilot 2在本地编辑和上传的航线文件中,不允许有重复的航线名称存在,所以在上传航线文件时,需要先调用该接口,检查是否存在重复的航线文件名称,如果存在重复的航线文件名称,则会弹窗提示用户重命名航线文件名称。
com.zdjjrj.wayline.controller.WaylineFileController#getDuplicatedWaylineName@Override public HttpResultResponse<List<String>> getDuplicatedWaylineName(String workspaceId, @NotNull @Size(min = 1) List<String> names, HttpServletRequest req, HttpServletResponse rsp) { List<String> existNamesList = waylineFileService.getDuplicateNames(workspaceId, names); return HttpResultResponse.success(existNamesList); }
com.zdjjrj.wayline.service.impl.WaylineFileServiceImpl#getDuplicateNames
@Override public List<String> getDuplicateNames(String workspaceId, List<String> names) { return mapper.selectList(new LambdaQueryWrapper<WaylineFileEntity>() .eq(WaylineFileEntity::getWorkspaceId, workspaceId) .in(WaylineFileEntity::getName, names)) .stream() .map(WaylineFileEntity::getName) .collect(Collectors.toList()); }
-
航线文件上传结果上报
航线文件上传到对象存储服务以后,DJI Pilot 2会把上传结果上报给服务端,服务端对该结果进行相应的业务操作。
com.zdjjrj.wayline.controller.WaylineFileController#fileUploadResultReport@Override public HttpResultResponse fileUploadResultReport(String workspaceId, @Valid WaylineUploadCallbackRequest request, HttpServletRequest req, HttpServletResponse rsp) { CustomClaim customClaim = (CustomClaim)req.getAttribute(TOKEN_CLAIM); WaylineUploadCallbackMetadata metadata = request.getMetadata(); WaylineFileDTO file = WaylineFileDTO.builder() .username(customClaim.getUsername()) .objectKey(request.getObjectKey()) .name(request.getName()) .templateTypes(metadata.getTemplateTypes().stream().map(WaylineTypeEnum::getValue).collect(Collectors.toList())) .payloadModelKeys(metadata.getPayloadModelKeys().stream().map(DeviceEnum::getDevice).collect(Collectors.toList())) .droneModelKey(metadata.getDroneModelKey().getDevice()) .build(); int id = waylineFileService.saveWaylineFile(workspaceId, file); return id <= 0 ? HttpResultResponse.error() : HttpResultResponse.success(); }
-
当用户需要特别关注某几个航线文件时,可以点击收藏,同时,通过该接口可以标记需要收藏的航线文件与该用户的绑定关系。
com.zdjjrj.wayline.controller.WaylineFileController#batchFavoritesWayline@Override public HttpResultResponse batchFavoritesWayline(String workspaceId, @NotNull @Size(min = 1) List<String> ids, HttpServletRequest req, HttpServletResponse rsp) { boolean isMark = waylineFileService.markFavorite(workspaceId, ids, true); return isMark ? HttpResultResponse.success() : HttpResultResponse.error(); }
-
批量取消收藏航线文件
同上功能,取消航线文件与用户的收藏绑定关系。
com.zdjjrj.wayline.controller.WaylineFileController#batchUnfavoritesWayline@Override public HttpResultResponse batchUnfavoritesWayline(String workspaceId, @NotNull @Size(min = 1) List<String> ids, HttpServletRequest req, HttpServletResponse rsp) { boolean isMark = waylineFileService.markFavorite(workspaceId, ids, false); return isMark ? HttpResultResponse.success() : HttpResultResponse.error(); }