Xiajijian
2025-11-28 bfac293c7866f92e074f7c8bf92e6548e1ce3768
ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java
@@ -1,6 +1,7 @@
package com.ard.route.service.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.ard.common.exception.ControlException;
@@ -13,6 +14,10 @@
import com.ard.data.noflyzone.utils.NoFlyZoneUtils;
import com.ard.oss.model.MinioUploadResult;
import com.ard.oss.service.impl.OssServiceContext;
import com.ard.ossdock.service.impl.OssDockServiceContext;
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.dto.ArdNoflyDto;
import com.ard.route.domain.route.ArdRouteInfo;
@@ -20,6 +25,10 @@
import com.ard.route.mapper.ArdRouteInfoMapper;
import com.ard.route.service.IArdRouteInfoService;
import com.ard.route.service.UavRouteService;
import com.ard.work.domain.cache.UavWaylineCache;
import com.ard.work.domain.dto.state.PointData;
import com.ard.work.domain.dto.wayline.*;
import com.ard.work.service.ITyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@@ -44,10 +53,16 @@
    private OssServiceContext ossService;
    @Autowired
    private OssDockServiceContext ossDockService;
    @Autowired
    private UavRouteService routeService;
    @Resource
    private IArdNoFlyZoneService ardNoFlyZoneService;
    @Resource
    private ITyService tyService;
    /**
     * 查询航线(kmz)
@@ -110,6 +125,7 @@
        KmzResultVo kmzResult = routeService.buildKmz(ardRouteInfo.getUavRouteReq(), ardRouteInfo.getName());
        ardRouteInfo.setPath(kmzResult.getPath());
        ardRouteInfo.setReadOnly("0");
        ardRouteInfo.setPointCount(getPointCount(ardRouteInfo));
        ardRouteInfoMapper.insertArdRouteInfo(ardRouteInfo);
        return kmzResult.getPath();
    }
@@ -137,8 +153,16 @@
                return 0;
            }
            ardRouteInfo.setPath(kmzResult.getPath());
            ardRouteInfo.setPointCount(getPointCount(ardRouteInfo));
        }
        return ardRouteInfoMapper.updateArdRouteInfo(ardRouteInfo);
    }
    private Integer getPointCount(ArdRouteInfo ardRouteInfo) {
        if (ardRouteInfo.getUavRouteReq().getRoutePointList() != null) {
            return ardRouteInfo.getUavRouteReq().getRoutePointList().size();
        }
        return 0;
    }
    /**
@@ -152,7 +176,12 @@
        // 删除航线(kmz)文件
        for (String id : ids) {
            ArdRouteInfo information = ardRouteInfoMapper.selectArdRouteInfoById(id);
            ossService.deleteObject("kmz", subStringMinioUrlName(information.getPath()));
            if (information.getPath() != null){
                ossService.deleteObject("kmz", subStringMinioUrlName(information.getPath()));
            }
            if (information.getPath1() != null){
                ossDockService.deleteObject("kmz", subStringMinioUrlName(information.getPath1()));
            }
        }
        return ardRouteInfoMapper.deleteArdRouteInfoByIds(ids);
    }
@@ -178,11 +207,16 @@
    public MinioUploadResult uploadArdRouteInfo(MultipartFile file) {
        try {
            String url = ossService.upload("kmz",file);
            String urlDock = ossDockService.upload("kmz",file);
            ArdRouteInfo information = new ArdRouteInfo();
            information.setName(file.getOriginalFilename());
            information.setPath(url);
            information.setPath1(urlDock);
            information.setGroupId("0");     // 默认分组
            information.setReadOnly("1");   // 默认只读
            // 生成kmz文件实体类加工
            // 增加航线实体类信息
            insertRouteInfomation(information);
            return MinioUploadResult.builder()
                    .url(url)
@@ -195,7 +229,7 @@
    }
    /**
     * 根据文件名称查询航线信息
     * 根据名称查询航线信息
     *
     * @param name 文件名称
     * @return 结果
@@ -227,11 +261,239 @@
    }
    /**
     * 上传航线到边缘服务器
     *
     * ardNoflyDto
     * @return 结果
     */
    @Override
    public Boolean uploadRouteToSixHe(String id,String boxSn) {
        // 1.获取航线信息
        // 1.1通过航线数据,转换。
        ArdRouteInfo route = ardRouteInfoMapper.selectArdRouteInfoById(id);
        try {
            route.setUavRouteReq((UavRouteReq) deserialize(route.getRouteData()));
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        // 1.2通过minio获取航线信息
        // 2.将航线信息转换成对应实体类
        WayLineUploadDTO wayLineUploadDTO = buildWayLineUploadDTO(route);
        wayLineUploadDTO.setBoxSn(boxSn);
        // 3.缓存航线信息
        WaylineInfo WaylineInfo = new WaylineInfo();
        WaylineInfo.setBoxSn(boxSn);
        WaylineInfo.setWaylineId(route.getId());
        UavWaylineCache.put(WaylineInfo);
        // 4.调用接口
        tyService.wayLineUpload(wayLineUploadDTO);
        return true;
    }
    /**
     * 开始航线
     *
     * @param boxSn 云盒SN编号
     * @return 结果
     */
    @Override
    public Boolean routeBegins(String boxSn) {
        WayLineBeginDTO wayLineBeginDTO = new WayLineBeginDTO(boxSn);
        tyService.wayLineBegin(wayLineBeginDTO);
        return true;
    }
    /**
     * 暂停航线
     *
     * @param boxSn 云盒SN编号
     * @return 结果
     */
    @Override
    public Boolean routeSuspension(String boxSn) {
        WayLinePauseDTO wayLinePauseDTO = new WayLinePauseDTO(boxSn);
        tyService.wayLinePause(wayLinePauseDTO);
        return true;
    }
    /**
     * 恢复航线
     *
     * @param boxSn 云盒SN编号
     * @return 结果
     */
    @Override
    public Boolean routeResumption(String boxSn) {
        WayLineResumeDTO wayLineResumeDTO = new WayLineResumeDTO(boxSn);
        tyService.wayLineResume(wayLineResumeDTO);
        return true;
    }
    /**
     * 结束航线
     *
     * @param boxSn 云盒SN编号
     * @return 结果
     */
    @Override
    public Boolean routeEnd(String boxSn) {
        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;
    }
    /**
     * 数据新增航线信息
     */
    private void insertRouteInfomation(ArdRouteInfo ardRouteInfo){
        ardRouteInfo.setId(IdUtils.simpleUUID());
        ardRouteInfo.setCreateTime(DateUtils.getNowDate());
        ardRouteInfo.setUpdateTime(DateUtils.getNowDate());
        ardRouteInfoMapper.insertArdRouteInfo(ardRouteInfo);
    }