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.CoordinatePointReq; import com.ard.route.domain.UavRouteReq; import com.ard.route.domain.route.ArdRouteInfo; 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 org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; 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 ArdRouteInfoServiceImpl implements IArdRouteInfoService { @Autowired private ArdRouteInfoMapper ardRouteInfoMapper; @Autowired private OssServiceContext ossService; @Autowired private UavRouteService routeService; @Resource private IArdNoFlyZoneService ardNoFlyZoneService; /** * 查询航线(kmz) * * @param id 航线(kmz)主键 * @return 航线(kmz) */ @Override public ArdRouteInfo selectArdRouteInfoById(String id) { ArdRouteInfo ardRouteInfo = ardRouteInfoMapper.selectArdRouteInfoById(id); try { ardRouteInfo.setUavRouteReq((UavRouteReq) deserialize(ardRouteInfo.getRouteData())); } catch (IOException | ClassNotFoundException e) { throw new RuntimeException(e); } return ardRouteInfo; } /** * 查询航线(kmz)列表 * * @param ardRouteInfo 航线(kmz) * @return 航线(kmz) */ @Override public List selectArdRouteInfoList(ArdRouteInfo ardRouteInfo) { return ardRouteInfoMapper.selectArdRouteInfoList(ardRouteInfo); } /** * 新增航线(kmz) * * @param ardRouteInfo 航线(kmz) * @return 结果 */ @Override public String insertArdRouteInfo(ArdRouteInfo ardRouteInfo) { ardRouteInfo.setId(IdUtils.simpleUUID()); ardRouteInfo.setCreateTime(DateUtils.getNowDate()); if (ardRouteInfo.getGroupId() == null){ ardRouteInfo.setGroupId("0"); } // 航线数据 byte[] routeData; try { routeData = serialize(ardRouteInfo.getUavRouteReq()); } catch (IOException e) { throw new RuntimeException(e); } Integer droneType = subStringDroneType(ardRouteInfo.getAircraft()); ardRouteInfo.getUavRouteReq().setDroneType(droneType); ardRouteInfo.setRouteData(routeData); KmzResultVo kmzResult = routeService.buildKmz(ardRouteInfo.getUavRouteReq(), ardRouteInfo.getName()); ardRouteInfo.setPath(kmzResult.getPath()); ardRouteInfo.setReadOnly("0"); ardRouteInfoMapper.insertArdRouteInfo(ardRouteInfo); return kmzResult.getPath(); } /** * 修改航线(kmz) * * @param ardRouteInfo 航线(kmz) * @return 结果 */ @Override public int updateArdRouteInfo(ArdRouteInfo ardRouteInfo) { ardRouteInfo.setUpdateTime(DateUtils.getNowDate()); KmzResultVo kmzResult = new KmzResultVo(); // 获取源文件名字 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()); } if ("更新航线kmz文件失败".equals(kmzResult.getData())) { return 0; } ardRouteInfo.setPath(kmzResult.getPath()); return ardRouteInfoMapper.updateArdRouteInfo(ardRouteInfo); } /** * 批量删除航线(kmz) * * @param ids 需要删除的航线(kmz)主键 * @return 结果 */ @Override public int deleteArdRouteInfoByIds(String[] ids) { // 删除航线(kmz)文件 for (String id : ids) { ArdRouteInfo information = ardRouteInfoMapper.selectArdRouteInfoById(id); ossService.deleteObject("kmz", subStringMinioUrlName(information.getPath())); } return ardRouteInfoMapper.deleteArdRouteInfoByIds(ids); } /** * 删除航线(kmz)信息 * * @param id 航线(kmz)主键 * @return 结果 */ @Override public int deleteArdRouteInfoById(String id) { return ardRouteInfoMapper.deleteArdRouteInfoById(id); } /** * 导入航线(kmz)文件 * * @param file 文件 * @return 结果 */ @Override public MinioUploadResult uploadArdRouteInfo(MultipartFile file) { try { String url = ossService.upload("kmz",file); ArdRouteInfo information = new ArdRouteInfo(); information.setName(file.getOriginalFilename()); information.setPath(url); information.setGroupId("0"); // 默认分组 information.setReadOnly("1"); // 默认只读 insertRouteInfomation(information); return MinioUploadResult.builder() .url(url) .newFileName(FileUtils.getName(url)) .originalFilename(file.getOriginalFilename()) .build(); }catch (Exception e){ return null; } } /** * 根据文件名称查询航线信息 * * @param name 文件名称 * @return 结果 */ @Override public ArdRouteInfo selectArdRouteInfoByName(String name) { return ardRouteInfoMapper.selectArdRouteInfoByName(name); } /** * 修改航线分组ID * * @param id ID * @param groupId 分组ID * @return 结果 */ @Override public int updateRouteInfomationGroupId(String id, String groupId) { return ardRouteInfoMapper.updateRouteInforGroupId(id, groupId); } /** * 判断行点是否在禁飞区 * * @param longitude 经度 * @param latitude 纬度 * @return 结果 */ @Override public Boolean selectRouteInfomationNoFly(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.isPointInPolygon(vertex, ardNoFlyZones); // if (inNoFlyZones) { // throw new ControlException("目标点在禁飞区内,无法执行操作!"); // } } return true; } /** * 数据新增航线信息 */ private void insertRouteInfomation(ArdRouteInfo ardRouteInfo){ ardRouteInfo.setId(IdUtils.simpleUUID()); ardRouteInfo.setCreateTime(DateUtils.getNowDate()); ardRouteInfoMapper.insertArdRouteInfo(ardRouteInfo); } private void verifyNoFlyZone(CoordinatePointReq a,CoordinatePointReq b){ } }