1.增加数据导出接口。

This commit is contained in:
sxlong 2024-11-25 11:09:55 +08:00
parent a53b06385f
commit 4bc0c04706
7 changed files with 371 additions and 72 deletions

View File

@ -0,0 +1,28 @@
package com.electromagnetic.industry.software.data.manage.controller;
import com.electromagnetic.industry.software.data.manage.facade.EDDataFacade;
import com.electromagnetic.industry.software.data.manage.request.indicator.EDDataRequest;
import electromagnetic.data.framework.share.model.ElectromagneticResult;
import electromagnetic.data.framework.share.model.ElectromagneticResultUtil;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.Date;
@RequestMapping("/data/ed/database")
@RestController
public class EDDataBaseController {
@Resource
private EDDataFacade edDataFacade;
@ApiOperation(value = "数据导出",notes = "")
@RequestMapping(value = "/export",method = RequestMethod.POST)
public ElectromagneticResult<?> export(@RequestBody EDDataRequest request){
return edDataFacade.batchExport(request);
}
}

View File

@ -1,4 +1,4 @@
#required
#required
spring.application.name=electromagnetic-data
# security
run.mode=NORMAL
@ -26,6 +26,7 @@ spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
mybatis.mapper-locations=classpath:sqlmapper/*.xml
pagehelper.helperDialect=mysql
pagehelper.reasonable=false
server.port=12352
server.port=8888
zip.password=~~BYE6cWGBJJjsU9DczYtZIQ==
upload.file.dest.path=G:/data/

View File

@ -3,6 +3,7 @@ package com.electromagnetic.industry.software.data.manage.domain.boardservice.us
import com.electromagnetic.industry.software.data.manage.domain.boardservice.category.model.Category;
import java.util.List;
import java.util.Map;
public interface CategoryService {
@ -32,7 +33,23 @@ public interface CategoryService {
List<Category> selectChildCategories(Category category);
/**
* 获取 指定节点的 父节点 从所有节点数组中
* 通过 节点 获取到顶级节点的树路径 从指定的节点数组中
* @param category
* @param categoryMap
* @return
*/
List<Category> getTopCategoriesPathList(Category category, Map<String, Category> categoryMap);
/**
* 通过 节点 获取父节点 从指定的节点数组中
* @param category
* @param categoryList
* @return
*/
Category getParentCategories(Category category, List<Category> categoryList);
/**
* 通过 节点ID 获取父节点 从指定的节点数组中
* @param categoryId
* @param categoryList
* @return

View File

@ -10,8 +10,10 @@ import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class CategoryServiceImpl implements CategoryService {
@ -102,24 +104,38 @@ public class CategoryServiceImpl implements CategoryService {
public List<Category> selectChildCategories(Category category) { return categoryRepository.selectChildCategories(category); }
/**
* 获取 指定节点的 父节点 从所有节点数组中
* @param categoryId
* 通过 节点 获取到顶级节点的树路径 从指定的节点数组中
* @param category
* @param categoryMap
* @return
*/
public List<Category> getTopCategoriesPathList(Category category, Map<String, Category> categoryMap)
{
Category categoryParent = categoryMap.get(category.getParentId());
if(categoryParent != null)
{
List<Category> topCategoriesPathList = getTopCategoriesPathList(categoryParent, categoryMap);
if(topCategoriesPathList == null)
{
topCategoriesPathList = new ArrayList();
}
topCategoriesPathList.add(0, categoryParent);
return topCategoriesPathList;
}
return null;
}
/**
* 通过 节点 获取父节点 从指定的节点数组中
* @param category
* @param categoryList
* @return
*/
public Category getParentCategories(String categoryId, List<Category> categoryList)
public Category getParentCategories(Category category, List<Category> categoryList)
{
Category category = null;
Category categoryParent = null;
for(Category iter : categoryList)
{
if(category == null && iter.getCategoryId().equals(categoryId))
{
category = iter;
break;
}
}
for(Category iter : categoryList)
{
if(categoryParent == null && iter.getCategoryId().equals(category.getParentId()))
{
@ -127,8 +143,29 @@ public class CategoryServiceImpl implements CategoryService {
break;
}
}
return categoryParent;
}
/**
* 获通过 节点ID 获取父节点 从指定的节点数组中
* @param categoryId
* @param categoryList
* @return
*/
public Category getParentCategories(String categoryId, List<Category> categoryList)
{
Category category = null;
for(Category iter : categoryList)
{
if(category == null && iter.getCategoryId().equals(categoryId))
{
category = iter;
break;
}
}
return getParentCategories(category, categoryList);
}
}

View File

@ -75,6 +75,11 @@
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.11.5</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,149 @@
package electromagnetic.data.framework.share.util;
import cn.hutool.core.util.StrUtil;
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.AesKeyStrength;
import net.lingala.zip4j.model.enums.CompressionLevel;
import net.lingala.zip4j.model.enums.CompressionMethod;
import net.lingala.zip4j.model.enums.EncryptionMethod;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* @desc zip解压缩工具
* @author: wcy
* @date: 2024/1/12
* @version: 1.0
*/
public class ZipUtil {
/**
* 压缩指定路径的文件
* @param srcFilePath 待压缩文件路径
* @param zipPathFileName zip文件全路径名
* @param password 加密密码
* @return
*/
public static boolean zipFile(String srcFilePath, String zipPathFileName, String password){
try {
// 生成的压缩文件
ZipFile zipFile = new ZipFile(zipPathFileName);
if (StrUtil.isNotEmpty(password)) {
zipFile.setPassword(password.toCharArray());
}
ZipParameters parameters = new ZipParameters();
// 压缩级别
parameters.setCompressionMethod(CompressionMethod.DEFLATE);
parameters.setCompressionLevel(CompressionLevel.NORMAL);
if(StrUtil.isNotEmpty(password)){
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(EncryptionMethod.AES);
parameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256);
}
// 要打包的文件夹
File file = new File(srcFilePath);
if (file.isDirectory()) {
zipFile.addFolder(file, parameters);
} else {
zipFile.addFile(file, parameters);
}
return true;
} catch (ZipException e) {
e.printStackTrace();
return false;
}
}
/**
* @param zipFileFullName zip文件所在的路径名
* @param filePath 解压到的路径
* @param password 需要解压的密码
* @return
*/
public static boolean unZipFile(String zipFileFullName, String filePath, String password) {
try {
ZipFile zipFile = new ZipFile(zipFileFullName);
// 如果解压需要密码
if(StrUtil.isNotEmpty(password) && zipFile.isEncrypted()) {
zipFile.setPassword(password.toCharArray());
}
zipFile.extractAll(filePath);
return true;
} catch (ZipException e) {
e.printStackTrace();
return false;
}
}
/**
* 添加文件到压缩文件中
* @param zipFullFileName zip文件所在路径及全名
* @param fullFileNameList 待添加的文件全路径集合
* @param rootFolderInZip 在压缩文件里的文件夹名
* @return
*/
public static boolean addFilesToZip(String zipFullFileName, List<String> fullFileNameList, String rootFolderInZip) {
try {
ZipFile zipFile = new ZipFile(zipFullFileName);
ArrayList<File> addFiles = new ArrayList<>();
for (String fileName : fullFileNameList) {
addFiles.add(new File(fileName));
}
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(CompressionMethod.DEFLATE);
parameters.setCompressionLevel(CompressionLevel.NORMAL);
if(StrUtil.isNotEmpty(rootFolderInZip)){
if(!rootFolderInZip.endsWith("/")){
rootFolderInZip = rootFolderInZip+"/";
}
parameters.setRootFolderNameInZip(rootFolderInZip);
}
zipFile.addFiles(addFiles, parameters);
return true;
} catch (ZipException e) {
e.printStackTrace();
// log.error("添加文件失败:\n"+e.getMessage());
return false;
}
}
/**
* 从压缩文件中删除路径
* @param zipFullFileName
* @param fileName
* @return
*/
public static boolean deleteFileInZip(String zipFullFileName, String fileName) {
try {
ZipFile zipFile = new ZipFile(zipFullFileName);
zipFile.removeFile(fileName);
return true;
} catch (ZipException e) {
e.printStackTrace();
return false;
}
}
// public static void main(String[] args) throws ZipException {
// String srcFilePath = "G:/comac_desk_app";
// String desFilePath = "C:\\Users\\test\\Desktop\\project\\file";
// String zipPathFileName = "G:/tmp/comac_desk_app.zip";
// String password = "123456";
// long begin = System.currentTimeMillis();
// boolean zipResult = zipFile(srcFilePath, zipPathFileName, password);
// long end = System.currentTimeMillis();
// System.out.println("压缩结果:" + zipResult + ",耗时:" + (end - begin) + "ms");
//
// boolean unZipResult = unZipFile(zipPathFileName, desFilePath, password);
// long end2 = System.currentTimeMillis();
// System.out.println("解压结果:" + unZipResult + ",耗时:" + (end2 - end) + "ms");
// System.out.println(unZipResult);
// }
}

View File

@ -1,4 +1,4 @@
package com.electromagnetic.industry.software.data.manage.service.facade;
package com.electromagnetic.industry.software.data.manage.service.facade;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
@ -18,10 +18,13 @@ import com.electromagnetic.industry.software.data.manage.request.indicator.FileC
import com.electromagnetic.industry.software.data.manage.request.indicator.FileChunkResultDTO;
import com.electromagnetic.industry.software.data.manage.response.indicator.EDDataPageResponse;
import com.electromagnetic.industry.software.data.manage.service.mappers.EDDataMappers;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import electromagnetic.data.framework.share.id.IdWorker;
import electromagnetic.data.framework.share.model.ElectromagneticResult;
import electromagnetic.data.framework.share.model.ElectromagneticResultUtil;
import lombok.extern.slf4j.Slf4j;
import electromagnetic.data.framework.share.util.ZipUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
@ -29,9 +32,8 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
import java.nio.file.*;
import java.util.*;
import java.util.stream.Collectors;
@ -41,10 +43,14 @@ public class EDDataFacadeImpl implements EDDataFacade {
@Resource
private EDDataService edDataService;
@Resource
private CategoryService categoryService;
@Value("${upload.file.dest.path}")
private String uploadFilePath;
@Value("${zip.password}")
private String passwordZIP;
private static final String UPLOAD_FILE_CHUNK_SUFFIX = ".part";
@ -381,68 +387,124 @@ public class EDDataFacadeImpl implements EDDataFacade {
// **********在导出的过程中可能会出现有用户上传文件的情况
// 获取目录编码ID
String categoryId = request.getParentId();
// 获取缓存文件夹的绝对路径
String userHome = System.getProperty("user.home");
File cacheDirectory = new File(userHome + "\\AppData\\Local\\Temp\\EDData\\Export");
if (!cacheDirectory.exists()) {
cacheDirectory.mkdirs();
}
String cacheFolder = cacheDirectory.getAbsolutePath(); // 缓存文件夹的绝对路径
// 获取文件夹编码ID数组
List<String> categoryIdInputList = Arrays.asList(request.getDataIdArr());
List<Category> categoryList = categoryService.selectAllCategories();
String cacheFolder = ""; // 缓存文件夹的绝对路径
String exportDataDirectory = "";
{
// 遍历客户端上传的
EDDataParams folderParames = new EDDataParams();
for (String dataId : request.getDataIdArr()) {
Category category = new Category();
category.setCategoryId(dataId);
categoryService.selectCategories(category);
//folderParames.setDataId(dataId);
//EDDataInfo edDataInfo = edDataService.getDataInfo(folderParames);
//if(edDataInfo != null)
//{
// JSONObject implantJsonObject = JSON.parseObject(edDataInfo.getImplantJson());
// String filePath = implantJsonObject.getString("folderPath");
// filePath = storageDirectory + "/" + filePath + "/" + edDataInfo.getDataName();
// dataPathArr.add(filePath);
//}
// 获取缓存文件夹的绝对路径
String userHome = System.getProperty("user.home");
cacheFolder = userHome + "\\AppData\\Local\\Temp\\EDData"; // 缓存文件夹的绝对路径
exportDataDirectory = cacheFolder + "\\ExportData";
File cacheDirectory = new File(exportDataDirectory);
if (!cacheDirectory.exists()) {
cacheDirectory.mkdirs();
}
}
String parentFolderPath = ""; //上级文件夹路径
String parentFolderIdPath = ""; //上级文件夹ID路径
String parentFolderName = ""; //上级文件夹名称
// 获取上级文件夹路径
List<Category> categoryAllList = categoryService.selectAllCategories();
Map<String, Category> categoryAllMap = new HashMap(); //所有目录数组map
List<Category> categoryInputList = new ArrayList(); //客户端输入的目录数组map
Map<String, Category> categoryInputMap = new HashMap(); //客户端输入的目录数组map
for (Category category : categoryAllList)
{
EDDataParams folderParames = new EDDataParams();
folderParames.setDataId(categoryId);
EDDataInfo edDataInfoParent = edDataService.getDataInfo(folderParames);
if(edDataInfoParent == null) {
ElectromagneticResultUtil.fail(HttpStatus.BAD_REQUEST.toString(),"上级文件夹为空!");
}
JSONObject implantJsonObject = JSON.parseObject(edDataInfoParent.getImplantJson());
parentFolderPath = implantJsonObject.getString("folderPath");
parentFolderIdPath = implantJsonObject.getString("folderIdPath");
if(!parentFolderPath.isEmpty())
parentFolderPath += "/" ;
if(!parentFolderIdPath.isEmpty())
parentFolderIdPath += "/" ;
parentFolderPath += edDataInfoParent.getDataName();
parentFolderIdPath += edDataInfoParent.getDataId();
parentFolderName = edDataInfoParent.getDataName();
categoryAllMap.put(category.getCategoryId(), category);
}
for (String categoryId : categoryIdInputList)
{
Category category = categoryAllMap.get(categoryId);
categoryInputList.add(category);
categoryInputMap.put(categoryId, category);
}
return null;
List<Category> categoryHighestList = new ArrayList();
List<Category> highestToTopCategoriesPathList = new ArrayList(); //输入的最高级目录到 所有目录的顶级目录的 路径目录数组
// 从客户端上传的输入目录数组中 找到最高级(不是最顶级)目录树节点
{
Category categoryHighestParent = null;
Category categoryHighestParentTemp = null;
String categoryIdParent = "";
for (Category category : categoryInputList)
{
// 从输入目录数组找到最高级父节点目录
categoryHighestParentTemp = category;
do{
categoryIdParent = categoryHighestParentTemp.getParentId();
categoryHighestParent = categoryHighestParentTemp;
categoryHighestParentTemp = categoryInputMap.get(categoryIdParent);
}
while(categoryHighestParentTemp != null);
categoryHighestList.add(categoryHighestParent);
}
for (Category category : categoryHighestList) {
List<Category> topCategoriesPathList = categoryService.getTopCategoriesPathList(category, categoryAllMap);
for (Category categoryPath : topCategoriesPathList) {
if(!highestToTopCategoriesPathList.contains(categoryPath)) {
highestToTopCategoriesPathList.add(categoryPath);
}
}
}
}
// 导出目录数据为json文件
{
List<Category> categoryExportList = new ArrayList(); //需要导出的目录数据数组
categoryExportList.addAll(highestToTopCategoriesPathList);
for (Category category : categoryInputList) {
if(!categoryExportList.contains(category)) {
categoryExportList.add(category);
}
}
// 创建ObjectMapper对象用于JSON处理
ObjectMapper objectMapper = new ObjectMapper();
// 将List<Person>转换为JSON字符串
String jsonString = "";
try {
jsonString = objectMapper.writeValueAsString(categoryExportList);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// 将JSON字符串写入文件
File jsonFile = new File(exportDataDirectory + "/categoryList.json");
try {
objectMapper.writeValue(jsonFile, jsonString);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("目录树数据已成功导出为JSON文件。" + jsonFile.getAbsolutePath());
}
// 导出文件和文件夹数据
{
String storageDirectory = "D:/fileTemp";
Path source = Paths.get(storageDirectory + "/testFolder3");
Path target = Paths.get(exportDataDirectory);
FileUtil.copy(source, target); // StandardCopyOption.REPLACE_EXISTING
System.out.println("文件数据已成功复制到目标目录。");
}
// 将目录树数据 文件夹及文件夹内数据 进行压缩打包
{
String zipPathFileName = cacheFolder + "/comac_exportData.comac";
ZipUtil.zipFile(exportDataDirectory, zipPathFileName, passwordZIP);
System.out.println("目录树数据+文件数据已成功复制到目标目录。" + zipPathFileName);
}
// 删除 导出数据的 缓存目录
FileUtil.del(exportDataDirectory);
return ElectromagneticResultUtil.success(cacheFolder + "\\comac_exportData.zip");
}
/**