From 67e380f8a481825084e6cf279a5de5adc9063136 Mon Sep 17 00:00:00 2001
From: rain <167982779@qq.com>
Date: Wed, 17 Apr 2024 09:36:34 +0800
Subject: [PATCH] 新增DB模块,将DB文件数据导入数据库,DB文件数据生成航线。新增成果展示,对图斑成果进行上传和删除。
---
src/main/java/com/dji/sample/patches/service/impl/GetPatchesServiceImpl.java | 34 ++
src/main/java/com/dji/sample/patches/service/ShpToDataSourceService.java | 17 +
src/main/java/com/dji/sample/territory/service/ITbDkjbxxService.java | 16 +
src/main/java/com/dji/sample/media/controller/FileController.java | 8
src/main/java/com/dji/sample/territory/controller/TbFjController.java | 40 +++
src/main/java/com/dji/sample/patches/utils/MultipartFileTOFileUtil.java | 22
src/main/java/com/dji/sample/territory/service/impl/TbDkjbxxServiceImpl.java | 110 +++++++++
src/main/java/com/dji/sample/patches/utils/ZipUtil.java | 31 --
src/main/java/com/dji/sample/territory/controller/TbDkjbxxController.java | 74 +++++
src/main/java/com/dji/sample/patches/service/GetPatchesService.java | 32 ++
src/main/resources/application-prod.yml | 2
src/main/java/com/dji/sample/territory/service/ITbFJService.java | 19 +
src/main/java/com/dji/sample/patches/controller/PatchesController.java | 52 +++
src/main/java/com/dji/sample/patches/service/impl/ShpToDataSourceServiceImpl.java | 39 +++
src/main/java/com/dji/sample/territory/service/impl/TbFjServiceImpl.java | 119 +++++++++
src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java | 5
/dev/null | 0
src/main/java/com/dji/sample/territory/dao/ITbDkjbxxMapper.java | 2
src/main/java/com/dji/sample/territory/dao/ITbFjMapper.java | 9
src/main/java/com/dji/sample/territory/model/entity/TbFjEntity.java | 38 +++
src/main/java/com/dji/sample/media/service/IFileService.java | 2
src/main/java/com/dji/sample/territory/model/entity/TbDkjbxxEntity.java | 25 ++
src/main/resources/application-dev.yml | 2
23 files changed, 638 insertions(+), 60 deletions(-)
diff --git a/src/main/java/com/dji/sample/media/controller/FileController.java b/src/main/java/com/dji/sample/media/controller/FileController.java
index 4834b0f..8ece8d7 100644
--- a/src/main/java/com/dji/sample/media/controller/FileController.java
+++ b/src/main/java/com/dji/sample/media/controller/FileController.java
@@ -55,7 +55,15 @@
mediaFileEntity.setUserId(claims.getId());
return ResponseResult.success(fileService.updateMediaFile(workspaceId, mediaFileEntity));
}
+ @DeleteMapping("/{workspace_id}/deleteFile")
+ public ResponseResult deleteFile(@PathVariable(name = "workspace_id") String workspaceId, @RequestParam String fileId) {
+ int count=fileService.deleteMedia(workspaceId, fileId);
+ if(count==0){
+ return ResponseResult.error("删除失败");
+ }
+ return ResponseResult.success();
+ }
/**
diff --git a/src/main/java/com/dji/sample/media/service/IFileService.java b/src/main/java/com/dji/sample/media/service/IFileService.java
index bc63bcd..6bdb865 100644
--- a/src/main/java/com/dji/sample/media/service/IFileService.java
+++ b/src/main/java/com/dji/sample/media/service/IFileService.java
@@ -73,4 +73,6 @@
* @return
*/
Boolean updateMediaFile(String workspaceId, MediaFileEntity mediaFileEntity);
+
+ int deleteMedia(String workspaceId, String fileId);
}
diff --git a/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java b/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
index 77272e0..72555d3 100644
--- a/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
+++ b/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
@@ -110,6 +110,11 @@
return new PaginationData<MediaFileEntity>(records, new Pagination(pageData));
}
+ public int deleteMedia(String workspaceId, String fileId) {
+ int count=mapper.delete(new LambdaUpdateWrapper<MediaFileEntity>().eq(MediaFileEntity::getFileId, fileId)
+ .eq(MediaFileEntity::getWorkspaceId, workspaceId));
+ return count;
+ }
@Override
public URL getObjectUrl(String workspaceId, String fileId) {
Optional<MediaFileEntity> mediaFileOpt = getMediaByFileId(workspaceId, fileId);
diff --git a/src/main/java/com/dji/sample/patches/controller/PatchesController.java b/src/main/java/com/dji/sample/patches/controller/PatchesController.java
index 1ac6321..61aea6a 100644
--- a/src/main/java/com/dji/sample/patches/controller/PatchesController.java
+++ b/src/main/java/com/dji/sample/patches/controller/PatchesController.java
@@ -9,7 +9,9 @@
import com.dji.sample.patches.model.Param.PatchesParam;
import com.dji.sample.patches.model.entity.LotInfo;
import com.dji.sample.patches.service.GetPatchesService;
+import com.dji.sample.patches.service.ShpToDataSourceService;
import com.dji.sample.patches.service.impl.ShpToDataSourceServiceImpl;
+import com.dji.sample.territory.service.impl.TbDkjbxxServiceImpl;
import com.dji.sample.wayline.model.entity.WaylineFileEntity;
import com.dji.sample.wayline.service.IWaylineFileService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -20,6 +22,7 @@
import java.net.URL;
import java.sql.SQLException;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM;
@@ -30,11 +33,20 @@
@Autowired
private GetPatchesService getPatchesService;
@Autowired
- private ShpToDataSourceServiceImpl shpToDataSourceServiceImpl;
+ private ShpToDataSourceService shpToDataSourceService;
@Autowired
private IWaylineFileService waylineFileService;
+ @Autowired
+ private TbDkjbxxServiceImpl tbDkjbxxService;
- //获取图斑信息
+ /**
+ * 根据workspaceId获取图斑列表信息
+ *
+ * @param page
+ * @param pageSize
+ * @param workspaceId
+ * @return
+ */
@GetMapping("/listPatches")
@SysLogAnnotation(operModul = "图斑", operType = "查询", operDesc = "查询图斑的全部信息")
public ResponseResult<PaginationData<LotInfo>> page(@RequestParam Integer page,
@@ -48,13 +60,28 @@
PaginationData<LotInfo> data = getPatchesService.limitGet(param);
return ResponseResult.success(data);
}
- //清空图斑文件
+
+ /**
+ * 删除图斑信息
+ * 本接口不需要接收任何参数,调用成功后会删除相应的补丁信息。
+ *
+ * @return 返回操作结果,如果操作成功,则返回一个成功的响应结果。
+ */
@DeleteMapping("/deletePatches")
public ResponseResult del() {
getPatchesService.delPatches();
return ResponseResult.success();
}
- //根据dkbh获取图斑图片
+
+ /**
+ * 根据图斑的地块编号获取相对应音视频
+ *
+ * @param page
+ * @param pageSize
+ * @param workspaceId
+ * @param dkbh
+ * @return
+ */
@GetMapping("/listPhoto")
public ResponseResult<PaginationData<MediaFileEntity>> GetPatchesPhoto(@RequestParam(name = "page", defaultValue = "1") Integer page,
@RequestParam(name = "page_size", defaultValue = "10") Integer pageSize,
@@ -72,7 +99,19 @@
return ResponseResult.error("未匹配到相关图片"); // 返回错误信息,可以根据实际情况自定义
}
}
- //上传图斑文件并返回航线
+
+ /**
+ * 上传图斑文件,解析文件并入库,再生成航线并返回
+ *
+ * @param file
+ * @param workspaceId
+ * @param waylineName
+ * @param airportLat
+ * @param airportLon
+ * @param request
+ * @return
+ * @throws Exception
+ */
@PostMapping("/uploadLot")
public ResponseResult getGeo(@RequestParam("file") MultipartFile file,
@RequestParam String workspaceId,
@@ -80,7 +119,7 @@
@RequestParam double airportLat,
@RequestParam double airportLon,
HttpServletRequest request) throws Exception {
- MultipartFile multipartFile = shpToDataSourceServiceImpl.insertGeo(file, workspaceId, waylineName, airportLat, airportLon);
+ MultipartFile multipartFile = shpToDataSourceService.insertGeo(file, workspaceId, waylineName, airportLat, airportLon);
CustomClaim customClaim = (CustomClaim) request.getAttribute(TOKEN_CLAIM);
String creator = customClaim.getUsername();
waylineFileService.importKmzFileBack(multipartFile, workspaceId, creator);
@@ -95,6 +134,5 @@
throw new RuntimeException(e);
}
return ResponseResult.success(infoMap);
-// return ResponseResult.success(MinioUrlUtils.getUrl(url));
}
}
diff --git a/src/main/java/com/dji/sample/patches/service/GetPatchesService.java b/src/main/java/com/dji/sample/patches/service/GetPatchesService.java
index 719be53..af8ef1a 100644
--- a/src/main/java/com/dji/sample/patches/service/GetPatchesService.java
+++ b/src/main/java/com/dji/sample/patches/service/GetPatchesService.java
@@ -5,8 +5,40 @@
import com.dji.sample.patches.model.Param.PatchesParam;
import com.dji.sample.patches.model.entity.LotInfo;
+import java.util.List;
+
public interface GetPatchesService {
+ /**
+ * 分页获取数据的接口实现。
+ * @param param 包含分页信息和查询条件的工作空间ID。
+ * @return 返回一个包含查询结果和分页信息的PaginationData对象。
+ */
PaginationData<LotInfo> limitGet(PatchesParam param);
void delPatches();
+
+ /**
+ * 根据条件获取照片的分页数据
+ *
+ * @param param 包含分页信息和查询条件的参数对象
+ * @param dkbh 查询条件中带有地块编号关键字,用于文件名的模糊搜索
+ * @return 返回照片的分页数据,包括分页信息和照片实体列表
+ */
PaginationData<MediaFileEntity> getPhoto(PatchesParam param,String dkbh);
+
+ /**
+ * 根据条件获取照片的分页数据
+ *
+ * @param workspaceId 工作空间的ID,用于指定查询的工作空间
+ * @param dkbh 查询条件中带有地块编号关键字,用于文件名的模糊搜索
+ * @return 返回照片的分页数据,包括分页信息和照片实体列表
+ */
+ List<MediaFileEntity> listPohto(String dkbh, String workspaceId);
+
+ /**
+ * 根据地块编号和工作空间ID获取地块信息。
+ * @param dkbh 地块编号,用于查询特定定单的地块信息。
+ * @param workspaceId 工作空间ID,用于查询属于特定工作空间的地块信息。
+ * @return 返回匹配给定地块编号和工作空间ID的地块信息对象。如果找不到匹配的记录,则返回null。
+ */
+ LotInfo getLotinfo(String dkbh,String workspaceId);
}
diff --git a/src/main/java/com/dji/sample/patches/service/ShpToDataSourceService.java b/src/main/java/com/dji/sample/patches/service/ShpToDataSourceService.java
index 253b5c8..99fd06b 100644
--- a/src/main/java/com/dji/sample/patches/service/ShpToDataSourceService.java
+++ b/src/main/java/com/dji/sample/patches/service/ShpToDataSourceService.java
@@ -1,6 +1,7 @@
package com.dji.sample.patches.service;
import com.dji.sample.patches.model.entity.LotInfo;
+import com.dji.sample.territory.model.entity.TbDkjbxxEntity;
import com.dji.sample.wayline.model.dto.WaylineFileDTO;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
@@ -13,6 +14,22 @@
import java.util.List;
public interface ShpToDataSourceService {
+
+ /**
+ * 上传图斑zip文件,解析内容入库,返回生成的航线
+ * @param file 图斑文件
+ * @param workspaceId 工作空间
+ * @param waylineName 航线名
+ * @param airportLat 机场纬度
+ * @param airportLon 机场经度
+ * @return 图斑生成的航线
+ * @throws Exception 处理过程中可能出现的任何异常
+ */
MultipartFile insertGeo(MultipartFile file , String workspaceId,String waylineName, double airportLat, double airportLon) throws Exception;
+ /**
+ * 将List<TbDkjbxxEntity>类型的数据批量插入到数据库中。
+ * @param list 需要保存到数据库的TbDkjbxxEntity实体列表。
+ */
+ void savaInMysql(List<TbDkjbxxEntity> list);
}
diff --git a/src/main/java/com/dji/sample/patches/service/impl/GetPatchesServiceImpl.java b/src/main/java/com/dji/sample/patches/service/impl/GetPatchesServiceImpl.java
index df577ca..fc1391d 100644
--- a/src/main/java/com/dji/sample/patches/service/impl/GetPatchesServiceImpl.java
+++ b/src/main/java/com/dji/sample/patches/service/impl/GetPatchesServiceImpl.java
@@ -24,6 +24,11 @@
@Autowired
private IFileMapper fileMapper;
+ /**
+ * 分页获取数据的接口实现。
+ * @param param 包含分页信息和查询条件的工作空间ID。
+ * @return 返回一个包含查询结果和分页信息的PaginationData对象。
+ */
@Override
public PaginationData<LotInfo> limitGet(PatchesParam param) {
Page<LotInfo> page = mapper.selectPage(new Page<LotInfo>(param.getPage(), param.getPageSize()),
@@ -39,7 +44,13 @@
public void delPatches() {
mapper.delete(null);
}
-
+ /**
+ * 根据条件获取照片的分页数据
+ *
+ * @param param 包含分页信息和查询条件的参数对象
+ * @param dkbh 查询条件中带有地块编号关键字,用于文件名的模糊搜索
+ * @return 返回照片的分页数据,包括分页信息和照片实体列表
+ */
@Override
public PaginationData<MediaFileEntity> getPhoto(PatchesParam param,String dkbh) {
Page<MediaFileEntity> page=fileMapper.selectPage(new Page<MediaFileEntity>(param.getPage(), param.getPageSize()),
@@ -49,4 +60,25 @@
.collect(Collectors.toList());
return new PaginationData<MediaFileEntity>(records, new Pagination(page));
}
+ /**
+ * 根据条件获取照片的分页数据
+ *
+ * @param workspaceId 工作空间的ID,用于指定查询的工作空间
+ * @param dkbh 查询条件中带有地块编号关键字,用于文件名的模糊搜索
+ * @return 返回照片的分页数据,包括分页信息和照片实体列表
+ */
+ public List<MediaFileEntity> listPohto(String dkbh,String workspaceId){
+ return fileMapper.selectList(new LambdaQueryWrapper<MediaFileEntity>().like(MediaFileEntity::getFileName, "%" + dkbh + "%")
+ .eq(MediaFileEntity::getWorkspaceId,workspaceId));
+ }
+ /**
+ * 根据地块编号和工作空间ID获取地块信息。
+ * @param dkbh 地块编号,用于查询特定定单的地块信息。
+ * @param workspaceId 工作空间ID,用于查询属于特定工作空间的地块信息。
+ * @return 返回匹配给定地块编号和工作空间ID的地块信息对象。如果找不到匹配的记录,则返回null。
+ */
+ public LotInfo getLotinfo(String dkbh,String workspaceId) {
+ return mapper.selectOne(new LambdaQueryWrapper<LotInfo>().eq(LotInfo::getDkbh, dkbh)
+ .eq(LotInfo::getWorkspaceId, workspaceId));
+ }
}
diff --git a/src/main/java/com/dji/sample/patches/service/impl/ShpToDataSourceServiceImpl.java b/src/main/java/com/dji/sample/patches/service/impl/ShpToDataSourceServiceImpl.java
index f4da965..f5e14db 100644
--- a/src/main/java/com/dji/sample/patches/service/impl/ShpToDataSourceServiceImpl.java
+++ b/src/main/java/com/dji/sample/patches/service/impl/ShpToDataSourceServiceImpl.java
@@ -10,11 +10,13 @@
import com.dji.sample.patches.utils.ShapeFileUtil;
import com.dji.sample.patches.xml.mode.XMLTemplateModel;
import com.dji.sample.patches.xml.utils.CreateWaylineFileUtils;
+import com.dji.sample.territory.model.entity.TbDkjbxxEntity;
import com.dji.sample.wayline.service.IWaylineFileService;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
@@ -42,7 +44,7 @@
@Autowired
private PatchesConfigPojo patchesConfigPojo;
-
+ @Transactional
public MultipartFile insertGeo(MultipartFile file, String workspaceId, String waylineName, double airportLat, double airportLon) throws Exception {
List<LotInfo> list = new ArrayList<>();
File file1 = MultipartFileTOFileUtil.multipartFile2File(file, patchesConfigPojo.getUnzip());
@@ -74,8 +76,43 @@
String destKMZFile = patchesConfigPojo.getDestKMZFile() + waylineName + ".kmz"; // 输出的KMZ文件路径
zipFolder(patchesConfigPojo.getSourceDir(), destKMZFile);
multipartFile = convert(new File(destKMZFile));
+ MultipartFileTOFileUtil.deleteFile(file1);
return multipartFile;
}
+ @Transactional
+ public void savaInMysql(List<TbDkjbxxEntity> list){
+ for (int i = 0; i <list.size() ; i++) {
+ LotInfo lotInfo = new LotInfo();
+ lotInfo=dbConvertToEntity(list.get(i));
+ mapper.insert(lotInfo);
+ }
+ }
+ /**
+ * 将SQlite数据库中DKJBXX对象转换为LotInfo对象。
+ * @param file 需要转换的DKJBXX对象。
+ * @return 返回一个构建好的LotInfo对象,包含从数据库实体中转换来的信息。
+ */
+ private LotInfo dbConvertToEntity(TbDkjbxxEntity file) {
+ LotInfo.LotInfoBuilder builder = LotInfo.builder();
+ if (file != null) {
+ builder.bsm(file.getBsm())
+ .bz(file.getBz())
+ .dkmj(file.getDkmj())
+ .dkmc(file.getDkmc())
+ .dkbh(file.getDkbh())
+ .xmc(file.getXmc())
+ .xzb(file.getXzb())
+ .sfbhzdk(file.getSfbhzdk())
+ .sjlx(file.getSjlx())
+ .dkfw(file.getDkfw())
+ .xzqdm(file.getXzqdm())
+ .yzb(file.getYzb())
+ .kzxx(file.getKzxx())
+ .dklx(file.getDklx())
+ .build();
+ }
+ return builder.build();
+ }
}
diff --git a/src/main/java/com/dji/sample/patches/utils/MultipartFileTOFileUtil.java b/src/main/java/com/dji/sample/patches/utils/MultipartFileTOFileUtil.java
index 4c3d68d..40558d6 100644
--- a/src/main/java/com/dji/sample/patches/utils/MultipartFileTOFileUtil.java
+++ b/src/main/java/com/dji/sample/patches/utils/MultipartFileTOFileUtil.java
@@ -1,8 +1,5 @@
package com.dji.sample.patches.utils;
-import com.dji.sample.patches.config.pojo.PatchesConfigPojo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
@@ -10,8 +7,6 @@
import java.util.UUID;
public class MultipartFileTOFileUtil {
-
-
/**
* MultiparFile转File
* @param multipartFile
@@ -19,17 +14,15 @@
* @return
*/
public static File multipartFile2File(MultipartFile multipartFile, String unzipPath) {
- String tmpFileDir = null;
// 创建临时文件
String randomFileName = UUID.randomUUID().toString();
- tmpFileDir = unzipPath + randomFileName;
+ String tmpFileDir = unzipPath + randomFileName;
File file = new File(tmpFileDir);
InputStream inputStream = null;
FileOutputStream outputStream = null;
try {
// 获取文件输入流
inputStream = multipartFile.getInputStream();
-
if (!file.exists()) {
file.createNewFile();
}
@@ -44,16 +37,23 @@
} catch (Exception e) {
throw new RuntimeException(e);
}
- ZipUtil.deleteFiles(tmpFileDir);
return file;
}
- //File转MultiparFile
public static MultipartFile convert(File file) throws IOException {
FileInputStream input = new FileInputStream(file);
MultipartFile multipartFile = new MockMultipartFile("file",
file.getName(), "application/octet-stream", input);
return multipartFile;
}
-
+ /**
+ * 将文件转换为MultipartFile类型。
+ * @param file 需要转换的文件对象,不可为null。
+ * @throws IOException 如果在读取文件时发生错误,则抛出IOException。
+ */
+ public static void deleteFile(File file) {
+ if (file.exists()) {
+ file.delete();
+ }
+ }
}
diff --git a/src/main/java/com/dji/sample/patches/utils/ZipUtil.java b/src/main/java/com/dji/sample/patches/utils/ZipUtil.java
index 4afa3d9..ebde8b0 100644
--- a/src/main/java/com/dji/sample/patches/utils/ZipUtil.java
+++ b/src/main/java/com/dji/sample/patches/utils/ZipUtil.java
@@ -81,37 +81,6 @@
}
return list;
}
-
- /**
- * @param filePath 临时文件的删除
- * 删除文件夹里面子目录
- * 再删除文件夹
- */
- public static void deleteFiles(String filePath) {
- File file = new File(filePath);
- if ((!file.exists()) || (!file.isDirectory())) {
-
- return;
- }
- String[] tempList = file.list();
- File temp = null;
- for (int i = 0; i < tempList.length; i++) {
- if (filePath.endsWith(File.separator)) {
- temp = new File(filePath + tempList[i]);
- } else {
- temp = new File(filePath + File.separator + tempList[i]);
- }
- if (temp.isFile()) {
- temp.delete();
- }
- if (temp.isDirectory()) {
- deleteFiles(filePath + "\\" + tempList[i]);
- }
- }
- // 空文件的删除
- file.delete();
- }
-
// 定义一个公共的静态方法zipFolder,用于压缩文件夹
// 参数sourceFolderPath是源文件夹的路径,zipFilePath是压缩后的zip文件路径
public static boolean zipFolder(String sourceFolderPath, String zipFilePath) {
diff --git a/src/main/java/com/dji/sample/territory/controller/TbDkjbxxController.java b/src/main/java/com/dji/sample/territory/controller/TbDkjbxxController.java
index 2ba53ae..a0f82bb 100644
--- a/src/main/java/com/dji/sample/territory/controller/TbDkjbxxController.java
+++ b/src/main/java/com/dji/sample/territory/controller/TbDkjbxxController.java
@@ -1,18 +1,43 @@
package com.dji.sample.territory.controller;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.model.entity.DroneFlightLogEntity;
+import com.dji.sample.media.model.MediaFileEntity;
+import com.dji.sample.patches.dao.GetPatchesMapper;
+import com.dji.sample.patches.model.Param.PatchesParam;
+import com.dji.sample.patches.model.entity.LotInfo;
+import com.dji.sample.patches.service.GetPatchesService;
+import com.dji.sample.patches.service.ShpToDataSourceService;
+import com.dji.sample.patches.utils.GeoToolsUtil;
+import com.dji.sample.patches.utils.MultipartFileTOFileUtil;
+import com.dji.sample.patches.xml.mode.XMLTemplateModel;
+import com.dji.sample.patches.xml.utils.CreateWaylineFileUtils;
import com.dji.sample.territory.model.entity.TbDkjbxxEntity;
import com.dji.sample.territory.service.ITbDkjbxxService;
+import com.dji.sample.territory.service.ITbFJService;
+import com.dji.sample.wayline.model.entity.WaylineFileEntity;
+import com.dji.sample.wayline.service.IWaylineFileService;
import lombok.extern.slf4j.Slf4j;
+import org.locationtech.jts.geom.Coordinate;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+
+import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM;
/**
* @PROJECT_NAME: drone
@@ -27,6 +52,10 @@
@Autowired
private ITbDkjbxxService tbDkjbxxService;
+ @Autowired
+ private ShpToDataSourceService service;
+ @Autowired
+ private IWaylineFileService waylineFileService;
@GetMapping("/list")
public ResponseResult list() {
@@ -34,4 +63,39 @@
return ResponseResult.success(list);
}
-}
+ /**
+ * 上传文件并保存到数据库
+ * @param file 需要上传的文件,通过multipart/form-data方式提交
+ * @return 返回上传结果的ResponseResult对象,其中包含上传成功的消息
+ */
+ @PostMapping("/upload")
+ public ResponseResult<String> uploadFile(@RequestParam("file") MultipartFile file) {
+ tbDkjbxxService.uploadFile(file);
+ List<TbDkjbxxEntity> list = tbDkjbxxService.list();
+ service.savaInMysql(list);
+ return tbDkjbxxService.uploadFile(file);
+ }
+
+ @PostMapping("/uploadLot")
+ public ResponseResult getGeo(@RequestParam String workspaceId,
+ @RequestParam String waylineName,
+ @RequestParam double airportLat,
+ @RequestParam double airportLon,
+ HttpServletRequest request) throws Exception {
+ MultipartFile multipartFile = tbDkjbxxService.listFile(workspaceId, waylineName, airportLat, airportLon);
+ CustomClaim customClaim = (CustomClaim) request.getAttribute(TOKEN_CLAIM);
+ String creator = customClaim.getUsername();
+ waylineFileService.importKmzFileBack(multipartFile, workspaceId, creator);
+ WaylineFileEntity entity = waylineFileService.selectByName(waylineName);
+ Map<String, String> infoMap = new HashMap<>();
+ URL url = null;
+ try {
+ url = waylineFileService.getObjectUrl(workspaceId, entity.getWaylineId());
+ infoMap.put("url", String.valueOf(MinioUrlUtils.getUrl(url)));
+ infoMap.put("waylineId", entity.getWaylineId());
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+ return ResponseResult.success(infoMap);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/dji/sample/territory/controller/TbFjController.java b/src/main/java/com/dji/sample/territory/controller/TbFjController.java
new file mode 100644
index 0000000..7f08b14
--- /dev/null
+++ b/src/main/java/com/dji/sample/territory/controller/TbFjController.java
@@ -0,0 +1,40 @@
+package com.dji.sample.territory.controller;
+import com.dji.sample.common.model.ResponseResult;
+import com.dji.sample.media.model.MediaFileEntity;
+import com.dji.sample.patches.model.entity.LotInfo;
+import com.dji.sample.patches.service.GetPatchesService;
+import com.dji.sample.territory.model.entity.TbFjEntity;
+import com.dji.sample.territory.service.ITbFJService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@Slf4j
+@RequestMapping("/territory/tbfj")
+public class TbFjController {
+
+ @Autowired
+ private ITbFJService tbFJService;
+ @Autowired
+ private GetPatchesService getPatches;
+
+ @PostMapping("/insertDb")
+ public ResponseResult insertDb(String dkbh, String workspaceId) throws IOException {
+ List<MediaFileEntity> list = getPatches.listPohto(dkbh, workspaceId);
+ if(list.size()==0){
+ return ResponseResult.error("未找到照片信息");}
+ LotInfo lotInfo = getPatches.getLotinfo(dkbh, workspaceId);
+ if(lotInfo==null){
+ return ResponseResult.error("未找到图斑信息");}
+ TbFjEntity entity=tbFJService.insertData(list, lotInfo);
+ if (entity!=null){
+ return ResponseResult.success("上传成功");
+ }
+ return ResponseResult.error("上传失败");
+ }
+}
diff --git a/src/main/java/com/dji/sample/territory/dao/ITbDkjbxxMapper.java b/src/main/java/com/dji/sample/territory/dao/ITbDkjbxxMapper.java
index 6ed5c85..edbfce8 100644
--- a/src/main/java/com/dji/sample/territory/dao/ITbDkjbxxMapper.java
+++ b/src/main/java/com/dji/sample/territory/dao/ITbDkjbxxMapper.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dji.sample.territory.model.entity.TbDkjbxxEntity;
+import org.apache.ibatis.annotations.Mapper;
/**
* @PROJECT_NAME: drone
@@ -9,5 +10,6 @@
* @USER: aix
* @DATE: 2024/4/10 11:18
*/
+@Mapper
public interface ITbDkjbxxMapper extends BaseMapper<TbDkjbxxEntity> {
}
diff --git a/src/main/java/com/dji/sample/territory/dao/ITbFjMapper.java b/src/main/java/com/dji/sample/territory/dao/ITbFjMapper.java
new file mode 100644
index 0000000..a438d1c
--- /dev/null
+++ b/src/main/java/com/dji/sample/territory/dao/ITbFjMapper.java
@@ -0,0 +1,9 @@
+package com.dji.sample.territory.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dji.sample.territory.model.entity.TbFjEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ITbFjMapper extends BaseMapper<TbFjEntity> {
+}
diff --git a/src/main/java/com/dji/sample/territory/model/entity/TbDkjbxxEntity.java b/src/main/java/com/dji/sample/territory/model/entity/TbDkjbxxEntity.java
index 7cc2fe1..903ae38 100644
--- a/src/main/java/com/dji/sample/territory/model/entity/TbDkjbxxEntity.java
+++ b/src/main/java/com/dji/sample/territory/model/entity/TbDkjbxxEntity.java
@@ -26,4 +26,27 @@
private String dklx;
-}
+ private String xzqdm;
+
+ private String xmc;
+
+ private String dkbh;
+
+ private String dkmc;
+
+ private Double dkmj;
+
+ private String sfbhzdk;
+
+ private Double xzb;
+
+ private Double yzb;
+
+ private String bz;
+
+ private String kzxx;
+
+ private String dkfw;
+
+ private String sjlx;
+}
\ No newline at end of file
diff --git a/src/main/java/com/dji/sample/territory/model/entity/TbFjEntity.java b/src/main/java/com/dji/sample/territory/model/entity/TbFjEntity.java
new file mode 100644
index 0000000..ed9161c
--- /dev/null
+++ b/src/main/java/com/dji/sample/territory/model/entity/TbFjEntity.java
@@ -0,0 +1,38 @@
+package com.dji.sample.territory.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName(value = "FJ")
+public class TbFjEntity {
+
+
+ private String bsm;
+
+ private String dklx;
+
+ private String dkbsm;
+
+ private String xzqdm;
+
+ private byte[] fj;
+
+ private String pssj;
+
+ private Double xdgd;
+
+ private Double jdgd;
+
+ private Double longitude;
+
+ private Double Latitude;
+}
diff --git a/src/main/java/com/dji/sample/territory/service/ITbDkjbxxService.java b/src/main/java/com/dji/sample/territory/service/ITbDkjbxxService.java
index 30b5e52..631a366 100644
--- a/src/main/java/com/dji/sample/territory/service/ITbDkjbxxService.java
+++ b/src/main/java/com/dji/sample/territory/service/ITbDkjbxxService.java
@@ -1,7 +1,15 @@
package com.dji.sample.territory.service;
import com.baomidou.mybatisplus.extension.service.IService;
+import com.dji.sample.common.model.ResponseResult;
+import com.dji.sample.media.model.MediaFileEntity;
+import com.dji.sample.patches.model.entity.LotInfo;
import com.dji.sample.territory.model.entity.TbDkjbxxEntity;
+import com.dji.sample.territory.model.entity.TbFjEntity;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
/**
* @PROJECT_NAME: drone
@@ -10,4 +18,12 @@
* @DATE: 2024/4/10 11:19
*/
public interface ITbDkjbxxService extends IService<TbDkjbxxEntity> {
+ /**
+ * 上传DB文件并覆盖之前DB文件,自动读取数据到本地数据库
+ * @param file
+ * @return
+ */
+ ResponseResult<String> uploadFile(MultipartFile file);
+ MultipartFile listFile( String workspaceId,String waylineName, double airportLat, double airportLon) throws IOException;
+
}
diff --git a/src/main/java/com/dji/sample/territory/service/ITbFJService.java b/src/main/java/com/dji/sample/territory/service/ITbFJService.java
new file mode 100644
index 0000000..e309799
--- /dev/null
+++ b/src/main/java/com/dji/sample/territory/service/ITbFJService.java
@@ -0,0 +1,19 @@
+package com.dji.sample.territory.service;
+
+import com.dji.sample.media.model.MediaFileEntity;
+import com.dji.sample.patches.model.entity.LotInfo;
+import com.dji.sample.territory.model.entity.TbFjEntity;
+
+import java.io.IOException;
+import java.util.List;
+
+public interface ITbFJService {
+ /**
+ * 按照地块编号所对应的信息和音视频文件存入sqlite数据库
+ * @param mediaFile
+ * @param lotInfo
+ * @return
+ * @throws IOException
+ */
+ TbFjEntity insertData(List<MediaFileEntity> mediaFile, LotInfo lotInfo) throws IOException;
+}
diff --git a/src/main/java/com/dji/sample/territory/service/impl/TbDkjbxxServiceImpl.java b/src/main/java/com/dji/sample/territory/service/impl/TbDkjbxxServiceImpl.java
index cd5a273..c2ac1e0 100644
--- a/src/main/java/com/dji/sample/territory/service/impl/TbDkjbxxServiceImpl.java
+++ b/src/main/java/com/dji/sample/territory/service/impl/TbDkjbxxServiceImpl.java
@@ -2,10 +2,34 @@
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dji.sample.common.model.ResponseResult;
+import com.dji.sample.media.model.MediaFileEntity;
+import com.dji.sample.patches.config.pojo.PatchesConfigPojo;
+import com.dji.sample.patches.model.entity.LotInfo;
+import com.dji.sample.patches.utils.GeoToolsUtil;
+import com.dji.sample.patches.utils.MultipartFileTOFileUtil;
+import com.dji.sample.patches.xml.mode.XMLTemplateModel;
+import com.dji.sample.patches.xml.utils.CreateWaylineFileUtils;
import com.dji.sample.territory.dao.ITbDkjbxxMapper;
+import com.dji.sample.territory.dao.ITbFjMapper;
import com.dji.sample.territory.model.entity.TbDkjbxxEntity;
+import com.dji.sample.territory.model.entity.TbFjEntity;
import com.dji.sample.territory.service.ITbDkjbxxService;
+import org.locationtech.jts.geom.Coordinate;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.springframework.util.FileCopyUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.dji.sample.patches.utils.MultipartFileTOFileUtil.convert;
+import static com.dji.sample.patches.utils.ZipUtil.zipFolder;
/**
* @PROJECT_NAME: drone
@@ -16,4 +40,88 @@
@Service
@DS("sqlite")
public class TbDkjbxxServiceImpl extends ServiceImpl<ITbDkjbxxMapper, TbDkjbxxEntity> implements ITbDkjbxxService {
-}
+ private static final String RESOURCE_FILE_PATH = "DB/resource_db.db";
+ @Autowired
+ private ITbDkjbxxMapper mapper;
+ @Autowired
+ private PatchesConfigPojo patchesConfigPojo;
+
+ /**
+ * 上传DB文件并覆盖之前DB文件,自动读取数据到本地数据库
+ *
+ * @param file
+ * @return
+ */
+ public ResponseResult<String> uploadFile(MultipartFile file) {
+ if (file.isEmpty()) {
+ return ResponseResult.error("所上传的文件为空");
+ }
+ try {
+ // 获取上传的文件输入流
+ InputStream inputStream = file.getInputStream();
+ // 创建输出流,将文件内容写入资源文件
+ OutputStream outputStream = new FileOutputStream(RESOURCE_FILE_PATH);
+ byte[] buffer = new byte[1024];
+ int bytesRead;
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, bytesRead);
+ }
+ outputStream.close();
+ inputStream.close();
+ return ResponseResult.success("文件上传成功");
+ } catch (IOException e) {
+ e.printStackTrace();
+ return ResponseResult.error(e.getMessage()); // 将异常信息包含在响应中返回给客户端
+ }
+ }
+
+ public MultipartFile listFile(String workspaceId, String waylineName, double airportLat, double airportLon) throws IOException {
+ List<TbDkjbxxEntity> list = mapper.selectList(null);
+ List<LotInfo> info = dbConvertToEntity(list);
+ Coordinate[] coordinates = GeoToolsUtil.getRoutePointOrder(info, airportLat, airportLon);
+ XMLTemplateModel xmlModel = XMLTemplateModel.init(coordinates, info);
+ CreateWaylineFileUtils.createWaylineFile(xmlModel, patchesConfigPojo.getTemplate(), patchesConfigPojo.getTargetTemplate(), patchesConfigPojo.getWaylines(), patchesConfigPojo.getTargetWaylines());
+ // 压缩文件夹中的内容
+ String destKMZFile = patchesConfigPojo.getDestKMZFile() + waylineName + ".kmz"; // 输出的KMZ文件路径
+ zipFolder(patchesConfigPojo.getSourceDir(), destKMZFile);
+ MultipartFile multipartFile = convert(new File(destKMZFile));
+ return multipartFile;
+ }
+
+ private List<LotInfo> dbConvertToEntity(List<TbDkjbxxEntity> list) {
+ List<LotInfo> infos =new ArrayList<>();
+ for (TbDkjbxxEntity file : list) {
+ LotInfo.LotInfoBuilder builder = LotInfo.builder();
+ if (file != null) {
+ builder.bsm(file.getBsm())
+ .bz(file.getBz())
+ .dkmj(file.getDkmj())
+ .dkmc(file.getDkmc())
+ .dkbh(file.getDkbh())
+ .xmc(file.getXmc())
+ .xzb(file.getXzb())
+ .sfbhzdk(file.getSfbhzdk())
+ .sjlx(file.getSjlx())
+ .dkfw(file.getDkfw())
+ .xzqdm(file.getXzqdm())
+ .yzb(file.getYzb())
+ .kzxx(file.getKzxx())
+ .dklx(file.getDklx())
+ .build();
+ infos.add(builder.build());
+ }
+ }
+ return infos;
+ }
+ public void insert(List<LotInfo> list) {
+ for (LotInfo lotInfo : list) {
+ TbDkjbxxEntity entity = new TbDkjbxxEntity();
+ entity.setBsm(lotInfo.getBsm());
+ entity.setDkbh(lotInfo.getDkbh());
+ entity.setXzb(lotInfo.getXzb());
+ entity.setYzb(lotInfo.getYzb());
+ entity.setDkfw(lotInfo.getDkfw());
+ mapper.insert(entity);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/dji/sample/territory/service/impl/TbFjServiceImpl.java b/src/main/java/com/dji/sample/territory/service/impl/TbFjServiceImpl.java
new file mode 100644
index 0000000..4902454
--- /dev/null
+++ b/src/main/java/com/dji/sample/territory/service/impl/TbFjServiceImpl.java
@@ -0,0 +1,119 @@
+package com.dji.sample.territory.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.dji.sample.media.model.MediaFileEntity;
+import com.dji.sample.patches.model.entity.LotInfo;
+import com.dji.sample.territory.dao.ITbFjMapper;
+import com.dji.sample.territory.model.entity.TbFjEntity;
+import com.dji.sample.territory.service.ITbFJService;
+import com.google.gson.JsonObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.List;
+import java.util.UUID;
+
+@Service
+@DS("sqlite")
+public class TbFjServiceImpl implements ITbFJService {
+ @Autowired
+ private ITbFjMapper mapper;
+
+ /**
+ * 按照地块编号所对应的信息和音视频文件存入sqlite数据库
+ *
+ * @param mediaFile
+ * @param lotInfo
+ * @return
+ * @throws IOException
+ */
+ public TbFjEntity insertData(List<MediaFileEntity> mediaFile, LotInfo lotInfo) throws IOException {
+ TbFjEntity tbFj = new TbFjEntity();
+ for (int i = 0; i < mediaFile.size(); i++) {
+ MediaFileEntity file = mediaFile.get(i);
+ tbFj = dbConvertToEntity(file, lotInfo);
+ try {
+ mapper.insert(tbFj);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return tbFj;
+ }
+
+ /**
+ * 将Media和Lotinfo实体类转化为TbFjEntity实体类
+ *
+ * @param mediaFile
+ * @param lotInfo
+ * @return
+ * @throws IOException
+ */
+ private TbFjEntity dbConvertToEntity(MediaFileEntity mediaFile, LotInfo lotInfo) {
+ String jsonString = JSONObject.toJSONString(mediaFile.getMetadata());
+ JSONObject jsonObject = JSONObject.parseObject(jsonString);
+ Double absoluteAltitude = jsonObject.getDouble("absoluteAltitude");
+ Double relativeAltitude = jsonObject.getDouble("relativeAltitude");
+ JSONObject shootPosition = jsonObject.getJSONObject("shootPosition");
+ Double lat = shootPosition.getDouble("lat");
+ Double lng = shootPosition.getDouble("lng");
+ Long pssj = mediaFile.getCreateTime();
+ String bsm= UUID.randomUUID().toString();
+ String key = mediaFile.getObjectKey();
+ String head = "http://dev.jxpskj.com:9000/cloud-bucket";
+ String url = head + key;
+ byte[] FJ = downloadFileAsBytes(url);
+ TbFjEntity.TbFjEntityBuilder builder = TbFjEntity.builder();
+ if (lotInfo != null){
+ builder.bsm(bsm)
+ .dkbsm(lotInfo.getDkbh())
+ .xzqdm(lotInfo.getXzqdm())
+ .dklx(lotInfo.getDklx())
+ .xdgd(relativeAltitude)
+ .jdgd(absoluteAltitude)
+ .Latitude(lat)
+ .longitude(lng)
+ .fj(FJ)
+ .pssj(String.valueOf(pssj))
+ .build();}
+ else {
+ throw new IllegalArgumentException("未匹配到相关地块");
+ }
+ return builder.build();
+ }
+
+ /**
+ * 将音视频文件转换成字节流
+ *
+ * @param fileUrl
+ * @return
+ */
+ public static byte[] downloadFileAsBytes(String fileUrl) {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+ try {
+ URL url = new URL(fileUrl);
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setRequestMethod("GET");
+
+ try (InputStream inputStream = connection.getInputStream()) {
+ byte[] buffer = new byte[1024];
+ int bytesRead;
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, bytesRead);
+ }
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ return outputStream.toByteArray();
+ }
+
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 2ab7819..91c36f9 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -14,7 +14,7 @@
password: yshb@123
sqlite:
driver-class-name: org.sqlite.JDBC
- url: jdbc:sqlite::resource:static/sqlite/resource_db.db
+ url: jdbc:sqlite:DB/resource_db.db
username:
password:
# url: jdbc:mysql://192.168.2.104:3306/drone_test?useSSL=false&allowPublicKeyRetrieval=true
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index 25e669e..ba086fa 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -14,7 +14,7 @@
password: jxpskj_2018
sqlite:
driver-class-name: org.sqlite.JDBC
- url: jdbc:sqlite::resource:static/sqlite/resource_db.db
+ url: jdbc:sqlite::/home/drone/server/sqlite/resource_db.db
username:
password:
# url: jdbc:mysql://182.108.40.114:3308/drone_zt_test?useSSL=false&allowPublicKeyRetrieval=true
diff --git a/src/main/resources/static/sqlite/resource_db.db b/src/main/resources/static/sqlite/resource_db.db
deleted file mode 100644
index af4ba36..0000000
--- a/src/main/resources/static/sqlite/resource_db.db
+++ /dev/null
Binary files differ
--
Gitblit v1.9.3