From de026326a9df6f4a2192e99cf0e53e7e7b6d445d Mon Sep 17 00:00:00 2001
From: Xiajijian <1176061145@qq.com>
Date: Fri, 24 Oct 2025 17:29:33 +0800
Subject: [PATCH] 1.整理文件管理文件路径。 2.新增航线信息接口业务。 3.优化KMZ文件接口业务逻辑。 4.pom文件修改。 5.增加业务工具类。 6.增加部分业务注解。 7.增加修改无人机状态方法。

---
 ard-route/src/main/java/com/ard/route/service/impl/UavRouteServiceImpl.java |  127 +++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 123 insertions(+), 4 deletions(-)

diff --git a/ard-route/src/main/java/com/ard/route/service/impl/UavRouteServiceImpl.java b/ard-route/src/main/java/com/ard/route/service/impl/UavRouteServiceImpl.java
index 33b596b..a8aeee0 100644
--- a/ard-route/src/main/java/com/ard/route/service/impl/UavRouteServiceImpl.java
+++ b/ard-route/src/main/java/com/ard/route/service/impl/UavRouteServiceImpl.java
@@ -3,26 +3,43 @@
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.io.FileUtil;
+import com.ard.common.utils.SecurityUtils;
+import com.ard.oss.service.impl.OssServiceContext;
 import com.ard.route.constant.FileTypeConstants;
 import com.ard.route.domain.RoutePointReq;
 import com.ard.route.domain.UavRouteReq;
 import com.ard.route.domain.WaypointHeadingReq;
 import com.ard.route.domain.WaypointTurnReq;
 import com.ard.route.domain.kml.*;
+import com.ard.route.domain.route.ArdRouteInformation;
 import com.ard.route.enums.kml.ExitOnRCLostEnums;
+import com.ard.route.service.IArdRouteInformationService;
 import com.ard.route.util.RouteFileUtils;
 import com.ard.route.service.UavRouteService;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
 import org.apache.commons.compress.archivers.ArchiveEntry;
 import org.apache.commons.compress.archivers.ArchiveInputStream;
 import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileOutputStream;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.zip.ZipOutputStream;
+
+import static com.ard.route.util.RouteFileUtils.*;
+import static com.ard.route.util.ToolUtils.getFileNameWithoutExtension;
 
 /**
  * Author:songjian
@@ -31,8 +48,28 @@
 @Service
 public class UavRouteServiceImpl implements UavRouteService {
 
+    @Value("${isLocal}")
+    private Boolean isLocal;
+
+    @Value("${kmz.path}")
+    private String localFilePath;
+
+    @Value("${MinioKmz.path}")
+    private String kmzPath;
+
+    @Resource
+    private OssServiceContext ossService;
+
+    @Resource
+    private IArdRouteInformationService ardRouteInformationService;
+
+    /**
+     * XML 头部
+     */
+    private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+
     @Override
-    public void updateKmz(UavRouteReq uavRouteReq) {
+    public String updateKmz(UavRouteReq uavRouteReq) {
         // TODO 替换本地文件路径!!!
         File file = FileUtil.file("/Users/songjian/Project/IdeaProjects/dj-uav/file/kmz/航线kmz文件.kmz");
         try (ArchiveInputStream archiveInputStream = new ZipArchiveInputStream(FileUtil.getInputStream(file))) {
@@ -51,9 +88,10 @@
                     this.handleRouteUpdate(wpmlInfo, uavRouteReq, FileTypeConstants.WPML, kmlParams);
                 }
             }
-            RouteFileUtils.buildKmz("更新航线kmz文件", kmlInfo, wpmlInfo);
+            return RouteFileUtils.buildKmz("更新航线kmz文件", kmlInfo, wpmlInfo, kmzPath);
         } catch (Exception e) {
             e.printStackTrace();
+            return "更新航线kmz文件失败";
         }
     }
 
@@ -99,10 +137,91 @@
     }
 
     @Override
-    public void buildKmz(UavRouteReq uavRouteReq) {
+    public String buildKmz(UavRouteReq uavRouteReq, String fileName) {
         KmlParams kmlParams = new KmlParams();
         BeanUtils.copyProperties(uavRouteReq, kmlParams);
         kmlParams.setRoutePointList(BeanUtil.copyToList(uavRouteReq.getRoutePointList(), RoutePointInfo.class));
-        RouteFileUtils.buildKmz("航线kmz文件AAAAAA", kmlParams);
+        return buildKmz(fileName, kmlParams);
+    }
+
+    /**
+     * 生成航线 KMZ 文件
+     *
+     * @param fileName  文件名
+     * @param kmlParams 参数对象
+     * @return 本地文件路径
+     */
+    public String buildKmz(String fileName, KmlParams kmlParams) {
+        KmlInfo kmlInfo = buildKml(kmlParams);
+        KmlInfo wpmlInfo = buildWpml(kmlParams);
+        return buildKmz(fileName, kmlInfo, wpmlInfo);
+    }
+
+    /**
+     * 生成航线 KMZ 文件
+     *
+     * @param fileName 文件名
+     * @param kmlInfo  kml 文件信息
+     * @param wpmlInfo wpml 文件信息
+     * @return 本地文件路径
+     */
+    public String buildKmz(String fileName, KmlInfo kmlInfo, KmlInfo wpmlInfo) {
+        XStream xStream = new XStream(new DomDriver());
+        xStream.processAnnotations(KmlInfo.class);
+        xStream.addImplicitCollection(KmlActionGroup.class, "action");
+
+        String kml = XML_HEADER + xStream.toXML(kmlInfo);
+        String wpml = XML_HEADER + xStream.toXML(wpmlInfo);
+
+        // 判断本地生成kmz文件
+        if (isLocal) {
+            try (FileOutputStream fileOutputStream = new FileOutputStream(localFilePath + fileName + ".kmz");
+                 ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream)) {
+                zipOutputStream.setLevel(0); // 0 表示不压缩,存储方式
+
+                // 创建KMZ文件内容
+                buildZipFile("wpmz/template.kml", zipOutputStream, kml);
+                buildZipFile("wpmz/waylines.wpml", zipOutputStream, wpml);
+
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            return localFilePath + fileName + ".kmz";
+        }else {
+            try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                 ZipOutputStream zipOutputStream = new ZipOutputStream(baos)) {
+                zipOutputStream.setLevel(0);
+
+                // 创建KMZ文件内容
+                buildZipFile("wpmz/template.kml", zipOutputStream, kml);
+                buildZipFile("wpmz/waylines.wpml", zipOutputStream, wpml);
+
+                zipOutputStream.finish();
+                zipOutputStream.flush();
+
+                // 获取文件大小
+                Double fileSize = (double) baos.size(); // 字节数
+
+                // 创建MultipartFile对象
+                MultipartFile multipartFile = new MockMultipartFile(
+                        fileName + ".kmz",
+                        fileName + ".kmz",
+                        "application/vnd.google-earth.kmz",
+                        new ByteArrayInputStream(baos.toByteArray())
+                );
+                String kmzFilePath = ossService.upload(kmzPath,multipartFile);
+                // KMZ信息管理
+                ArdRouteInformation ardRouteInformation = new ArdRouteInformation();
+                ardRouteInformation.setFileName(fileName);
+                ardRouteInformation.setFileNameNew(getFileNameWithoutExtension(kmzFilePath));
+                ardRouteInformation.setUpPath(kmzFilePath);
+                ardRouteInformation.setUpFileSize(fileSize);
+                ardRouteInformation.setCreateBy(SecurityUtils.getUsername());
+                ardRouteInformationService.insertArdRouteInformation(ardRouteInformation);
+                return kmzFilePath;
+            } catch (Exception e) {
+                throw new RuntimeException("KMZ文件生成或上传失败", e);
+            }
+        }
     }
 }

--
Gitblit v1.9.3