src/main/java/com/dji/sample/control/model/enums/RemoteDebugMethodEnum.java
@@ -51,7 +51,7 @@ CHARGE_CLOSE("charge_close", true, null), BATTERY_MAINTENANCE_SWITCH("battery_maintenance_switch", true, AlarmState.class), ALARM_STATE_SWITCH("alarm_state_switch", true, AlarmState.class), BATTERY_STORE_MODE_SWITCH("battery_store_mode_switch", true, BatteryStoreMode.class), src/main/java/com/dji/sample/media/controller/FileController.java
@@ -8,6 +8,7 @@ import com.dji.sample.media.model.MediaFileEntity; import com.dji.sample.media.model.MediaFileQueryParam; import com.dji.sample.media.service.IFileService; import com.dji.sample.media.util.ImageDownloaderAndCompressor; import com.drew.imaging.ImageProcessingException; import org.apache.ibatis.annotations.Update; import org.springframework.beans.factory.annotation.Autowired; @@ -15,14 +16,18 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import java.awt.*; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM; import static com.dji.sample.media.util.ImageDownloaderAndCompressor.*; /** * @author sean @@ -65,15 +70,15 @@ @RequestParam(name = "page_size", defaultValue = "10") int pageSize, @PathVariable(name = "workspace_id") String workspaceId ) { return ResponseResult.success(fileService.getPhotoByJobId(page,pageSize,workspaceId, jobId)); return ResponseResult.success(fileService.getPhotoByJobId(page, pageSize, workspaceId, jobId)); } @GetMapping("/{workspace_id}/getJobIds") public ResponseResult getJobIds(@PathVariable(name = "workspace_id") String workspaceId, @RequestParam(defaultValue = "1") int page, @RequestParam(name = "page_size", defaultValue = "10") int pageSize ) { return ResponseResult.success(fileService.getJobId(page,pageSize,workspaceId)); ) { return ResponseResult.success(fileService.getJobId(page, pageSize, workspaceId)); } @PutMapping("/examine") @@ -165,4 +170,24 @@ e.printStackTrace(); } } } private static final String BASE_URL = "http://dev.jxpskj.com:9000/cloud-bucket"; @GetMapping("/download-images") public void downloadImages(@RequestParam String jobId, HttpServletResponse response) { List<MediaFileEntity> entities = fileService.getMedia(jobId); List<String> urls = entities.stream() .map(MediaFileEntity::getObjectKey) .map(objectKey -> BASE_URL + objectKey) .collect(Collectors.toList()); String outputFolder = "images"; // 存放图片的文件夹 new File(outputFolder).mkdirs(); // 创建文件夹 downloadAndSaveImages(urls, outputFolder); zipAndSendFolder(outputFolder, response); cleanUp(outputFolder); } } src/main/java/com/dji/sample/media/service/IFileService.java
@@ -55,6 +55,7 @@ * @return */ Object mediaInfo(String fileId); List<MediaFileEntity> getMedia(String jobId); /** * Query information about all files in this workspace based on the workspace id. * src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
@@ -112,10 +112,12 @@ MediaFileEntity fileEntity = this.fileUploadConvertToEntity(file); fileEntity.setWorkspaceId(workspaceId); fileEntity.setFileId(UUID.randomUUID().toString()); if (!file.getObjectKey().endsWith(".mp4")){ String url = pojo.getEndpoint() + "/" + pojo.getBucket() + file.getObjectKey(); File file1 = TbFjServiceImpl.downloadFile(url); Object data = ImgUtil.getInfo(file1); fileEntity.setDroneData(data); } return mapper.insert(fileEntity); } @@ -787,8 +789,8 @@ e.printStackTrace(); } } public PaginationData<MediaFileEntity> getJobId( int pageNum, int pageSize,String workspaceId) { @Override public PaginationData<MediaFileEntity> getJobId(int pageNum, int pageSize, String workspaceId) { // 分页查询 Page<MediaFileEntity> page = new Page<>(pageNum, pageSize); Page<MediaFileEntity> resultPage = mapper.selectPage(page, new LambdaQueryWrapper<MediaFileEntity>() @@ -810,14 +812,26 @@ List<MediaFileEntity> uniqueFiles = new ArrayList<>(uniqueFilesMap.values()); // 使用分页对象构造 Pagination Pagination pagination = new Pagination(resultPage); return new PaginationData<>(uniqueFiles, pagination); // 使用去重后的列表重新计算总数 int uniqueTotal = uniqueFiles.size(); // 创建新的分页对象,使用去重后的总数 Page<MediaFileEntity> uniquePage = new Page<>(pageNum, pageSize, uniqueTotal); // 截取当前页的数据 int fromIndex = Math.min((pageNum - 1) * pageSize, uniqueTotal); int toIndex = Math.min(fromIndex + pageSize, uniqueTotal); List<MediaFileEntity> pagedUniqueFiles = uniqueFiles.subList(fromIndex, toIndex); // 使用新的分页对象构造 Pagination Pagination pagination = new Pagination(uniquePage); return new PaginationData<>(pagedUniqueFiles, pagination); } @Override public PaginationData<MediaFileEntity> getPhotoByJobId(int pageNum,int pageSize,String workspaceId, String jobId) { public PaginationData<MediaFileEntity> getPhotoByJobId(int pageNum, int pageSize, String workspaceId, String jobId) { // 分页查询 Page<MediaFileEntity> page = new Page<>(pageNum, pageSize); @@ -837,13 +851,28 @@ List<MediaFileEntity> uniqueFiles = new ArrayList<>(uniqueFilesMap.values()); // 使用分页对象构造 Pagination Pagination pagination = new Pagination(resultPage); return new PaginationData<>(uniqueFiles, pagination); // 使用去重后的列表重新计算总数 int uniqueTotal = uniqueFiles.size(); // 创建新的分页对象,使用去重后的总数 Page<MediaFileEntity> uniquePage = new Page<>(pageNum, pageSize, uniqueTotal); // 截取当前页的数据 int fromIndex = Math.min((pageNum - 1) * pageSize, uniqueTotal); int toIndex = Math.min(fromIndex + pageSize, uniqueTotal); List<MediaFileEntity> pagedUniqueFiles = uniqueFiles.subList(fromIndex, toIndex); // 使用新的分页对象构造 Pagination Pagination pagination = new Pagination(uniquePage); return new PaginationData<>(pagedUniqueFiles, pagination); } public List<MediaFileEntity> getMedia(String jobId){ return mapper.selectList(new LambdaQueryWrapper<MediaFileEntity>().eq(MediaFileEntity::getJobId,jobId)); } public void updateById(Integer id, MediaFileMarkEntity entity) { entity.setIsadd(1); UpdateWrapper<MediaFileMarkEntity> updateWrapper = new UpdateWrapper<>(); src/main/java/com/dji/sample/media/util/ImageDownloaderAndCompressor.java
New file @@ -0,0 +1,103 @@ package com.dji.sample.media.util; import java.awt.image.BufferedImage; import java.io.*; import java.net.URL; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; public class ImageDownloaderAndCompressor { public static void downloadAndSaveImages(List<String> urls, String outputFolder) { int count = 0; for (String imageUrl : urls) { try { // 下载图片 URL url = new URL(imageUrl); BufferedImage image = ImageIO.read(url); // 保存图片 File outputfile = new File(outputFolder, "image_" + (count++) + ".jpg"); ImageIO.write(image, "jpg", outputfile); System.out.println("Saved: " + outputfile.getAbsolutePath()); } catch (IOException e) { System.err.println("Failed to download image: " + imageUrl); e.printStackTrace(); } } } public static void zipAndSendFolder(String folderName, HttpServletResponse response) { try { File zipFile = new File(folderName + ".zip"); zipFolder(folderName, zipFile.getPath()); // 设置响应头 response.setContentType("application/zip"); response.setHeader("Content-Disposition", "attachment; filename=" + zipFile.getName()); response.setContentLength((int) zipFile.length()); // 将压缩文件写入响应 try (InputStream is = new FileInputStream(zipFile); OutputStream os = response.getOutputStream()) { byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); } } // 删除临时压缩文件 zipFile.delete(); } catch (IOException e) { System.err.println("Failed to compress or send folder: " + folderName); e.printStackTrace(); } } public static void zipFolder(String srcFolder, String destZipFile) throws IOException { try (FileOutputStream fos = new FileOutputStream(destZipFile); ZipOutputStream zos = new ZipOutputStream(fos)) { File srcFile = new File(srcFolder); for (File file : srcFile.listFiles()) { try (FileInputStream fis = new FileInputStream(file)) { ZipEntry zipEntry = new ZipEntry(file.getName()); zos.putNextEntry(zipEntry); byte[] bytes = new byte[1024]; int length; while ((length = fis.read(bytes)) >= 0) { zos.write(bytes, 0, length); } zos.closeEntry(); } } } } public static void cleanUp(String folderName) { File folder = new File(folderName); deleteFolder(folder); } public static void deleteFolder(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { deleteFolder(f); } else { f.delete(); } } } folder.delete(); } } src/main/java/com/dji/sample/media/util/UnZipPhotoUtil.java
New file @@ -0,0 +1,80 @@ package com.dji.sample.media.util; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.util.List; import java.util.Objects; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class UnZipPhotoUtil { public static void downloadAndSaveImages(List<String> urls, String outputFolder) throws IOException { int count = 0; for (String imageUrl : urls) { try { // 下载图片 URL url = new URL(imageUrl); BufferedImage image = ImageIO.read(url); // 保存图片 File outputfile = new File(outputFolder, "image_" + (count++) + ".jpg"); ImageIO.write(image, "jpg", outputfile); System.out.println("Saved: " + outputfile.getAbsolutePath()); } catch (IOException e) { System.err.println("Failed to download image: " + imageUrl); e.printStackTrace(); throw e; } } } public static void zipFolder(String srcFolder, String destZipFile) throws IOException { try (FileOutputStream fos = new FileOutputStream(destZipFile); ZipOutputStream zos = new ZipOutputStream(fos)) { File srcFile = new File(srcFolder); for (File file : Objects.requireNonNull(srcFile.listFiles())) { try (FileInputStream fis = new FileInputStream(file)) { ZipEntry zipEntry = new ZipEntry(file.getName()); zos.putNextEntry(zipEntry); byte[] bytes = new byte[1024]; int length; while ((length = fis.read(bytes)) >= 0) { zos.write(bytes, 0, length); } zos.closeEntry(); } catch (IOException e) { System.err.println("Failed to zip file: " + file.getPath()); e.printStackTrace(); throw e; } } } } public static void cleanUp(String folderName) { File folder = new File(folderName); deleteFolder(folder); } public static void deleteFolder(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { deleteFolder(f); } else { f.delete(); } } } folder.delete(); } } src/main/java/com/dji/sample/patches/controller/PatchesController.java
@@ -143,7 +143,7 @@ @RequestParam String patchesId, @RequestParam double lat, @RequestParam double lon, @RequestParam String isTemp, @RequestParam(defaultValue = "1",required = false) String isTemp, HttpServletRequest request) throws IOException { CustomClaim customClaim = (CustomClaim) request.getAttribute(TOKEN_CLAIM); String creator = customClaim.getUsername(); @@ -165,7 +165,7 @@ @GetMapping("/useMyTask") public ResponseResult useMyTask() throws Exception { try { TimerUtil.mytask10(); // TimerUtil.mytask10(); // timerUtil.myTask2(); // timerUtil.myTask3(); // timerUtil.mytask4(); src/main/java/com/dji/sample/patches/utils/TimerUtil.java
@@ -142,100 +142,100 @@ // waylineJobService.publishOneFlightTask(waylineJobDTO.get()); // } // } @Scheduled(cron = "0 0 1 * * ?") public void mytask4() throws IOException { Long time = getCurrentTimestampPlus8Hours(8); List<List<Long>> listOfLists = new ArrayList<>(); List<Long> sublist = new ArrayList<>(); sublist.add(time); // 添加整数值 listOfLists.add(sublist); List<Long> lists1 = new ArrayList<>(); lists1.add(time); String times = convertTimestampToFormattedString(time); sendPostWithParameters("别墅巡查一段", "2a44748a-1500-406f-80cf-ad92186fe8d2", times, lists1, listOfLists); } @Scheduled(cron = "0 50 0 * * ?") public void mytask5() throws IOException { Long time = getCurrentTimestampPlus8Hours(9); List<List<Long>> listOfLists = new ArrayList<>(); List<Long> sublist = new ArrayList<>(); sublist.add(time); // 添加整数值 listOfLists.add(sublist); List<Long> lists1 = new ArrayList<>(); lists1.add(time); String times = convertTimestampToFormattedString(time); sendPostWithParameters("别墅巡查二段", "a07229af-471a-4058-9da6-5a2b84308b9e", times, lists1, listOfLists); } @Scheduled(cron = "0 40 1 * * ?") public void mytask6() throws IOException { Long time = getCurrentTimestampPlus8Hours(9); List<List<Long>> listOfLists = new ArrayList<>(); List<Long> sublist = new ArrayList<>(); sublist.add(time); // 添加整数值 listOfLists.add(sublist); List<Long> lists1 = new ArrayList<>(); lists1.add(time); String times = convertTimestampToFormattedString(time); sendPostWithParameters("九洲巡河一段", "9f471686-a73a-4e90-8f37-92eed8ed5929", times, lists1, listOfLists); } @Scheduled(cron = "0 40 2 * * ?") public void mytask7() throws IOException { Long time = getCurrentTimestampPlus8Hours(9); List<List<Long>> listOfLists = new ArrayList<>(); List<Long> sublist = new ArrayList<>(); sublist.add(time); // 添加整数值 listOfLists.add(sublist); List<Long> lists1 = new ArrayList<>(); lists1.add(time); String times = convertTimestampToFormattedString(time); sendPostWithParameters("九洲巡河二段", "58cd4261-02d7-4c4e-b876-25a4a2630c18", times, lists1, listOfLists); } @Scheduled(cron = "0 30 2 * * ?") public void mytask8() throws IOException { Long time = getCurrentTimestampPlus8Hours(12); List<List<Long>> listOfLists = new ArrayList<>(); List<Long> sublist = new ArrayList<>(); sublist.add(time); // 添加整数值 listOfLists.add(sublist); List<Long> lists1 = new ArrayList<>(); lists1.add(time); String times = convertTimestampToFormattedString(time); sendPostWithParameters("定时任务2:30", "c3a7b125-bc0b-49d4-96ed-80743200ab80", times, lists1, listOfLists); } @Scheduled(cron = "0 30 2 * * ?") public void mytask9() throws IOException { Long time = getCurrentTimestampPlus8Hours(14); List<List<Long>> listOfLists = new ArrayList<>(); List<Long> sublist = new ArrayList<>(); sublist.add(time); // 添加整数值 listOfLists.add(sublist); List<Long> lists1 = new ArrayList<>(); lists1.add(time); String times = convertTimestampToFormattedString(time); sendPostWithParameters("定时任务4:30", "c3a7b125-bc0b-49d4-96ed-80743200ab80", times, lists1, listOfLists); } @Scheduled(cron = "0 0 6 * * ?") public static void mytask10() { File directory = new File("/tmp"); String[] partialFileNames = {"temp", "mark"}; // 要匹配的部分文件名 if (directory.isDirectory()) { File[] files = directory.listFiles(); if (files != null) { for (File file : files) { for (String partialFileName : partialFileNames) { if (file.isFile() && file.getName().contains(partialFileName)) { file.delete(); break; // 跳出内层循环,以免重复删除同一个文件 } } } } } } // @Scheduled(cron = "0 0 1 * * ?") // public void mytask4() throws IOException { // Long time = getCurrentTimestampPlus8Hours(8); // List<List<Long>> listOfLists = new ArrayList<>(); // List<Long> sublist = new ArrayList<>(); // sublist.add(time); // 添加整数值 // listOfLists.add(sublist); // List<Long> lists1 = new ArrayList<>(); // lists1.add(time); // String times = convertTimestampToFormattedString(time); // sendPostWithParameters("别墅巡查一段", "2a44748a-1500-406f-80cf-ad92186fe8d2", times, lists1, listOfLists); // } // // @Scheduled(cron = "0 50 0 * * ?") // public void mytask5() throws IOException { // Long time = getCurrentTimestampPlus8Hours(9); // List<List<Long>> listOfLists = new ArrayList<>(); // List<Long> sublist = new ArrayList<>(); // sublist.add(time); // 添加整数值 // listOfLists.add(sublist); // List<Long> lists1 = new ArrayList<>(); // lists1.add(time); // String times = convertTimestampToFormattedString(time); // sendPostWithParameters("别墅巡查二段", "a07229af-471a-4058-9da6-5a2b84308b9e", times, lists1, listOfLists); // } // // @Scheduled(cron = "0 40 1 * * ?") // public void mytask6() throws IOException { // Long time = getCurrentTimestampPlus8Hours(9); // List<List<Long>> listOfLists = new ArrayList<>(); // List<Long> sublist = new ArrayList<>(); // sublist.add(time); // 添加整数值 // listOfLists.add(sublist); // List<Long> lists1 = new ArrayList<>(); // lists1.add(time); // String times = convertTimestampToFormattedString(time); // sendPostWithParameters("九洲巡河一段", "9f471686-a73a-4e90-8f37-92eed8ed5929", times, lists1, listOfLists); // } // // @Scheduled(cron = "0 40 2 * * ?") // public void mytask7() throws IOException { // Long time = getCurrentTimestampPlus8Hours(9); // List<List<Long>> listOfLists = new ArrayList<>(); // List<Long> sublist = new ArrayList<>(); // sublist.add(time); // 添加整数值 // listOfLists.add(sublist); // List<Long> lists1 = new ArrayList<>(); // lists1.add(time); // String times = convertTimestampToFormattedString(time); // sendPostWithParameters("九洲巡河二段", "58cd4261-02d7-4c4e-b876-25a4a2630c18", times, lists1, listOfLists); // } // // @Scheduled(cron = "0 30 2 * * ?") // public void mytask8() throws IOException { // Long time = getCurrentTimestampPlus8Hours(12); // List<List<Long>> listOfLists = new ArrayList<>(); // List<Long> sublist = new ArrayList<>(); // sublist.add(time); // 添加整数值 // listOfLists.add(sublist); // List<Long> lists1 = new ArrayList<>(); // lists1.add(time); // String times = convertTimestampToFormattedString(time); // sendPostWithParameters("定时任务2:30", "c3a7b125-bc0b-49d4-96ed-80743200ab80", times, lists1, listOfLists); // } // @Scheduled(cron = "0 30 2 * * ?") // public void mytask9() throws IOException { // Long time = getCurrentTimestampPlus8Hours(14); // List<List<Long>> listOfLists = new ArrayList<>(); // List<Long> sublist = new ArrayList<>(); // sublist.add(time); // 添加整数值 // listOfLists.add(sublist); // List<Long> lists1 = new ArrayList<>(); // lists1.add(time); // String times = convertTimestampToFormattedString(time); // sendPostWithParameters("定时任务4:30", "c3a7b125-bc0b-49d4-96ed-80743200ab80", times, lists1, listOfLists); // } // @Scheduled(cron = "0 0 6 * * ?") // public static void mytask10() { // File directory = new File("/tmp"); // String[] partialFileNames = {"temp", "mark"}; // 要匹配的部分文件名 // if (directory.isDirectory()) { // File[] files = directory.listFiles(); // if (files != null) { // for (File file : files) { // for (String partialFileName : partialFileNames) { // if (file.isFile() && file.getName().contains(partialFileName)) { // file.delete(); // break; // 跳出内层循环,以免重复删除同一个文件 // } // } // } // } // } // } /** * 完成对未推送的图斑数据进行整合发送 * src/main/java/com/dji/sample/wayline/controller/WaylineFileController.java
@@ -230,14 +230,14 @@ public ResponseResult importKmzFile(@PathVariable(name = "workspace_id") String workspaceId, HttpServletRequest request, MultipartFile file, @RequestParam(required = false) String patchesId, @RequestParam(defaultValue = "1") String isTemp @RequestParam(defaultValue = "1",required = false) String isTemp ) { 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, isTemp); String back = waylineFileService.importKmzFile(file, workspaceId, creator, patchesId,isTemp); if (back != null) { return ResponseResult.error(back); } src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java
@@ -78,7 +78,7 @@ @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_FLIGHT_TASK_PROGRESS, outputChannel = ChannelName.OUTBOUND_EVENTS) public CommonTopicReceiver handleProgress(CommonTopicReceiver receiver, MessageHeaders headers) { log.info("上报航线任务进度: {}", receiver.toString()); EventsReceiver<WaylineTaskProgressReceiver> eventsReceiver = mapper.convertValue(receiver.getData(), EventsReceiver<WaylineTaskProgressReceiver> eventsReceiver = mapper.convertValue(receiver.getData(), new TypeReference<EventsReceiver<WaylineTaskProgressReceiver>>(){}); eventsReceiver.setBid(receiver.getBid()); eventsReceiver.setSn(receiver.getGateway()); src/main/java/com/dji/sample/wayline/service/impl/WaylineFileServiceImpl.java
@@ -155,7 +155,7 @@ } @Override public Integer saveWaylineFiles(String workspaceId, WaylineFileDTO metadata, String patchesId, String isTemp) { public Integer saveWaylineFiles(String workspaceId, WaylineFileDTO metadata, String patchesId,String isTemp) { metadata.setPatchesId(patchesId); WaylineFileEntity file = this.dtoConvertToEntity(metadata); file.setWaylineId(UUID.randomUUID().toString()); @@ -219,7 +219,7 @@ } @Override public String importKmzFile(MultipartFile file, String workspaceId, String creator, String patchesId, String isTemp) { public String importKmzFile(MultipartFile file, String workspaceId, String creator, String patchesId,String isTemp) { Optional<WaylineFileDTO> waylineFileOpt = validKmzFile(file); if (waylineFileOpt.isEmpty()) { throw new RuntimeException("文件格式错误"); @@ -232,7 +232,7 @@ waylineFile.setIsTemp(isTemp); back = ossService.putObject(OssConfiguration.bucket, waylineFile.getObjectKey(), file.getInputStream()); if (back == null) { this.saveWaylineFiles(workspaceId, waylineFile, patchesId, isTemp); this.saveWaylineFiles(workspaceId, waylineFile, patchesId,isTemp); } } catch (IOException e) { e.printStackTrace(); src/main/resources/application-dev.yml
@@ -85,15 +85,15 @@ oss: enable: true provider: minio endpoint: http://139.196.74.78:9000 external-endpoint: http://139.196.74.78:9000 access-key: sxkj secret-key: sxkj2024 endpoint: http://dev.jxpskj.com:9000 external-endpoint: http://dev.jxpskj.com:9000 access-key: pskj secret-key: pskj@2021 bucket: cloud-bucket expire: 3600 region: us-east-1 object-dir-prefix: out-net-file-address: https://wrj.shuixiongit.com/minio out-net-file-address: https://dev.jxpskj.com:8026 #图斑的解压地址和图斑文件转航线文件的地址 patches: