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<ArdRouteInfor> 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<ArdNoFlyZone> 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 insertRouteInformation(ArdRouteInfor ardRouteInfor){
|
ardRouteInfor.setId(IdUtils.simpleUUID());
|
ardRouteInfor.setCreateTime(DateUtils.getNowDate());
|
ardRouteInforMapper.insertArdRouteInfor(ardRouteInfor);
|
}
|
|
}
|