fix:优化导入逻辑,支持waypoints解析

This commit is contained in:
高大 2026-01-28 10:28:51 +08:00
parent a01ec7becd
commit 2202f4b034
1 changed files with 62 additions and 35 deletions

View File

@ -1,6 +1,5 @@
package com.ruoyi.airline.service.impl; package com.ruoyi.airline.service.impl;
import com.ruoyi.airline.api.domain.AirLinePointVO;
import com.ruoyi.airline.domain.api.IAirlineFileDomain; import com.ruoyi.airline.domain.api.IAirlineFileDomain;
import com.ruoyi.airline.domain.model.AirlineFile; import com.ruoyi.airline.domain.model.AirlineFile;
import com.ruoyi.airline.domain.model.kml.KmlInfo; import com.ruoyi.airline.domain.model.kml.KmlInfo;
@ -24,7 +23,7 @@ import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.UUID; import java.util.UUID;
@ -66,43 +65,71 @@ public class AirlineFileServiceImpl implements IAirlineFileService {
@Override @Override
public AirlineFileDTO parseAndUplload(MultipartFile file) { public AirlineFileDTO parseAndUplload(MultipartFile file) {
KmlInfo kmlInfo = new KmlInfo(); String originalFilename = file.getOriginalFilename();
try (ArchiveInputStream archiveInputStream = new ZipArchiveInputStream(file.getInputStream());) { String fileExtension = "";
ArchiveEntry entry; if (originalFilename != null && originalFilename.lastIndexOf('.') > 0) {
while (!Objects.isNull(entry = archiveInputStream.getNextEntry())) { fileExtension = originalFilename.substring(originalFilename.lastIndexOf('.') + 1).toLowerCase();
String name = entry.getName(); }
if (name.toLowerCase().endsWith(".kml")) {
// 解KML文件 try {
kmlInfo = KmlFileUtils.parseKml(archiveInputStream); if ("zip".equals(fileExtension) || "kmz".equals(fileExtension)) {
// 处理ZIP/KMZ文件
KmlInfo kmlInfo = new KmlInfo();
try (ArchiveInputStream archiveInputStream = new ZipArchiveInputStream(file.getInputStream());) {
ArchiveEntry entry;
while (!Objects.isNull(entry = archiveInputStream.getNextEntry())) {
String name = entry.getName();
if (name.toLowerCase().endsWith(".kml")) {
// 解KML文件
kmlInfo = KmlFileUtils.parseKml(archiveInputStream);
}
}
if (Objects.isNull(kmlInfo)) {
throw new BaseException("kmz文件内容缺失");
}
String globalHeight = kmlInfo.getDocument().getFolder().getGlobalHeight();
R<String> fileUrl = remoteFileService.uploadFileByData(UUID.randomUUID().toString(), "waypoints", WayPointUitls.kmz2waypoint(kmlInfo));
AirlineFileDTO dto = new AirlineFileDTO();
// 去除文件名中的后缀名
int pos = originalFilename.lastIndexOf(".");
String fileNameWithoutExtension = pos > 0 ? originalFilename.substring(0, pos) : originalFilename;
List<AirlineFile> airlineFiles =iAirlineFileDomain.selectFileNameLike(fileNameWithoutExtension);
List<String> fileNames = airlineFiles.stream().map(AirlineFile::getName).toList();
String newFileName = FileUtils.generateUniqueFileName(fileNameWithoutExtension, fileNames);
dto.setFileName(newFileName);
dto.setFileUrl(fileUrl.getData());
dto.setAirVendor(kmlInfo.getDocument().getKmlMissionConfig().getDroneInfo().getDroneEnumValue());
dto.setAirType(kmlInfo.getDocument().getKmlMissionConfig().getDroneInfo().getDroneEnumValue());
return dto;
} }
} else if ("waypoints".equals(fileExtension)) {
// 直接处理Waypoints文件
AirlineFileDTO dto = new AirlineFileDTO();
// 去除文件名中的后缀名
int pos = originalFilename.lastIndexOf(".");
String fileNameWithoutExtension = pos > 0 ? originalFilename.substring(0, pos) : originalFilename;
List<AirlineFile> airlineFiles =iAirlineFileDomain.selectFileNameLike(fileNameWithoutExtension);
List<String> fileNames = airlineFiles.stream().map(AirlineFile::getName).toList();
String newFileName = FileUtils.generateUniqueFileName(fileNameWithoutExtension, fileNames);
dto.setFileName(newFileName);
// 直接读取文件内容并上传
R<String> fileUrl = remoteFileService.uploadFileByData(UUID.randomUUID().toString(), "waypoints", Arrays.toString(file.getBytes()));
dto.setFileUrl(fileUrl.getData());
dto.setAirVendor("");
dto.setAirType("");
return dto;
} else {
throw new BaseException("不支持的文件格式请上传KMZ或Waypoints文件");
} }
if (Objects.isNull(kmlInfo)) {
throw new BaseException("kmz文件内容缺失");
}
String globalHeight = kmlInfo.getDocument().getFolder().getGlobalHeight();
R<String> fileUrl = remoteFileService.uploadFileByData(UUID.randomUUID().toString(), "waypoints", WayPointUitls.kmz2waypoint(kmlInfo));
AirlineFileDTO dto = new AirlineFileDTO();
// 去除文件名中的后缀名
String fileName = file.getName();
int pos = fileName.lastIndexOf(".");
String fileNameWithoutExtension = pos > 0 ? fileName.substring(0, pos) : fileName;
List<AirlineFile> airlineFiles =iAirlineFileDomain.selectFileNameLike(fileNameWithoutExtension);
List<String> fileNames = airlineFiles.stream().map(AirlineFile::getName).toList();
String newFileName = FileUtils.generateUniqueFileName(fileNameWithoutExtension, fileNames);
dto.setFileName(newFileName);
dto.setFileUrl(fileUrl.getData());
dto.setAirVendor(kmlInfo.getDocument().getKmlMissionConfig().getDroneInfo().getDroneEnumValue());
dto.setAirType(kmlInfo.getDocument().getKmlMissionConfig().getDroneInfo().getDroneEnumValue());
return dto;
} catch (IOException e) { } catch (IOException e) {
throw new BaseException("Waypoints文件生成失败"); throw new BaseException("文件处理失败");
} catch (Exception e) { } catch (Exception e) {
log.error("kmz航线转换失败", e); log.error("航线文件处理失败", e);
throw new BaseException("kmz航线转换失败"); throw new BaseException("航线文件处理失败");
} }
} }