Xiajijian
2025-11-29 bd2ead7fc4642833ae6188574e5738407e988c1c
1.优化修改航线信息功能。
1 files added
5 files modified
255 ■■■■■ changed files
ard-admin/src/main/java/com/ard/web/controller/route/UavRouteController.java 10 ●●●●● patch | view | raw | blame | history
ard-route/src/main/java/com/ard/route/service/UavRouteService.java 5 ●●●●● patch | view | raw | blame | history
ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java 57 ●●●●● patch | view | raw | blame | history
ard-route/src/main/java/com/ard/route/service/impl/UavRouteServiceImpl.java 41 ●●●●● patch | view | raw | blame | history
ard-route/src/main/java/com/ard/route/util/RouteFileUtils.java 8 ●●●●● patch | view | raw | blame | history
ard-route/src/main/java/com/ard/route/util/UavRouteReqUtils.java 134 ●●●●● patch | view | raw | blame | history
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));
    }
}
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);
}
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)信息
     * 
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);
    }
}
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);
ard-route/src/main/java/com/ard/route/util/UavRouteReqUtils.java
New file
@@ -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;
    }
}