From d957404beb08f0824a4a4737528fe65d6eea0e04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E5=A4=A7?= <1504665037@qq.com> Date: Tue, 27 Jan 2026 11:33:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=B1=82BaseException=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AirlineFileGroupInfoController.java | 12 ++- .../AirLinePointControllerConvert.java | 101 ++++++++++++++++++ .../convert/AirlineFileControllerConvert.java | 6 +- ...AirlineFileGroupInfoControllerConvert.java | 3 + .../domain/api/IAirlineFileDomain.java | 2 +- .../api/IAirlineFileGroupInfoDomain.java | 13 ++- .../convert/AirlineFileDomainConvert.java | 2 + .../domain/impl/AirlineFileDomainImpl.java | 4 +- .../impl/AirlineFileGroupInfoDomainImpl.java | 14 ++- .../airline/domain/model/AirLinePoint.java | 78 ++++++++++++++ .../airline/domain/model/AirlineFile.java | 7 +- .../domain/model/AirlineFileGroupInfo.java | 2 +- .../airline/domain/uitl/WayPointUitls.java | 15 +-- .../mapper/AirlineFileGroupInfoMapper.java | 12 ++- .../airline/mapper/AirlineFileMapper.java | 2 +- .../api/IAirlineFileGroupInfoService.java | 8 +- .../service/api/IAirlineFileService.java | 3 + .../convert/AirLinePointServiceConvert.java | 101 ++++++++++++++++++ .../AirlineFileGroupInfoServiceConvert.java | 2 + .../convert/AirlineFileServiceConvert.java | 8 +- .../airline/service/dto/AirLinePointDTO.java | 78 ++++++++++++++ .../airline/service/dto/AirlineFileDTO.java | 7 +- .../impl/AirlineFileServiceGroupImpl.java | 20 ++-- .../impl/AirlineFileServiceGroupInfoImpl.java | 21 ++-- .../service/impl/AirlineFileServiceImpl.java | 25 +++-- .../airline/AirlineFileGroupInfoMapper.xml | 12 +++ 26 files changed, 498 insertions(+), 60 deletions(-) create mode 100644 src/main/java/com/ruoyi/airline/controller/convert/AirLinePointControllerConvert.java create mode 100644 src/main/java/com/ruoyi/airline/domain/model/AirLinePoint.java create mode 100644 src/main/java/com/ruoyi/airline/service/convert/AirLinePointServiceConvert.java create mode 100644 src/main/java/com/ruoyi/airline/service/dto/AirLinePointDTO.java diff --git a/src/main/java/com/ruoyi/airline/controller/AirlineFileGroupInfoController.java b/src/main/java/com/ruoyi/airline/controller/AirlineFileGroupInfoController.java index 14d1583..95eaa21 100644 --- a/src/main/java/com/ruoyi/airline/controller/AirlineFileGroupInfoController.java +++ b/src/main/java/com/ruoyi/airline/controller/AirlineFileGroupInfoController.java @@ -60,11 +60,12 @@ public class AirlineFileGroupInfoController extends BaseController { *

* kmz类似zip,一般情况下内部包含kml和wpml两个文件 * + * * @param file */ @PostMapping("/parseAndUpload") @Operation(summary = " kmz航线文件,并转换成waypoint上传 ,仅仅返航URL") - public AjaxResult parseAndUpload(@RequestParam("file") MultipartFile file, Long groupId) throws IOException { + public AjaxResult parseAndUpload(@RequestParam("file") MultipartFile file, Long groupId) throws BaseException { AirlineFileDTO dto = iAirlineFileService.parseAndUplload(file); AirlineFileDTO result = iAirlineFileService.save(dto); AirlineFileGroupInfoDTO infoDTO = new AirlineFileGroupInfoDTO(); @@ -81,13 +82,16 @@ public class AirlineFileGroupInfoController extends BaseController { */ @PostMapping() @Operation(summary = "在当前分组下添加初始航线,必须上传分组ID") - public AjaxResult add(@RequestBody AirlineFileGroupInfoVO vo) throws IOException { + public AjaxResult add(@RequestBody AirlineFileGroupInfoVO vo) throws BaseException { if (vo.getGroupId() == null) { throw new BaseException("分组ID不能为空"); } AirlineFileGroupInfoDTO dto = AirlineFileGroupInfoControllerConvert.toDTO(vo); - AirlineFileGroupInfoDTO result = iAirlineFileGroupInfoService.save(dto); - return success(AirlineFileGroupInfoControllerConvert.toVO(result)); + Long result = iAirlineFileGroupInfoService.save(dto); + if (result > 0) { + return success(result); + } + throw new BaseException("新增失败"); } diff --git a/src/main/java/com/ruoyi/airline/controller/convert/AirLinePointControllerConvert.java b/src/main/java/com/ruoyi/airline/controller/convert/AirLinePointControllerConvert.java new file mode 100644 index 0000000..6d23acf --- /dev/null +++ b/src/main/java/com/ruoyi/airline/controller/convert/AirLinePointControllerConvert.java @@ -0,0 +1,101 @@ +package com.ruoyi.airline.controller.convert; + +import java.util.List; +import java.util.stream.Collectors; + +import com.ruoyi.airline.api.domain.AirLinePointVO; +import com.ruoyi.airline.service.dto.AirLinePointDTO; + +/** + * 航线航点Controller转换类 + * 用于Controller层VO和Service层DTO之间的转换 + * + * @author ruoyi + * @date 2026-01-26 + */ +public class AirLinePointControllerConvert { + + /** + * 将Service DTO转换为Controller VO + * + * @param dto Service DTO + * @return Controller VO + */ + public static AirLinePointVO toVO(AirLinePointDTO dto) { + if (dto == null) { + return null; + } + AirLinePointVO vo = new AirLinePointVO(); + vo.setId(dto.getId()); + vo.setCommand(dto.getCommand()); + vo.setLat(dto.getLat()); + vo.setLon(dto.getLon()); + vo.setAlt(dto.getAlt()); + vo.setLoiterTime(dto.getLoiterTime()); + vo.setCameraPitch(dto.getCameraPitch()); + vo.setCameraRoll(dto.getCameraRoll()); + vo.setCameraYaw(dto.getCameraYaw()); + vo.setSessionControl(dto.getSessionControl()); + vo.setShootCommand(dto.getShootCommand()); + vo.setZoomAbsolute(dto.getZoomAbsolute()); + vo.setRotateDirection(dto.getRotateDirection()); + return vo; + } + + /** + * 将Controller VO转换为Service DTO + * + * @param vo Controller VO + * @return Service DTO + */ + public static AirLinePointDTO toDTO(AirLinePointVO vo) { + if (vo == null) { + return null; + } + AirLinePointDTO dto = new AirLinePointDTO(); + dto.setId(vo.getId()); + dto.setCommand(vo.getCommand()); + dto.setLat(vo.getLat()); + dto.setLon(vo.getLon()); + dto.setAlt(vo.getAlt()); + dto.setLoiterTime(vo.getLoiterTime()); + dto.setCameraPitch(vo.getCameraPitch()); + dto.setCameraRoll(vo.getCameraRoll()); + dto.setCameraYaw(vo.getCameraYaw()); + dto.setSessionControl(vo.getSessionControl()); + dto.setShootCommand(vo.getShootCommand()); + dto.setZoomAbsolute(vo.getZoomAbsolute()); + dto.setRotateDirection(vo.getRotateDirection()); + return dto; + } + + /** + * 将Service DTO列表转换为Controller VO列表 + * + * @param dtoList Service DTO列表 + * @return Controller VO列表 + */ + public static List toVOList(List dtoList) { + if (dtoList == null || dtoList.isEmpty()) { + return null; + } + return dtoList.stream() + .map(AirLinePointControllerConvert::toVO) + .collect(Collectors.toList()); + } + + /** + * 将Controller VO列表转换为Service DTO列表 + * + * @param voList Controller VO列表 + * @return Service DTO列表 + */ + public static List toDTOList(List voList) { + if (voList == null || voList.isEmpty()) { + return null; + } + return voList.stream() + .map(AirLinePointControllerConvert::toDTO) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/ruoyi/airline/controller/convert/AirlineFileControllerConvert.java b/src/main/java/com/ruoyi/airline/controller/convert/AirlineFileControllerConvert.java index ab78f16..2fb8023 100644 --- a/src/main/java/com/ruoyi/airline/controller/convert/AirlineFileControllerConvert.java +++ b/src/main/java/com/ruoyi/airline/controller/convert/AirlineFileControllerConvert.java @@ -26,11 +26,12 @@ public class AirlineFileControllerConvert { return null; } AirlineFileVO vo = new AirlineFileVO(); + vo.setName(dto.getName()); vo.setId(dto.getId()); vo.setFileName(dto.getFileName()); vo.setFileUrl(dto.getFileUrl()); vo.setType(dto.getType()); - vo.setLinePointDtoList(dto.getLinePointDtoList()); + vo.setLinePointVOList(AirLinePointControllerConvert.toVOList(dto.getLinePointDtoList())); vo.setStatus(dto.getStatus()); vo.setDjiRthAltitude(dto.getDjiRthAltitude()); return vo; @@ -48,10 +49,11 @@ public class AirlineFileControllerConvert { } AirlineFileDTO dto = new AirlineFileDTO(); dto.setId(vo.getId()); + dto.setName(vo.getName()); dto.setFileName(vo.getFileName()); dto.setFileUrl(vo.getFileUrl()); dto.setType(vo.getType()); - dto.setLinePointDtoList(vo.getLinePointDtoList()); + dto.setLinePointDtoList(AirLinePointControllerConvert.toDTOList(vo.getLinePointVOList())); dto.setStatus(vo.getStatus()); dto.setDjiRthAltitude(vo.getDjiRthAltitude()); return dto; diff --git a/src/main/java/com/ruoyi/airline/controller/convert/AirlineFileGroupInfoControllerConvert.java b/src/main/java/com/ruoyi/airline/controller/convert/AirlineFileGroupInfoControllerConvert.java index 7e7583f..4ec6447 100644 --- a/src/main/java/com/ruoyi/airline/controller/convert/AirlineFileGroupInfoControllerConvert.java +++ b/src/main/java/com/ruoyi/airline/controller/convert/AirlineFileGroupInfoControllerConvert.java @@ -3,6 +3,7 @@ package com.ruoyi.airline.controller.convert; import com.ruoyi.airline.api.domain.AirlineFileGroupInfoVO; import com.ruoyi.airline.api.domain.AirlineFileGroupVO; +import com.ruoyi.airline.service.convert.AirlineFileServiceConvert; import com.ruoyi.airline.service.dto.AirlineFileGroupDTO; import com.ruoyi.airline.service.dto.AirlineFileGroupInfoDTO; @@ -33,6 +34,7 @@ public class AirlineFileGroupInfoControllerConvert { vo.setGroupId(dto.getGroupId()); vo.setCreateBy(dto.getCreateBy()); vo.setCreateTime(dto.getCreateTime()); + vo.setUpdateBy(dto.getUpdateBy()); vo.setUpdateTime(dto.getUpdateTime()); vo.setRemark(dto.getRemark()); @@ -57,6 +59,7 @@ public class AirlineFileGroupInfoControllerConvert { dto.setUpdateBy(vo.getUpdateBy()); dto.setUpdateTime(vo.getUpdateTime()); dto.setRemark(vo.getRemark()); + dto.setAirlineFileDTO(AirlineFileControllerConvert.toDTO(vo.getAirlineFileVO())); return dto; } diff --git a/src/main/java/com/ruoyi/airline/domain/api/IAirlineFileDomain.java b/src/main/java/com/ruoyi/airline/domain/api/IAirlineFileDomain.java index d4d3a08..a893f62 100644 --- a/src/main/java/com/ruoyi/airline/domain/api/IAirlineFileDomain.java +++ b/src/main/java/com/ruoyi/airline/domain/api/IAirlineFileDomain.java @@ -16,5 +16,5 @@ public interface IAirlineFileDomain { List selectFileListByIds(List ids); - AirlineFile save(AirlineFile model); + Long save(AirlineFile model); } \ No newline at end of file diff --git a/src/main/java/com/ruoyi/airline/domain/api/IAirlineFileGroupInfoDomain.java b/src/main/java/com/ruoyi/airline/domain/api/IAirlineFileGroupInfoDomain.java index 0f81476..ec72c96 100644 --- a/src/main/java/com/ruoyi/airline/domain/api/IAirlineFileGroupInfoDomain.java +++ b/src/main/java/com/ruoyi/airline/domain/api/IAirlineFileGroupInfoDomain.java @@ -19,7 +19,16 @@ public interface IAirlineFileGroupInfoDomain { * * @param dto */ - int deleteGroupInfo(AirlineFileGroupInfo dto); + Long deleteGroupInfo(AirlineFileGroupInfo dto); - AirlineFileGroupInfo save(AirlineFileGroupInfo model); + Long save(AirlineFileGroupInfo model); + + /** + * 检查是否存在相同的groupId和airlineId + * + * @param groupId 分组ID + * @param airlineId 航线ID + * @return 是否存在 + */ + boolean existsByGroupIdAndAirlineId(Long groupId, Long airlineId); } diff --git a/src/main/java/com/ruoyi/airline/domain/convert/AirlineFileDomainConvert.java b/src/main/java/com/ruoyi/airline/domain/convert/AirlineFileDomainConvert.java index 9b00194..4a10397 100644 --- a/src/main/java/com/ruoyi/airline/domain/convert/AirlineFileDomainConvert.java +++ b/src/main/java/com/ruoyi/airline/domain/convert/AirlineFileDomainConvert.java @@ -27,6 +27,7 @@ public class AirlineFileDomainConvert { } AirlineFileEntity entity = new AirlineFileEntity(); entity.setId(model.getId()); + entity.setName(model.getName()); entity.setFileName(model.getFileName()); entity.setFileUrl(model.getFileUrl()); entity.setType(model.getType()); @@ -51,6 +52,7 @@ public class AirlineFileDomainConvert { } AirlineFile model = new AirlineFile(); model.setId(entity.getId()); + model.setName(entity.getName()); model.setFileName(entity.getFileName()); model.setFileUrl(entity.getFileUrl()); model.setType(entity.getType()); diff --git a/src/main/java/com/ruoyi/airline/domain/impl/AirlineFileDomainImpl.java b/src/main/java/com/ruoyi/airline/domain/impl/AirlineFileDomainImpl.java index 8c044c3..d22cc7a 100644 --- a/src/main/java/com/ruoyi/airline/domain/impl/AirlineFileDomainImpl.java +++ b/src/main/java/com/ruoyi/airline/domain/impl/AirlineFileDomainImpl.java @@ -28,8 +28,8 @@ public class AirlineFileDomainImpl implements IAirlineFileDomain { } @Override - public AirlineFile save(AirlineFile model) { + public Long save(AirlineFile model) { AirlineFileEntity entity = AirlineFileDomainConvert.toEntity(model); - return AirlineFileDomainConvert.toModel(airlineFileMapper.save(entity)); + return airlineFileMapper.save(entity); } } \ No newline at end of file diff --git a/src/main/java/com/ruoyi/airline/domain/impl/AirlineFileGroupInfoDomainImpl.java b/src/main/java/com/ruoyi/airline/domain/impl/AirlineFileGroupInfoDomainImpl.java index 891da30..b6d4400 100644 --- a/src/main/java/com/ruoyi/airline/domain/impl/AirlineFileGroupInfoDomainImpl.java +++ b/src/main/java/com/ruoyi/airline/domain/impl/AirlineFileGroupInfoDomainImpl.java @@ -32,15 +32,25 @@ public class AirlineFileGroupInfoDomainImpl implements IAirlineFileGroupInfoDoma } @Override - public int deleteGroupInfo(AirlineFileGroupInfo model) { + public Long deleteGroupInfo(AirlineFileGroupInfo model) { model.setDelFlag(1L); AirlineFileGroupInfoEntity Entity = AirlineFileGroupInfoDomainConvert.toEntity(model); return airlineFileGroupInfoMapper.deleteGroupInfo(Entity); } @Override - public AirlineFileGroupInfo save(AirlineFileGroupInfo model) { + public Long save(AirlineFileGroupInfo model) { AirlineFileGroupInfoEntity Entity = AirlineFileGroupInfoDomainConvert.toEntity(model); return airlineFileGroupInfoMapper.save(Entity); } + + @Override + public boolean existsByGroupIdAndAirlineId(Long groupId, Long airlineId) { + AirlineFileGroupInfo model = new AirlineFileGroupInfo(); + model.setGroupId(groupId); + model.setAirlineId(airlineId); + AirlineFileGroupInfoEntity entity = AirlineFileGroupInfoDomainConvert.toEntity(model); + int count = airlineFileGroupInfoMapper.countByGroupIdAndAirlineId(entity); + return count > 0; + } } diff --git a/src/main/java/com/ruoyi/airline/domain/model/AirLinePoint.java b/src/main/java/com/ruoyi/airline/domain/model/AirLinePoint.java new file mode 100644 index 0000000..148ea36 --- /dev/null +++ b/src/main/java/com/ruoyi/airline/domain/model/AirLinePoint.java @@ -0,0 +1,78 @@ +package com.ruoyi.airline.domain.model; +/** + * 航线航点VO + * + * @author 拓恒 + * @date 2026-01-17 + */ + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class AirLinePoint implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * 序号 + */ + private Integer id; + + /** + * 动作id + */ + private Integer command; + /** + * 经纬度 +-180 + */ + private String lat; + /** + * 经纬度 +-90 + */ + private String lon; + + /** + * 高度 + */ + private Integer alt; + + /** + * 悬停时间s + */ + private String loiterTime; + + /** + * 相机俯仰角 + */ + private String cameraPitch; + + /** + * 相机滚动角 + */ + private String cameraRoll; + + /** + * 相机偏航角 + */ + private String cameraYaw; + + /** + * 挂载控制 1 相机 + */ + private Integer sessionControl; + /** + * 相机指令 1 拍照 + */ + private Integer shootCommand; + + /** + * 绝对变焦 目前 1-10 + */ + private Integer zoomAbsolute; + + /*** + * 转动方向 -1逆时针 1相对机场方向 (硬件定义的) + */ + private Integer rotateDirection; +} diff --git a/src/main/java/com/ruoyi/airline/domain/model/AirlineFile.java b/src/main/java/com/ruoyi/airline/domain/model/AirlineFile.java index e232eb4..5728da1 100644 --- a/src/main/java/com/ruoyi/airline/domain/model/AirlineFile.java +++ b/src/main/java/com/ruoyi/airline/domain/model/AirlineFile.java @@ -19,7 +19,10 @@ public class AirlineFile { * 主键ID */ private Long id; - + /** + * 航线名称 + */ + private String name; /** * 文件名称 */ @@ -56,7 +59,7 @@ public class AirlineFile { /** * 航线点列表 */ - private List linePointDtoList; + private List linePointDtoList; /** * 数据来源 diff --git a/src/main/java/com/ruoyi/airline/domain/model/AirlineFileGroupInfo.java b/src/main/java/com/ruoyi/airline/domain/model/AirlineFileGroupInfo.java index 65f82fd..4110f1e 100644 --- a/src/main/java/com/ruoyi/airline/domain/model/AirlineFileGroupInfo.java +++ b/src/main/java/com/ruoyi/airline/domain/model/AirlineFileGroupInfo.java @@ -1,6 +1,5 @@ package com.ruoyi.airline.domain.model; -import com.ruoyi.common.core.web.domain.BaseEntity; import com.ruoyi.common.core.web.domain.ExBaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; @@ -29,6 +28,7 @@ public class AirlineFileGroupInfo extends ExBaseEntity { */ private Long airlineId; + private AirlineFile airlineFile; @Override public String toString() { diff --git a/src/main/java/com/ruoyi/airline/domain/uitl/WayPointUitls.java b/src/main/java/com/ruoyi/airline/domain/uitl/WayPointUitls.java index 7e7c066..4d73b85 100644 --- a/src/main/java/com/ruoyi/airline/domain/uitl/WayPointUitls.java +++ b/src/main/java/com/ruoyi/airline/domain/uitl/WayPointUitls.java @@ -2,6 +2,7 @@ package com.ruoyi.airline.domain.uitl; import com.ruoyi.airline.api.domain.AirLinePointVO; import com.ruoyi.airline.domain.model.kml.*; +import com.ruoyi.airline.service.dto.AirLinePointDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; @@ -27,7 +28,7 @@ public class WayPointUitls { StringBuilder waypointBuilder = new StringBuilder("QGC WPL 110\n"); // 重置全局id计数器 //定义waypoint的航点对象集合备用 - List linePoints = new ArrayList<>(); + List linePoints = new ArrayList<>(); //m3和m4TD的机型可以从missionConfig获取部分基础数据 KmlMissionConfig missionConfig = kmlInfo.getDocument().getKmlMissionConfig(); //其他场景下都可以从missionConfig 拿航点和动作集合 @@ -67,7 +68,7 @@ public class WayPointUitls { String[] coords = cleanCoords.split(","); // 基础航点(安全点22和结束点20之间的其他16普通航点) - AirLinePointVO waypoint = buildPoint( + AirLinePointDTO waypoint = buildPoint( 16, coords[1], coords[0], (int) Float.parseFloat(placeMark.getHeight()), @@ -98,7 +99,7 @@ public class WayPointUitls { // 5. 生成Waypoints文件内容 for (int i = 0; i < linePoints.size(); i++) { - AirLinePointVO point = linePoints.get(i); + AirLinePointDTO point = linePoints.get(i); waypointBuilder.append(formatWaypointLine(point, i)).append("\n"); } @@ -107,7 +108,7 @@ public class WayPointUitls { } // 格式化航点行(直接使用DTO字段) - public static String formatWaypointLine(AirLinePointVO point, Integer index) { + public static String formatWaypointLine(AirLinePointDTO point, Integer index) { switch (point.getCommand()) { case 16: if (index == 0) { @@ -167,7 +168,7 @@ public class WayPointUitls { } // 动作解析逻辑 - public static void processActions(KmlAction action, List linePoints) { + public static void processActions(KmlAction action, List linePoints) { //kmz航线的动作code String actionType = action.getActionActuatorFunc(); @@ -277,10 +278,10 @@ public class WayPointUitls { //构建waypoint航点 - public static AirLinePointVO buildPoint(int command, String lat, String lon, int alt, + public static AirLinePointDTO buildPoint(int command, String lat, String lon, int alt, String loiterTime, String cameraPitch, String cameraRoll, String cameraYaw, int sessionControl, int zoomAbsolute, int rotateDirection) { - AirLinePointVO point = new AirLinePointVO(); + AirLinePointDTO point = new AirLinePointDTO(); point.setCommand(command); point.setLat(lat); point.setLon(lon); diff --git a/src/main/java/com/ruoyi/airline/mapper/AirlineFileGroupInfoMapper.java b/src/main/java/com/ruoyi/airline/mapper/AirlineFileGroupInfoMapper.java index 4960544..3a85d5d 100644 --- a/src/main/java/com/ruoyi/airline/mapper/AirlineFileGroupInfoMapper.java +++ b/src/main/java/com/ruoyi/airline/mapper/AirlineFileGroupInfoMapper.java @@ -15,7 +15,15 @@ public interface AirlineFileGroupInfoMapper { List selectGroupList(AirlineFileGroupInfoEntity entity); - int deleteGroupInfo(AirlineFileGroupInfoEntity entity); + Long deleteGroupInfo(AirlineFileGroupInfoEntity entity); - AirlineFileGroupInfo save(AirlineFileGroupInfoEntity entity); + Long save(AirlineFileGroupInfoEntity entity); + + /** + * 检查是否存在相同的groupId和airlineId + * + * @param entity 包含groupId和airlineId的实体 + * @return 存在的记录数 + */ + int countByGroupIdAndAirlineId(AirlineFileGroupInfoEntity entity); } diff --git a/src/main/java/com/ruoyi/airline/mapper/AirlineFileMapper.java b/src/main/java/com/ruoyi/airline/mapper/AirlineFileMapper.java index f5fdcb7..05f5186 100644 --- a/src/main/java/com/ruoyi/airline/mapper/AirlineFileMapper.java +++ b/src/main/java/com/ruoyi/airline/mapper/AirlineFileMapper.java @@ -13,7 +13,7 @@ import java.util.List; public interface AirlineFileMapper { - AirlineFileEntity save(AirlineFileEntity entity); + Long save(AirlineFileEntity entity); List selectFileListByIds(List ids); } \ No newline at end of file diff --git a/src/main/java/com/ruoyi/airline/service/api/IAirlineFileGroupInfoService.java b/src/main/java/com/ruoyi/airline/service/api/IAirlineFileGroupInfoService.java index ba86239..99e71c9 100644 --- a/src/main/java/com/ruoyi/airline/service/api/IAirlineFileGroupInfoService.java +++ b/src/main/java/com/ruoyi/airline/service/api/IAirlineFileGroupInfoService.java @@ -1,10 +1,8 @@ package com.ruoyi.airline.service.api; -import com.alibaba.fastjson.JSONObject; import com.ruoyi.airline.service.dto.AirlineFileGroupInfoDTO; -import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.core.exception.base.BaseException; -import java.io.IOException; import java.util.List; /** @@ -13,9 +11,9 @@ import java.util.List; * @author 拓恒 */ public interface IAirlineFileGroupInfoService { - List selectGroupInfoListById(Long groupId); + List selectGroupInfoListById(Long groupId); - AirlineFileGroupInfoDTO save(AirlineFileGroupInfoDTO dto) throws IOException; + Long save(AirlineFileGroupInfoDTO dto) throws BaseException; } diff --git a/src/main/java/com/ruoyi/airline/service/api/IAirlineFileService.java b/src/main/java/com/ruoyi/airline/service/api/IAirlineFileService.java index 6c03c13..6b24f8c 100644 --- a/src/main/java/com/ruoyi/airline/service/api/IAirlineFileService.java +++ b/src/main/java/com/ruoyi/airline/service/api/IAirlineFileService.java @@ -1,5 +1,6 @@ package com.ruoyi.airline.service.api; +import com.ruoyi.airline.domain.model.AirlineFile; import com.ruoyi.airline.service.dto.AirlineFileDTO; import org.springframework.web.multipart.MultipartFile; @@ -19,4 +20,6 @@ public interface IAirlineFileService { AirlineFileDTO parseAndUplload(MultipartFile file); AirlineFileDTO createOrupdate(AirlineFileDTO airlineFile) throws IOException; + + AirlineFile selectById(Long airlineId); } \ No newline at end of file diff --git a/src/main/java/com/ruoyi/airline/service/convert/AirLinePointServiceConvert.java b/src/main/java/com/ruoyi/airline/service/convert/AirLinePointServiceConvert.java new file mode 100644 index 0000000..ca2826e --- /dev/null +++ b/src/main/java/com/ruoyi/airline/service/convert/AirLinePointServiceConvert.java @@ -0,0 +1,101 @@ +package com.ruoyi.airline.service.convert; + +import com.ruoyi.airline.service.dto.AirLinePointDTO; +import com.ruoyi.airline.domain.model.AirLinePoint; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 航线航点Service转换类 + * 用于Service DTO和Domain模型之间的转换 + * + * @author ruoyi + * @date 2026-01-26 + */ +public class AirLinePointServiceConvert { + + /** + * 将Service DTO转换为Domain模型 + * + * @param dto Service DTO + * @return Domain模型 + */ + public static AirLinePoint toModel(AirLinePointDTO dto) { + if (dto == null) { + return null; + } + AirLinePoint model = new AirLinePoint(); + model.setId(dto.getId()); + model.setCommand(dto.getCommand()); + model.setLat(dto.getLat()); + model.setLon(dto.getLon()); + model.setAlt(dto.getAlt()); + model.setLoiterTime(dto.getLoiterTime()); + model.setCameraPitch(dto.getCameraPitch()); + model.setCameraRoll(dto.getCameraRoll()); + model.setCameraYaw(dto.getCameraYaw()); + model.setSessionControl(dto.getSessionControl()); + model.setShootCommand(dto.getShootCommand()); + model.setZoomAbsolute(dto.getZoomAbsolute()); + model.setRotateDirection(dto.getRotateDirection()); + return model; + } + + /** + * 将Domain模型转换为Service DTO + * + * @param model Domain模型 + * @return Service DTO + */ + public static AirLinePointDTO toDTO(AirLinePoint model) { + if (model == null) { + return null; + } + AirLinePointDTO dto = new AirLinePointDTO(); + dto.setId(model.getId()); + dto.setCommand(model.getCommand()); + dto.setLat(model.getLat()); + dto.setLon(model.getLon()); + dto.setAlt(model.getAlt()); + dto.setLoiterTime(model.getLoiterTime()); + dto.setCameraPitch(model.getCameraPitch()); + dto.setCameraRoll(model.getCameraRoll()); + dto.setCameraYaw(model.getCameraYaw()); + dto.setSessionControl(model.getSessionControl()); + dto.setShootCommand(model.getShootCommand()); + dto.setZoomAbsolute(model.getZoomAbsolute()); + dto.setRotateDirection(model.getRotateDirection()); + return dto; + } + + /** + * 将Domain模型列表转换为Service DTO列表 + * + * @param modelList Domain模型列表 + * @return Service DTO列表 + */ + public static List toDTOList(List modelList) { + if (modelList == null || modelList.isEmpty()) { + return null; + } + return modelList.stream() + .map(AirLinePointServiceConvert::toDTO) + .collect(Collectors.toList()); + } + + /** + * 将Service DTO列表转换为Domain模型列表 + * + * @param dtoList Service DTO列表 + * @return Domain模型列表 + */ + public static List toModelList(List dtoList) { + if (dtoList == null || dtoList.isEmpty()) { + return null; + } + return dtoList.stream() + .map(AirLinePointServiceConvert::toModel) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/ruoyi/airline/service/convert/AirlineFileGroupInfoServiceConvert.java b/src/main/java/com/ruoyi/airline/service/convert/AirlineFileGroupInfoServiceConvert.java index 2daeac2..c9793f0 100644 --- a/src/main/java/com/ruoyi/airline/service/convert/AirlineFileGroupInfoServiceConvert.java +++ b/src/main/java/com/ruoyi/airline/service/convert/AirlineFileGroupInfoServiceConvert.java @@ -30,6 +30,7 @@ public class AirlineFileGroupInfoServiceConvert { dto.setId(model.getId()); dto.setGroupId(model.getGroupId()); dto.setAirlineId(model.getAirlineId()); + dto.setAirlineFileDTO(AirlineFileServiceConvert.toDTO(model.getAirlineFile())); return dto; } @@ -47,6 +48,7 @@ public class AirlineFileGroupInfoServiceConvert { model.setId(dto.getId()); model.setGroupId(dto.getGroupId()); model.setAirlineId(dto.getAirlineId()); + model.setAirlineFile(AirlineFileServiceConvert.toModel(dto.getAirlineFileDTO())); return model; } diff --git a/src/main/java/com/ruoyi/airline/service/convert/AirlineFileServiceConvert.java b/src/main/java/com/ruoyi/airline/service/convert/AirlineFileServiceConvert.java index 62013c9..bc6450f 100644 --- a/src/main/java/com/ruoyi/airline/service/convert/AirlineFileServiceConvert.java +++ b/src/main/java/com/ruoyi/airline/service/convert/AirlineFileServiceConvert.java @@ -1,7 +1,7 @@ package com.ruoyi.airline.service.convert; -import com.ruoyi.airline.service.dto.AirlineFileDTO; import com.ruoyi.airline.domain.model.AirlineFile; +import com.ruoyi.airline.service.dto.AirlineFileDTO; import java.util.List; import java.util.stream.Collectors; @@ -27,12 +27,13 @@ public class AirlineFileServiceConvert { } AirlineFile model = new AirlineFile(); model.setId(dto.getId()); + model.setName(dto.getName()); model.setFileName(dto.getFileName()); model.setFileUrl(dto.getFileUrl()); model.setType(dto.getType()); model.setNote(dto.getNote()); model.setDistance(dto.getDistance()); - model.setLinePointDtoList(dto.getLinePointDtoList()); + model.setLinePointDtoList(AirLinePointServiceConvert.toModelList(dto.getLinePointDtoList())); model.setSource(dto.getSource()); model.setStatus(dto.getStatus()); model.setFileMd5(dto.getFileMd5()); @@ -61,12 +62,13 @@ public class AirlineFileServiceConvert { } AirlineFileDTO dto = new AirlineFileDTO(); dto.setId(model.getId()); + dto.setName(model.getName()); dto.setFileName(model.getFileName()); dto.setFileUrl(model.getFileUrl()); dto.setType(model.getType()); dto.setNote(model.getNote()); dto.setDistance(model.getDistance()); - dto.setLinePointDtoList(model.getLinePointDtoList()); + dto.setLinePointDtoList(AirLinePointServiceConvert.toDTOList(model.getLinePointDtoList())); dto.setSource(model.getSource()); dto.setStatus(model.getStatus()); dto.setFileMd5(model.getFileMd5()); diff --git a/src/main/java/com/ruoyi/airline/service/dto/AirLinePointDTO.java b/src/main/java/com/ruoyi/airline/service/dto/AirLinePointDTO.java new file mode 100644 index 0000000..e210f2f --- /dev/null +++ b/src/main/java/com/ruoyi/airline/service/dto/AirLinePointDTO.java @@ -0,0 +1,78 @@ +package com.ruoyi.airline.service.dto; +/** + * 航线航点VO + * + * @author 拓恒 + * @date 2026-01-17 + */ + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class AirLinePointDTO implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * 序号 + */ + private Integer id; + + /** + * 动作id + */ + private Integer command; + /** + * 经纬度 +-180 + */ + private String lat; + /** + * 经纬度 +-90 + */ + private String lon; + + /** + * 高度 + */ + private Integer alt; + + /** + * 悬停时间s + */ + private String loiterTime; + + /** + * 相机俯仰角 + */ + private String cameraPitch; + + /** + * 相机滚动角 + */ + private String cameraRoll; + + /** + * 相机偏航角 + */ + private String cameraYaw; + + /** + * 挂载控制 1 相机 + */ + private Integer sessionControl; + /** + * 相机指令 1 拍照 + */ + private Integer shootCommand; + + /** + * 绝对变焦 目前 1-10 + */ + private Integer zoomAbsolute; + + /*** + * 转动方向 -1逆时针 1相对机场方向 (硬件定义的) + */ + private Integer rotateDirection; +} diff --git a/src/main/java/com/ruoyi/airline/service/dto/AirlineFileDTO.java b/src/main/java/com/ruoyi/airline/service/dto/AirlineFileDTO.java index ba8b3d4..a54944c 100644 --- a/src/main/java/com/ruoyi/airline/service/dto/AirlineFileDTO.java +++ b/src/main/java/com/ruoyi/airline/service/dto/AirlineFileDTO.java @@ -19,7 +19,10 @@ public class AirlineFileDTO { * 主键ID */ private Long id; - + /** + * 航线名称 + */ + private String name; /** * 文件名称 */ @@ -57,7 +60,7 @@ public class AirlineFileDTO { /** * 航线点列表 */ - private List linePointDtoList; + private List linePointDtoList; /** * 关联机场id diff --git a/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceGroupImpl.java b/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceGroupImpl.java index 24d7d71..5ec8059 100644 --- a/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceGroupImpl.java +++ b/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceGroupImpl.java @@ -13,7 +13,6 @@ import com.ruoyi.airline.service.convert.AirlineFileGroupServiceConvert; import com.ruoyi.airline.service.convert.AirlineFileServiceConvert; import com.ruoyi.airline.service.dto.AirlineFileGroupDTO; import com.ruoyi.airline.service.dto.AirlineFileGroupInfoDTO; -import com.ruoyi.common.core.exception.base.BaseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -48,23 +47,20 @@ public class AirlineFileServiceGroupImpl implements IAirlineFileGroupService { AirlineFileGroupInfoDTO dto = new AirlineFileGroupInfoDTO(); dto.setGroupId(groupId); AirlineFileGroupInfo model = AirlineFileGroupInfoServiceConvert.toModel(dto); - int result = iAirlineFileGroupInfoDomain.deleteGroupInfo(model); - if (result > 0) { - // 2、删除分组 - AirlineFileGroup model2 = new AirlineFileGroup(); - model2.setGroupId(groupId); - model2.setUserId(userId); - return iAirlineFileGroupDomain.deletegroup(model2); - } - // TODO 增加事务机制 - throw new BaseException("删除航线失败"); + iAirlineFileGroupInfoDomain.deleteGroupInfo(model); + + // 2、删除分组 + AirlineFileGroup model2 = new AirlineFileGroup(); + model2.setGroupId(groupId); + model2.setUserId(userId); + return iAirlineFileGroupDomain.deletegroup(model2); } @Override public boolean checkGroupNameUnique(AirlineFileGroupDTO group) { AirlineFileGroup model = AirlineFileGroupServiceConvert.toModel(group); - return iAirlineFileGroupDomain.checkgroupNameUnique(model) ; + return iAirlineFileGroupDomain.checkgroupNameUnique(model); } @Override diff --git a/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceGroupInfoImpl.java b/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceGroupInfoImpl.java index a09f0ba..e934103 100644 --- a/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceGroupInfoImpl.java +++ b/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceGroupInfoImpl.java @@ -7,13 +7,12 @@ import com.ruoyi.airline.service.api.IAirlineFileService; import com.ruoyi.airline.service.convert.AirlineFileGroupInfoServiceConvert; import com.ruoyi.airline.service.dto.AirlineFileDTO; import com.ruoyi.airline.service.dto.AirlineFileGroupInfoDTO; +import com.ruoyi.common.core.exception.base.BaseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; import java.util.List; /** @@ -38,17 +37,27 @@ public class AirlineFileServiceGroupInfoImpl implements IAirlineFileGroupInfoSer @Override public List selectGroupInfoListById(Long groupId) { List models = iAirlineFileGroupInfoDomain.selectGroupInfoListById(groupId); + models.forEach(model -> { + model.setAirlineFile(iAirlineFileService.selectById(model.getAirlineId())); + }); return AirlineFileGroupInfoServiceConvert.toDtoList(models); } @Override - public AirlineFileGroupInfoDTO save(AirlineFileGroupInfoDTO dto) throws IOException { + public Long save(AirlineFileGroupInfoDTO dto) throws BaseException { AirlineFileDTO result = iAirlineFileService.save(dto.getAirlineFileDTO()); - dto.setAirlineFileDTO(result); + + dto.setAirlineId(result.getId()); // 保存分组信息 AirlineFileGroupInfo model = AirlineFileGroupInfoServiceConvert.toModel(dto); - AirlineFileGroupInfo airlineFileGroupInfoDTO = iAirlineFileGroupInfoDomain.save(model); - return AirlineFileGroupInfoServiceConvert.toDTO(airlineFileGroupInfoDTO); + + // 检查唯一性:同一个分组下不能有相同的航线 + boolean exists = iAirlineFileGroupInfoDomain.existsByGroupIdAndAirlineId(model.getGroupId(), model.getAirlineId()); + if (exists) { + throw new BaseException("该航线已存在于当前分组中"); + } + + return iAirlineFileGroupInfoDomain.save(model); } } \ No newline at end of file diff --git a/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceImpl.java b/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceImpl.java index 3cb49b7..a1eaa61 100644 --- a/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceImpl.java +++ b/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceImpl.java @@ -8,6 +8,7 @@ import com.ruoyi.airline.domain.uitl.KmlFileUtils; import com.ruoyi.airline.domain.uitl.WayPointUitls; import com.ruoyi.airline.service.api.IAirlineFileService; import com.ruoyi.airline.service.convert.AirlineFileServiceConvert; +import com.ruoyi.airline.service.dto.AirLinePointDTO; import com.ruoyi.airline.service.dto.AirlineFileDTO; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.base.BaseException; @@ -47,8 +48,9 @@ public class AirlineFileServiceImpl implements IAirlineFileService { @Override public AirlineFileDTO save(AirlineFileDTO dto) { AirlineFile model = AirlineFileServiceConvert.toModel(dto); - AirlineFile result = iAirlineFileDomain.save(model); - return AirlineFileServiceConvert.toDTO(result); + Long id = iAirlineFileDomain.save(model); + dto.setId(id); + return dto; } @@ -102,11 +104,11 @@ public class AirlineFileServiceImpl implements IAirlineFileService { public AirlineFileDTO createOrupdate(AirlineFileDTO airlineFile) { StringBuilder waypointBuilder = new StringBuilder("QGC WPL 110\n"); - List LineDto = airlineFile.getLinePointDtoList(); + List LineDto = airlineFile.getLinePointDtoList(); // 新建字节输出流,Freemarker操作此输出流写入生成的业务文件. if (LineDto != null && !LineDto.isEmpty()) { for (int i = 0; i < LineDto.size(); i++) { - AirLinePointVO point = LineDto.get(i); + AirLinePointDTO point = LineDto.get(i); waypointBuilder.append(WayPointUitls.formatWaypointLine(point, i)).append("\n"); } @@ -118,10 +120,21 @@ public class AirlineFileServiceImpl implements IAirlineFileService { airlineFile.setSource("airport"); airlineFile.setStatus(airlineFile.getStatus() == null ? 1 : airlineFile.getStatus()); AirlineFile model = AirlineFileServiceConvert.toModel(airlineFile); - AirlineFile result = iAirlineFileDomain.save(model); - return AirlineFileServiceConvert.toDTO(result); + Long id = iAirlineFileDomain.save(model); + model.setId(id); + return AirlineFileServiceConvert.toDTO(model); } return null; } + + @Override + public AirlineFile selectById(Long airlineId) { + if (airlineId == null) { + return null; + } + List ids = List.of(airlineId); + List airlineFiles = iAirlineFileDomain.selectFileListByIds(ids); + return airlineFiles != null && !airlineFiles.isEmpty() ? airlineFiles.get(0) : null; + } } \ No newline at end of file diff --git a/src/main/resources/mapper/airline/AirlineFileGroupInfoMapper.xml b/src/main/resources/mapper/airline/AirlineFileGroupInfoMapper.xml index 7957250..729061b 100644 --- a/src/main/resources/mapper/airline/AirlineFileGroupInfoMapper.xml +++ b/src/main/resources/mapper/airline/AirlineFileGroupInfoMapper.xml @@ -52,4 +52,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" values (#{groupId}, #{airlineId}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, 0) + + \ No newline at end of file