From a222a89580ad46ad31924bdfba4f0e05ecefde16 Mon Sep 17 00:00:00 2001
From: Xiajijian <1176061145@qq.com>
Date: Tue, 10 Mar 2026 17:14:46 +0800
Subject: [PATCH] 1. 优化精细化巡检业务逻辑。

---
 ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java |  287 +++++++++++++++++++++++---------------------------------
 1 files changed, 119 insertions(+), 168 deletions(-)

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 662f980..cf56316 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
@@ -6,6 +6,7 @@
 
 import com.ard.common.exception.ControlException;
 import com.ard.common.utils.DateUtils;
+import com.ard.common.utils.SecurityUtils;
 import com.ard.common.utils.file.FileUtils;
 import com.ard.common.utils.uuid.IdUtils;
 import com.ard.data.noflyzone.domain.ArdNoFlyZone;
@@ -13,6 +14,8 @@
 import com.ard.data.noflyzone.service.IArdNoFlyZoneService;
 import com.ard.data.noflyzone.utils.NoFlyZoneUtils;
 import com.ard.framework.web.service.TokenService;
+import com.ard.inspection.domain.ArdPointCloud;
+import com.ard.inspection.mapper.ArdPointCloudMapper;
 import com.ard.oss.model.MinioUploadResult;
 import com.ard.oss.service.impl.OssServiceContext;
 import com.ard.route.domain.djuav.ActionGroupReq;
@@ -20,30 +23,31 @@
 import com.ard.route.domain.djuav.RoutePointReq;
 import com.ard.route.domain.djuav.UavRouteReq;
 import com.ard.route.domain.dto.ArdNoflyDto;
+import com.ard.route.domain.route.ArdRouteCloud;
 import com.ard.route.domain.route.ArdRouteInfo;
 import com.ard.route.domain.route.ArdRouteMission;
 import com.ard.route.domain.vo.KmzResultVo;
+import com.ard.route.mapper.ArdRouteCloudMapper;
 import com.ard.route.mapper.ArdRouteInfoMapper;
 import com.ard.route.mapper.ArdRouteMissionMapper;
 import com.ard.route.service.IArdRouteInfoService;
 import com.ard.route.service.UavRouteService;
 import com.ard.work.domain.cache.UavTelemetryDataCache;
 import com.ard.work.domain.cache.UavWaylineCache;
-import com.ard.work.domain.dto.state.PointData;
 import com.ard.work.domain.dto.telemetry.TelemetryData;
 import com.ard.work.domain.dto.wayline.*;
 import com.ard.work.service.ITyService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
-
 import javax.annotation.Resource;
-
 import static com.ard.route.enums.kml.DroneEnumValueEnums.M350_RTK;
-import static com.ard.route.util.InitializationUtils.divided_23;
+import static com.ard.route.util.InitializationUtils.divided23;
 import static com.ard.route.util.ToolUtils.*;
+import static com.ard.route.util.UavRouteReqUtils.buildWayLineUploadDTO;
 import static com.ard.route.util.UavRouteReqUtils.fileConversionEntity;
 
 /**
@@ -69,6 +73,12 @@
     @Autowired
     private ArdRouteMissionMapper ardRouteMissionMapper;
 
+    @Autowired
+    private ArdPointCloudMapper ardPointCloudMapper;
+
+    @Autowired
+    private ArdRouteCloudMapper ardRouteCloudMapper;
+
     @Resource
     private IArdNoFlyZoneService ardNoFlyZoneService;
 
@@ -86,8 +96,19 @@
         ArdRouteInfo ardRouteInfo = ardRouteInfoMapper.selectArdRouteInfoById(id);
         try {
             if (ardRouteInfo != null) {
-                if (ardRouteInfo.getRouteData() != null){
-                    ardRouteInfo.setUavRouteReq((UavRouteReq) deserialize(ardRouteInfo.getRouteData()));
+                if ("3".equals(ardRouteInfo.getType())) {
+                    if (ardRouteInfo.getRouteData() != null){
+                        UavRouteReq uavRouteReq = new UavRouteReq();
+                        BeanUtils.copyProperties(deserialize(ardRouteInfo.getRouteData()), uavRouteReq);
+                        ardRouteInfo.setUavRouteReq(uavRouteReq);
+                    }
+                } else {
+                    if (ardRouteInfo.getRouteData() != null){
+                        ardRouteInfo.setUavRouteReq((UavRouteReq) deserialize(ardRouteInfo.getRouteData()));
+                    }
+                }
+                if (ardRouteInfo.getCloudData() != null){
+                    ardRouteInfo.setArdPointCloudList(deserializeLs(ardRouteInfo.getCloudData()));
                 }
             }
         } catch (IOException | ClassNotFoundException e) {
@@ -96,11 +117,8 @@
 
         // 如果参考起飞点不为空,将每个航点高度进行加工。
         if (ardRouteInfo.getUavRouteReq().getTakeOffRefPoint() != null){
-
             double altitudeOffset = getDoublePoint(ardRouteInfo.getUavRouteReq().getTakeOffRefPoint(), "alt");
-
             for (RoutePointReq routePointReq : ardRouteInfo.getUavRouteReq().getRoutePointList()) {
-                // 调整每个航点高度
                 adjustRoutePointHeight(routePointReq, altitudeOffset);
             }
         }else {
@@ -114,6 +132,7 @@
         return ardRouteInfo;
     }
 
+    // 调整每个航点高度
     private void adjustRoutePointHeight(RoutePointReq routePointReq, double altitudeOffset) {
         routePointReq.setHeight(routePointReq.getHeight() + altitudeOffset);
     }
@@ -142,7 +161,8 @@
      */
     @Override
     public String insertArdRouteInfo(ArdRouteInfo ardRouteInfo) {
-        processRouteMission(ardRouteInfo);
+        checkRouteMissionStatus(ardRouteInfo,"1");
+        checkRouteMissionStatus(ardRouteInfo,"2");
         ardRouteInfo.setId(IdUtils.simpleUUID());
         ardRouteInfo.setCreateTime(DateUtils.getNowDate());
         ardRouteInfo.setUpdateTime(DateUtils.getNowDate()); // 修改时间,用于排序
@@ -154,20 +174,78 @@
         zoomProcessing(ardRouteInfo);
         ardRouteInfo.setPath(kmzResult.getPath());
         ardRouteInfo.setReadOnly("0");
+        insertRoutePointCloud(ardRouteInfo);
         ardRouteInfoMapper.insertArdRouteInfo(dataProcessing(ardRouteInfo));
         return kmzResult.getPath();
     }
 
-    // 航线任务数据加工校验
-    private void processRouteMission(ArdRouteInfo ardRouteInfo){
-        if ("3".equals(ardRouteInfo.getType())) {
-            ArdRouteMission ardRouteMission = ardRouteMissionMapper.selectArdRouteMissionById(ardRouteInfo.getMissionId());
-            if ("0".equals(ardRouteMission.getRouteId())) {
-                ardRouteMission.setRouteId(ardRouteInfo.getId());
-                ardRouteMissionMapper.updateArdRouteMission(ardRouteMission);
-            }else {
-                throw new RuntimeException("不能修改默认分组");
+    /**
+     * 新增航信信息时,修改点云数据
+     * 同时增加航线与点云关联关系表数据
+     */
+    private void insertRoutePointCloud(ArdRouteInfo ardRouteInfo) {
+        List<ArdRouteCloud> cloudList = new ArrayList<>();
+        if (ardRouteInfo.getArdPointCloudList() != null){
+            for (ArdPointCloud cloudId : ardRouteInfo.getArdPointCloudList()) {
+                ArdRouteCloud cloud = new ArdRouteCloud();
+                cloud.setRouteId(ardRouteInfo.getId());
+                cloud.setCloudId(cloudId.getId());
+                cloudId.setAssociatedState("1");
+                cloudList.add(cloud);
+                cloudId.setUpdateTime(DateUtils.getNowDate());
+                ardPointCloudMapper.updateArdPointCloud(cloudId);
             }
+            ardRouteCloudMapper.batchRouteCloud(cloudList);
+        }
+    }
+
+    /**
+     * 航线任务数据加工校验
+     * 1.新建航线时,判断航线任务是否已完成
+     * 2.新建航线时,对航线任务数据进行加工
+     * 3.执行航线的时,修改航线任务表执行状态
+     */
+    private void checkRouteMissionStatus(ArdRouteInfo ardRouteInfo,String type){
+        ArdRouteMission mission = ardRouteMissionMapper.selectArdRouteMissionById(ardRouteInfo.getMissionId());
+        if (mission != null){
+            switch(type){
+                case "1":
+                    validateForCreate(mission);
+                    break;
+                case "2":
+                    bindRoute(mission,ardRouteInfo);
+                    break;
+                case "3":
+                    executeMission(mission,ardRouteInfo);
+                    break;
+                default:
+                    throw new RuntimeException("不支持的操作类型!!!");
+            }
+        }
+    }
+
+    private void validateForCreate(ArdRouteMission mission) {
+        if ("1".equals(mission.getExecuteStatus())){
+            throw new RuntimeException("航线任务已完成,无法创建航线!!!");
+        }
+    }
+
+    private void bindRoute(ArdRouteMission mission, ArdRouteInfo routeInfo) {
+        if (mission.getRouteId() != null) {
+            throw new RuntimeException("航线任务下已绑定航线,不可创建新航线信息!!!");
+        }
+        mission.setRouteId(routeInfo.getId());
+        ardRouteMissionMapper.updateArdRouteMission(mission);
+    }
+
+    private void executeMission(ArdRouteMission mission,ArdRouteInfo ardRouteInfo) {
+        if ("0".equals(mission.getExecuteStatus())) {
+            mission.setRouteId(ardRouteInfo.getId());
+            mission.setExecuteStatus("1");
+            mission.setExecuteName(SecurityUtils.getUsername());
+            mission.setExecuteTime(DateUtils.getNowDate());
+            mission.setUpdateTime(DateUtils.getNowDate());
+            ardRouteMissionMapper.updateArdRouteMission(mission);
         }
     }
 
@@ -207,7 +285,7 @@
                 for (ActionGroupReq actionGroupReq : routePointReq.getActionGroupList()) {
                     for (PointActionReq action : actionGroupReq.getActions()) {
                         if (action.getZoom() != null){
-                            action.setZoom(divided_23(action.getZoom()));
+                            action.setZoom(divided23(action.getZoom()));
                         }
                     }
                 }
@@ -219,14 +297,19 @@
     private ArdRouteInfo dataProcessing(ArdRouteInfo ardRouteInfo) {
         // 航线数据
         byte[] routeData = null;
+        byte[] cloudData = null;
         try {
             if (ardRouteInfo.getUavRouteReq() != null){
                 routeData = serialize(ardRouteInfo.getUavRouteReq());
+            }
+            if (ardRouteInfo.getArdPointCloudList() != null){
+                cloudData = serialize(ardRouteInfo.getArdPointCloudList());
             }
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
         ardRouteInfo.setRouteData(routeData);
+        ardRouteInfo.setCloudData(cloudData);
         ardRouteInfo.setPointCount(getPointCount(ardRouteInfo));
         return ardRouteInfo;
     }
@@ -382,7 +465,17 @@
         // 1.1通过航线数据,转换。
         ArdRouteInfo route = ardRouteInfoMapper.selectArdRouteInfoById(id);
         try {
+//            if ("3".equals(route.getType())) {
+//                UavRouteReq uavRouteReq = new UavRouteReq();
+//                BeanUtils.copyProperties(deserialize(route.getRouteData()), uavRouteReq);
+//                route.setUavRouteReq((UavRouteReq) deserialize(route.getRouteData()));
+//            }else {
+//                route.setUavRouteReq((UavRouteReq) deserialize(route.getRouteData()));
+//            }
             route.setUavRouteReq((UavRouteReq) deserialize(route.getRouteData()));
+            if (route.getCloudData() != null){
+                route.setArdPointCloudList(deserializeLs(route.getCloudData()));
+            }
         } catch (IOException | ClassNotFoundException e) {
             throw new RuntimeException(e);
         }
@@ -439,9 +532,12 @@
     @Override
     public Boolean routeBegins(String id,String boxSn) {
         ArdRouteInfo route = ardRouteInfoMapper.selectArdRouteInfoById(id);
-        // 判断是否循环航线
-        if (null != route && "0".equals(route.getIsLoop())){
-            deleteArdRouteInfoById(id);
+        if (null != route){
+            // 判断是否循环航线
+            if ("0".equals(route.getIsLoop())){
+                deleteArdRouteInfoById(id);
+            }
+            checkRouteMissionStatus(route,"3");
         }
         WayLineBeginDTO wayLineBeginDTO = new WayLineBeginDTO(boxSn);
         tyService.wayLineBegin(wayLineBeginDTO);
@@ -485,151 +581,6 @@
         WayLineEndDTO wayLineEndDTO = new WayLineEndDTO(boxSn);
         tyService.wayLineEnd(wayLineEndDTO);
         return true;
-    }
-
-    /**
-     * ArdRouteInfo实体转换,WayLineUploadDTO
-     */
-    private WayLineUploadDTO buildWayLineUploadDTO(ArdRouteInfo ardRouteInfo){
-        WayLineUploadDTO wayLineUploadDTO = new WayLineUploadDTO();
-        String finishAction = ardRouteInfo.getUavRouteReq().getFinishAction(); //1
-        Double autoFlightSpeed = ardRouteInfo.getUavRouteReq().getAutoFlightSpeed(); //15
-        Double globalTransitionalSpeed = ardRouteInfo.getUavRouteReq().getGlobalTransitionalSpeed(); //8
-        String exitOnRcLostAction = ardRouteInfo.getUavRouteReq().getExitOnRcLostAction();  //0
-
-        PlanLineData planLineData = new PlanLineData();
-        if (finishAction != null){
-            planLineData.setLoseAction(0);
-        }
-        if (autoFlightSpeed != null){
-            planLineData.setAutoSpeed(8);
-        }
-        planLineData.setMaxSpeed(15);
-//        if (globalTransitionalSpeed != null){
-//            planLineData.setMaxSpeed(15);
-//        }
-        if (exitOnRcLostAction != null){
-            planLineData.setFinishedAction(1);
-        }
-        planLineData.setHomeHeight(50);
-        planLineData.setInterests(new ArrayList<>());
-        planLineData.setIsSaveEnergyMode(0);
-        planLineData.setPoints(buildPointDataList(ardRouteInfo.getUavRouteReq()));
-
-        wayLineUploadDTO.setWayLineData(planLineData);
-        return wayLineUploadDTO;
-    }
-
-    private List<PointData> buildPointDataList(UavRouteReq uavRouteReq){
-        List<PointData> pointDataList = new ArrayList<>();
-        for (RoutePointReq routePointReq : uavRouteReq.getRoutePointList()) {
-            PointData pointData = new PointData();
-
-            Integer routePointIndex = routePointReq.getRoutePointIndex();
-            if (routePointIndex != null){
-                pointData.setGroupIndex(routePointIndex);
-            }
-            Double height = routePointReq.getHeight();
-            if (height != null){
-                pointData.setHeight(height.floatValue());
-            }
-            Double longitude = routePointReq.getLongitude();
-            if (longitude != null){
-                pointData.setLng(longitude.floatValue());
-            }
-            Double latitude = routePointReq.getLatitude();
-            if (latitude != null){
-                pointData.setLat(latitude.floatValue());
-            }
-            Double speed = routePointReq.getSpeed();
-            if (speed != null){
-                pointData.setSpeed(speed.floatValue());
-            }
-            pointData.setDampingDistance(0);
-            pointData.setFlightPathMode(1);
-            pointData.setHeading(0);
-            pointData.setHeadingMode(0);
-            pointData.setInterestIndex(-1);
-            pointData.setSafeGohomeFlag(0);
-            pointData.setActions(buildPointActionList(routePointReq.getActionGroupList()));
-            pointDataList.add(pointData);
-
-        }
-        return pointDataList;
-    }
-
-    private List<PointAction> buildPointActionList(List<ActionGroupReq> actionGroupList){
-        List<PointAction> pointActionList = new ArrayList<>();
-        for (ActionGroupReq actionGroupReq : actionGroupList) {
-            for (PointActionReq action : actionGroupReq.getActions()) {
-                PointAction pointAction = typeProcessing(action);
-                pointActionList.add(pointAction);
-            }
-        }
-        return pointActionList;
-    }
-
-    private PointAction typeProcessing(PointActionReq pointActionReq){
-        PointAction pointAction = new PointAction();
-
-        if (pointActionReq.getZoom() != null){
-            pointAction.setType(1);
-            pointAction.setParam(pointActionReq.getZoom().floatValue());
-            pointAction.setSpeakInfo("");
-            pointAction.setWaitTime(2);
-        }
-
-        if (pointActionReq.getTakePhotoType() != null){
-            pointAction.setType(2);
-            pointAction.setParam(1);
-            pointAction.setSpeakInfo("");
-            pointAction.setWaitTime(2);
-        }
-
-        if (pointActionReq.getStartRecord() != null){
-            pointAction.setType(3);
-            pointAction.setParam(1);
-            pointAction.setSpeakInfo("");
-            pointAction.setWaitTime(2);
-        }
-
-        if (pointActionReq.getStopRecord() != null){
-            pointAction.setType(4);
-            pointAction.setParam(1);
-            pointAction.setSpeakInfo("");
-            pointAction.setWaitTime(2);
-        }
-
-        if (pointActionReq.getAircraftHeading() != null){
-            pointAction.setType(5);
-            pointAction.setParam(pointActionReq.getAircraftHeading().floatValue());
-            pointAction.setSpeakInfo("");
-            pointAction.setWaitTime(2);
-        }
-
-        if (pointActionReq.getGimbalPitchRotateAngle() != null){
-            pointAction.setType(6);
-            pointAction.setParam(pointActionReq.getGimbalPitchRotateAngle().floatValue());
-            pointAction.setSpeakInfo("");
-            pointAction.setWaitTime(2);
-        }
-
-        if (pointActionReq.getGimbalYawRotateAngle() != null){
-            pointAction.setType(7);
-            pointAction.setParam(pointActionReq.getGimbalYawRotateAngle().floatValue());
-            pointAction.setSpeakInfo("");
-            pointAction.setWaitTime(2);
-        }
-
-        if (pointActionReq.getHoverTime() != null){
-            pointAction.setType(9);
-            pointAction.setParam(pointActionReq.getHoverTime().floatValue());
-            pointAction.setSpeakInfo("");
-            pointAction.setWaitTime(2);
-        }
-
-        return pointAction;
-
     }
 
     /**

--
Gitblit v1.9.3