package com.ard.route.service.impl; import java.io.IOException; import java.util.List; import com.ard.common.exception.ControlException; import com.ard.common.utils.DateUtils; import com.ard.common.utils.file.FileUtils; import com.ard.common.utils.uuid.IdUtils; import com.ard.data.noflyzone.domain.ArdNoFlyZone; import com.ard.data.noflyzone.domain.Vertex; import com.ard.data.noflyzone.service.IArdNoFlyZoneService; 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.UavRouteReq; import com.ard.route.domain.route.ArdRouteInformation; import com.ard.route.domain.vo.KmzResultVo; import com.ard.route.service.UavRouteService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ard.route.mapper.ArdRouteInformationMapper; import com.ard.route.service.IArdRouteInformationService; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import static com.ard.route.util.ToolUtils.*; /** * 航线(kmz)Service业务层处理 * * @author xia * @date 2025-10-23 */ @Service public class ArdRouteInformationServiceImpl implements IArdRouteInformationService { @Autowired private ArdRouteInformationMapper ardRouteInformationMapper; @Autowired private OssServiceContext ossService; @Autowired private UavRouteService routeService; @Resource private IArdNoFlyZoneService ardNoFlyZoneService; /** * 查询航线(kmz) * * @param id 航线(kmz)主键 * @return 航线(kmz) */ @Override public ArdRouteInformation selectArdRouteInformationById(String id) { ArdRouteInformation ardRouteInformation = ardRouteInformationMapper.selectArdRouteInformationById(id); try { ardRouteInformation.setUavRouteReq((UavRouteReq) deserialize(ardRouteInformation.getRouteData())); } catch (IOException | ClassNotFoundException e) { throw new RuntimeException(e); } return ardRouteInformation; } /** * 查询航线(kmz)列表 * * @param ardRouteInformation 航线(kmz) * @return 航线(kmz) */ @Override public List selectArdRouteInformationList(ArdRouteInformation ardRouteInformation) { return ardRouteInformationMapper.selectArdRouteInformationList(ardRouteInformation); } /** * 新增航线(kmz) * * @param ardRouteInformation 航线(kmz) * @return 结果 */ @Override public String insertArdRouteInformation(ArdRouteInformation ardRouteInformation) { ardRouteInformation.setId(IdUtils.simpleUUID()); ardRouteInformation.setCreateTime(DateUtils.getNowDate()); if (ardRouteInformation.getFolderId() == null){ ardRouteInformation.setFolderId("0"); } // 航线数据 byte[] routeData; try { routeData = serialize(ardRouteInformation.getUavRouteReq()); } catch (IOException e) { throw new RuntimeException(e); } ardRouteInformation.setRouteData(routeData); KmzResultVo kmzResult = routeService.buildKmz(ardRouteInformation.getUavRouteReq(), ardRouteInformation.getFileName()); ardRouteInformationMapper.insertArdRouteInformation(assembly(ardRouteInformation,kmzResult)); return kmzResult.getUpPath(); } /** * 修改航线(kmz) * * @param ardRouteInformation 航线(kmz) * @return 结果 */ @Override public int updateArdRouteInformation(ArdRouteInformation ardRouteInformation) { ardRouteInformation.setUpdateTime(DateUtils.getNowDate()); KmzResultVo kmzResult = new KmzResultVo(); // 获取源文件名字 ArdRouteInformation route = ardRouteInformationMapper.selectArdRouteInformationById(ardRouteInformation.getId()); if (route.getFileName().equals(ardRouteInformation.getFileName())) { kmzResult = routeService.updateKmz(ardRouteInformation.getUavRouteReq(), ardRouteInformation.getFileName()); }else { kmzResult = routeService.updateKmzNew(ardRouteInformation.getUavRouteReq(), route.getFileName(),ardRouteInformation.getFileName()); } if ("更新航线kmz文件失败".equals(kmzResult.getData())) { return 0; } return ardRouteInformationMapper.updateArdRouteInformation(assembly(ardRouteInformation,kmzResult)); } //组装数据 private ArdRouteInformation assembly(ArdRouteInformation information,KmzResultVo kmzResult){ information.setFileNameNew(kmzResult.getFileNameNew()); information.setMinioUpPath(kmzResult.getMinioUpPath()); information.setUpPath(kmzResult.getUpPath()); information.setUpFileSize(kmzResult.getUpFileSize()); return information; } /** * 批量删除航线(kmz) * * @param ids 需要删除的航线(kmz)主键 * @return 结果 */ @Override public int deleteArdRouteInformationByIds(String[] ids) { // 删除航线(kmz)文件 for (String id : ids) { ArdRouteInformation information = ardRouteInformationMapper.selectArdRouteInformationById(id); ossService.deleteObject("kmz", information.getMinioUpPath()); } return ardRouteInformationMapper.deleteArdRouteInformationByIds(ids); } /** * 删除航线(kmz)信息 * * @param id 航线(kmz)主键 * @return 结果 */ @Override public int deleteArdRouteInformationById(String id) { return ardRouteInformationMapper.deleteArdRouteInformationById(id); } /** * 导入航线(kmz)文件 * * @param file 文件 * @return 结果 */ @Override public MinioUploadResult uploadArdRouteInformation(MultipartFile file) { try { String url = ossService.upload("kmz",file); ArdRouteInformation information = new ArdRouteInformation(); information.setFileName(file.getOriginalFilename()); information.setFileNameNew(getFileNameWithoutExtension(url)); information.setMinioUpPath(extractFilePath(url)); information.setUpPath(url); information.setUpFileSize((double) file.getSize()); insertRouteInformation(information); return MinioUploadResult.builder() .url(url) .newFileName(FileUtils.getName(url)) .originalFilename(file.getOriginalFilename()) .build(); }catch (Exception e){ return null; } } /** * 根据文件名称查询航线信息 * * @param name 文件名称 * @return 结果 */ @Override public ArdRouteInformation selectArdRouteInformationByName(String name) { return ardRouteInformationMapper.selectArdRouteInformationByName(name); } /** * 修改航线分组ID * * @param id ID * @param folderId 分组ID * @return 结果 */ @Override public int updateRouteInformationFolderId(String id, String folderId) { return ardRouteInformationMapper.updateRouteInformationFolderId(id, folderId); } /** * 判断行点是否在禁飞区 * * @param longitude 经度 * @param latitude 纬度 * @return 结果 */ @Override public Boolean selectRouteInformationNoFly(Double longitude, Double latitude) { if (longitude == null || latitude == null) { throw new ControlException("方法参数中未找到有效经纬度字段,无法判断禁飞区!"); } List ardNoFlyZones = ardNoFlyZoneService.selectArdNoFlyZoneList(new ArdNoFlyZone()); if (!ardNoFlyZones.isEmpty()) { Vertex vertex = new Vertex(longitude, latitude); boolean inNoFlyZones = NoFlyZoneUtils.isInNoFlyZones(vertex, ardNoFlyZones); if (inNoFlyZones) { throw new ControlException("目标点在禁飞区内,无法执行操作!"); } } return true; } /** * 数据新增航线信息 */ private void insertRouteInformation(ArdRouteInformation ardRouteInformation){ ardRouteInformation.setId(IdUtils.simpleUUID()); ardRouteInformation.setCreateTime(DateUtils.getNowDate()); ardRouteInformationMapper.insertArdRouteInformation(ardRouteInformation); } }