ard-admin/src/main/java/com/ard/web/controller/route/ArdRouteInfoController.java
@@ -132,10 +132,51 @@ /** * 上传航线到边缘服务器 */ // @ApiOperation("上传航线到边缘服务器") // @PostMapping // public AjaxResult uploadRouteInformation(@RequestBody ArdRouteInfo ArdRouteInfor) { // return success(ardRouteInfoService.selectArdRouteInforByName(ArdRouteInfor.getName())); // } @ApiOperation("上传航线到边缘服务器") @PostMapping("/uploadRouteToSixHe/{id}/{boxSn}") public AjaxResult uploadRouteToSixHe(@PathVariable("id") String id, @PathVariable("boxSn") String boxSn) { return success(ardRouteInfoService.uploadRouteToSixHe(id,boxSn)); } /** * 开始航线 */ @ApiOperation("开始航线") @PostMapping("/routeBegins/{boxSn}") public AjaxResult routeBegins(@PathVariable("boxSn") String boxSn) { ardRouteInfoService.routeBegins(boxSn); return AjaxResult.success(); } /** * 暂停航线 */ @ApiOperation("暂停航线") @PostMapping("/routeSuspension/{boxSn}") public AjaxResult routeSuspension(@PathVariable("boxSn") String boxSn) { ardRouteInfoService.routeSuspension(boxSn); return AjaxResult.success(); } /** * 恢复航线 */ @ApiOperation("恢复航线") @PostMapping("/routeResumption/{boxSn}") public AjaxResult routeResumption(@PathVariable("boxSn") String boxSn) { ardRouteInfoService.routeResumption(boxSn); return AjaxResult.success(); } /** * 结束航线 */ @ApiOperation("结束航线") @PostMapping("/routeEnd/{boxSn}") public AjaxResult routeEnd(@PathVariable("boxSn") String boxSn) { ardRouteInfoService.routeEnd(boxSn); return AjaxResult.success(); } } ard-route/pom.xml
@@ -55,6 +55,10 @@ <groupId>com.ard</groupId> <artifactId>ard-system</artifactId> </dependency> <dependency> <groupId>com.ard</groupId> <artifactId>ard-work</artifactId> </dependency> </dependencies> ard-route/src/main/java/com/ard/route/domain/sixhe/ArdRouteChange.java
@@ -26,4 +26,8 @@ private List<ArdRoutePoints> points; private Integer securityHeight; private Integer templateId; } ard-route/src/main/java/com/ard/route/service/IArdRouteInfoService.java
@@ -4,6 +4,8 @@ import com.ard.oss.model.MinioUploadResult; import com.ard.route.domain.dto.ArdNoflyDto; import com.ard.route.domain.route.ArdRouteInfo; import com.ard.route.domain.sixhe.ArdRouteChange; import com.ard.work.domain.dto.wayline.WayLineUploadDTO; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -92,9 +94,51 @@ /** * 判断行点是否在禁飞区 * * ardNoflyDto * @param ardNoflyDto 禁飞区DTO实体类 * @return 结果 */ public Boolean selectRouteInfomationNoFly(ArdNoflyDto ardNoflyDto); /** * 上传航线到边缘服务器 * * @param id ID * @param boxSn 云盒SN编号 * @return 结果 */ public Boolean uploadRouteToSixHe(String id, String boxSn); /** * 开始航线 * * @param boxSn 云盒SN编号 * @return 结果 */ public Boolean routeBegins(String boxSn); /** * 暂停航线 * * @param boxSn 云盒SN编号 * @return 结果 */ public Boolean routeSuspension(String boxSn); /** * 恢复航线 * * @param boxSn 云盒SN编号 * @return 结果 */ public Boolean routeResumption(String boxSn); /** * 结束航线 * * @param boxSn 云盒SN编号 * @return 结果 */ public Boolean routeEnd(String boxSn); } 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,13 +14,20 @@ import com.ard.data.noflyzone.utils.NoFlyZoneUtils; import com.ard.oss.model.MinioUploadResult; 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.dto.ArdNoflyDto; import com.ard.route.domain.route.ArdRouteInfo; import com.ard.route.domain.sixhe.ArdRouteChange; import com.ard.route.domain.vo.KmzResultVo; import com.ard.route.mapper.ArdRouteInfoMapper; import com.ard.route.service.IArdRouteInfoService; import com.ard.route.service.UavRouteService; 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; @@ -48,6 +56,9 @@ @Resource private IArdNoFlyZoneService ardNoFlyZoneService; @Resource private ITyService tyService; /** * 查询航线(kmz) @@ -227,6 +238,228 @@ } /** * 上传航线到边缘服务器 * * 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); } // 2.将航线信息转换成对应实体类 WayLineUploadDTO wayLineUploadDTO = buildWayLineUploadDTO(route); // 3.调用接口 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); } 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.getLatitude(); if (longitude != null){ pointData.setLng(longitude.floatValue()); } Double latitude = routePointReq.getLongitude(); 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){ ard-route/src/main/java/com/ard/route/util/InitializationUtils.java
@@ -80,40 +80,137 @@ ardRouteChange.setIsSaveEnergyMode(0); ardRouteChange.setLoseAction(0); ardRouteChange.setMaxSpeed(15); ardRouteChange.setSecurityHeight(50); ardRouteChange.setTemplateId(0); List<ArdRoutePoints> points = new ArrayList<>(); ArdRoutePoints ardRoutePoints0 = new ArdRoutePoints(); ardRoutePoints0.setDampingDistance(0); ardRoutePoints0.setFlightPathMode(1); ardRoutePoints0.setGroupIndex(0); ardRoutePoints0.setHeading(0); ardRoutePoints0.setHeadingMode(0); ardRoutePoints0.setHeight(50); ardRoutePoints0.setInterestIndex(0); ardRoutePoints0.setLat(31.11339916); ardRoutePoints0.setLon(103.75851462); ardRoutePoints0.setSafeGohomeFlag(0); ardRoutePoints0.setSpeed(8); List<ArdRouteActions> actions = new ArrayList<>(); ArdRouteActions ardRouteActions0 = new ArdRouteActions(); ardRouteActions0.setParam(10); ardRouteActions0.setSpeakInfo(""); ardRouteActions0.setType(1); ardRouteActions0.setWaitTime(2); ArdRouteActions ardRouteActions1 = new ArdRouteActions(); ardRouteActions1.setParam(10); ardRouteActions1.setSpeakInfo(""); ardRouteActions1.setType(1); ardRouteActions1.setWaitTime(2); ArdRouteActions ardRouteActions2 = new ArdRouteActions(); ardRouteActions2.setParam(10); ardRouteActions2.setSpeakInfo(""); ardRouteActions2.setType(1); ardRouteActions2.setWaitTime(2); actions.add(ardRouteActions0); actions.add(ardRouteActions1); actions.add(ardRouteActions2); points.add(ardRoutePoints0); //----------------------------------------------------- ArdRoutePoints ardRoutePoints00 = new ArdRoutePoints(); ardRoutePoints00.setDampingDistance(0); ardRoutePoints00.setFlightPathMode(1); ardRoutePoints00.setGroupIndex(0); ardRoutePoints00.setHeading(0); ardRoutePoints00.setHeadingMode(0); ardRoutePoints00.setHeight(50); ardRoutePoints00.setInterestIndex(-1); ardRoutePoints00.setLat(31.11339916); ardRoutePoints00.setLon(103.75851462); ardRoutePoints00.setSafeGohomeFlag(0); ardRoutePoints00.setSpeed(8); List<ArdRouteActions> actions00 = new ArrayList<>(); ArdRouteActions ardRouteActions00 = new ArdRouteActions(); ardRouteActions00.setParam(10); ardRouteActions00.setSpeakInfo(""); ardRouteActions00.setType(1); ardRouteActions00.setWaitTime(2); ArdRouteActions ardRouteActions01 = new ArdRouteActions(); ardRouteActions01.setParam(10); ardRouteActions01.setSpeakInfo(""); ardRouteActions01.setType(1); ardRouteActions01.setWaitTime(2); ArdRouteActions ardRouteActions02 = new ArdRouteActions(); ardRouteActions02.setParam(10); ardRouteActions02.setSpeakInfo(""); ardRouteActions02.setType(1); ardRouteActions02.setWaitTime(2); actions00.add(ardRouteActions00); actions00.add(ardRouteActions01); actions00.add(ardRouteActions02); ardRoutePoints00.setActions(actions00); //----------------------------------------------------- ArdRoutePoints ardRoutePoints10 = new ArdRoutePoints(); ardRoutePoints10.setDampingDistance(0); ardRoutePoints10.setFlightPathMode(1); ardRoutePoints10.setGroupIndex(0); ardRoutePoints10.setHeading(0); ardRoutePoints10.setHeadingMode(0); ardRoutePoints10.setHeight(50); ardRoutePoints10.setInterestIndex(-1); ardRoutePoints10.setLat(31.11339916); ardRoutePoints10.setLon(103.75746538); ardRoutePoints10.setSafeGohomeFlag(0); ardRoutePoints10.setSpeed(8); List<ArdRouteActions> actions10 = new ArrayList<>(); ArdRouteActions ardRouteActions10 = new ArdRouteActions(); ardRouteActions10.setParam(20); ardRouteActions10.setSpeakInfo(""); ardRouteActions10.setType(9); ardRouteActions10.setWaitTime(2); ArdRouteActions ardRouteActions11 = new ArdRouteActions(); ardRouteActions11.setParam(40); ardRouteActions11.setSpeakInfo(""); ardRouteActions11.setType(6); ardRouteActions11.setWaitTime(2); ArdRouteActions ardRouteActions12 = new ArdRouteActions(); ardRouteActions12.setParam(40); ardRouteActions12.setSpeakInfo(""); ardRouteActions12.setType(7); ardRouteActions12.setWaitTime(2); ArdRouteActions ardRouteActions13 = new ArdRouteActions(); ardRouteActions13.setParam(40); ardRouteActions13.setSpeakInfo(""); ardRouteActions13.setType(8); ardRouteActions13.setWaitTime(2); actions10.add(ardRouteActions10); actions10.add(ardRouteActions11); actions10.add(ardRouteActions12); ardRoutePoints10.setActions(actions10); //----------------------------------------------------- ArdRoutePoints ardRoutePoints20 = new ArdRoutePoints(); ardRoutePoints20.setDampingDistance(0); ardRoutePoints20.setFlightPathMode(1); ardRoutePoints20.setGroupIndex(0); ardRoutePoints20.setHeading(0); ardRoutePoints20.setHeadingMode(0); ardRoutePoints20.setHeight(50); ardRoutePoints20.setInterestIndex(-1); ardRoutePoints20.setLat(31.11250084); ardRoutePoints20.setLon(103.75746538); ardRoutePoints20.setSafeGohomeFlag(0); ardRoutePoints20.setSpeed(8); List<ArdRouteActions> actions20 = new ArrayList<>(); ArdRouteActions ardRouteActions20 = new ArdRouteActions(); ardRouteActions20.setParam(15); ardRouteActions20.setSpeakInfo(""); ardRouteActions20.setType(9); ardRouteActions20.setWaitTime(2); ArdRouteActions ardRouteActions21 = new ArdRouteActions(); ardRouteActions21.setParam(3); ardRouteActions21.setSpeakInfo(""); ardRouteActions21.setType(10); ardRouteActions21.setWaitTime(2); actions20.add(ardRouteActions20); actions20.add(ardRouteActions21); ardRoutePoints20.setActions(actions20); //----------------------------------------------------- ArdRoutePoints ardRoutePoints30 = new ArdRoutePoints(); ardRoutePoints30.setDampingDistance(0); ardRoutePoints30.setFlightPathMode(1); ardRoutePoints30.setGroupIndex(0); ardRoutePoints30.setHeading(0); ardRoutePoints30.setHeadingMode(0); ardRoutePoints30.setHeight(60); ardRoutePoints30.setInterestIndex(-1); ardRoutePoints30.setLat(31.11250084); ardRoutePoints30.setLon(103.75851462); ardRoutePoints30.setSafeGohomeFlag(0); ardRoutePoints30.setSpeed(8); List<ArdRouteActions> actions30 = new ArrayList<>(); ArdRouteActions ardRouteActions30 = new ArdRouteActions(); ardRouteActions30.setParam(1); ardRouteActions30.setSpeakInfo(""); ardRouteActions30.setType(2); ardRouteActions30.setWaitTime(2); actions30.add(ardRouteActions30); ardRoutePoints30.setActions(actions30); points.add(ardRoutePoints00); points.add(ardRoutePoints10); points.add(ardRoutePoints20); points.add(ardRoutePoints30); ardRouteChange.setPoints(points); } ard-work/src/main/java/com/ard/work/domain/dto/state/PointData.java
@@ -8,17 +8,56 @@ // 假设 PointData 类定义如下 @Data public class PointData { private double lat; // 纬度 private double lng; // 经度 private float height; // 高度(单位:米,范围0~遥控器限高) private float speed; // 速度(单位:米/秒,范围0~15),默认8 private List<PointAction> actions; // 动作数组 private int flightPathMode; // 航线飞行模式:1=直线飞行,2=协调转弯,3=曲线飞行(停),4=曲线飞行(不停) private float dampingDistance; // 转弯半径(仅协调转弯模式下有效),取值范围1~655.35单位:米 private int safeGohomeFlag; // 是否为安全返航点 0=不是,1=是 private int headingMode; // 偏航模式 0=自动,1=锁定,2=遥控器控制,3=云台依照航点方向旋转,4=朝向兴趣点,5=飞机和云台的偏航同时旋转 private float heading; // 航点偏航 -180~180 private int interestIndex; // 兴趣点下标,默认-1 private int groupIndex; // 组下标 /** 纬度 */ private double lat; /** 经度 */ private double lng; /** 高度(单位:米,范围0~遥控器限高) */ private float height; /** 速度(单位:米/秒,范围0~15),默认8 */ private float speed; /** 动作数组 */ private List<PointAction> actions; /** 航线飞行模式: * 1=直线飞行, * 2=协调转弯, * 3=曲线飞行(停), * 4=曲线飞行(不停) */ private int flightPathMode; /** 转弯半径(仅协调转弯模式下有效),取值范围1~655.35单位:米 */ private float dampingDistance; /** 是否为安全返航点 * 0=不是, * 1=是 */ private int safeGohomeFlag; /** 偏航模式 * 0=自动, * 1=锁定, * 2=遥控器控制, * 3=云台依照航点方向旋转, * 4=朝向兴趣点, * 5=飞机和云台的偏航同时旋转 */ private int headingMode; /** 航点偏航 -180~180 */ private float heading; /** 兴趣点下标,默认-1 */ private int interestIndex; /** 组下标 */ private int groupIndex; } ard-work/src/main/java/com/ard/work/domain/dto/wayline/PlanLineData.java
@@ -18,17 +18,43 @@ @AllArgsConstructor @NoArgsConstructor public class PlanLineData { private int finishedAction; // 结束航线后动作(必填) private float maxSpeed; // 最大飞行速度(单位:米/秒) private float autoSpeed; // 自动飞行速度(单位:米/秒) private List<PointData> points; // 坐标点数组(必填) private int loseAction; // 网络失联后动作(必填) private int homeHeight; // 返航高度(必填) private int isSaveEnergyMode; // 是否开启节能模式 private HangarPoint takePoint; // 起飞点机库信息 private HangarPoint landPoint; // 降落点机库信息 private List<PointData> interests; // 兴趣点数组 private NormalModel normalModel; // 普通建模 private SurroundModel surroundModel; // 环绕建模 private PointData takeOffPoint; // 起飞点 /** 结束航线后动作(必填) */ private int finishedAction; /** 最大飞行速度(单位:米/秒) */ private float maxSpeed; /** 自动飞行速度(单位:米/秒) */ private float autoSpeed; /** 坐标点数组(必填) */ private List<PointData> points; /** 网络失联后动作(必填) */ private int loseAction; /** 返航高度(必填) */ private int homeHeight; /** 是否开启节能模式 */ private int isSaveEnergyMode; /** 起飞点机库信息 */ private HangarPoint takePoint; /** 降落点机库信息 */ private HangarPoint landPoint; /** 兴趣点数组 */ private List<PointData> interests; /** 普通建模 */ private NormalModel normalModel; /** 环绕建模 */ private SurroundModel surroundModel; /** 起飞点 */ private PointData takeOffPoint; } ard-work/src/main/java/com/ard/work/domain/dto/wayline/PointAction.java
@@ -15,8 +15,33 @@ @AllArgsConstructor @NoArgsConstructor public class PointAction { private int type; // 类型:1-变焦 2-拍照 3-录像 4-停录 5-控制飞机机头偏航 6-控制云台俯仰 7-控制云台偏航 8-控制云台横滚 9-悬停 10-等距间隔拍照 11-等时间隔拍照 12-结束间隔拍照 13-单条喊话 14-开始循环喊话 15-结束循环喊话 16-对焦 private float param; // 参数,根据类型不同含义不同 private int waitTime; // 动作触发后等待时长(单位:秒) private String speakInfo; // 喊话内容[type=13和type=14时生效] /** 类型: * 1-变焦 * 2-拍照 * 3-录像 * 4-停录 * 5-控制飞机机头偏航 * 6-控制云台俯仰 * 7-控制云台偏航 * 8-控制云台横滚 * 9-悬停 * 10-等距间隔拍照 * 11-等时间隔拍照 * 12-结束间隔拍照 * 13-单条喊话 * 14-开始循环喊话 * 15-结束循环喊话 * 16-对焦 */ private int type; /** 参数,根据类型不同含义不同 */ private float param; /** 动作触发后等待时长(单位:秒) */ private int waitTime; /** 喊话内容[type=13和type=14时生效] */ private String speakInfo; } ard-work/src/main/java/com/ard/work/domain/dto/wayline/WayLineUploadDTO.java
@@ -16,6 +16,14 @@ @AllArgsConstructor @NoArgsConstructor public class WayLineUploadDTO { /** * 云盒SN编号 */ private String boxSn; /** * 航线数据 */ private PlanLineData wayLineData; }