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.ArdRouteInfor; import com.ard.route.domain.vo.KmzResultVo; import com.ard.route.mapper.ArdRouteInforMapper; import com.ard.route.service.IArdRouteInforService; 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 ArdRouteInforServiceImpl implements IArdRouteInforService { @Autowired private ArdRouteInforMapper ardRouteInforMapper; @Autowired private OssServiceContext ossService; @Autowired private UavRouteService routeService; @Resource private IArdNoFlyZoneService ardNoFlyZoneService; /** * 查询航线(kmz) * * @param id 航线(kmz)主键 * @return 航线(kmz) */ @Override public ArdRouteInfor selectArdRouteInforById(String id) { ArdRouteInfor ardRouteInfor = ardRouteInforMapper.selectArdRouteInforById(id); try { ardRouteInfor.setUavRouteReq((UavRouteReq) deserialize(ardRouteInfor.getRouteData())); } catch (IOException | ClassNotFoundException e) { throw new RuntimeException(e); } return ardRouteInfor; } /** * 查询航线(kmz)列表 * * @param ardRouteInfor 航线(kmz) * @return 航线(kmz) */ @Override public List selectArdRouteInforList(ArdRouteInfor ardRouteInfor) { return ardRouteInforMapper.selectArdRouteInforList(ardRouteInfor); } /** * 新增航线(kmz) * * @param ardRouteInfor 航线(kmz) * @return 结果 */ @Override public String insertArdRouteInfor(ArdRouteInfor ardRouteInfor) { ardRouteInfor.setId(IdUtils.simpleUUID()); ardRouteInfor.setCreateTime(DateUtils.getNowDate()); if (ardRouteInfor.getGroupingId() == null){ ardRouteInfor.setGroupingId("0"); } // 航线数据 byte[] routeData; try { routeData = serialize(ardRouteInfor.getUavRouteReq()); } catch (IOException e) { throw new RuntimeException(e); } ardRouteInfor.setRouteData(routeData); KmzResultVo kmzResult = routeService.buildKmz(ardRouteInfor.getUavRouteReq(), ardRouteInfor.getKmzName()); ardRouteInfor.setUpPath(kmzResult.getUpPath()); ardRouteInforMapper.insertArdRouteInfor(ardRouteInfor); return kmzResult.getUpPath(); } /** * 修改航线(kmz) * * @param ardRouteInfor 航线(kmz) * @return 结果 */ @Override public int updateArdRouteInfor(ArdRouteInfor ardRouteInfor) { ardRouteInfor.setUpdateTime(DateUtils.getNowDate()); KmzResultVo kmzResult = new KmzResultVo(); // 获取源文件名字 ArdRouteInfor route = ardRouteInforMapper.selectArdRouteInforById(ardRouteInfor.getId()); if (route.getKmzName().equals(ardRouteInfor.getKmzName())) { kmzResult = routeService.updateKmz(ardRouteInfor.getUavRouteReq(), ardRouteInfor.getKmzName()); }else { kmzResult = routeService.updateKmzNew(ardRouteInfor.getUavRouteReq(), route.getKmzName(), ardRouteInfor.getKmzName()); } if ("更新航线kmz文件失败".equals(kmzResult.getData())) { return 0; } ardRouteInfor.setUpPath(kmzResult.getUpPath()); return ardRouteInforMapper.updateArdRouteInfor(ardRouteInfor); } /** * 批量删除航线(kmz) * * @param ids 需要删除的航线(kmz)主键 * @return 结果 */ @Override public int deleteArdRouteInforByIds(String[] ids) { // 删除航线(kmz)文件 for (String id : ids) { ArdRouteInfor information = ardRouteInforMapper.selectArdRouteInforById(id); ossService.deleteObject("kmz", subStringMinioUrlName(information.getUpPath())); } return ardRouteInforMapper.deleteArdRouteInforByIds(ids); } /** * 删除航线(kmz)信息 * * @param id 航线(kmz)主键 * @return 结果 */ @Override public int deleteArdRouteInforById(String id) { return ardRouteInforMapper.deleteArdRouteInforById(id); } /** * 导入航线(kmz)文件 * * @param file 文件 * @return 结果 */ @Override public MinioUploadResult uploadArdRouteInfor(MultipartFile file) { try { String url = ossService.upload("kmz",file); ArdRouteInfor information = new ArdRouteInfor(); information.setKmzName(file.getOriginalFilename()); information.setUpPath(url); information.setGroupingId("0"); // 默认分组 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 ArdRouteInfor selectArdRouteInforByName(String name) { return ardRouteInforMapper.selectArdRouteInforByName(name); } /** * 修改航线分组ID * * @param id ID * @param groupingId 分组ID * @return 结果 */ @Override public int updateRouteInformationGroupingId(String id, String groupingId) { return ardRouteInforMapper.updateRouteInforGroupingId(id, groupingId); } /** * 判断行点是否在禁飞区 * * @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(ArdRouteInfor ardRouteInfor){ ardRouteInfor.setId(IdUtils.simpleUUID()); ardRouteInfor.setCreateTime(DateUtils.getNowDate()); ardRouteInforMapper.insertArdRouteInfor(ardRouteInfor); } }