rain
2024-08-20 74d1c21ebb6b3b916904d95d13d289df23dcdedd
src/main/java/com/dji/sample/wayline/service/impl/WaylineFileServiceImpl.java
@@ -28,7 +28,6 @@
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
@@ -52,7 +51,6 @@
    @Autowired
    private IWaylineFileMapper mapper;
    @Autowired
    private OssServiceContext ossService;
@@ -64,10 +62,10 @@
                new LambdaQueryWrapper<WaylineFileEntity>()
                        .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                        .eq(param.isFavorited(), WaylineFileEntity::getFavorited, param.isFavorited())
                        .and(param.getTemplateType() != null, wrapper ->  {
                                for (Integer type : param.getTemplateType()) {
                                    wrapper.like(WaylineFileEntity::getTemplateTypes, type).or();
                                }
                        .and(param.getTemplateType() != null, wrapper -> {
                            for (Integer type : param.getTemplateType()) {
                                wrapper.like(WaylineFileEntity::getTemplateTypes, type).or();
                            }
                        })
                        // There is a risk of SQL injection
                        .last(StringUtils.hasText(param.getOrderBy()), " order by " + param.getOrderBy()));
@@ -82,14 +80,49 @@
    }
    @Override
    public PaginationData<WaylineFileDTO> getShowWaylinesByParam(String workspaceId, WaylineQueryParam param) {
        // Paging Query
        Page<WaylineFileEntity> page = mapper.selectPage(
                new Page<WaylineFileEntity>(param.getPage(), param.getPageSize()),
                new LambdaQueryWrapper<WaylineFileEntity>()
                        .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                        .eq(WaylineFileEntity::getIsTemp,1)
                        .eq(param.isFavorited(), WaylineFileEntity::getFavorited, param.isFavorited())
                        .and(param.getTemplateType() != null, wrapper -> {
                            for (Integer type : param.getTemplateType()) {
                                wrapper.like(WaylineFileEntity::getTemplateTypes, type).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<WaylineFileDTO> records = page.getRecords()
                .stream()
                .map(this::entityConvertToDTO)
                .collect(Collectors.toList());
        return new PaginationData<>(records, new Pagination(page));
    }
    @Override
    public String getPatchesId(String waylineId) {
        WaylineFileEntity entity = mapper.selectOne(new LambdaQueryWrapper<WaylineFileEntity>()
                .eq(WaylineFileEntity::getWaylineId, waylineId));
        return entity.getPatchesId();
    }
    @Override
    public Optional<WaylineFileDTO> getWaylineByWaylineId(String workspaceId, String waylineId) {
        return Optional.ofNullable(
                this.entityConvertToDTO(
                        mapper.selectOne(
                                new LambdaQueryWrapper<WaylineFileEntity>()
                                    .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                                    .eq(WaylineFileEntity::getWaylineId, waylineId))));
                                        .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                                        .eq(WaylineFileEntity::getWaylineId, waylineId))));
    }
    @Override
    public URL getObjectUrl(String workspaceId, String waylineId) throws SQLException {
@@ -105,7 +138,7 @@
        WaylineFileEntity file = this.dtoConvertToEntity(metadata);
        file.setWaylineId(UUID.randomUUID().toString());
        file.setWorkspaceId(workspaceId);
        file.setWaylineType(metadata.getWaylineType());
        if (!StringUtils.hasText(file.getSign())) {
            try (InputStream object = ossService.getObject(OssConfiguration.bucket, metadata.getObjectKey())) {
                if (object.available() == 0) {
@@ -120,6 +153,30 @@
        int insertId = mapper.insert(file);
        return insertId > 0 ? file.getId() : insertId;
    }
    @Override
    public Integer saveWaylineFiles(String workspaceId, WaylineFileDTO metadata, String patchesId,String isTemp,int waylineType) {
        metadata.setPatchesId(patchesId);
        WaylineFileEntity file = this.dtoConvertToEntity(metadata);
        file.setWaylineId(UUID.randomUUID().toString());
        file.setWorkspaceId(workspaceId);
        file.setIsTemp(isTemp);
        file.setWaylineType(waylineType);
        if (!StringUtils.hasText(file.getSign())) {
            try (InputStream object = ossService.getObject(OssConfiguration.bucket, metadata.getObjectKey())) {
                if (object.available() == 0) {
                    throw new RuntimeException("文件" + metadata.getObjectKey() +
                            " 在空间中不存在[" + OssConfiguration.bucket + "].");
                }
                file.setSign(DigestUtils.md5DigestAsHex(object));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        int insertId = mapper.insert(file);
        return insertId > 0 ? file.getId() : insertId;
    }
    @Override
    public Boolean markFavorite(String workspaceId, List<String> waylineIds, Boolean isFavorite) {
@@ -138,8 +195,8 @@
    @Override
    public List<String> getDuplicateNames(String workspaceId, List<String> names) {
        return mapper.selectList(new LambdaQueryWrapper<WaylineFileEntity>()
                .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                .in(WaylineFileEntity::getName, names))
                        .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                        .in(WaylineFileEntity::getName, names))
                .stream()
                .map(WaylineFileEntity::getName)
                .collect(Collectors.toList());
@@ -153,8 +210,8 @@
        }
        WaylineFileDTO wayline = waylineOpt.get();
        boolean isDel = mapper.delete(new LambdaUpdateWrapper<WaylineFileEntity>()
                    .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                    .eq(WaylineFileEntity::getWaylineId, waylineId))
                .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                .eq(WaylineFileEntity::getWaylineId, waylineId))
                > 0;
        if (!isDel) {
            return false;
@@ -163,33 +220,83 @@
    }
    @Override
    public void importKmzFile(MultipartFile file, String workspaceId, String creator) {
    public String importKmzFile(MultipartFile file, String workspaceId, String creator, String patchesId,String isTemp,int waylineType) {
        Optional<WaylineFileDTO> waylineFileOpt = validKmzFile(file);
        if (waylineFileOpt.isEmpty()) {
            throw new RuntimeException("文件格式错误");
        }
        String back = null;
        try {
            WaylineFileDTO waylineFile = waylineFileOpt.get();
            waylineFile.setWaylineId(workspaceId);
            waylineFile.setUsername(creator);
            waylineFile.setIsTemp(isTemp);
            waylineFile.setWaylineType(waylineType);
            back = ossService.putObject(OssConfiguration.bucket, waylineFile.getObjectKey(), file.getInputStream());
            if (back == null) {
                this.saveWaylineFiles(workspaceId, waylineFile, patchesId,isTemp, waylineType);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return back;
    }
    @Override
    public WaylineFileDTO importKmzFileBack(MultipartFile file, String workspaceId, String creator,int waylineType) {
        WaylineFileDTO waylineFile = null;
        Optional<WaylineFileDTO> waylineFileOpt = validKmzFile(file);
        if (waylineFileOpt.isEmpty()) {
            throw new RuntimeException("文件格式错误");
        }
        try {
            WaylineFileDTO waylineFile = waylineFileOpt.get();
            waylineFile = waylineFileOpt.get();
            waylineFile.setWaylineId(workspaceId);
            waylineFile.setUsername(creator);
            waylineFile.setWaylineType(waylineType);
            ossService.putObject(OssConfiguration.bucket, waylineFile.getObjectKey(), file.getInputStream());
            this.saveWaylineFile(workspaceId, waylineFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return waylineFile;
    }
    @Override
    public WaylineFileDTO importPlaneKmzFile(MultipartFile file, String workspaceId, String creator,String newName,String id,int waylineType) {
        WaylineFileDTO waylineFile = null;
        Optional<WaylineFileDTO> waylineFileOpt = validKmzFile(file);
        if (waylineFileOpt.isEmpty()) {
            throw new RuntimeException("文件格式错误");
        }
        try {
            waylineFile = waylineFileOpt.get();
            waylineFile.setWaylineId(workspaceId);
            waylineFile.setUsername(creator);
            ossService.putObject(OssConfiguration.bucket, waylineFile.getObjectKey(), file.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return waylineFile;
    }
    @Override
    public List<WaylineListDTO> waylineList(String workspaceId,String droneName) {
    public WaylineFileEntity selectByName(String name) {
        return mapper.selectOne(new LambdaQueryWrapper<WaylineFileEntity>().eq(WaylineFileEntity::getName, name));
    }
    @Override
    public List<WaylineListDTO> waylineList(String workspaceId, String droneName) {
        LambdaQueryChainWrapper<WaylineFileEntity> wrapper =
                new LambdaQueryChainWrapper<>(mapper).eq(WaylineFileEntity::getWorkspaceId, workspaceId);
        if (StringUtils.hasText(droneName)){
            wrapper.like(WaylineFileEntity::getName,droneName);
        if (StringUtils.hasText(droneName)) {
            wrapper.like(WaylineFileEntity::getName, droneName);
        }
        return  wrapper.list().stream().map(r -> WaylineListDTO.builder().waylineFileId(r.getWaylineId()).name(r.getName()).build())
        return wrapper.list().stream().map(r -> WaylineListDTO.builder().waylineFileId(r.getWaylineId()).name(r.getName()).build())
                .collect(Collectors.toList());
    }
@@ -233,7 +340,7 @@
                return Optional.of(WaylineFileDTO.builder()
                        .droneModelKey(String.format("%s-%s-%s", DeviceDomainEnum.SUB_DEVICE.getVal(), type, subType))
                        .payloadModelKeys(List.of(String.format("%s-%s-%s",DeviceDomainEnum.PAYLOAD.getVal(), payloadType, payloadSubType)))
                        .payloadModelKeys(List.of(String.format("%s-%s-%s", DeviceDomainEnum.PAYLOAD.getVal(), payloadType, payloadSubType)))
//                        .objectKey(OssConfiguration.objectDirPrefix + File.separator + filename)
                        .objectKey(OssConfiguration.objectDirPrefix + "/" + filename)
                        .name(filename.substring(0, filename.lastIndexOf(WAYLINE_FILE_SUFFIX)))
@@ -247,8 +354,10 @@
        }
        return Optional.empty();
    }
    /**
     * Convert database entity objects into wayline data transfer object.
     *
     * @param entity
     * @return
     */
@@ -260,6 +369,7 @@
                .droneModelKey(entity.getDroneModelKey())
                .favorited(entity.getFavorited())
                .name(entity.getName())
                .patchesId(entity.getPatchesId())
                .payloadModelKeys(entity.getPayloadModelKeys() != null ?
                        Arrays.asList(entity.getPayloadModelKeys().split(",")) : null)
                .templateTypes(Arrays.stream(entity.getTemplateTypes().split(","))
@@ -276,6 +386,7 @@
    /**
     * Convert the received wayline object into a database entity object.
     *
     * @param file
     * @return
     */
@@ -294,9 +405,19 @@
                            .collect(Collectors.joining(",")))
                    .favorited(file.getFavorited())
                    .sign(file.getSign())
                    .patchesId(file.getPatchesId())
                    .spotInFreckle(file.getSpotInFreckle())
                    .build();
        }
        return builder.build();
    }
    @Override
    public int updateWayline(WaylineFileEntity entity) {
        return mapper.update(entity, new LambdaQueryWrapper<WaylineFileEntity>()
                .eq(WaylineFileEntity::getWaylineId, entity.getWaylineId()));
    }
}