From b4cbe90b2f84798a6664bfb57c7dbbe16b3c3c51 Mon Sep 17 00:00:00 2001
From: Xiajijian <1176061145@qq.com>
Date: Tue, 04 Nov 2025 20:15:21 +0800
Subject: [PATCH] 1.文件业务权限管理优化。 2.文件夹业务权限管理优化。 3.航线信息接口业务逻辑优化。 4.解析kmz文件接口,异常处理。 5.增加解析kmz文件接口业务,符合智云3.0整体业务。 6.优化公共方法类。 7.新增文件异常处理优化。 8.解决文件夹查询异常报错。 9.根据前端业务增加业务字段。 10.修改代码注释。 11.抽取公共方法。

---
 ard-route/src/main/java/com/ard/route/service/UavRouteService.java                      |    5 
 ard-route/src/main/java/com/ard/route/domain/kml/RoutePointInfo.java                    |    4 
 ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteInformationController.java |   18 +
 ard-admin/src/main/java/com/ard/web/controller/route/UavRouteController.java            |    2 
 ard-route/src/main/java/com/ard/route/domain/kml/KmlPlacemark.java                      |   16 +
 ard-route/src/main/java/com/ard/route/domain/kml/KmlMappingHeadingParam.java            |   18 +
 ard-route/src/main/java/com/ard/route/domain/kml/KmlFolder.java                         |    2 
 ard-route/src/main/java/com/ard/route/domain/WaypointTurnReq.java                       |    2 
 ard-route/src/main/java/com/ard/route/service/IArdRouteFileService.java                 |    5 
 ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteFileController.java        |   22 +-
 ard-route/src/main/java/com/ard/route/util/RouteFileUtils.java                          |  163 ++++++++-------
 ard-route/src/main/java/com/ard/route/domain/UavRouteReq.java                           |    7 
 ard-route/src/main/java/com/ard/route/domain/route/ArdRouteInformation.java             |   12 +
 ard-route/src/main/java/com/ard/route/domain/kml/KmlParams.java                         |    9 
 ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteFolderController.java      |   14 
 ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInformationServiceImpl.java  |   22 ++
 ard-route/src/main/java/com/ard/route/service/impl/ArdRouteFolderServiceImpl.java       |   34 ++
 ard-route/src/main/java/com/ard/route/domain/RoutePointReq.java                         |   24 --
 ard-route/src/main/resources/mapper/ArdRouteInformationMapper.xml                       |   10 +
 ard-route/src/main/java/com/ard/route/domain/WaypointHeadingReq.java                    |    2 
 ard-route/src/main/java/com/ard/route/domain/MappingTypeReq.java                        |    2 
 ard-route/src/main/java/com/ard/route/util/ToolUtils.java                               |   11 +
 ard-route/src/main/java/com/ard/route/service/impl/ArdRouteFileServiceImpl.java         |   18 +
 ard-route/src/main/java/com/ard/route/service/IArdRouteInformationService.java          |    2 
 /dev/null                                                                               |   24 --
 ard-route/src/main/java/com/ard/route/service/impl/UavRouteServiceImpl.java             |   64 +----
 ard-route/src/main/resources/mapper/ArdRouteFolderMapper.xml                            |    9 
 ard-route/src/main/java/com/ard/route/domain/ActionGroupReq.java                        |   44 ++++
 ard-route/src/main/java/com/ard/route/domain/CoordinatePointReq.java                    |    2 
 ard-route/src/main/java/com/ard/route/domain/vo/KmzResultVo.java                        |   16 +
 ard-route/src/main/java/com/ard/route/domain/PointActionReq.java                        |   12 +
 31 files changed, 366 insertions(+), 229 deletions(-)

diff --git a/ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteFileController.java b/ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteFileController.java
index b7d018d..3b5ee50 100644
--- a/ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteFileController.java
+++ b/ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteFileController.java
@@ -3,6 +3,7 @@
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
+import com.alibaba.fastjson2.JSON;
 import com.ard.common.annotation.Log;
 import com.ard.common.core.controller.BaseController;
 import com.ard.common.core.domain.AjaxResult;
@@ -13,16 +14,10 @@
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import com.ard.route.domain.route.ArdRouteFile;
 import com.ard.route.service.IArdRouteFileService;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 文件Controller
@@ -79,10 +74,15 @@
     @ApiOperation("新增文件")
     @PreAuthorize("@ss.hasPermi('route:file:add')")
     @Log(title = "文件", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody ArdRouteFile ardRouteFile) {
+    //@PostMapping("/addFile/{folderId}")
+    @PostMapping("/addFile")
+    public AjaxResult add(@RequestPart("file") MultipartFile file)
+                          //@PathVariable String folderId)
+    {
+        ArdRouteFile ardRouteFile = new ArdRouteFile();
         ardRouteFile.setCreateBy(getUsername());
-        return toAjax(ardRouteFileService.insertArdRouteFile(ardRouteFile));
+        //ardRouteFile.setFolderId(folderId);
+        return toAjax(ardRouteFileService.insertArdRouteFile(ardRouteFile, file));
     }
 
     /**
diff --git a/ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteFolderController.java b/ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteFolderController.java
index 85b1bd4..c405cd5 100644
--- a/ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteFolderController.java
+++ b/ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteFolderController.java
@@ -43,10 +43,10 @@
      * 查询文件夹列表
      */
     @ApiOperation("查询文件夹列表")
-    @PreAuthorize("@ss.hasPermi('route:folder:list')")
+    //@PreAuthorize("@ss.hasPermi('route:folder:list')")
     @GetMapping("/list")
     public TableDataInfo list(ArdRouteFolder ardRouteFolder) {
-        startPage();
+        //startPage();
         List<ArdRouteFolder> list = ardRouteFolderService.selectArdRouteFolderList(ardRouteFolder);
         return getDataTable(list);
     }
@@ -55,7 +55,7 @@
      * 导出文件夹列表
      */
     @ApiOperation("导出文件夹列表")
-    @PreAuthorize("@ss.hasPermi('route:folder:export')")
+    //@PreAuthorize("@ss.hasPermi('route:folder:export')")
     @Log(title = "文件夹", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, ArdRouteFolder ardRouteFolder) {
@@ -68,7 +68,7 @@
      * 获取文件夹详细信息
      */
     @ApiOperation("获取文件夹详细信息")
-    @PreAuthorize("@ss.hasPermi('route:folder:query')")
+    //@PreAuthorize("@ss.hasPermi('route:folder:query')")
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") String id) {
         return success(ardRouteFolderService.selectArdRouteFolderById(id));
@@ -78,7 +78,7 @@
      * 新增文件夹
      */
     @ApiOperation("新增文件夹")
-    @PreAuthorize("@ss.hasPermi('route:folder:add')")
+    //@PreAuthorize("@ss.hasPermi('route:folder:add')")
     @Log(title = "文件夹", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody ArdRouteFolder ardRouteFolder) {
@@ -90,7 +90,7 @@
      * 修改文件夹
      */
     @ApiOperation("修改文件夹")
-    @PreAuthorize("@ss.hasPermi('route:folder:edit')")
+    //@PreAuthorize("@ss.hasPermi('route:folder:edit')")
     @Log(title = "文件夹", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody ArdRouteFolder ardRouteFolder) {
@@ -102,7 +102,7 @@
      * 删除文件夹
      */
     @ApiOperation("删除文件夹")
-    @PreAuthorize("@ss.hasPermi('route:folder:remove')")
+    //@PreAuthorize("@ss.hasPermi('route:folder:remove')")
     @Log(title = "文件夹", businessType = BusinessType.DELETE)
 	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable String[] ids) {
diff --git a/ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteInformationController.java b/ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteInformationController.java
index 2ea62dc..80d564b 100644
--- a/ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteInformationController.java
+++ b/ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteInformationController.java
@@ -19,6 +19,8 @@
 import com.ard.common.core.page.TableDataInfo;
 import org.springframework.web.multipart.MultipartFile;
 
+import static com.ard.common.core.domain.AjaxResult.success;
+
 /**
  * 航线(kmz)Controller
  * 
@@ -37,7 +39,7 @@
      * 查询航线(kmz)列表
      */
     @ApiOperation("查询航线(kmz)列表")
-    @PreAuthorize("@ss.hasPermi('route:information:list')")
+    //@PreAuthorize("@ss.hasPermi('route:information:list')")
     @GetMapping("/list")
     public TableDataInfo list(ArdRouteInformation ardRouteInformation) {
         startPage();
@@ -49,7 +51,7 @@
      * 导出航线(kmz)列表
      */
     @ApiOperation("导出航线(kmz)列表")
-    @PreAuthorize("@ss.hasPermi('route:information:export')")
+    //@PreAuthorize("@ss.hasPermi('route:information:export')")
     @Log(title = "航线(kmz)", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, ArdRouteInformation ardRouteInformation) {
@@ -62,7 +64,7 @@
      * 获取航线(kmz)详细信息
      */
     @ApiOperation("获取航线(kmz)详细信息")
-    @PreAuthorize("@ss.hasPermi('route:information:query')")
+    //@PreAuthorize("@ss.hasPermi('route:information:query')")
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") String id) {
         return success(ardRouteInformationService.selectArdRouteInformationById(id));
@@ -72,19 +74,19 @@
      * 新增航线(kmz)
      */
     @ApiOperation("新增航线(kmz)")
-    @PreAuthorize("@ss.hasPermi('route:information:add')")
+    //@PreAuthorize("@ss.hasPermi('route:information:add')")
     @Log(title = "航线(kmz)", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody ArdRouteInformation ardRouteInformation) {
         ardRouteInformation.setCreateBy(getUsername());
-        return toAjax(ardRouteInformationService.insertArdRouteInformation(ardRouteInformation));
+        return success(ardRouteInformationService.insertArdRouteInformation(ardRouteInformation));
     }
 
     /**
      * 修改航线(kmz)
      */
     @ApiOperation("修改航线(kmz)")
-    @PreAuthorize("@ss.hasPermi('route:information:edit')")
+    //@PreAuthorize("@ss.hasPermi('route:information:edit')")
     @Log(title = "航线(kmz)", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody ArdRouteInformation ardRouteInformation) {
@@ -96,7 +98,7 @@
      * 删除航线(kmz)
      */
     @ApiOperation("删除航线(kmz)")
-    @PreAuthorize("@ss.hasPermi('route:information:remove')")
+    //@PreAuthorize("@ss.hasPermi('route:information:remove')")
     @Log(title = "航线(kmz)", businessType = BusinessType.DELETE)
 	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable String[] ids) {
@@ -107,7 +109,7 @@
      * 导入航线(kmz)文件
      */
     @ApiOperation("导入航线(kmz)文件")
-    @PreAuthorize("@ss.hasPermi('route:information:upload')")
+    //@PreAuthorize("@ss.hasPermi('route:information:upload')")
     @PostMapping("/upload")
     public AjaxResult upload(@RequestPart("file") MultipartFile file) {
         MinioUploadResult minioUploadResult = ardRouteInformationService.uploadArdRouteInformation(file);
diff --git a/ard-admin/src/main/java/com/ard/web/controller/route/UavRouteController.java b/ard-admin/src/main/java/com/ard/web/controller/route/UavRouteController.java
index aa75373..92df269 100644
--- a/ard-admin/src/main/java/com/ard/web/controller/route/UavRouteController.java
+++ b/ard-admin/src/main/java/com/ard/web/controller/route/UavRouteController.java
@@ -50,7 +50,7 @@
     @ApiOperation("解析kmz文件")
     @PreAuthorize("@ss.hasPermi('route:kmz:parseKmz')")
     @PostMapping("/parseKmz")
-    public AjaxResult parseKmz(@RequestParam("fileUrl") String fileUrl) throws IOException {
+    public AjaxResult parseKmz(@RequestParam("fileUrl") String fileUrl){
         return success(routeService.parseKmz(fileUrl));
     }
 
diff --git a/ard-route/src/main/java/com/ard/route/domain/ActionGroupReq.java b/ard-route/src/main/java/com/ard/route/domain/ActionGroupReq.java
new file mode 100644
index 0000000..490ed2a
--- /dev/null
+++ b/ard-route/src/main/java/com/ard/route/domain/ActionGroupReq.java
@@ -0,0 +1,44 @@
+package com.ard.route.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Author:Cleaner
+ * Date: 2024/12/22 10:46
+ **/
+@Data
+public class ActionGroupReq implements Serializable {
+
+    /**
+     * 动作组编号
+     */
+    private Integer actionGroupId;
+
+    /**
+     * 动作组开始生效的航点
+     */
+    private Integer actionGroupStartIndex;
+
+    /**
+     * 动作组结束生效的航点
+     */
+    private Integer actionGroupEndIndex;
+
+    /**
+     * 动作触发器类型
+     */
+    private String actionTriggerType;
+
+    /**
+     * 动作触发器参数
+     */
+    private Double actionTriggerParam;
+
+    /**
+     * 动作列表
+     */
+    private List<PointActionReq> actions;
+}
diff --git a/ard-route/src/main/java/com/ard/route/domain/ActionTriggerReq.java b/ard-route/src/main/java/com/ard/route/domain/ActionTriggerReq.java
deleted file mode 100644
index ed6f4f1..0000000
--- a/ard-route/src/main/java/com/ard/route/domain/ActionTriggerReq.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.ard.route.domain;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * Author:songjian
- * Date: 2024/12/22 10:46
- **/
-@Data
-public class ActionTriggerReq implements Serializable {
-
-    /**
-     * 动作触发器类型
-     */
-    private String actionTriggerType;
-
-    /**
-     * 动作触发器参数
-     */
-    private Double actionTriggerParam;
-
-}
diff --git a/ard-route/src/main/java/com/ard/route/domain/CoordinatePointReq.java b/ard-route/src/main/java/com/ard/route/domain/CoordinatePointReq.java
index 1f02dbb..1aff0e3 100644
--- a/ard-route/src/main/java/com/ard/route/domain/CoordinatePointReq.java
+++ b/ard-route/src/main/java/com/ard/route/domain/CoordinatePointReq.java
@@ -5,7 +5,7 @@
 import java.io.Serializable;
 
 /**
- * Author:songjian
+ * Author:xia
  * Date: 2024/12/22 10:46
  **/
 @Data
diff --git a/ard-route/src/main/java/com/ard/route/domain/MappingTypeReq.java b/ard-route/src/main/java/com/ard/route/domain/MappingTypeReq.java
index 6c2016b..0d8d0fa 100644
--- a/ard-route/src/main/java/com/ard/route/domain/MappingTypeReq.java
+++ b/ard-route/src/main/java/com/ard/route/domain/MappingTypeReq.java
@@ -6,7 +6,7 @@
 import java.util.List;
 
 /**
- * Author:songjian
+ * Author:xia
  * Date: 2024/12/22 10:46
  **/
 @Data
diff --git a/ard-route/src/main/java/com/ard/route/domain/PointActionReq.java b/ard-route/src/main/java/com/ard/route/domain/PointActionReq.java
index d0c0806..015b1c3 100644
--- a/ard-route/src/main/java/com/ard/route/domain/PointActionReq.java
+++ b/ard-route/src/main/java/com/ard/route/domain/PointActionReq.java
@@ -8,8 +8,6 @@
 @Data
 public class PointActionReq implements Serializable {
 
-//    @Serial
-//    private static final long serialVersionUID = -1234025611387201652L;
     /**
      * 动作编号
      */
@@ -65,4 +63,14 @@
      */
     private Boolean stopRecord;
 
+    /**
+     * 拍照名称
+     */
+    private String fileSuffix;
+
+    /**
+     * 录像名称
+     */
+    private String panoShotSubMode;
+
 }
diff --git a/ard-route/src/main/java/com/ard/route/domain/RoutePointReq.java b/ard-route/src/main/java/com/ard/route/domain/RoutePointReq.java
index 15aab97..f96e7b7 100644
--- a/ard-route/src/main/java/com/ard/route/domain/RoutePointReq.java
+++ b/ard-route/src/main/java/com/ard/route/domain/RoutePointReq.java
@@ -51,28 +51,6 @@
     /**
      * 航点动作列表
      */
-    private List<PointActionReq> actions;
-
-
-    /**
-     * 航点动作触发
-     */
-    private ActionTriggerReq actionTriggerReq;
-
-
-    /**
-     * 等时拍照间隔时间 单位s
-     */
-    private Double timeInterval;
-
-    /**
-     * 等距拍照间隔距离 单位m
-     */
-    private Double distanceInterval;
-
-    /**
-     * 停止间隔拍照航点编号
-     */
-    private Integer endIntervalRouteIndex;
+    private List<ActionGroupReq> actionGroupList;
 
 }
diff --git a/ard-route/src/main/java/com/ard/route/domain/UavRouteReq.java b/ard-route/src/main/java/com/ard/route/domain/UavRouteReq.java
index a9fe9e4..298086b 100644
--- a/ard-route/src/main/java/com/ard/route/domain/UavRouteReq.java
+++ b/ard-route/src/main/java/com/ard/route/domain/UavRouteReq.java
@@ -6,7 +6,7 @@
 import java.util.List;
 
 /**
- * Author:songjian
+ * Author:xia
  * Date: 2024/12/22 10:46
  **/
 @Data
@@ -112,4 +112,9 @@
      */
     private MappingTypeReq mappingTypeReq;
 
+    /**
+     * 航线初始动作列表
+     */
+    private List<PointActionReq> startActionList;
+
 }
diff --git a/ard-route/src/main/java/com/ard/route/domain/WaypointHeadingReq.java b/ard-route/src/main/java/com/ard/route/domain/WaypointHeadingReq.java
index 1cf1f2d..8e6decd 100644
--- a/ard-route/src/main/java/com/ard/route/domain/WaypointHeadingReq.java
+++ b/ard-route/src/main/java/com/ard/route/domain/WaypointHeadingReq.java
@@ -5,7 +5,7 @@
 import java.io.Serializable;
 
 /**
- * Author:songjian
+ * Author:xia
  * Date: 2024/12/22 13:05
  **/
 @Data
diff --git a/ard-route/src/main/java/com/ard/route/domain/WaypointTurnReq.java b/ard-route/src/main/java/com/ard/route/domain/WaypointTurnReq.java
index e9854d1..5c17415 100644
--- a/ard-route/src/main/java/com/ard/route/domain/WaypointTurnReq.java
+++ b/ard-route/src/main/java/com/ard/route/domain/WaypointTurnReq.java
@@ -5,7 +5,7 @@
 import java.io.Serializable;
 
 /**
- * Author:songjian
+ * Author:xia
  * Date: 2024/12/22 13:05
  **/
 @Data
diff --git a/ard-route/src/main/java/com/ard/route/domain/kml/KmlFolder.java b/ard-route/src/main/java/com/ard/route/domain/kml/KmlFolder.java
index 29338fd..806b0f3 100644
--- a/ard-route/src/main/java/com/ard/route/domain/kml/KmlFolder.java
+++ b/ard-route/src/main/java/com/ard/route/domain/kml/KmlFolder.java
@@ -51,6 +51,6 @@
     private String waylineId;
 
     @XStreamAlias("wpml:startActionGroup")
-    private KmlActionGroup actionGroup;
+    private KmlActionGroup startActionGroup;
 
 }
diff --git a/ard-route/src/main/java/com/ard/route/domain/kml/KmlMappingHeadingParam.java b/ard-route/src/main/java/com/ard/route/domain/kml/KmlMappingHeadingParam.java
new file mode 100644
index 0000000..d26a2c8
--- /dev/null
+++ b/ard-route/src/main/java/com/ard/route/domain/kml/KmlMappingHeadingParam.java
@@ -0,0 +1,18 @@
+package com.ard.route.domain.kml;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.Data;
+
+@Data
+@XStreamAlias("wpml:mappingHeadingParam")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class KmlMappingHeadingParam {
+
+    @XStreamAlias("wpml:mappingHeadingMode")
+    private String mappingHeadingMode;
+
+    @XStreamAlias("wpml:actionActuatorFunc")
+    private String actionActuatorFunc;
+
+}
diff --git a/ard-route/src/main/java/com/ard/route/domain/kml/KmlParams.java b/ard-route/src/main/java/com/ard/route/domain/kml/KmlParams.java
index 797a533..748dd21 100644
--- a/ard-route/src/main/java/com/ard/route/domain/kml/KmlParams.java
+++ b/ard-route/src/main/java/com/ard/route/domain/kml/KmlParams.java
@@ -1,6 +1,7 @@
 package com.ard.route.domain.kml;
 
 import com.ard.route.domain.MappingTypeReq;
+import com.ard.route.domain.PointActionReq;
 import com.ard.route.domain.WaypointHeadingReq;
 import com.ard.route.domain.WaypointTurnReq;
 import lombok.Data;
@@ -89,9 +90,17 @@
      */
     private MappingTypeReq mappingTypeReq;
 
+    /**
+     * 航点列表
+     */
     private List<RoutePointInfo> routePointList;
 
     /**
+     * 航线初始动作列表
+     */
+    private List<PointActionReq> startActionList;
+
+    /**
      * 飞向首航点模式
      * safely:安全模式
      * pointToPoint:倾斜飞行模式
diff --git a/ard-route/src/main/java/com/ard/route/domain/kml/KmlPlacemark.java b/ard-route/src/main/java/com/ard/route/domain/kml/KmlPlacemark.java
index fe33390..4bd4725 100644
--- a/ard-route/src/main/java/com/ard/route/domain/kml/KmlPlacemark.java
+++ b/ard-route/src/main/java/com/ard/route/domain/kml/KmlPlacemark.java
@@ -1,10 +1,14 @@
 package com.ard.route.domain.kml;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 @XStreamAlias("Placemark")
+@JsonInclude(JsonInclude.Include.NON_NULL)
 public class KmlPlacemark {
 
     @XStreamAlias("wpml:isRisky")
@@ -50,7 +54,7 @@
     private String gimbalPitchAngle;
 
     @XStreamAlias("wpml:actionGroup")
-    private KmlActionGroup actionGroup;
+    private List<KmlActionGroup> actionGroup;
 
     // 下面 wpml 文件使用
     @XStreamAlias("wpml:executeHeight")
@@ -84,18 +88,24 @@
     @XStreamAlias("wpml:overlap")
     private KmlOverlap overlap;
 
-    @XStreamAlias("wpml:ovefacadeWaylineEnablerlap")
+    @XStreamAlias("wpml:facadeWaylineEnable")
     private String facadeWaylineEnable;
 
     @XStreamAlias("Polygon")
     private KmlPolygon polygon;
 
     @XStreamAlias("wpml:mappingHeadingParam")
-    private KmlActionGroup mappingHeadingParam;
+    private KmlMappingHeadingParam mappingHeadingParam;
 
     @XStreamAlias("wpml:gimbalPitchMode")
     private String gimbalPitchMode;
 
+    @XStreamAlias("wpml:quickOrthoMappingEnable")
+    private String quickOrthoMappingEnable;
+
+    @XStreamAlias("wpml:quickOrthoMappingEnable")
+    private String quickOrthoMappingPitch;
+
     // 倾斜摄影模板元素
     @XStreamAlias("wpml:inclinedGimbalPitch")
     private String inclinedGimbalPitch;
diff --git a/ard-route/src/main/java/com/ard/route/domain/kml/RoutePointInfo.java b/ard-route/src/main/java/com/ard/route/domain/kml/RoutePointInfo.java
index e82695d..d394298 100644
--- a/ard-route/src/main/java/com/ard/route/domain/kml/RoutePointInfo.java
+++ b/ard-route/src/main/java/com/ard/route/domain/kml/RoutePointInfo.java
@@ -1,6 +1,6 @@
 package com.ard.route.domain.kml;
 
-import com.ard.route.domain.PointActionReq;
+import com.ard.route.domain.ActionGroupReq;
 import com.ard.route.domain.WaypointHeadingReq;
 import com.ard.route.domain.WaypointTurnReq;
 import lombok.Data;
@@ -54,7 +54,7 @@
     /**
      * 航点动作列表
      */
-    private List<PointActionReq> actions;
+    private List<ActionGroupReq> actionGroupList;
 
     /**
      * 是否首尾航点(首尾航点不能是协调转弯类型)
diff --git a/ard-route/src/main/java/com/ard/route/domain/route/ArdRouteInformation.java b/ard-route/src/main/java/com/ard/route/domain/route/ArdRouteInformation.java
index 5b2777a..38c36d4 100644
--- a/ard-route/src/main/java/com/ard/route/domain/route/ArdRouteInformation.java
+++ b/ard-route/src/main/java/com/ard/route/domain/route/ArdRouteInformation.java
@@ -2,6 +2,7 @@
 
 import com.ard.common.annotation.Excel;
 import com.ard.common.core.domain.BaseEntity;
+import com.ard.route.domain.UavRouteReq;
 import lombok.Data;
 
 /**
@@ -38,4 +39,15 @@
     @Excel(name = "Minio文件路径")
     private String minioUpPath;
 
+    /** 飞行器 */
+    private String aircraft;
+
+    /** 飞行器型号 */
+    private String aircraftModel;
+
+    /**
+     * 生成kmz文件实体类
+     */
+    private UavRouteReq uavRouteReq;
+
 }
diff --git a/ard-route/src/main/java/com/ard/route/domain/vo/KmzResultVo.java b/ard-route/src/main/java/com/ard/route/domain/vo/KmzResultVo.java
new file mode 100644
index 0000000..3c587f6
--- /dev/null
+++ b/ard-route/src/main/java/com/ard/route/domain/vo/KmzResultVo.java
@@ -0,0 +1,16 @@
+package com.ard.route.domain.vo;
+
+import lombok.Data;
+
+@Data
+public class KmzResultVo {
+
+    private String fileNameNew;
+
+    private String minioUpPath;
+
+    private String upPath;
+
+    private Double upFileSize;
+
+}
diff --git a/ard-route/src/main/java/com/ard/route/service/IArdRouteFileService.java b/ard-route/src/main/java/com/ard/route/service/IArdRouteFileService.java
index 405f720..b8db8fa 100644
--- a/ard-route/src/main/java/com/ard/route/service/IArdRouteFileService.java
+++ b/ard-route/src/main/java/com/ard/route/service/IArdRouteFileService.java
@@ -1,7 +1,10 @@
 package com.ard.route.service;
 
+import java.io.File;
+import java.io.IOException;
 import java.util.List;
 import com.ard.route.domain.route.ArdRouteFile;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 文件Service接口
@@ -33,7 +36,7 @@
      * @param ardRouteFile 文件
      * @return 结果
      */
-    public int insertArdRouteFile(ArdRouteFile ardRouteFile);
+    public int insertArdRouteFile(ArdRouteFile ardRouteFile, MultipartFile file);
 
     /**
      * 修改文件
diff --git a/ard-route/src/main/java/com/ard/route/service/IArdRouteInformationService.java b/ard-route/src/main/java/com/ard/route/service/IArdRouteInformationService.java
index 37372e1..b18c08e 100644
--- a/ard-route/src/main/java/com/ard/route/service/IArdRouteInformationService.java
+++ b/ard-route/src/main/java/com/ard/route/service/IArdRouteInformationService.java
@@ -36,7 +36,7 @@
      * @param ardRouteInformation 航线(kmz)
      * @return 结果
      */
-    public int insertArdRouteInformation(ArdRouteInformation ardRouteInformation);
+    public String insertArdRouteInformation(ArdRouteInformation ardRouteInformation);
 
     /**
      * 修改航线(kmz)
diff --git a/ard-route/src/main/java/com/ard/route/service/UavRouteService.java b/ard-route/src/main/java/com/ard/route/service/UavRouteService.java
index dba322b..a9cfd30 100644
--- a/ard-route/src/main/java/com/ard/route/service/UavRouteService.java
+++ b/ard-route/src/main/java/com/ard/route/service/UavRouteService.java
@@ -2,6 +2,7 @@
 
 import com.ard.route.domain.UavRouteReq;
 import com.ard.route.domain.vo.KmzInfoVO;
+import com.ard.route.domain.vo.KmzResultVo;
 
 import java.io.IOException;
 
@@ -16,11 +17,11 @@
     /**
      * 生成kmz文件(带航点)
      */
-    public String buildKmz(UavRouteReq uavRouteReq, String fileName);
+    public KmzResultVo buildKmz(UavRouteReq uavRouteReq, String fileName);
 
     /**
      * 解析kmz文件
      */
-    public KmzInfoVO parseKmz(String file) throws IOException;
+    public KmzInfoVO parseKmz(String file);
 
 }
diff --git a/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteFileServiceImpl.java b/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteFileServiceImpl.java
index 568796a..97b721c 100644
--- a/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteFileServiceImpl.java
+++ b/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteFileServiceImpl.java
@@ -1,15 +1,20 @@
 package com.ard.route.service.impl;
 
+import java.io.IOException;
 import java.util.List;
 
 import com.ard.common.annotation.DataScope;
 import com.ard.common.utils.DateUtils;
 import com.ard.common.utils.uuid.IdUtils;
+import com.ard.oss.service.impl.OssServiceContext;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ard.route.mapper.ArdRouteFileMapper;
 import com.ard.route.domain.route.ArdRouteFile;
 import com.ard.route.service.IArdRouteFileService;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
 
 /**
  * 文件Service业务层处理
@@ -22,6 +27,9 @@
 
     @Autowired
     private ArdRouteFileMapper ardRouteFileMapper;
+
+    @Autowired
+    private OssServiceContext ossService;
 
     /**
      * 查询文件
@@ -53,9 +61,17 @@
      * @return 结果
      */
     @Override
-    public int insertArdRouteFile(ArdRouteFile ardRouteFile) {
+    public int insertArdRouteFile(ArdRouteFile ardRouteFile, MultipartFile file){
         ardRouteFile.setId(IdUtils.simpleUUID());
         ardRouteFile.setCreateTime(DateUtils.getNowDate());
+        // 放到默认文件夹
+        ardRouteFile.setFolderId("0");
+        try {
+            String url = ossService.upload("kmz",file);
+            ardRouteFile.setFilePath(url);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
         return ardRouteFileMapper.insertArdRouteFile(ardRouteFile);
     }
 
diff --git a/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteFolderServiceImpl.java b/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteFolderServiceImpl.java
index fcd9df0..1625807 100644
--- a/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteFolderServiceImpl.java
+++ b/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteFolderServiceImpl.java
@@ -1,5 +1,6 @@
 package com.ard.route.service.impl;
 
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -79,6 +80,9 @@
     public int insertArdRouteFolder(ArdRouteFolder ardRouteFolder) {
         ardRouteFolder.setId(IdUtils.simpleUUID());
         ardRouteFolder.setCreateTime(DateUtils.getNowDate());
+        // 获取当前数据条数
+        int count = ardRouteFolderMapper.selectArdRouteFolderList(null).size();
+        ardRouteFolder.setSerialNumber(count + 1);
         return ardRouteFolderMapper.insertArdRouteFolder(ardRouteFolder);
     }
 
@@ -90,6 +94,10 @@
      */
     @Override
     public int updateArdRouteFolder(ArdRouteFolder ardRouteFolder) {
+        // 不能修改默认文件夹
+        if ("0".equals(ardRouteFolder.getId())) {
+            throw new RuntimeException("不能修改默认文件夹");
+        }
         ardRouteFolder.setUpdateTime(DateUtils.getNowDate());
         return ardRouteFolderMapper.updateArdRouteFolder(ardRouteFolder);
     }
@@ -103,13 +111,27 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Map<String, Integer> deleteArdRouteFolderByIds(String[] ids) {
+        // 检查是否包含默认文件夹,不能删除默认文件夹
+        for (String id : ids) {
+            if ("0".equals(id)) {
+                throw new RuntimeException("不能删除默认文件夹");
+            }
+        }
+
         Map<String, Integer> result = new HashMap<>();
-        // 删除文件夹的同时也删除文件夹下的所有文件
-        int fileAdd = ardRouteFileMapper.deleteRouteFileByFolderIds(ids);
-        result.put("file", fileAdd);
-        int folderCount = ardRouteFolderMapper.deleteArdRouteFolderByIds(ids);
-        result.put("folder", folderCount);
-        return result;
+        try {
+            // 先删除文件
+            int fileCount = ardRouteFileMapper.deleteRouteFileByFolderIds(ids);
+            result.put("file", fileCount);
+
+            // 再删除文件夹
+            int folderCount = ardRouteFolderMapper.deleteArdRouteFolderByIds(ids);
+            result.put("folder", folderCount);
+
+            return result;
+        } catch (Exception e) {
+            throw e; // 抛出异常让事务回滚
+        }
     }
 
     /**
diff --git a/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInformationServiceImpl.java b/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInformationServiceImpl.java
index d9a288a..d7b9899 100644
--- a/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInformationServiceImpl.java
+++ b/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInformationServiceImpl.java
@@ -7,11 +7,15 @@
 import com.ard.oss.model.MinioUploadResult;
 import com.ard.oss.service.impl.OssServiceContext;
 import com.ard.route.domain.route.ArdRouteInformation;
+import com.ard.route.domain.vo.KmzResultVo;
+import com.ard.route.service.UavRouteService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ard.route.mapper.ArdRouteInformationMapper;
 import com.ard.route.service.IArdRouteInformationService;
 import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
 
 import static com.ard.route.util.ToolUtils.extractFilePath;
 import static com.ard.route.util.ToolUtils.getFileNameWithoutExtension;
@@ -30,6 +34,9 @@
 
     @Autowired
     private OssServiceContext ossService;
+
+    @Autowired
+    private UavRouteService routeService;
 
     /**
      * 查询航线(kmz)
@@ -60,10 +67,21 @@
      * @return 结果
      */
     @Override
-    public int insertArdRouteInformation(ArdRouteInformation ardRouteInformation) {
+    public String insertArdRouteInformation(ArdRouteInformation ardRouteInformation) {
         ardRouteInformation.setId(IdUtils.simpleUUID());
         ardRouteInformation.setCreateTime(DateUtils.getNowDate());
-        return ardRouteInformationMapper.insertArdRouteInformation(ardRouteInformation);
+
+        if (ardRouteInformation.getUavRouteReq() != null){
+
+        }
+        KmzResultVo kmzResult = routeService.buildKmz(ardRouteInformation.getUavRouteReq(), ardRouteInformation.getFileName());
+        // 将KmzResult中的信息设置到ardRouteInformation中
+        ardRouteInformation.setFileNameNew(kmzResult.getFileNameNew());
+        ardRouteInformation.setMinioUpPath(kmzResult.getMinioUpPath());
+        ardRouteInformation.setUpPath(kmzResult.getUpPath());
+        ardRouteInformation.setUpFileSize(kmzResult.getUpFileSize());
+        ardRouteInformationMapper.insertArdRouteInformation(ardRouteInformation);
+        return kmzResult.getUpPath();
     }
 
     /**
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 678afaf..994a90e 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
@@ -13,6 +13,7 @@
 import com.ard.route.domain.kml.*;
 import com.ard.route.domain.route.ArdRouteInformation;
 import com.ard.route.domain.vo.KmzInfoVO;
+import com.ard.route.domain.vo.KmzResultVo;
 import com.ard.route.enums.kml.ExitOnRCLostEnums;
 import com.ard.route.service.IArdRouteInformationService;
 import com.ard.route.util.FileUtils;
@@ -38,32 +39,20 @@
 import java.util.zip.ZipOutputStream;
 
 import static com.ard.route.util.RouteFileUtils.*;
-import static com.ard.route.util.ToolUtils.extractFilePath;
-import static com.ard.route.util.ToolUtils.getFileNameWithoutExtension;
+import static com.ard.route.util.ToolUtils.*;
 
 /**
- * Author:songjian
+ * Author:xia
  * Date: 2024/12/22 10:36
  **/
 @Service
 public class UavRouteServiceImpl implements UavRouteService {
-
-    private Boolean isLocal = false;
-
-    private String localFilePath = "KmzFile/kmz/";
-
-    private String kmzPath = "kmz";
 
     @Resource
     private OssServiceContext ossService;
 
     @Resource
     private IArdRouteInformationService ardRouteInformationService;
-
-    /**
-     * XML 头部
-     */
-    private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
 
     /**
      * 编辑kmz文件
@@ -149,7 +138,7 @@
      * 生成kmz文件(带航点)
      */
     @Override
-    public String buildKmz(UavRouteReq uavRouteReq, String fileName) {
+    public KmzResultVo buildKmz(UavRouteReq uavRouteReq, String fileName) {
         KmlParams kmlParams = new KmlParams();
         BeanUtils.copyProperties(uavRouteReq, kmlParams);
         kmlParams.setRoutePointList(BeanUtil.copyToList(uavRouteReq.getRoutePointList(), RoutePointInfo.class));
@@ -163,7 +152,7 @@
      * @param kmlParams 参数对象
      * @return 本地文件路径
      */
-    public String buildKmz(String fileName, KmlParams kmlParams) {
+    public KmzResultVo buildKmz(String fileName, KmlParams kmlParams) {
         KmlInfo kmlInfo = buildKml(kmlParams);
         KmlInfo wpmlInfo = buildWpml(kmlParams);
         return buildKmz(fileName, kmlInfo, wpmlInfo);
@@ -177,13 +166,16 @@
      * @param wpmlInfo wpml 文件信息
      * @return 本地文件路径
      */
-    public String buildKmz(String fileName, KmlInfo kmlInfo, KmlInfo wpmlInfo) {
+    public KmzResultVo buildKmz(String fileName, KmlInfo kmlInfo, KmlInfo wpmlInfo) {
         XStream xStream = new XStream(new DomDriver());
         xStream.processAnnotations(KmlInfo.class);
         xStream.addImplicitCollection(KmlActionGroup.class, "action");
+        xStream.addImplicitCollection(KmlPlacemark.class, "actionGroup");
 
         String kml = XML_HEADER + xStream.toXML(kmlInfo);
         String wpml = XML_HEADER + xStream.toXML(wpmlInfo);
+
+        KmzResultVo result = new KmzResultVo();
 
         // 判断本地生成kmz文件
         if (isLocal) {
@@ -198,7 +190,8 @@
             } catch (Exception e) {
                 throw new RuntimeException(e);
             }
-            return localFilePath + fileName + ".kmz";
+            result.setUpPath(localFilePath + fileName + ".kmz");
+            return result;
         }else {
             try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
                  ZipOutputStream zipOutputStream = new ZipOutputStream(baos)) {
@@ -222,16 +215,11 @@
                         new ByteArrayInputStream(baos.toByteArray())
                 );
                 String kmzFilePath = ossService.upload(kmzPath,multipartFile);
-                // KMZ信息管理
-                ArdRouteInformation ardRouteInformation = new ArdRouteInformation();
-                ardRouteInformation.setFileName(fileName);
-                ardRouteInformation.setFileNameNew(getFileNameWithoutExtension(kmzFilePath));
-                ardRouteInformation.setMinioUpPath(extractFilePath(kmzFilePath));
-                ardRouteInformation.setUpPath(kmzFilePath);
-                ardRouteInformation.setUpFileSize(fileSize);
-                ardRouteInformation.setCreateBy(SecurityUtils.getUsername());
-                ardRouteInformationService.insertArdRouteInformation(ardRouteInformation);
-                return kmzFilePath;
+                result.setFileNameNew(getFileNameWithoutExtension(kmzFilePath));
+                result.setMinioUpPath(extractFilePath(kmzFilePath));
+                result.setUpPath(kmzFilePath);
+                result.setUpFileSize(fileSize);
+                return result;
             } catch (Exception e) {
                 throw new RuntimeException("KMZ文件生成或上传失败", e);
             }
@@ -242,7 +230,7 @@
      * 解析kmz文件
      */
     @Override
-    public KmzInfoVO parseKmz(String fileUrl) throws IOException {
+    public KmzInfoVO parseKmz(String fileUrl){
         KmzInfoVO kmzInfoVO = new KmzInfoVO();
         try (InputStream inputStream = ossService.getObject(kmzPath,fileUrl);
              ArchiveInputStream archiveInputStream = new ZipArchiveInputStream(inputStream)){
@@ -260,23 +248,5 @@
             e.printStackTrace();
         }
         return null;
-
-
-//        File file = FileUtils.downloadUrlToTempFile(fileUrl);
-//        try (ArchiveInputStream archiveInputStream = new ZipArchiveInputStream(FileUtil.getInputStream(file))) {
-//            ArchiveEntry entry;
-//            while (!Objects.isNull(entry = archiveInputStream.getNextEntry())) {
-//                String name = entry.getName();
-//                if (name.toLowerCase().endsWith(".kml")) {
-//                    kmzInfoVO.setKmlInfo(RouteFileUtils.parseKml(archiveInputStream));
-//                } else if (name.toLowerCase().endsWith(".wpml")) {
-//                    kmzInfoVO.setWpmlInfo(RouteFileUtils.parseKml(archiveInputStream));
-//                }
-//            }
-//            return kmzInfoVO;
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//        return null;
     }
 }
diff --git a/ard-route/src/main/java/com/ard/route/util/RouteFileUtils.java b/ard-route/src/main/java/com/ard/route/util/RouteFileUtils.java
index b888454..628b2b1 100644
--- a/ard-route/src/main/java/com/ard/route/util/RouteFileUtils.java
+++ b/ard-route/src/main/java/com/ard/route/util/RouteFileUtils.java
@@ -21,21 +21,12 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
+import static com.ard.route.util.ToolUtils.XML_HEADER;
+
 /**
  * 航线文件操作工具类
  */
 public class RouteFileUtils {
-
-    /**
-     * XML 头部
-     */
-    private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
-
-    /**
-     * 生成的本地 kmz 文件存储路径
-     */
-    private static final String LOCAL_KMZ_FILE_PATH = "file" + File.separator + "kmz" + File.separator;
-
 
     /**
      * kml文件解析
@@ -175,13 +166,18 @@
         kmlFolder.setAutoFlightSpeed(String.valueOf(kmlParams.getAutoFlightSpeed()));
         if (StringUtils.equals(fileType, FileTypeConstants.KML)) {
             kmlFolder.setTemplateType(kmlParams.getTemplateType());
-            kmlFolder.setWaylineCoordinateSysParam(buildKmlWayLineCoordinateSysParam(TemplateTypeEnums.WAYPOINT.getValue()));
+            kmlFolder.setWaylineCoordinateSysParam(buildKmlWayLineCoordinateSysParam(kmlParams.getTemplateType(), HeightModeEnums.RELATIVE_TO_START_POINT.getValue(),
+                    String.valueOf(kmlParams.getGlobalHeight())));
             kmlFolder.setPayloadParam(buildKmlPayloadParam(kmlParams));
         }
         if (StringUtils.equals(fileType, FileTypeConstants.WPML)) {
             kmlFolder.setWaylineId("0");
             kmlFolder.setExecuteHeightMode(ExecuteHeightModeEnums.RELATIVE_TO_START_POINT.getValue());
-            // TODO 航线初始动作
+            if (CollectionUtil.isNotEmpty(kmlParams.getStartActionList())) {
+                KmlActionGroup kmlActionGroup = new KmlActionGroup();
+                kmlActionGroup.setAction(getKmlActionList(kmlParams.getStartActionList(), kmlParams));
+                kmlFolder.setStartActionGroup(kmlActionGroup);
+            }
         }
         // 航点类型模板航线配置
         if (StringUtils.equals(kmlFolder.getTemplateType(), TemplateTypeEnums.WAYPOINT.getValue())) {
@@ -222,12 +218,6 @@
                 if (CollectionUtil.isNotEmpty(routePointList)) {
                     List<KmlPlacemark> kmlPlacemarkList = new ArrayList<>();
                     for (RoutePointInfo routePointInfo : routePointList) {
-//                        ActionTriggerReq actionTriggerReq = new ActionTriggerReq();
-//                        actionTriggerReq.setActionTriggerType(StringUtils.equals(kmlParams.getMappingTypeReq().getShootType(), ShootTypeEnums.TIME.getValue()) ?
-//                                ActionTriggerTypeEnums.MULTIPLE_TIMING.getValue() :
-//                                ActionTriggerTypeEnums.MULTIPLE_DISTANCE.getValue());
-//                        actionTriggerReq.setActionTriggerParam(2.0);
-//                        RoutePointInfo.setActionTriggerReq(actionTriggerReq);
                         kmlPlacemarkList.add(buildKmlPlacemark(routePointInfo, kmlParams, fileType));
                     }
                     kmlFolder.setPlacemarkList(kmlPlacemarkList);
@@ -237,17 +227,56 @@
         return kmlFolder;
     }
 
-    public static KmlWayLineCoordinateSysParam buildKmlWayLineCoordinateSysParam(String templateType) {
+    /**
+     * 构建航点动作
+     *
+     * @param actionList 航点动作列表
+     * @param kmlParams
+     * @return
+     */
+    private static List<KmlAction> getKmlActionList(List<PointActionReq> actionList, KmlParams kmlParams) {
+        List<KmlAction> kmlActionList = new ArrayList<>();
+        for (PointActionReq pointActionReq : actionList) {
+            if (ObjectUtil.isNotNull(pointActionReq.getHoverTime())) {
+                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.HOVER.getValue(), pointActionReq, kmlParams));
+            } else if (ObjectUtil.isNotNull(pointActionReq.getAircraftHeading())) {
+                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.ROTATE_YAW.getValue(), pointActionReq, kmlParams));
+            } else if (ObjectUtil.isNotNull(pointActionReq.getTakePhotoType()) && ObjectUtil.equals(pointActionReq.getTakePhotoType(), 0)) {
+                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.TAKE_PHOTO.getValue(), pointActionReq, kmlParams));
+            } else if ((ObjectUtil.isNotNull(pointActionReq.getGimbalYawRotateAngle())) || (ObjectUtil.isNotNull(pointActionReq.getGimbalPitchRotateAngle()))) {
+                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.GIMBAL_ROTATE.getValue(), pointActionReq, kmlParams));
+            } else if (ObjectUtil.isNotNull(pointActionReq.getZoom())) {
+                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.ZOOM.getValue(), pointActionReq, kmlParams));
+            } else if (ObjectUtil.isNotNull(pointActionReq.getTakePhotoType()) && ObjectUtil.equals(pointActionReq.getTakePhotoType(), 1)) {
+                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.PANO_SHOT.getValue(), pointActionReq, kmlParams));
+            } else if (ObjectUtil.isNotNull(pointActionReq.getStartRecord()) && pointActionReq.getStartRecord()) {
+                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.START_RECORD.getValue(), pointActionReq, kmlParams));
+            } else if (ObjectUtil.isNotNull(pointActionReq.getStopRecord()) && pointActionReq.getStopRecord()) {
+                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.STOP_RECORD.getValue(), pointActionReq, kmlParams));
+            }
+        }
+        return kmlActionList;
+    }
+
+    /**
+     * 构造坐标系参数信息
+     *
+     * @param templateType 航线模板类型
+     * @param heightMode   高度模式
+     * @param height       高度
+     * @return 坐标系参数信息
+     */
+    public static KmlWayLineCoordinateSysParam buildKmlWayLineCoordinateSysParam(String templateType, String heightMode, String height) {
         KmlWayLineCoordinateSysParam kmlWayLineCoordinateSysParam = new KmlWayLineCoordinateSysParam();
         kmlWayLineCoordinateSysParam.setCoordinateMode("WGS84");
-        kmlWayLineCoordinateSysParam.setHeightMode(HeightModeEnums.RELATIVE_TO_START_POINT.getValue());
+        kmlWayLineCoordinateSysParam.setHeightMode(heightMode);
         kmlWayLineCoordinateSysParam.setPositioningType(PositioningTypeEnums.GPS.getValue());
         if (StringUtils.equals(templateType, TemplateTypeEnums.MAPPING2D.getValue()) ||
                 StringUtils.equals(templateType, TemplateTypeEnums.MAPPING3D.getValue()) ||
                 StringUtils.equals(templateType, TemplateTypeEnums.MAPPING_STRIP.getValue())) {
-            kmlWayLineCoordinateSysParam.setGlobalShootHeight("50");
+            kmlWayLineCoordinateSysParam.setGlobalShootHeight(height);
             kmlWayLineCoordinateSysParam.setSurfaceFollowModeEnable("1");
-            kmlWayLineCoordinateSysParam.setSurfaceRelativeHeight("100");
+            kmlWayLineCoordinateSysParam.setSurfaceRelativeHeight(height);
         }
         return kmlWayLineCoordinateSysParam;
     }
@@ -287,6 +316,7 @@
         kmlPlacemark.setIsRisky("0");
         kmlPlacemark.setKmlPoint(buildKmlPoint(String.valueOf(routePointInfo.getLongitude()), String.valueOf(routePointInfo.getLatitude())));
         kmlPlacemark.setIndex(String.valueOf(routePointInfo.getRoutePointIndex()));
+
         handleHeight(routePointInfo, kmlParams, fileType, kmlPlacemark);
         handleSpeed(routePointInfo, kmlParams, fileType, kmlPlacemark);
         handleWaypointHeadingParam(routePointInfo, kmlParams, fileType, kmlPlacemark);
@@ -296,8 +326,12 @@
                 kmlPlacemark.setGimbalPitchAngle(String.valueOf(routePointInfo.getGimbalPitchAngle()));
             }
         }
-        if (CollectionUtil.isNotEmpty(routePointInfo.getActions())) {
-            kmlPlacemark.setActionGroup(buildKmlActionGroup(routePointInfo, kmlParams));
+        if (CollectionUtil.isNotEmpty(routePointInfo.getActionGroupList())) {
+            List<KmlActionGroup> kmlActionGroupList = new ArrayList<>();
+            for (ActionGroupReq actionGroupReq : routePointInfo.getActionGroupList()) {
+                kmlActionGroupList.add(buildKmlActionGroup(actionGroupReq, kmlParams));
+            }
+            kmlPlacemark.setActionGroup(kmlActionGroupList);
         }
         return kmlPlacemark;
     }
@@ -321,22 +355,16 @@
 
     private static KmlOverlap buildKmlOverlap(String collectionMethod, String lensType, Integer overlapH, Integer overlapW) {
         KmlOverlap overlap = new KmlOverlap();
-        if (StringUtils.equals(collectionMethod, CollectionMethodEnums.ORTHO.getValue())) {
-            if (StringUtils.equals(lensType, LensTypeEnums.LIDAR.getValue())) {
-                overlap.setOrthoLidarOverlapH(String.valueOf(overlapH));
-                overlap.setOrthoLidarOverlapW(String.valueOf(overlapW));
-            } else {
-                overlap.setOrthoCameraOverlapH(String.valueOf(overlapH));
-                overlap.setOrthoCameraOverlapW(String.valueOf(overlapW));
-            }
+        if (StringUtils.equals(collectionMethod, LensTypeEnums.CAMERA.getValue())) {
+            overlap.setOrthoCameraOverlapH(String.valueOf(overlapH));
+            overlap.setOrthoCameraOverlapW(String.valueOf(overlapW));
+            overlap.setInclinedCameraOverlapW(String.valueOf(overlapW));
+            overlap.setInclinedCameraOverlapH(String.valueOf(overlapH));
         } else {
-            if (StringUtils.equals(lensType, LensTypeEnums.LIDAR.getValue())) {
-                overlap.setInclinedLidarOverlapH(String.valueOf(overlapH));
-                overlap.setInclinedCameraOverlapW(String.valueOf(overlapW));
-            } else {
-                overlap.setInclinedCameraOverlapH(String.valueOf(overlapH));
-                overlap.setInclinedCameraOverlapW(String.valueOf(overlapW));
-            }
+            overlap.setOrthoLidarOverlapH(String.valueOf(overlapH));
+            overlap.setOrthoLidarOverlapW(String.valueOf(overlapW));
+            overlap.setInclinedLidarOverlapH(String.valueOf(overlapH));
+            overlap.setInclinedLidarOverlapW(String.valueOf(overlapW));
         }
         return overlap;
     }
@@ -462,44 +490,15 @@
         return kmlWaypointTurnParam;
     }
 
-    public static KmlActionGroup buildKmlActionGroup(RoutePointInfo routePointInfo, KmlParams kmlParams) {
+    public static KmlActionGroup buildKmlActionGroup(ActionGroupReq actionGroupReq, KmlParams kmlParams) {
         KmlActionGroup kmlActionGroup = new KmlActionGroup();
-        kmlActionGroup.setActionGroupId(String.valueOf(routePointInfo.getRoutePointIndex()));
-        kmlActionGroup.setActionGroupStartIndex(String.valueOf(routePointInfo.getRoutePointIndex()));
-        kmlActionGroup.setActionGroupEndIndex(String.valueOf(ObjectUtil.isNotNull(routePointInfo.getEndIntervalRouteIndex()) ?
-                routePointInfo.getEndIntervalRouteIndex() : routePointInfo.getRoutePointIndex()));
+        kmlActionGroup.setActionGroupId(String.valueOf(actionGroupReq.getActionGroupId()));
+        kmlActionGroup.setActionGroupStartIndex(String.valueOf(actionGroupReq.getActionGroupStartIndex()));
+        kmlActionGroup.setActionGroupEndIndex(String.valueOf(actionGroupReq.getActionGroupEndIndex()));
         kmlActionGroup.setActionGroupMode(ActionGroupModeEnums.SEQUENCE.getValue());
-        String actionTriggerType = ActionTriggerTypeEnums.REACH_POINT.getValue();
-        Double actionTriggerParam = 0.0;
-        if (ObjectUtil.isNotNull(routePointInfo.getTimeInterval())) {
-            actionTriggerType = ActionTriggerTypeEnums.MULTIPLE_TIMING.getValue();
-            actionTriggerParam = routePointInfo.getTimeInterval();
-        } else if (ObjectUtil.isNotNull(routePointInfo.getDistanceInterval())) {
-            actionTriggerType = ActionTriggerTypeEnums.MULTIPLE_DISTANCE.getValue();
-            actionTriggerParam = routePointInfo.getDistanceInterval();
-        }
-        kmlActionGroup.setActionTrigger(buildKmlActionTrigger(actionTriggerType, actionTriggerParam));
-        List<KmlAction> kmlActionList = new ArrayList<>();
-        for (PointActionReq pointActionReq : routePointInfo.getActions()) {
-            if (ObjectUtil.isNotNull(pointActionReq.getHoverTime())) {
-                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.HOVER.getValue(), pointActionReq, kmlParams));
-            } else if (ObjectUtil.isNotNull(pointActionReq.getAircraftHeading())) {
-                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.ROTATE_YAW.getValue(), pointActionReq, kmlParams));
-            } else if (ObjectUtil.isNotNull(pointActionReq.getTakePhotoType()) && ObjectUtil.equals(pointActionReq.getTakePhotoType(), 0)) {
-                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.TAKE_PHOTO.getValue(), pointActionReq, kmlParams));
-            } else if ((ObjectUtil.isNotNull(pointActionReq.getGimbalYawRotateAngle())) || (ObjectUtil.isNotNull(pointActionReq.getGimbalPitchRotateAngle()))) {
-                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.GIMBAL_ROTATE.getValue(), pointActionReq, kmlParams));
-            } else if (ObjectUtil.isNotNull(pointActionReq.getZoom())) {
-                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.ZOOM.getValue(), pointActionReq, kmlParams));
-            } else if (ObjectUtil.isNotNull(pointActionReq.getTakePhotoType()) && ObjectUtil.equals(pointActionReq.getTakePhotoType(), 1)) {
-                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.PANO_SHOT.getValue(), pointActionReq, kmlParams));
-            } else if (ObjectUtil.isNotNull(pointActionReq.getStartRecord()) && pointActionReq.getStartRecord()) {
-                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.START_RECORD.getValue(), pointActionReq, kmlParams));
-            } else if (ObjectUtil.isNotNull(pointActionReq.getStopRecord()) && pointActionReq.getStopRecord()) {
-                kmlActionList.add(buildKmlAction(String.valueOf(pointActionReq.getActionIndex()), ActionActuatorFuncEnums.STOP_RECORD.getValue(), pointActionReq, kmlParams));
-            }
-        }
-        kmlActionGroup.setAction(kmlActionList);
+
+        kmlActionGroup.setActionTrigger(buildKmlActionTrigger(actionGroupReq.getActionTriggerType(), actionGroupReq.getActionTriggerParam()));
+        kmlActionGroup.setAction(getKmlActionList(actionGroupReq.getActions(), kmlParams));
         return kmlActionGroup;
     }
 
@@ -526,7 +525,11 @@
         if (StringUtils.equals(actionActuatorFunc, ActionActuatorFuncEnums.TAKE_PHOTO.getValue()) ||
                 StringUtils.equals(actionActuatorFunc, ActionActuatorFuncEnums.START_RECORD.getValue())) {
             kmlActionActuatorFuncParam.setPayloadPositionIndex(String.valueOf(kmlParams.getPayloadPosition()));
-            kmlActionActuatorFuncParam.setFileSuffix("");
+            if (pointActionReq.getFileSuffix() != null){
+                kmlActionActuatorFuncParam.setFileSuffix(pointActionReq.getFileSuffix());
+            }else {
+                kmlActionActuatorFuncParam.setFileSuffix("panoramicPhoto_360");
+            }
             kmlActionActuatorFuncParam.setUseGlobalPayloadLensIndex(String.valueOf(pointActionReq.getUseGlobalImageFormat()));
             if (ObjectUtil.equals(pointActionReq.getUseGlobalImageFormat(), 0)) {
                 kmlActionActuatorFuncParam.setPayloadLensIndex(pointActionReq.getImageFormat());
@@ -568,7 +571,11 @@
         } else if (StringUtils.equals(actionActuatorFunc, ActionActuatorFuncEnums.PANO_SHOT.getValue())) {
             kmlActionActuatorFuncParam.setPayloadPositionIndex(String.valueOf(kmlParams.getPayloadPosition()));
             kmlActionActuatorFuncParam.setUseGlobalPayloadLensIndex(String.valueOf(pointActionReq.getUseGlobalImageFormat()));
-            kmlActionActuatorFuncParam.setPanoShotSubMode("panoShot_360");
+            if (pointActionReq.getFileSuffix()!=null){
+                kmlActionActuatorFuncParam.setPanoShotSubMode(pointActionReq.getPanoShotSubMode());
+            }else {
+                kmlActionActuatorFuncParam.setPanoShotSubMode("panoShot_360");
+            }
             if (ObjectUtil.equals(pointActionReq.getUseGlobalImageFormat(), 0)) {
                 kmlActionActuatorFuncParam.setPayloadLensIndex(pointActionReq.getImageFormat());
             } else {
diff --git a/ard-route/src/main/java/com/ard/route/util/ToolUtils.java b/ard-route/src/main/java/com/ard/route/util/ToolUtils.java
index 3080eb8..0e221c5 100644
--- a/ard-route/src/main/java/com/ard/route/util/ToolUtils.java
+++ b/ard-route/src/main/java/com/ard/route/util/ToolUtils.java
@@ -8,6 +8,17 @@
  */
 public class ToolUtils {
 
+    public static Boolean isLocal = false;
+
+    public static String localFilePath = "KmzFile/kmz/";
+
+    public static String kmzPath = "kmz";
+
+    /**
+     * XML 头部
+     */
+    public static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+
     /**
      * 生成KMZ文件名称规则
      */
diff --git a/ard-route/src/main/resources/mapper/ArdRouteFolderMapper.xml b/ard-route/src/main/resources/mapper/ArdRouteFolderMapper.xml
index f3b8ac0..e886150 100644
--- a/ard-route/src/main/resources/mapper/ArdRouteFolderMapper.xml
+++ b/ard-route/src/main/resources/mapper/ArdRouteFolderMapper.xml
@@ -40,11 +40,12 @@
         <include refid="selectArdRouteFolderVo"/>
         <where>
             <if test="fileName != null  and fileName != ''"> and file_name like concat('%', #{fileName}, '%')</if>
-            <if test="createdBy != null  and createdBy != ''"> and created_by = #{createdBy}</if>
-            <if test="createdTime != null "> and created_time = #{createdTime}</if>
-            <if test="updatedBy != null  and updatedBy != ''"> and updated_by = #{updatedBy}</if>
-            <if test="updatedTime != null "> and updated_time = #{updatedTime}</if>
+            <if test="createBy != null  and createBy != ''"> and create_by = #{createBy}</if>
+            <if test="createTime != null "> and create_time = #{createTime}</if>
+            <if test="updateBy != null  and updateBy != ''"> and update_by = #{updateBy}</if>
+            <if test="updateTime != null "> and update_time = #{updateTime}</if>
         </where>
+        order by serial_number asc
     </select>
 
     <select id="selectArdRouteFolderById" parameterType="String" resultMap="ArdRouteFolderResult">
diff --git a/ard-route/src/main/resources/mapper/ArdRouteInformationMapper.xml b/ard-route/src/main/resources/mapper/ArdRouteInformationMapper.xml
index 99cdbc5..b3dcf38 100644
--- a/ard-route/src/main/resources/mapper/ArdRouteInformationMapper.xml
+++ b/ard-route/src/main/resources/mapper/ArdRouteInformationMapper.xml
@@ -11,6 +11,8 @@
         <result property="upPath"    column="up_path"    />
         <result property="minioUpPath"    column="minio_up_path"    />
         <result property="upFileSize"    column="up_file_size"    />
+        <result property="aircraft"    column="aircraft"    />
+        <result property="aircraftModel"    column="aircraft_model"    />
         <result property="createBy"    column="create_by"    />
         <result property="createTime"    column="create_time"    />
         <result property="updateBy"    column="update_by"    />
@@ -24,6 +26,8 @@
                up_path,
                minio_up_path,
                up_file_size,
+               aircraft,
+               aircraft_model,
                create_by,
                create_time,
                update_by,
@@ -54,6 +58,8 @@
             <if test="upPath != null">up_path,</if>
             <if test="minioUpPath != null">minio_up_path,</if>
             <if test="upFileSize != null">up_file_size,</if>
+            <if test="aircraft != null">aircraft,</if>
+            <if test="aircraftModel != null">aircraft_model,</if>
             <if test="createBy != null">create_by,</if>
             <if test="createTime != null">create_time,</if>
             <if test="updateBy != null">update_by,</if>
@@ -66,6 +72,8 @@
             <if test="upPath != null">#{upPath},</if>
             <if test="minioUpPath != null">#{minioUpPath},</if>
             <if test="upFileSize != null">#{upFileSize},</if>
+            <if test="aircraft != null">#{aircraft},</if>
+            <if test="aircraftModel != null">#{aircraftModel},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="updateBy != null">#{updateBy},</if>
@@ -81,6 +89,8 @@
             <if test="upPath != null">up_path = #{upPath},</if>
             <if test="minioUpPath != null">minio_up_path = #{minioUpPath},</if>
             <if test="upFileSize != null">up_file_size = #{upFileSize},</if>
+            <if test="aircraft != null">aircraft = #{aircraft},</if>
+            <if test="aircraftModel != null">aircraft_model = #{aircraftModel},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>

--
Gitblit v1.9.3