From c3b9669d67b5928757e6ad9c3b8215070cef344e Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Mon, 01 Dec 2025 11:25:39 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 ard-route/src/main/java/com/ard/route/service/UavRouteService.java                    |    5 
 ard-route/src/main/java/com/ard/route/util/RouteFileUtils.java                        |    8 +
 ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java |    4 
 ard-admin/src/main/java/com/ard/web/controller/route/UavRouteController.java          |   10 ++
 ard-route/src/main/java/com/ard/route/util/UavRouteReqUtils.java                      |  134 ++++++++++++++++++++++++++
 ard-route/src/main/java/com/ard/route/service/impl/UavRouteServiceImpl.java           |   41 +-------
 ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java       |   57 ++++++----
 7 files changed, 192 insertions(+), 67 deletions(-)

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 ccd44ae..273ee47 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
@@ -2,6 +2,7 @@
 
 import com.ard.common.core.domain.AjaxResult;
 import com.ard.route.domain.djuav.UavRouteReq;
+import com.ard.route.domain.vo.KmzInfoVo;
 import com.ard.route.service.UavRouteService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -51,5 +52,14 @@
         return success(routeService.parseKmz(fileUrl));
     }
 
+    /**
+     * KmzInfoVo实体类转换为UavRouteReq实体类
+     */
+    @ApiOperation("KmzInfoVo转换UavRouteReq")
+    @PostMapping("/KmzInfoVoToUavRouteReq")
+    public AjaxResult parseKmz(@RequestBody KmzInfoVo kmzInfoVo){
+        return success(routeService.kmzInfoVoToUavRouteReq(kmzInfoVo));
+    }
+
 }
 
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 47fdb24..c21566f 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
@@ -23,9 +23,8 @@
     public KmzInfoVo parseKmz(String file);
 
     /**
-     * 编辑kmz文件
-     * 定制:删除旧的文件名的文件,并添加新文件名的文件
+     * KmzInfoVo实体类转换为UavRouteReq实体类
      */
-    public KmzResultVo updateKmzNew(UavRouteReq uavRouteReq, String oldFileName, String newFilePath) ;
+    public UavRouteReq kmzInfoVoToUavRouteReq(KmzInfoVo kmzInfoVo);
 
 }
diff --git a/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java b/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java
index 4d0faaa..aa70de9 100644
--- a/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java
+++ b/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java
@@ -113,20 +113,10 @@
         if (ardRouteInfo.getGroupId() == null){
             ardRouteInfo.setGroupId("0");
         }
-        // 航线数据
-        byte[] routeData;
-        try {
-            routeData = serialize(ardRouteInfo.getUavRouteReq());
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
         ardRouteInfo.getUavRouteReq().setDroneType(subStringDroneType(ardRouteInfo.getAircraft()));
-        ardRouteInfo.setRouteData(routeData);
         KmzResultVo kmzResult = routeService.buildKmz(ardRouteInfo.getUavRouteReq(), ardRouteInfo.getName());
         ardRouteInfo.setPath(kmzResult.getPath());
-        ardRouteInfo.setReadOnly("0");
-        ardRouteInfo.setPointCount(getPointCount(ardRouteInfo));
-        ardRouteInfoMapper.insertArdRouteInfo(ardRouteInfo);
+        ardRouteInfoMapper.insertArdRouteInfo(dataProcessing(ardRouteInfo));
         return kmzResult.getPath();
     }
 
@@ -144,20 +134,34 @@
             KmzResultVo kmzResult;
             // 获取源文件名字
             ArdRouteInfo route = ardRouteInfoMapper.selectArdRouteInfoById(ardRouteInfo.getId());
-            if (route.getName().equals(ardRouteInfo.getName())) {
-                kmzResult = routeService.updateKmz(ardRouteInfo.getUavRouteReq(), ardRouteInfo.getName());
-            }else {
-                kmzResult = routeService.updateKmzNew(ardRouteInfo.getUavRouteReq(), route.getName(), ardRouteInfo.getName());
-            }
+            // 先删除航线
+            delOssService(route);
+            // 再生成航线
+            kmzResult = routeService.buildKmz(ardRouteInfo.getUavRouteReq(), ardRouteInfo.getName());
             if ("更新航线kmz文件失败".equals(kmzResult.getData())) {
                 return 0;
             }
             ardRouteInfo.setPath(kmzResult.getPath());
-            ardRouteInfo.setPointCount(getPointCount(ardRouteInfo));
         }
-        return ardRouteInfoMapper.updateArdRouteInfo(ardRouteInfo);
+        return ardRouteInfoMapper.updateArdRouteInfo(dataProcessing(ardRouteInfo));
     }
 
+    // 新增信息加工
+    private ArdRouteInfo dataProcessing(ArdRouteInfo ardRouteInfo) {
+        // 航线数据
+        byte[] routeData;
+        try {
+            routeData = serialize(ardRouteInfo.getUavRouteReq());
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ardRouteInfo.setRouteData(routeData);
+        ardRouteInfo.setReadOnly("0");
+        ardRouteInfo.setPointCount(getPointCount(ardRouteInfo));
+        return ardRouteInfo;
+    }
+
+    // 获取行点总数
     private Integer getPointCount(ArdRouteInfo ardRouteInfo) {
         if (ardRouteInfo.getUavRouteReq().getRoutePointList() != null) {
             return ardRouteInfo.getUavRouteReq().getRoutePointList().size();
@@ -176,16 +180,21 @@
         // 删除航线(kmz)文件
         for (String id : ids) {
             ArdRouteInfo information = ardRouteInfoMapper.selectArdRouteInfoById(id);
-            if (information.getPath() != null){
-                ossService.deleteObject("kmz", subStringMinioUrlName(information.getPath()));
-            }
-            if (information.getPath1() != null){
-                ossDockService.deleteObject("kmz", subStringMinioUrlName(information.getPath1()));
-            }
+            delOssService(information);
         }
         return ardRouteInfoMapper.deleteArdRouteInfoByIds(ids);
     }
 
+    // 删除minio文件
+    private void delOssService(ArdRouteInfo information){
+        if (information.getPath() != null){
+            ossService.deleteObject("kmz", subStringMinioUrlName(information.getPath()));
+        }
+        if (information.getPath1() != null){
+            ossDockService.deleteObject("kmz", subStringMinioUrlName(information.getPath1()));
+        }
+    }
+
     /**
      * 删除航线(kmz)信息
      * 
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 1a8b76e..352d034 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
@@ -37,6 +37,7 @@
 
 import static com.ard.route.util.RouteFileUtils.*;
 import static com.ard.route.util.ToolUtils.*;
+import static com.ard.route.util.UavRouteReqUtils.kmzInfoVOToUavRouteReq;
 
 /**
  * Author:xia
@@ -230,42 +231,12 @@
         return null;
     }
 
+    /**
+     * KmzInfoVo实体类转换为UavRouteReq实体类
+     */
     @Override
-    public KmzResultVo updateKmzNew(UavRouteReq uavRouteReq, String oldFile, String newFile) {
-        KmzResultVo result = new KmzResultVo();
-        // 校验修改的文件是否存在
-        ArdRouteInfo routeInformation = ardRouteInformationService.selectArdRouteInfoByName(oldFile);
-        if ( routeInformation == null ){
-            result.setData("修改航线文件失败,请检查文件是否存在");
-            return result;
-        }
-
-        // 获取文件
-        String minioUrl = subStringMinioUrlName(routeInformation.getPath());
-        try (InputStream inputStream = ossService.getObject(kmzPath,minioUrl);
-             ArchiveInputStream archiveInputStream = new ZipArchiveInputStream(inputStream)){
-            ArchiveEntry entry;
-            KmlInfo kmlInfo = new KmlInfo();
-            KmlInfo wpmlInfo = new KmlInfo();
-            KmlParams kmlParams = new KmlParams();
-            while (!Objects.isNull(entry = archiveInputStream.getNextEntry())) {
-                String name = entry.getName();
-                if (name.toLowerCase().endsWith(".kml")) {
-                    kmlInfo = RouteFileUtils.parseKml(archiveInputStream);
-                    buildKmlParams(kmlParams, kmlInfo);
-                    this.handleRouteUpdate(kmlInfo, uavRouteReq, FileTypeConstants.KML, kmlParams);
-                } else if (name.toLowerCase().endsWith(".wpml")) {
-                    wpmlInfo = RouteFileUtils.parseKml(archiveInputStream);
-                    this.handleRouteUpdate(wpmlInfo, uavRouteReq, FileTypeConstants.WPML, kmlParams);
-                }
-            }
-            // 删除文件
-            ossService.deleteObject(kmzPath, minioUrl);
-            return buildKmzMethod(newFile, kmlInfo, wpmlInfo);
-        } catch (Exception e) {
-            result.setData("更新航线kmz文件失败");
-            return result;
-        }
+    public UavRouteReq kmzInfoVoToUavRouteReq(KmzInfoVo kmzInfoVo) {
+        return kmzInfoVOToUavRouteReq(kmzInfoVo);
     }
 
 }
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 3573eeb..da95d7b 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
@@ -36,7 +36,13 @@
      */
     public static KmlInfo parseKml(InputStream inputStream) {
         XStream xStream = new XStream();
-        xStream.allowTypes(new Class[]{KmlInfo.class, KmlAction.class, KmlWayLineCoordinateSysParam.class, KmlPoint.class, KmlActionGroup.class});
+        xStream.allowTypes(new Class[]{
+                KmlInfo.class,
+                KmlAction.class,
+                KmlWayLineCoordinateSysParam.class,
+                KmlPoint.class,
+                KmlActionGroup.class
+        });
         xStream.alias("kml", KmlInfo.class);
         xStream.processAnnotations(KmlInfo.class);
         xStream.autodetectAnnotations(true);
diff --git a/ard-route/src/main/java/com/ard/route/util/UavRouteReqUtils.java b/ard-route/src/main/java/com/ard/route/util/UavRouteReqUtils.java
new file mode 100644
index 0000000..8e90bb6
--- /dev/null
+++ b/ard-route/src/main/java/com/ard/route/util/UavRouteReqUtils.java
@@ -0,0 +1,134 @@
+package com.ard.route.util;
+
+import com.ard.oss.service.impl.OssServiceContext;
+import com.ard.route.domain.djuav.ActionGroupReq;
+import com.ard.route.domain.djuav.PointActionReq;
+import com.ard.route.domain.djuav.RoutePointReq;
+import com.ard.route.domain.djuav.UavRouteReq;
+import com.ard.route.domain.djuav.kml.*;
+import com.ard.route.domain.vo.KmzInfoVo;
+import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.archivers.ArchiveInputStream;
+import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import static com.ard.route.util.ToolUtils.getDoublePoint;
+
+public class UavRouteReqUtils {
+
+    @Resource
+    private OssServiceContext ossService;
+
+    // 将文件转换成 UavRouteReq 实体
+    public static KmzInfoVo fileConversionEntity(MultipartFile file){
+        KmzInfoVo kmzInfoVO = new KmzInfoVo();
+        try (InputStream inputStream = file.getInputStream();
+             ArchiveInputStream archiveInputStream = new ZipArchiveInputStream(inputStream)){
+            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;
+    }
+
+    public static UavRouteReq kmzInfoVOToUavRouteReq(KmzInfoVo vo) {
+        UavRouteReq uavRouteReq = new UavRouteReq();
+        if (vo.getKmlInfo().getDocument().getFolder().getTemplateType() != null){
+            uavRouteReq.setTemplateType(vo.getKmlInfo().getDocument().getFolder().getTemplateType());
+        }
+        uavRouteReq.setDroneType(Integer.valueOf(vo.getKmlInfo().getDocument().getKmlMissionConfig().getDroneInfo().getDroneEnumValue()));
+        uavRouteReq.setImageFormat(vo.getKmlInfo().getDocument().getFolder().getPayloadParam().getImageFormat());
+        uavRouteReq.setGlobalHeight(Double.valueOf(vo.getKmlInfo().getDocument().getFolder().getGlobalHeight()));
+        uavRouteReq.setAutoFlightSpeed(Double.valueOf(vo.getKmlInfo().getDocument().getFolder().getAutoFlightSpeed()));
+        uavRouteReq.setTakeOffRefPoint(vo.getKmlInfo().getDocument().getKmlMissionConfig().getTakeOffRefPoint());
+        uavRouteReq.setRoutePointList(routePointList(vo.getKmlInfo().getDocument().getFolder().getPlacemarkList()));
+        return uavRouteReq;
+    }
+
+    public static List<RoutePointReq> routePointList(List<KmlPlacemark> placemarkList) {
+        List<RoutePointReq> routePointList = new ArrayList<>();
+        for (KmlPlacemark kmlPlacemark : placemarkList) {
+            RoutePointReq routePointReq = new RoutePointReq();
+            routePointReq.setRoutePointIndex(Integer.valueOf(kmlPlacemark.getIndex()));
+            routePointReq.setLongitude(getDoublePoint(kmlPlacemark.getKmlPoint().getCoordinates(),"lon"));
+            routePointReq.setLatitude(getDoublePoint(kmlPlacemark.getKmlPoint().getCoordinates(),"lat"));
+            routePointReq.setHeight(Double.valueOf(kmlPlacemark.getHeight()));
+            if (kmlPlacemark.getWaypointSpeed() != null) {
+                routePointReq.setSpeed(Double.valueOf(kmlPlacemark.getWaypointSpeed()));
+            }
+            if (kmlPlacemark.getActionGroup() != null) {
+                routePointReq.setActionGroupList(actionGroupList(kmlPlacemark.getActionGroup()));
+            }
+            routePointList.add(routePointReq);
+        }
+        return routePointList;
+    }
+
+    public static List<ActionGroupReq> actionGroupList(List<KmlActionGroup> actionGroup) {
+        List<ActionGroupReq> actionGroupList = new ArrayList<>();
+        for (KmlActionGroup kmlActionGroup : actionGroup) {
+            ActionGroupReq actionGroupReq = new ActionGroupReq();
+            List<PointActionReq> actions = new ArrayList<>();
+            //for (KmlAction kmlAction : kmlActionGroup.getAction()) {
+            for (int i=0 ; i < kmlActionGroup.getAction().size() ; i++) {
+                PointActionReq pointActionReq = actions(kmlActionGroup.getAction().get(i),i);
+                actions.add(pointActionReq);
+            }
+            actionGroupReq.setActions(actions);
+            actionGroupList.add(actionGroupReq);
+        }
+        return actionGroupList;
+    }
+
+    public static PointActionReq actions(KmlAction kmlAction,Integer actionIndex){
+        PointActionReq pointActionReq = new PointActionReq();
+        pointActionReq.setActionIndex(actionIndex);
+        if ("takePhoto".equals(kmlAction.getActionActuatorFunc())) {    // 照相
+            pointActionReq.setTakePhotoType(0);
+            pointActionReq.setFileSuffix(kmlAction.getActionActuatorFuncParam().getFileSuffix());
+            pointActionReq.setImageFormat("");
+            pointActionReq.setUseGlobalImageFormat(Integer.valueOf(kmlAction.getActionActuatorFuncParam().getUseGlobalPayloadLensIndex()));
+        }
+        if ("startRecord".equals(kmlAction.getActionActuatorFunc())) {      // 开始录像
+            pointActionReq.setPanoShotSubMode(kmlAction.getActionActuatorFuncParam().getFileSuffix());
+            pointActionReq.setStartRecord(true);
+        }
+        if ("stopRecord".equals(kmlAction.getActionActuatorFunc())) {       // 停止录像
+            pointActionReq.setStopRecord(true);
+        }
+        if ("gimbalRotate".equals(kmlAction.getActionActuatorFunc())) {     // 云台偏航俯仰
+            if ("1".equals(kmlAction.getActionActuatorFuncParam().getGimbalPitchRotateEnable())) {      // 云台俯仰角
+                pointActionReq.setGimbalPitchRotateAngle(Double.valueOf(kmlAction.getActionActuatorFuncParam().getGimbalPitchRotateAngle()));
+            }
+            if ("1".equals(kmlAction.getActionActuatorFuncParam().getGimbalYawRotateEnable())){      // 云台偏航角
+                pointActionReq.setGimbalYawRotateAngle(Double.valueOf(kmlAction.getActionActuatorFuncParam().getGimbalYawRotateAngle()));
+            }
+        }
+        if ("zoom".equals(kmlAction.getActionActuatorFunc())) {
+            pointActionReq.setZoom(Double.valueOf(kmlAction.getActionActuatorFuncParam().getFocalLength()));
+        }
+        if ("hover".equals(kmlAction.getActionActuatorFunc())) {
+            pointActionReq.setHoverTime(Integer.valueOf(kmlAction.getActionActuatorFuncParam().getHoverTime()));
+        }
+        if ("rotateYaw".equals(kmlAction.getActionActuatorFunc())) {
+            pointActionReq.setAircraftHeading(Double.valueOf(kmlAction.getActionActuatorFuncParam().getAircraftHeading()));
+        }
+        return pointActionReq;
+    }
+
+}
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java
index cca3705..4365828 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceServiceImpl.java
@@ -196,10 +196,6 @@
         if (needUpdate) {
             ardFlightTaskMapper.updateArdFlightTask(local);
         }
-
-        // 其它媒体增量更新
-        updateVideoToDatabase(local, remote.getVideoPathList());
-        updatePhotoToDatabase(local, local.getServerId(), remote.getBoxSn());
     }
 
 

--
Gitblit v1.9.3