From 516e81ba91a89d0b501c9789085b20a8283329b5 Mon Sep 17 00:00:00 2001 From: chenxudong Date: Fri, 22 Nov 2024 17:17:15 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E7=9A=84=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/controller/EDDataController.java | 28 ++- .../src/main/resources/application.properties | 8 +- .../data/manage/facade/EDDataFacade.java | 31 +++- .../request/indicator/FileChunkDTO.java | 18 ++ .../request/indicator/FileChunkResultDTO.java | 15 ++ .../manage/service/aop/ServiceAspect.java | 82 ++++++--- .../service/facade/EDDataFacadeImpl.java | 161 ++++++++++++++++-- 7 files changed, 298 insertions(+), 45 deletions(-) create mode 100644 facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileChunkDTO.java create mode 100644 facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileChunkResultDTO.java diff --git a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java index 62d0d03..8e693e4 100644 --- a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java +++ b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java @@ -2,6 +2,7 @@ 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 com.electromagnetic.industry.software.data.manage.request.indicator.FileChunkDTO; import electromagnetic.data.framework.share.model.ElectromagneticResult; import electromagnetic.data.framework.share.model.ElectromagneticResultUtil; import io.swagger.annotations.ApiOperation; @@ -9,8 +10,8 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import java.util.Date; +import java.util.List; @RequestMapping("/data/ed/file") @RestController @@ -73,5 +74,30 @@ public class EDDataController { return ElectromagneticResultUtil.success("复制"); } + @ApiOperation(value = "获取已经上传的分片",notes = "") + @RequestMapping(value = "/getUploadedChunkNums",method = RequestMethod.GET) + public ElectromagneticResult getUploadedChunkNums(@RequestParam String identifier) { + return edDataFacade.getUploadedChunkNums(identifier); + } + + @ApiOperation(value = "合并分片",notes = "") + @RequestMapping(value = "/mergeChunks",method = RequestMethod.GET) + public ElectromagneticResult mergeChunks(@RequestParam String identifier, + @RequestParam String fileName, + @RequestParam Integer totalChunks) { + return edDataFacade.mergeChunks(identifier, fileName, totalChunks); + } + + @ApiOperation(value = "分片上传",notes = "") + @RequestMapping(value = "/batchImport",method = RequestMethod.POST) + public ElectromagneticResult batchImport(FileChunkDTO fileChunkDTO) { + return edDataFacade.batchImport(fileChunkDTO); + } + + @ApiOperation(value = "检查分片是否存在",notes = "") + @RequestMapping(value = "/batchImport",method = RequestMethod.GET) + public ElectromagneticResult checkChunkExist(FileChunkDTO fileChunkDTO) { + return edDataFacade.checkChunkExist(fileChunkDTO); + } } diff --git a/bootstrap/src/main/resources/application.properties b/bootstrap/src/main/resources/application.properties index cfdc88c..49e9923 100644 --- a/bootstrap/src/main/resources/application.properties +++ b/bootstrap/src/main/resources/application.properties @@ -15,15 +15,17 @@ spring.datasource.typd=com.alibaba.druid.pool.DruidDataSource #spring.datasource.url=jdbc:mysql://${DATASOURCE_URL:obproxy-0c63.ops.cloud.cic.inter}:3306/${DATASOURCE_HOST:dataplatform_ptst}?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true #spring.datasource.username=${DATASOURCE_NAME:dataplatform@ProjectTest_tenant5#testdb} #spring.datasource.password=${DATASOURCE_PASSWORD:Y7G6v4_3ijn77K_Kbl_U85} -spring.datasource.url=jdbc:mysql://139.196.179.195:3306/em_data?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true +spring.datasource.url=jdbc:mysql://139.224.43.89:3306/em_data?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true spring.datasource.username=comac spring.datasource.password=2024*Comac - +spring.servlet.multipart.max-file-size=500MB +spring.servlet.multipart.max-request-size=10MB spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource mybatis.mapper-locations=classpath:sqlmapper/*.xml pagehelper.helperDialect=mysql pagehelper.reasonable=false -server.port=8888 +server.port=12352 +upload.file.dest.path=G:/data/ \ No newline at end of file diff --git a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java index 7f7f61a..71a6b67 100644 --- a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java +++ b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java @@ -1,6 +1,8 @@ package com.electromagnetic.industry.software.data.manage.facade; import com.electromagnetic.industry.software.data.manage.request.indicator.EDDataRequest; +import com.electromagnetic.industry.software.data.manage.request.indicator.FileChunkDTO; +import com.electromagnetic.industry.software.data.manage.request.indicator.FileChunkResultDTO; import com.electromagnetic.industry.software.data.manage.response.indicator.EDDataPageResponse; import electromagnetic.data.framework.share.model.ElectromagneticResult; @@ -61,9 +63,34 @@ public interface EDDataFacade { /** * 导入 - * @param request + * @param fileChunkDTO * @return */ - ElectromagneticResult batchImport(EDDataRequest request); + ElectromagneticResult batchImport(FileChunkDTO fileChunkDTO); + + /** + * 获取已经上传的分片 + * @param identifier + * @return + */ + ElectromagneticResult> getUploadedChunkNums(String identifier); + + + /** + * 合并分片 + * @param identifier + * @param fileName + * @param totalChunks + * @return + */ + ElectromagneticResult mergeChunks(String identifier, String fileName, Integer totalChunks); + + + /** + * 检查分片是否存在 + * @param fileChunkDTO + * @return + */ + ElectromagneticResult checkChunkExist(FileChunkDTO fileChunkDTO); } diff --git a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileChunkDTO.java b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileChunkDTO.java new file mode 100644 index 0000000..4a3b66a --- /dev/null +++ b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileChunkDTO.java @@ -0,0 +1,18 @@ +package com.electromagnetic.industry.software.data.manage.request.indicator; + +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +@Data +public class FileChunkDTO { + + private String identifier; + private long totalSize; + private MultipartFile file; + private String fileName; + private Integer chunkNumber; + private Long chunkSize; + private Long currentChunkSize; + private Integer totalChunks; + +} diff --git a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileChunkResultDTO.java b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileChunkResultDTO.java new file mode 100644 index 0000000..6dc4498 --- /dev/null +++ b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileChunkResultDTO.java @@ -0,0 +1,15 @@ +package com.electromagnetic.industry.software.data.manage.request.indicator; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FileChunkResultDTO { + private Boolean skipUpload; + private Set uploaded; +} diff --git a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/aop/ServiceAspect.java b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/aop/ServiceAspect.java index a7538c7..2ca26d3 100644 --- a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/aop/ServiceAspect.java +++ b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/aop/ServiceAspect.java @@ -1,18 +1,21 @@ package com.electromagnetic.industry.software.data.manage.service.aop; import com.alibaba.fastjson.JSON; -import electromagnetic.data.framework.share.exception.LoggerConstant; -import electromagnetic.data.framework.share.log.LogUtils; -import electromagnetic.data.framework.share.log.ServiceResultHandleUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.catalina.connector.ResponseFacade; import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; +import org.springframework.util.StopWatch; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.multipart.MultipartFile; - +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.util.ArrayList; +import java.util.List; /** * service 通用日志切面 * @@ -21,33 +24,56 @@ import org.springframework.stereotype.Component; */ @Aspect @Component +@Slf4j public class ServiceAspect { - private static final Logger LOGGER = LoggerFactory.getLogger(LoggerConstant.DOMAIN_SERVICE); - /** * 日志切面 */ @Around("execution(* com.electromagnetic.industry.software.data.manage.facade..*.*(..)))") - public Object logAspect(ProceedingJoinPoint pjd) { - long startTime = System.currentTimeMillis(); - Object[] args = pjd.getArgs(); - Object arg = args.length < 1 ? "" : args[0]; - Signature signature = pjd.getSignature(); - String declaringTypeName = signature.getDeclaringTypeName(); - String logPattern = declaringTypeName.substring(declaringTypeName.lastIndexOf(".") + 1) + "@" + signature.getName() + " request={0}, response={1}, cost={2}ms"; - Object proceed = null; - try { - proceed = pjd.proceed(args); - } catch (Throwable t) { - LogUtils.error(t,LOGGER, "Executing " + logPattern+",Throwable:"+t, - arg == null ? "" : JSON.toJSONString(arg), JSON.toJSONString(proceed), System.currentTimeMillis() - startTime); - return ServiceResultHandleUtil.serviceError(t); - } + public Object process(ProceedingJoinPoint jp) throws Throwable { + String methodInfo = jp.getTarget().getClass().getSimpleName() + "." + + jp.getSignature().getName(); + Object[] args = jp.getArgs(); + String paramInfo = ""; + if (args != null && args.length > 0) { + if (args[0] != null && args[0].getClass() != ResponseFacade.class) { + try { + List list = new ArrayList<>(); + for (Object obj : jp.getArgs()) { - // 正常返回日志 - LogUtils.info(LOGGER, "End " + logPattern, - arg == null ? "" : JSON.toJSONString(arg), JSON.toJSONString(proceed), System.currentTimeMillis() - startTime); - return proceed; + if (obj instanceof ServletResponse) { + log.info("参数中有response"); + } else if (obj instanceof ServletRequest) { + log.info("参数中有request"); + } else if (obj instanceof MultipartFile) { + //文件不输出 + MultipartFile obj1 = (MultipartFile) obj; + log.info("参数中文件;文件名:{},文件大小:{}", obj1.getName(), obj1.getSize()); + break; + } else { + list.add(obj); + } + } + + paramInfo = JSON.toJSONString(list); + } catch (Exception e) { + log.warn("切面异常", e.getMessage()); + } + } + } + log.info("请求接口开始:{},参数:{}", methodInfo, paramInfo); + long startTime = System.currentTimeMillis(); + StopWatch stopwatch = new StopWatch(); + stopwatch.start("接口:" + methodInfo); + Object rvt = jp.proceed(); + if (rvt instanceof ResponseEntity) { + return rvt; + } + String returnInfo = JSON.toJSONString(rvt); + log.info("请求接口结束:{},返回参数:{},接口耗时:{}", methodInfo, returnInfo, (System.currentTimeMillis() - startTime) + "毫秒"); + stopwatch.stop(); + log.debug(stopwatch.prettyPrint()); + return rvt; } } diff --git a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java index 6951d73..e8f3dc8 100644 --- a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java +++ b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java @@ -1,5 +1,9 @@ package com.electromagnetic.industry.software.data.manage.service.facade; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.file.FileMode; +import cn.hutool.core.util.ZipUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.electromagnetic.industry.software.data.manage.domain.boardservice.category.model.Category; @@ -10,29 +14,41 @@ import com.electromagnetic.industry.software.data.manage.domain.boardservice.ind import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service.CategoryService; import com.electromagnetic.industry.software.data.manage.facade.EDDataFacade; import com.electromagnetic.industry.software.data.manage.request.indicator.EDDataRequest; +import com.electromagnetic.industry.software.data.manage.request.indicator.FileChunkDTO; +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 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 org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.io.File; +import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import java.util.stream.Collectors; @Service +@Slf4j public class EDDataFacadeImpl implements EDDataFacade { @Resource private EDDataService edDataService; private CategoryService categoryService; + @Value("${upload.file.dest.path}") + private String uploadFilePath; + + private static final String UPLOAD_FILE_CHUNK_SUFFIX = ".part"; + + /** * 创建文件夹 * WISDOM_CREATE_FOLDER @@ -431,19 +447,142 @@ public class EDDataFacadeImpl implements EDDataFacade { /** * 导入 - * @param request + * @param fileChunkDTO * @return */ @Override - public ElectromagneticResult batchImport(EDDataRequest request) { - //1、上传文件到指定目录,并重命名 - //2、接下压缩包 - //3、扫码解压文件夹的所有文件 - //4、循环处理文件:读取文件名称,根据名称规则,进行数据库查询,匹配层级树、文件夹和文件是否跳过 - //5、如果不存在则新建文件记录 - //6、并移动文件到上传目录 - //7、处理完成返回成功 - return null; + public ElectromagneticResult batchImport(FileChunkDTO fileChunkDTO) { + + String identifier = fileChunkDTO.getIdentifier(); + String fileName = fileChunkDTO.getFileName(); + + // 首先检查文件是否存在,如果存在则不允许重复上传。 + String destZipPath = uploadFilePath + identifier + File.separator + fileName; + boolean existFile = FileUtil.exist(new File(destZipPath)); + if (existFile) { + return ElectromagneticResultUtil.fail("-1", "文件已经存在,请勿重复上传。"); + } + + // 检查该分片有没被上传过 + String destChunkPath = uploadFilePath + identifier + File.separator + fileChunkDTO.getChunkNumber() + UPLOAD_FILE_CHUNK_SUFFIX; + boolean existChunk = FileUtil.exist(new File(destChunkPath)); + if (existChunk) { + return ElectromagneticResultUtil.success(true); + } + + File dir = new File(uploadFilePath + identifier + File.separator); + if (!dir.exists()) { + dir.mkdir(); + } + + try ( + InputStream inputStream = fileChunkDTO.getFile().getInputStream(); + FileOutputStream fileOutputStream = new FileOutputStream(destChunkPath); + ) { + IoUtil.copy(inputStream, fileOutputStream); + } catch (IOException ioException) { + log.error("上传文件错误...", ioException); + } + return ElectromagneticResultUtil.success(fileChunkDTO.getIdentifier()); + } + + @Override + public ElectromagneticResult> getUploadedChunkNums(String identifier) { + return ElectromagneticResultUtil.success(getUploadedChunks(identifier)); + } + + private List getUploadedChunks(String identifier) { + String destPath = uploadFilePath + identifier; + + if (!FileUtil.exist(new File(destPath))) { + return new ArrayList<>(); + } + + List uploadedFileChunkNums = FileUtil.listFileNames(destPath) + .stream() + .filter(e -> !e.endsWith(".zip")) + .map(e -> e.replace(UPLOAD_FILE_CHUNK_SUFFIX, "")) + .map(Integer::parseInt) + .collect(Collectors.toList()); + return uploadedFileChunkNums; + } + + // TODO 需要验证如果一个分片上传一半网络断开,则该分片的存储情况。 + @Override + public ElectromagneticResult mergeChunks(String identifier, String fileName, Integer totalChunks) { + + // 检查所有分片是否已经上传完成,分片编号从1开始 + for (int i = 1; i <= totalChunks; i++) { + String tmpPath = uploadFilePath + identifier + File.separator + i + UPLOAD_FILE_CHUNK_SUFFIX; + if (!FileUtil.exist(new File(tmpPath))) { + log.error("第{}个分片没有上传完成,请上传完成后再合并。", i); + ElectromagneticResultUtil.fail("-1", "文件尚未上传完成。"); + } + } + + // 合并分片 + String destZipPath = uploadFilePath + identifier + File.separator + fileName; + File mergedFile = new File(destZipPath); + try { + RandomAccessFile targetFile = new RandomAccessFile(mergedFile, "rw"); + byte[] buffer = new byte[1024]; + for (int i = 1; i <= totalChunks; i++) { + String tmpPath = uploadFilePath + identifier + File.separator + i + UPLOAD_FILE_CHUNK_SUFFIX; + RandomAccessFile tmp = new RandomAccessFile(new File(tmpPath), "r"); + int len; + while ((len = tmp.read(buffer)) != -1) { + targetFile.write(buffer, 0, len); + } + tmp.close(); + } + targetFile.close(); + } catch (IOException ioException) { + ElectromagneticResultUtil.fail("-1", "文件合并失败"); + } + + // 删除分片 + for (int i = 1; i <= totalChunks; i++) { + String tmpPath = uploadFilePath + identifier + File.separator + i + UPLOAD_FILE_CHUNK_SUFFIX; + FileUtil.del(tmpPath); + } + + // 检验文件的MD5值 + + // 解压文件 + ZipUtil.unzip(destZipPath, uploadFilePath + identifier + File.separator); + + // 文件信息存入数据库 + + return ElectromagneticResultUtil.success(true); + } + + @Override + public ElectromagneticResult checkChunkExist(FileChunkDTO fileChunkDTO) { + FileChunkResultDTO res = new FileChunkResultDTO(); + // 首先判断zip文件是否存在,如果不存在则表示还没有上传完成。 + String identifier = fileChunkDTO.getIdentifier(); + String fileName = fileChunkDTO.getFileName(); + String destZipPath = uploadFilePath + identifier + File.separator + fileName; + boolean existFile = FileUtil.exist(new File(destZipPath)); + + if (existFile) { + return ElectromagneticResultUtil.success(new FileChunkResultDTO(false, new HashSet<>())); + } + + List uploadedChunks = getUploadedChunks(identifier); + return ElectromagneticResultUtil.success(new FileChunkResultDTO(true, new HashSet<>(uploadedChunks))); +// +// String destChunkPath = uploadFilePath + identifier + File.separator + fileChunkDTO.getChunkNumber() + UPLOAD_FILE_CHUNK_SUFFIX; +// boolean existChunk = FileUtil.exist(new File(destChunkPath)); +// List uploadedChunks = getUploadedChunks(identifier); +// +// +// +// +// FileChunkResultDTO res = new FileChunkResultDTO(); +// res.setSkipUpload(existChunk); +// res.setUploaded(new HashSet<>(uploadedChunks)); +// return ElectromagneticResultUtil.success(res); } From a53b06385ff5ae27269a5d5df05915d1e092eb0e Mon Sep 17 00:00:00 2001 From: chenxudong Date: Mon, 25 Nov 2024 09:01:45 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/service/facade/EDDataFacadeImpl.java | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java index e8f3dc8..99884e9 100644 --- a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java +++ b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java @@ -566,23 +566,11 @@ public class EDDataFacadeImpl implements EDDataFacade { boolean existFile = FileUtil.exist(new File(destZipPath)); if (existFile) { - return ElectromagneticResultUtil.success(new FileChunkResultDTO(false, new HashSet<>())); + return ElectromagneticResultUtil.success(new FileChunkResultDTO(true, new HashSet<>())); } List uploadedChunks = getUploadedChunks(identifier); - return ElectromagneticResultUtil.success(new FileChunkResultDTO(true, new HashSet<>(uploadedChunks))); -// -// String destChunkPath = uploadFilePath + identifier + File.separator + fileChunkDTO.getChunkNumber() + UPLOAD_FILE_CHUNK_SUFFIX; -// boolean existChunk = FileUtil.exist(new File(destChunkPath)); -// List uploadedChunks = getUploadedChunks(identifier); -// -// -// -// -// FileChunkResultDTO res = new FileChunkResultDTO(); -// res.setSkipUpload(existChunk); -// res.setUploaded(new HashSet<>(uploadedChunks)); -// return ElectromagneticResultUtil.success(res); + return ElectromagneticResultUtil.success(new FileChunkResultDTO(false, new HashSet<>(uploadedChunks))); } From 4bc0c047062144c559b32697e6a0f12aed69615d Mon Sep 17 00:00:00 2001 From: sxlong Date: Mon, 25 Nov 2024 11:09:55 +0800 Subject: [PATCH 3/8] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=8E=A5=E5=8F=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/EDDataBaseController.java | 28 +++ .../src/main/resources/application.properties | 7 +- .../user/service/CategoryService.java | 19 +- .../service/impl/CategoryServiceImpl.java | 63 +++++-- electromagnetic-framework/pom.xml | 5 + .../data/framework/share/util/ZipUtil.java | 149 +++++++++++++++ .../service/facade/EDDataFacadeImpl.java | 172 ++++++++++++------ 7 files changed, 371 insertions(+), 72 deletions(-) create mode 100644 bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataBaseController.java create mode 100644 electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/ZipUtil.java diff --git a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataBaseController.java b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataBaseController.java new file mode 100644 index 0000000..5a4c1ab --- /dev/null +++ b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataBaseController.java @@ -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); + } + + +} diff --git a/bootstrap/src/main/resources/application.properties b/bootstrap/src/main/resources/application.properties index 49e9923..5e345dd 100644 --- a/bootstrap/src/main/resources/application.properties +++ b/bootstrap/src/main/resources/application.properties @@ -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/ \ No newline at end of file +upload.file.dest.path=G:/data/ diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/CategoryService.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/CategoryService.java index 792916a..df82817 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/CategoryService.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/CategoryService.java @@ -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 selectChildCategories(Category category); /** - * 获取 指定节点的 父节点 从所有节点数组中 + * 通过 节点 获取到顶级节点的树路径 从指定的节点数组中 + * @param category + * @param categoryMap + * @return + */ + List getTopCategoriesPathList(Category category, Map categoryMap); + + /** + * 通过 节点 获取父节点 从指定的节点数组中 + * @param category + * @param categoryList + * @return + */ + Category getParentCategories(Category category, List categoryList); + + /** + * 通过 节点ID 获取父节点 从指定的节点数组中 * @param categoryId * @param categoryList * @return diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/impl/CategoryServiceImpl.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/impl/CategoryServiceImpl.java index ef441ea..bd30ee8 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/impl/CategoryServiceImpl.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/service/impl/CategoryServiceImpl.java @@ -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 selectChildCategories(Category category) { return categoryRepository.selectChildCategories(category); } /** - * 获取 指定节点的 父节点 从所有节点数组中 - * @param categoryId + * 通过 节点 获取到顶级节点的树路径 从指定的节点数组中 + * @param category + * @param categoryMap + * @return + */ + public List getTopCategoriesPathList(Category category, Map categoryMap) + { + Category categoryParent = categoryMap.get(category.getParentId()); + if(categoryParent != null) + { + List 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 categoryList) + public Category getParentCategories(Category category, List 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 categoryList) + { + Category category = null; + for(Category iter : categoryList) + { + if(category == null && iter.getCategoryId().equals(categoryId)) + { + category = iter; + break; + } + } + return getParentCategories(category, categoryList); + } + + } diff --git a/electromagnetic-framework/pom.xml b/electromagnetic-framework/pom.xml index 9e7d955..718c99d 100644 --- a/electromagnetic-framework/pom.xml +++ b/electromagnetic-framework/pom.xml @@ -75,6 +75,11 @@ org.springframework spring-webmvc + + net.lingala.zip4j + zip4j + 2.11.5 + \ No newline at end of file diff --git a/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/ZipUtil.java b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/ZipUtil.java new file mode 100644 index 0000000..bb5c8a1 --- /dev/null +++ b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/ZipUtil.java @@ -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 fullFileNameList, String rootFolderInZip) { + try { + ZipFile zipFile = new ZipFile(zipFullFileName); + ArrayList 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); +// } + +} diff --git a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java index 99884e9..017bce3 100644 --- a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java +++ b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java @@ -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 categoryIdInputList = Arrays.asList(request.getDataIdArr()); - List 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 categoryAllList = categoryService.selectAllCategories(); + Map categoryAllMap = new HashMap(); //所有目录数组map + List categoryInputList = new ArrayList(); //客户端输入的目录数组map + Map 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 categoryHighestList = new ArrayList(); + List 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 topCategoriesPathList = categoryService.getTopCategoriesPathList(category, categoryAllMap); + for (Category categoryPath : topCategoriesPathList) { + if(!highestToTopCategoriesPathList.contains(categoryPath)) { + highestToTopCategoriesPathList.add(categoryPath); + } + } + } + } + + // 导出目录数据为json文件 + { + List categoryExportList = new ArrayList(); //需要导出的目录数据数组 + categoryExportList.addAll(highestToTopCategoriesPathList); + for (Category category : categoryInputList) { + if(!categoryExportList.contains(category)) { + categoryExportList.add(category); + } + } + + // 创建ObjectMapper对象,用于JSON处理 + ObjectMapper objectMapper = new ObjectMapper(); + + // 将List转换为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"); } /** From 286f23ad21dcc5fe42afd8e62c8f1b81e020868d Mon Sep 17 00:00:00 2001 From: sxlong Date: Tue, 26 Nov 2024 09:31:30 +0800 Subject: [PATCH 4/8] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.properties | 7 +- .../indicator/service/EDDataService.java | 14 + .../service/impl/EDDataServiceImpl.java | 371 +++++++++++++++++- .../user/repository/CategoryRepository.java | 35 ++ .../util/{ZipUtil.java => EleZipUtil.java} | 2 +- .../data/manage/facade/EDDataFacade.java | 2 +- .../manage/repository/dao/CategoryMapper.java | 7 + .../impl/CategoryRepositoryImpl.java | 74 ++++ .../resources/sqlmapper/CategoryMapper.xml | 19 + .../service/facade/EDDataFacadeImpl.java | 216 ++-------- 10 files changed, 556 insertions(+), 191 deletions(-) rename electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/{ZipUtil.java => EleZipUtil.java} (99%) diff --git a/bootstrap/src/main/resources/application.properties b/bootstrap/src/main/resources/application.properties index 5e345dd..68f1298 100644 --- a/bootstrap/src/main/resources/application.properties +++ b/bootstrap/src/main/resources/application.properties @@ -29,4 +29,9 @@ pagehelper.reasonable=false server.port=8888 zip.password=~~BYE6cWGBJJjsU9DczYtZIQ== -upload.file.dest.path=G:/data/ +#windows文件存储目录 +upload.file.dest.path=E:/comacFileStore/ +#文件缓存路径 +upload.file.cache.dir=/szsd/cache/ +#文件存储路径 +upload.file.store.dir=/szsd/fileStore/ diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/EDDataService.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/EDDataService.java index 58ad441..4d3bf3d 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/EDDataService.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/EDDataService.java @@ -62,4 +62,18 @@ public interface EDDataService { */ Boolean createMultiLevelDirectory(String path); + /** + * 导出数据 + * @param parames + * @return + */ + String exportData(EDDataParams parames); + + /** + * 解压后的数据目录 + * @param folderPath + * @return + */ + Boolean importData(String folderPath); + } diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/impl/EDDataServiceImpl.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/impl/EDDataServiceImpl.java index a692211..0b8ee3e 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/impl/EDDataServiceImpl.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/impl/EDDataServiceImpl.java @@ -3,37 +3,65 @@ */ package com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.service.impl; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.ZipUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.symmetric.AES; import cn.hutool.poi.excel.cell.CellSetter; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.category.model.Category; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.model.EDDataInfo; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.model.EDDataPage; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.parames.EDDataParams; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.repository.EDDataRepository; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.service.EDDataService; +import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.repository.CategoryRepository; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import electromagnetic.data.framework.share.exception.LoggerConstant; +import electromagnetic.data.framework.share.id.IdWorker; +import electromagnetic.data.framework.share.model.ElectromagneticResultUtil; +import electromagnetic.data.framework.share.util.EleZipUtil; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.io.IOException; +import java.io.*; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; -import java.util.List; +import java.util.*; /** * @author * @version $Id: IndicatorCardServiceImpl.java, v 0.1 2024-07-26 17:20 */ @Service +@Slf4j public class EDDataServiceImpl implements EDDataService { - private static final Logger LOGGER = LoggerFactory.getLogger(LoggerConstant.DOMAIN_SERVICE); +// private static final Logger LOGGER = LoggerFactory.getLogger(LoggerConstant.DOMAIN_SERVICE); @Resource private EDDataRepository edDataRepository; + @Resource + private CategoryRepository categoryRepository; + @Value("${zip.password}") + private String passwordZIP; + @Value("${upload.file.dest.path}") + private String uploadFilePath; + @Value("${upload.file.cache.dir}") + private String fileCacheDir; + @Value("${upload.file.store.dir}") + private String fileStoreDir; /** * 创建文件/文件夹数据信息 @@ -42,7 +70,44 @@ public class EDDataServiceImpl implements EDDataService { */ public Boolean createDataInfo(EDDataInfo edDataInfo) { - edDataRepository.createDataInfo(edDataInfo); + // 获取上级目录的名称 + Category categoryParent = new Category(); + categoryParent.setCategoryId(edDataInfo.getCategoryId()); + List categoryParentList = categoryRepository.selectCategories(categoryParent); + if(categoryParentList.size() < 1) + { + return Boolean.FALSE; + } + else + { + // 获取新文件夹路径信息 + categoryParent = categoryParentList.get(0); + + String osName = System.getProperty("os.name").toLowerCase(); + String storageDirectory = osName.startsWith("win") ? uploadFilePath + fileStoreDir : fileStoreDir; + + String folderParent = categoryParent.getCategoryId() + "_" + categoryParent.getCategoryName() ; + String folderNew = storageDirectory + "/" + folderParent + "/" + edDataInfo.getDataName(); + + // 判断文件夹名称是否存在 + EDDataParams folderParames = new EDDataParams(); + folderParames.setParentId(edDataInfo.getCategoryId()); + List childFileInfoList = edDataRepository.getDataInfoList(folderParames); + for(EDDataInfo fileInfo : childFileInfoList) + { + if(fileInfo.getDataName() == edDataInfo.getDataName()){ + return Boolean.FALSE; + } + } + + // 将文件夹数据写到数据库中 + if(edDataRepository.createDataInfo(edDataInfo)) { + if (!FileUtil.exist(folderNew)){ + FileUtil.mkdir(folderNew); + } + } + } + return Boolean.TRUE; } @@ -145,4 +210,302 @@ public class EDDataServiceImpl implements EDDataService { } + /** + * 导出数据 + * @param parames + * @return + */ + public String exportData(EDDataParams parames) + { + + // 获取文件夹编码ID数组 + List categoryIdInputList = Arrays.asList(parames.getDataIdArr()); + + String osName = System.getProperty("os.name").toLowerCase(); + + fileCacheDir = osName.startsWith("win") ? uploadFilePath + fileCacheDir : fileCacheDir; + + String exportDataDirectory = ""; + + { + exportDataDirectory = fileCacheDir + "/ExportData"; + File cacheDirectory = new File(exportDataDirectory); + if (!cacheDirectory.exists()) { + cacheDirectory.mkdirs(); + } + } + + List categoryAllList = categoryRepository.getAllCategories(); + Map categoryAllMap = new HashMap(); //所有目录数组map + List categoryInputList = new ArrayList(); //客户端输入的目录数组map + Map categoryInputMap = new HashMap(); //客户端输入的目录数组map + for (Category category : categoryAllList) + { + categoryAllMap.put(category.getCategoryId(), category); + } + for (String categoryId : categoryIdInputList) + { + Category category = categoryAllMap.get(categoryId); + categoryInputList.add(category); + categoryInputMap.put(categoryId, category); + } + + + List categoryHighestList = new ArrayList(); + List 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 topCategoriesPathList = categoryRepository.getTopCategoriesPathList(category, categoryAllMap); + for (Category categoryPath : topCategoriesPathList) { + if(!highestToTopCategoriesPathList.contains(categoryPath)) { + highestToTopCategoriesPathList.add(categoryPath); + } + } + } + } + + // 导出目录树数据为json文件 + { + List categoryExportList = new ArrayList(); //需要导出的目录数据数组 + categoryExportList.addAll(highestToTopCategoriesPathList); + for (Category category : categoryInputList) { + if(!categoryExportList.contains(category)) { + categoryExportList.add(category); + } + } + + // 创建ObjectMapper对象,用于JSON处理 + ObjectMapper objectMapper = new ObjectMapper(); + + // 将List转换为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()); + } + + // 导出文件信息数据和文件数据 + { + // 保存文件信息数据为json文件 + EDDataParams folderParames = new EDDataParams(); + List fileAllList = edDataRepository.getDataInfoList(folderParames); //获取所有文件信息数据 + Map fileAllMap = new HashMap(); //所有文件数组map + for (EDDataInfo fileFinfo : fileAllList) + { + fileAllMap.put(fileFinfo.getDataId(), fileFinfo); + } + List fileExportList = new ArrayList(); //需要导出的文件信息数据数组 + for (EDDataInfo fileFinfo : fileAllList) + { + if(categoryInputMap.get(fileFinfo.getCategoryId()) != null) + { + fileExportList.add(fileFinfo); + } + } + + + // 创建ObjectMapper对象,用于JSON处理 + ObjectMapper objectMapper = new ObjectMapper(); + + // 将List转换为JSON字符串 + String jsonString = ""; + try { + jsonString = objectMapper.writeValueAsString(fileExportList); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + + // 将JSON字符串写入文件 + File jsonFile = new File(exportDataDirectory + "/fileInfoList.json"); + try { + objectMapper.writeValue(jsonFile, jsonString); + } catch (IOException e) { + e.printStackTrace(); + } + + System.out.println("目录树数据已成功导出为JSON文件。" + jsonFile.getAbsolutePath()); + + + // 将文件 复制到 数据导出的缓存目录中 + //String storageDirectory = osName.startsWith("win") ? uploadFilePath + fileStoreDir : fileStoreDir; + //error Path source = Paths.get(storageDirectory + "/testFolder3"); + //Path target = Paths.get(exportDataDirectory); + //FileUtil.copy(source, target); // StandardCopyOption.REPLACE_EXISTING + //System.out.println("文件数据已成功复制到目标目录。"); + } + + // 将目录树数据 和 文件夹及文件夹内数据 进行压缩打包 + { + String zipPathFileName = fileCacheDir + "/comac_exportData1.comac"; + String enCodeZipPathFileName = fileCacheDir + "/comac_exportData.comac"; +// EleZipUtil.zipFile(exportDataDirectory, zipPathFileName, passwordZIP); + + ZipUtil.zip(exportDataDirectory, zipPathFileName); + String password = "adknfhkj87654knd"; + AES aes = SecureUtil.aes(password.getBytes()); // aesKey是加密密钥 + try( + InputStream inputStream = new FileInputStream(zipPathFileName); + OutputStream outputStream = new FileOutputStream(enCodeZipPathFileName); + ) { + aes.encrypt(inputStream, outputStream, true); + } catch (Exception e) { + log.error("文件加密错误..", e); + } + + System.out.println("目录树数据+文件数据已成功复制到目标目录。" + zipPathFileName); + } + + // 删除 导出数据的 缓存目录 + FileUtil.del(exportDataDirectory); + + return fileCacheDir + "/comac_exportData.comac"; + } + + /** + * 将解压后的数据导入到数据库中 + * @param folderPath 解压后的数据目录 + * @return + */ + public Boolean importData(String folderPath) + { + // 获取所有目录树节点数据 + List categoryAllList = categoryRepository.getAllCategories(); + Map categoryAllMap = new HashMap(); //所有目录数组map + for (Category category : categoryAllList) + { + categoryAllMap.put(category.getCategoryId(), category); + } + + // 获取所有文件信息数据 + EDDataParams parames = new EDDataParams(); + List fileInfoAllList = edDataRepository.getDataInfoList(parames); + Map fileInfoAllMap = new HashMap(); //所有文件数组map + for (EDDataInfo fileInfo : fileInfoAllList) + { + fileInfoAllMap.put(fileInfo.getDataId(), fileInfo); + } + + + // 读取并反序列化目录树的JSON文件数据为List;然后写入到数据库中。 + List categoryImportList = null; + { + // 读取文件数据 + + try { + // 创建ObjectMapper对象,用于JSON处理 + ObjectMapper objectMapper = new ObjectMapper(); + + // 指定要读取的JSON文件路径 + File jsonFile = new File(folderPath + "/categoryList.json"); + + // 将JSON数据从文件中读取并反序列化为List + categoryImportList = objectMapper.readValue(jsonFile, objectMapper.getTypeFactory().constructCollectionType(List.class, Category.class)); + if (categoryImportList == null) { + System.out.println("读取并反序列化JSON文件数据为List失败!"); + return Boolean.FALSE; + } + } catch (IOException e) { + e.printStackTrace(); + } + + // 将目录树数据写入到数据库中 + + for (Category category : categoryImportList) { + if (categoryAllMap.get(category.getCategoryId()) == null) { + categoryRepository.createCategory(category); + } + } + } + + // 读取并反序列化文件信息的JSON文件数据为List;然后写入到数据库中。 + List fileInfoImportList = null; + { + // 读取文件数据 + + try { + // 创建ObjectMapper对象,用于JSON处理 + ObjectMapper objectMapper = new ObjectMapper(); + + // 指定要读取的JSON文件路径 + File jsonFile = new File(folderPath + "/fileInfoList.json"); + + // 将JSON数据从文件中读取并反序列化为List + fileInfoImportList = objectMapper.readValue(jsonFile, objectMapper.getTypeFactory().constructCollectionType(List.class, Category.class)); + if (fileInfoImportList == null) { + log.info("读取并反序列化JSON文件数据为List失败!"); + return Boolean.FALSE; + } + } catch (IOException e) { + e.printStackTrace(); + } + + // 将文件信息数据写入到数据库中 + + for (EDDataInfo fileInfo : fileInfoImportList) { + if (fileInfoAllMap.get(fileInfo.getDataId()) == null) { + edDataRepository.createDataInfo(fileInfo); + } + } + } + + // 将解压后的文件夹和文件 移动到 上传文件的存储目录中 + { + String osName = System.getProperty("os.name").toLowerCase(); + String storageFilePath = osName.startsWith("win") ? uploadFilePath + fileStoreDir : fileStoreDir; + String cacheFilePath = folderPath; + + try { + for (EDDataInfo fileInfo : fileInfoImportList) { + if (fileInfoAllMap.get(fileInfo.getDataId()) == null) { + if (!FileUtil.exist(storageFilePath)){ + FileUtil.mkdir(storageFilePath); + } + + Path source = Paths.get(cacheFilePath); + Path target = Paths.get(storageFilePath); + + Files.move(source, target); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + } + + return Boolean.TRUE; + } + + } \ No newline at end of file diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/repository/CategoryRepository.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/repository/CategoryRepository.java index 176fb1c..fd7713d 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/repository/CategoryRepository.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/user/repository/CategoryRepository.java @@ -2,7 +2,9 @@ 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.ArrayList; import java.util.List; +import java.util.Map; public interface CategoryRepository { @@ -30,4 +32,37 @@ public interface CategoryRepository { */ List selectChildCategories(Category category); + /** + * 创建目录树节点数据 + * @return + */ + Boolean createCategory(Category category); + + /** + * 通过 节点 获取到顶级节点的树路径 从指定的节点数组中 + * @param category + * @param categoryMap + * @return + */ + List getTopCategoriesPathList(Category category, Map categoryMap); + + /** + * 通过 节点 获取父节点 从指定的节点数组中 + * @param category + * @param categoryList + * @return + */ + Category getParentCategories(Category category, List categoryList); + + + /** + * 获通过 节点ID 获取父节点 从指定的节点数组中 + * @param categoryId + * @param categoryList + * @return + */ + Category getParentCategories(String categoryId, List categoryList); + + + } diff --git a/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/ZipUtil.java b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/EleZipUtil.java similarity index 99% rename from electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/ZipUtil.java rename to electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/EleZipUtil.java index bb5c8a1..d279112 100644 --- a/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/ZipUtil.java +++ b/electromagnetic-framework/src/main/java/electromagnetic/data/framework/share/util/EleZipUtil.java @@ -18,7 +18,7 @@ import java.util.List; * @date: 2024/1/12 * @version: 1.0 */ -public class ZipUtil { +public class EleZipUtil { /** * 压缩指定路径的文件 * @param srcFilePath 待压缩文件路径 diff --git a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java index 71a6b67..9109666 100644 --- a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java +++ b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java @@ -59,7 +59,7 @@ public interface EDDataFacade { * @param request * @return */ - ElectromagneticResult batchExport(EDDataRequest request); + ElectromagneticResult> batchExport(EDDataRequest request); /** * 导入 diff --git a/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/dao/CategoryMapper.java b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/dao/CategoryMapper.java index 9f51c2c..cd557db 100644 --- a/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/dao/CategoryMapper.java +++ b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/dao/CategoryMapper.java @@ -31,4 +31,11 @@ public interface CategoryMapper { * @return */ List selectChildCategories(Category category); + + /** + * 创建目录树节点数据 + * @return + */ + Boolean createCategory(Category category); + } diff --git a/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/CategoryRepositoryImpl.java b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/CategoryRepositoryImpl.java index 2af6889..c69c2f8 100644 --- a/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/CategoryRepositoryImpl.java +++ b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/CategoryRepositoryImpl.java @@ -6,7 +6,9 @@ import com.electromagnetic.industry.software.data.manage.repository.dao.Category import org.springframework.stereotype.Repository; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; +import java.util.Map; @Repository public class CategoryRepositoryImpl implements CategoryRepository { @@ -44,4 +46,76 @@ public class CategoryRepositoryImpl implements CategoryRepository { @Override public List selectChildCategories(Category category) { return categoryMapper.selectChildCategories(category); } + /** + * 创建目录树节点数据 + * @return + */ + @Override + public Boolean createCategory(Category category) { return categoryMapper.createCategory(category); } + + + /** + * 通过 节点 获取到顶级节点的树路径 从指定的节点数组中 + * @param category + * @param categoryMap + * @return + */ + public List getTopCategoriesPathList(Category category, Map categoryMap) + { + Category categoryParent = categoryMap.get(category.getParentId()); + if(categoryParent != null) + { + List 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(Category category, List categoryList) + { + Category categoryParent = null; + for(Category iter : categoryList) + { + if(categoryParent == null && iter.getCategoryId().equals(category.getParentId())) + { + categoryParent = iter; + break; + } + } + return categoryParent; + } + + + /** + * 获通过 节点ID 获取父节点 从指定的节点数组中 + * @param categoryId + * @param categoryList + * @return + */ + public Category getParentCategories(String categoryId, List categoryList) + { + Category category = null; + for(Category iter : categoryList) + { + if(category == null && iter.getCategoryId().equals(categoryId)) + { + category = iter; + break; + } + } + return getParentCategories(category, categoryList); + } + } diff --git a/infrastructure/repository/src/main/resources/sqlmapper/CategoryMapper.xml b/infrastructure/repository/src/main/resources/sqlmapper/CategoryMapper.xml index 37a864d..d2ee3cc 100644 --- a/infrastructure/repository/src/main/resources/sqlmapper/CategoryMapper.xml +++ b/infrastructure/repository/src/main/resources/sqlmapper/CategoryMapper.xml @@ -45,4 +45,23 @@ where parent_id = parentId and category_status="available" + + + SELECT LAST_INSERT_ID() + + insert into ed_data_info (id, + category_type_id, parent_id, category_id, + category_name, category_status, + creator, creator_name, gmt_create, + modifier, modifier_name, gmt_modified, + effect_flag + ) + values (#{id,jdbcType=VARCHAR}, #{categoryTypeId,jdbcType=VARCHAR}, + #{parentId,jdbcType=VARCHAR}, #{categoryId,jdbcType=VARCHAR}, + #{categoryName,jdbcType=VARCHAR}, #{categoryStatus,jdbcType=VARCHAR}, + #{creator,jdbcType=VARCHAR}, #{creatorName,jdbcType=VARCHAR}, now(), #{modifier,jdbcType=VARCHAR}, + #{modifierName,jdbcType=VARCHAR},now(),1 + ) + + \ No newline at end of file diff --git a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java index 017bce3..7af6f9c 100644 --- a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java +++ b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java @@ -1,8 +1,7 @@ -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; -import cn.hutool.core.io.file.FileMode; import cn.hutool.core.util.ZipUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -23,8 +22,8 @@ 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 electromagnetic.data.framework.share.util.EleZipUtil; 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; @@ -44,13 +43,16 @@ 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; + @Value("${upload.file.dest.path}") + private String uploadFilePath; + @Value("${upload.file.cache.dir}") + private String fileCacheDir; + @Value("${upload.file.store.dir}") + private String fileStoreDir; + + private static final String UPLOAD_FILE_CHUNK_SUFFIX = ".part"; @@ -71,7 +73,7 @@ public class EDDataFacadeImpl implements EDDataFacade { if(Boolean.TRUE) { if (request.getUserId() == null || request.getUserId().isEmpty()) request.setUserId(IdWorker.getSnowFlakeIdString()); if (request.getUserName() == null || request.getUserName().isEmpty()) request.setUserName("user"); - if (request.getName() == null || request.getName().isEmpty()) request.setName("testFolder"); + //if (request.getName() == null || request.getName().isEmpty()) request.setName("testFolder"); //if (request.getParentId() == null || request.getParentId().isEmpty()) request.setParentId(IdWorker.getSnowFlakeIdString()); } @@ -89,51 +91,8 @@ public class EDDataFacadeImpl implements EDDataFacade { edDataInfo.setVersion("1.0.0"); edDataInfo.setDataStatus("publish"); - String parentFolderPath = ""; - // 获取上级目录的名称 - if(!request.getParentId().isEmpty()) { - EDDataParams parames = new EDDataParams(); - parames.setDataId(request.getParentId()); - EDDataInfo edDataInfoParent = edDataService.getDataInfo(parames); - if(edDataInfoParent == null) { - ElectromagneticResultUtil.fail(HttpStatus.BAD_REQUEST.toString(),"上级文件夹为空!"); - } - - String folderNameParent = edDataInfoParent.getDataName(); - String folderIdParent = edDataInfoParent.getDataId(); - - // 记录当前目录的文件夹路径和文件夹id路径 - JSONObject implantJsonObject = JSON.parseObject(edDataInfoParent.getImplantJson()); - if(implantJsonObject == null) { - implantJsonObject = new JSONObject(); - parentFolderPath = folderNameParent; - implantJsonObject.put("folderPath", parentFolderPath); - implantJsonObject.put("folderIdPath", folderIdParent); - } - else - { - String folderPath = implantJsonObject.getString("folderPath"); - String folderIdPath = implantJsonObject.getString("folderIdPath"); - parentFolderPath = folderPath + "/" + folderNameParent; - implantJsonObject.put("folderPath", parentFolderPath); - implantJsonObject.put("folderIdPath", folderIdPath + "/" + folderIdParent); - } - - String newImplantJson = implantJsonObject.toJSONString(); - edDataInfo.setImplantJson(newImplantJson); - } - - boolean isSuccess = edDataService.createDataInfo(edDataInfo); - if(isSuccess) - { - // 获取文件存储的文件夹路径 - String storageDirectory = "D:/fileTemp/" + parentFolderPath + "/" + edDataInfo.getDataName(); - if(!edDataService.checkFolderIsExist(storageDirectory)) { - edDataService.createMultiLevelDirectory(storageDirectory); - } - } - - return ElectromagneticResultUtil.success(Boolean.TRUE); + Boolean isSuccess = edDataService.createDataInfo(edDataInfo); + return ElectromagneticResultUtil.success(isSuccess); } @@ -220,10 +179,10 @@ public class EDDataFacadeImpl implements EDDataFacade { fileName = fileFullName.substring(fileFullName.lastIndexOf(".")); } - // 获取文件存储的文件夹路径 - String storageDirectory = "D:/fileTemp"; - if(!edDataService.checkFolderIsExist(storageDirectory)) { - edDataService.createMultiLevelDirectory(storageDirectory); + String osName = System.getProperty("os.name").toLowerCase(); + String storageFilePath = osName.startsWith("win") ? uploadFilePath + fileStoreDir : fileStoreDir; + if(!edDataService.checkFolderIsExist(storageFilePath)) { + edDataService.createMultiLevelDirectory(storageFilePath); } String parentFolderPath = ""; //上级文件夹路径 @@ -251,7 +210,7 @@ public class EDDataFacadeImpl implements EDDataFacade { } // 文件保存目录路径 - String fileSavePath = storageDirectory + "/" + parentFolderPath; + String fileSavePath = storageFilePath + "/" + parentFolderPath; String treeName = "目录树名称"; //String newFileName = treeName + "," + parentFolderName + "," + fileFullName; String newFileName = fileFullName; @@ -292,8 +251,8 @@ public class EDDataFacadeImpl implements EDDataFacade { boolean isSuccess = edDataService.createDataInfo(edDataInfo); - String userHome = System.getProperty("user.home"); - File cacheDirectory = new File(userHome + "\\AppData\\Local\\Temp\\EDData\\Upload"); + String cacheUploadFilePath = osName.startsWith("win") ? uploadFilePath + fileCacheDir : fileCacheDir; + File cacheDirectory = new File(cacheUploadFilePath + "/Upload"); if (!cacheDirectory.exists()) { cacheDirectory.mkdirs(); } @@ -351,7 +310,8 @@ public class EDDataFacadeImpl implements EDDataFacade { //EDDataParams parames= EDDataMappers.INSTANCE.getEDDataParames(request); // 获取文件存储的文件夹路径 - String storageDirectory = "D:/fileTemp"; + String osName = System.getProperty("os.name").toLowerCase(); + String storageFilePath = osName.startsWith("win") ? uploadFilePath + fileStoreDir : fileStoreDir; EDDataParams parames = new EDDataParams(); List dataPathArr = new ArrayList(); for(String dataId : request.getDataIdArr()) @@ -362,7 +322,7 @@ public class EDDataFacadeImpl implements EDDataFacade { { JSONObject implantJsonObject = JSON.parseObject(edDataInfo.getImplantJson()); String filePath = implantJsonObject.getString("folderPath"); - filePath = storageDirectory + "/" + filePath + "/" + edDataInfo.getDataName(); + filePath = storageFilePath + "/" + filePath + "/" + edDataInfo.getDataName(); dataPathArr.add(filePath); } } @@ -379,132 +339,18 @@ public class EDDataFacadeImpl implements EDDataFacade { * @return */ @Override - public ElectromagneticResult batchExport(EDDataRequest request) { + public ElectromagneticResult> batchExport(EDDataRequest request) { //1、根据用户选择层级树编码查出所有文件和文件夹list //2、循环list将每个文件复制到新建目录并进行重命名,命名规则:目录树编码+,+文件夹编码(有则填写无则为空)+,+文件编码 //3、打包新建为zip,并根据生产下载地址(域名+文件路径+文件) //4、返回前端下载的地址 // **********在导出的过程中可能会出现有用户上传文件的情况 - - // 获取文件夹编码ID数组 - List categoryIdInputList = Arrays.asList(request.getDataIdArr()); - - - String cacheFolder = ""; // 缓存文件夹的绝对路径 - String exportDataDirectory = ""; - - { - // 获取缓存文件夹的绝对路径 - 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(); - } - } - - List categoryAllList = categoryService.selectAllCategories(); - Map categoryAllMap = new HashMap(); //所有目录数组map - List categoryInputList = new ArrayList(); //客户端输入的目录数组map - Map categoryInputMap = new HashMap(); //客户端输入的目录数组map - for (Category category : categoryAllList) - { - categoryAllMap.put(category.getCategoryId(), category); - } - for (String categoryId : categoryIdInputList) - { - Category category = categoryAllMap.get(categoryId); - categoryInputList.add(category); - categoryInputMap.put(categoryId, category); - } - - - List categoryHighestList = new ArrayList(); - List 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 topCategoriesPathList = categoryService.getTopCategoriesPathList(category, categoryAllMap); - for (Category categoryPath : topCategoriesPathList) { - if(!highestToTopCategoriesPathList.contains(categoryPath)) { - highestToTopCategoriesPathList.add(categoryPath); - } - } - } - } - - // 导出目录数据为json文件 - { - List categoryExportList = new ArrayList(); //需要导出的目录数据数组 - categoryExportList.addAll(highestToTopCategoriesPathList); - for (Category category : categoryInputList) { - if(!categoryExportList.contains(category)) { - categoryExportList.add(category); - } - } - - // 创建ObjectMapper对象,用于JSON处理 - ObjectMapper objectMapper = new ObjectMapper(); - - // 将List转换为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"); + EDDataParams parames= EDDataMappers.INSTANCE.getEDDataParames(request); + String fileUrl = edDataService.exportData(parames); + Map result = new HashMap<>(); + result.put("url", fileUrl); + return ElectromagneticResultUtil.success(result); } /** @@ -614,8 +460,9 @@ public class EDDataFacadeImpl implements EDDataFacade { ZipUtil.unzip(destZipPath, uploadFilePath + identifier + File.separator); // 文件信息存入数据库 + Boolean result = edDataService.importData(destZipPath); - return ElectromagneticResultUtil.success(true); + return ElectromagneticResultUtil.success(result); } @Override @@ -636,4 +483,5 @@ public class EDDataFacadeImpl implements EDDataFacade { } + } From 1f18245c8f7645e0494414395906b0a6c213e3c8 Mon Sep 17 00:00:00 2001 From: chenxudong Date: Tue, 26 Nov 2024 10:31:35 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/controller/EDDataController.java | 11 +++- .../data/manage/facade/EDDataFacade.java | 10 +++- .../request/indicator/FileDownloadDTO.java | 8 +++ .../service/facade/EDDataFacadeImpl.java | 58 ++++++++++--------- 4 files changed, 55 insertions(+), 32 deletions(-) create mode 100644 facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileDownloadDTO.java diff --git a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java index 8e693e4..833f534 100644 --- a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java +++ b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java @@ -3,13 +3,18 @@ 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 com.electromagnetic.industry.software.data.manage.request.indicator.FileChunkDTO; +import com.electromagnetic.industry.software.data.manage.request.indicator.FileDownloadDTO; import electromagnetic.data.framework.share.model.ElectromagneticResult; import electromagnetic.data.framework.share.model.ElectromagneticResultUtil; import io.swagger.annotations.ApiOperation; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.Date; import java.util.List; @@ -62,9 +67,9 @@ public class EDDataController { @ApiOperation(value = "下载",notes = "") - @RequestMapping(value = "/download",method = RequestMethod.POST) - public ElectromagneticResult download(@RequestBody EDDataRequest request){ - return edDataFacade.download(request); + @RequestMapping(value = "/download",method = RequestMethod.GET) + public ResponseEntity download(@RequestBody FileDownloadDTO fileDownloadDTO, HttpServletResponse response) throws IOException { + return edDataFacade.download(fileDownloadDTO, response); } diff --git a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java index 9109666..6ca43af 100644 --- a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java +++ b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java @@ -3,9 +3,14 @@ package com.electromagnetic.industry.software.data.manage.facade; import com.electromagnetic.industry.software.data.manage.request.indicator.EDDataRequest; import com.electromagnetic.industry.software.data.manage.request.indicator.FileChunkDTO; import com.electromagnetic.industry.software.data.manage.request.indicator.FileChunkResultDTO; +import com.electromagnetic.industry.software.data.manage.request.indicator.FileDownloadDTO; import com.electromagnetic.industry.software.data.manage.response.indicator.EDDataPageResponse; import electromagnetic.data.framework.share.model.ElectromagneticResult; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.ResponseEntity; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -49,10 +54,11 @@ public interface EDDataFacade { /** * 下载 - * @param request + * + * @param fileDownloadDTO * @return */ - ElectromagneticResult>> download(EDDataRequest request); + ResponseEntity download(FileDownloadDTO fileDownloadDTO, HttpServletResponse response) throws IOException; /** * 导出 diff --git a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileDownloadDTO.java b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileDownloadDTO.java new file mode 100644 index 0000000..0193210 --- /dev/null +++ b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileDownloadDTO.java @@ -0,0 +1,8 @@ +package com.electromagnetic.industry.software.data.manage.request.indicator; + +import lombok.Data; + +@Data +public class FileDownloadDTO { + private String dataIdArr; +} diff --git a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java index 7af6f9c..8079804 100644 --- a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java +++ b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java @@ -2,34 +2,35 @@ package com.electromagnetic.industry.software.data.manage.service.facade; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ZipUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.electromagnetic.industry.software.data.manage.domain.boardservice.category.model.Category; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.model.EDDataInfo; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.model.EDDataPage; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.parames.EDDataParams; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.service.EDDataService; -import com.electromagnetic.industry.software.data.manage.domain.boardservice.user.service.CategoryService; import com.electromagnetic.industry.software.data.manage.facade.EDDataFacade; import com.electromagnetic.industry.software.data.manage.request.indicator.EDDataRequest; import com.electromagnetic.industry.software.data.manage.request.indicator.FileChunkDTO; import com.electromagnetic.industry.software.data.manage.request.indicator.FileChunkResultDTO; +import com.electromagnetic.industry.software.data.manage.request.indicator.FileDownloadDTO; 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 electromagnetic.data.framework.share.util.EleZipUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpStatus; + +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import java.io.*; import java.io.IOException; import java.nio.file.*; @@ -302,35 +303,38 @@ public class EDDataFacadeImpl implements EDDataFacade { * 下载 * WISDOM_DOWNLOAD * /data/ed/file/download - * @param request + * + * @param fileDownloadDTO * @return */ - public ElectromagneticResult>> download(EDDataRequest request) + public ResponseEntity download(FileDownloadDTO fileDownloadDTO, HttpServletResponse response) throws IOException { - //EDDataParams parames= EDDataMappers.INSTANCE.getEDDataParames(request); - // 获取文件存储的文件夹路径 String osName = System.getProperty("os.name").toLowerCase(); String storageFilePath = osName.startsWith("win") ? uploadFilePath + fileStoreDir : fileStoreDir; EDDataParams parames = new EDDataParams(); - List dataPathArr = new ArrayList(); - for(String dataId : request.getDataIdArr()) - { - parames.setDataId(dataId); - EDDataInfo edDataInfo = edDataService.getDataInfo(parames); - if(edDataInfo != null) - { - JSONObject implantJsonObject = JSON.parseObject(edDataInfo.getImplantJson()); - String filePath = implantJsonObject.getString("folderPath"); - filePath = storageFilePath + "/" + filePath + "/" + edDataInfo.getDataName(); - dataPathArr.add(filePath); - } - } + String dataId = fileDownloadDTO.getDataIdArr(); + parames.setDataId(dataId); + EDDataInfo edDataInfo = edDataService.getDataInfo(parames); + Assert.isTrue(edDataInfo != null, "没有找到该下载文件"); + JSONObject implantJsonObject = JSON.parseObject(edDataInfo.getImplantJson()); + String filePath = storageFilePath + "/" + implantJsonObject.getString("folderPath") + "/" + edDataInfo.getDataName(); + Assert.isTrue(FileUtil.exist(filePath), "下载文件不存在。"); + File file = new File(filePath); + FileSystemResource fileSystemResource = new FileSystemResource(file); + HttpHeaders headers = new HttpHeaders(); + headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); + headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", fileSystemResource.getFilename())); + headers.add("Pragma", "no-cache"); + headers.add("Expires", "0"); - Map> result = new HashMap<>(); - result.put("urlArr", dataPathArr); - - return ElectromagneticResultUtil.success(result); + // 构建响应实体(可以返回 Date: Tue, 26 Nov 2024 15:47:52 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../software/data/manage/controller/user/UserController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/user/UserController.java b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/user/UserController.java index 7b9e3a0..3d9ddea 100644 --- a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/user/UserController.java +++ b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/user/UserController.java @@ -9,7 +9,6 @@ import com.electromagnetic.industry.software.data.manage.request.user.UserReques import electromagnetic.data.framework.share.model.ElectromagneticResult; import com.electromagnetic.industry.software.data.manage.request.user.*; import io.swagger.annotations.ApiOperation; -import jdk.internal.org.objectweb.asm.tree.analysis.Value; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; From 9709d6a691e40e2abe9d6e30c1d915068ff40a5d Mon Sep 17 00:00:00 2001 From: sxlong Date: Tue, 26 Nov 2024 18:02:12 +0800 Subject: [PATCH 7/8] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E7=9B=B8=E5=85=B3=E7=9A=84=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/EDDataBaseController.java | 28 - .../manage/controller/EDDataController.java | 8 +- .../src/main/resources/application.properties | 10 +- .../indicator/parames/EDDataParams.java | 8 + .../repository/EDDataRepository.java | 8 - .../indicator/service/EDDataService.java | 29 +- .../service/impl/EDDataServiceImpl.java | 540 +++++++++++++----- .../data/manage/facade/EDDataFacade.java | 2 +- .../request/indicator/FileDownloadDTO.java | 2 +- .../repository/impl/EDDataRepositoryImpl.java | 13 - .../resources/sqlmapper/CategoryMapper.xml | 4 +- .../service/facade/EDDataFacadeImpl.java | 178 +----- 12 files changed, 449 insertions(+), 381 deletions(-) delete mode 100644 bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataBaseController.java diff --git a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataBaseController.java b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataBaseController.java deleted file mode 100644 index 5a4c1ab..0000000 --- a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataBaseController.java +++ /dev/null @@ -1,28 +0,0 @@ -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); - } - - -} diff --git a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java index 833f534..6327f96 100644 --- a/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java +++ b/bootstrap/src/main/java/com/electromagnetic/industry/software/data/manage/controller/EDDataController.java @@ -62,7 +62,7 @@ public class EDDataController { request.setParentId(parentId); request.setFileData(file); request.setGmtBatchUpload(new Date(gmtBatchUpload)); - return edDataFacade.upload(request); + return edDataFacade.uploadFile(request); } @@ -79,6 +79,12 @@ public class EDDataController { return ElectromagneticResultUtil.success("复制"); } + @ApiOperation(value = "数据导出",notes = "") + @RequestMapping(value = "/batchExport",method = RequestMethod.POST) + public ElectromagneticResult batchExport(@RequestBody EDDataRequest request){ + return edDataFacade.batchExport(request); + } + @ApiOperation(value = "获取已经上传的分片",notes = "") @RequestMapping(value = "/getUploadedChunkNums",method = RequestMethod.GET) public ElectromagneticResult getUploadedChunkNums(@RequestParam String identifier) { diff --git a/bootstrap/src/main/resources/application.properties b/bootstrap/src/main/resources/application.properties index 68f1298..1381f03 100644 --- a/bootstrap/src/main/resources/application.properties +++ b/bootstrap/src/main/resources/application.properties @@ -30,8 +30,12 @@ server.port=8888 zip.password=~~BYE6cWGBJJjsU9DczYtZIQ== #windows文件存储目录 -upload.file.dest.path=E:/comacFileStore/ +data.windows.path=E:/comacFileStorage/ #文件缓存路径 -upload.file.cache.dir=/szsd/cache/ +data.file.cache.dir=/szsd/cache/ #文件存储路径 -upload.file.store.dir=/szsd/fileStore/ +data.file.storage.dir=/szsd/fileStorage/ +#上传文件时文件的缓存文件夹名称 +data.upload.cache.dir=upload +#导出数据时文件的缓存文件夹名称 +data.export.cache.dir=export diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/parames/EDDataParams.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/parames/EDDataParams.java index 23cf20f..10bad3c 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/parames/EDDataParams.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/parames/EDDataParams.java @@ -17,6 +17,14 @@ public class EDDataParams implements Serializable { * 每页数据 */ private Integer pageSize = 10; + /** + * 操作用户id + */ + private String userId; + /** + * 用户名 + */ + private String userName; /** * 上级文件夹数据码,为空是顶级 */ diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/repository/EDDataRepository.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/repository/EDDataRepository.java index 0ea9c6d..bed766b 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/repository/EDDataRepository.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/repository/EDDataRepository.java @@ -43,12 +43,4 @@ public interface EDDataRepository { */ Boolean updateFileInfo(EDDataParams parames); - /** - * 下载 - * @param parames - * @return - */ - Boolean download(EDDataParams parames); - - } \ No newline at end of file diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/EDDataService.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/EDDataService.java index 4d3bf3d..b14df27 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/EDDataService.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/EDDataService.java @@ -4,6 +4,9 @@ import com.electromagnetic.industry.software.data.manage.domain.boardservice.ind import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.model.EDDataPage; import com.electromagnetic.industry.software.data.manage.domain.boardservice.indicator.parames.EDDataParams; +import java.util.List; +import java.util.Map; + public interface EDDataService { /** @@ -42,25 +45,25 @@ public interface EDDataService { Integer getChildFileCount(EDDataParams parames); /** - * 下载 + * 获取文件的文件夹路径 + * @param categoryId + * @return + */ + String getFilePathOfFolder(String categoryId); + + /** + * 文件上传 * @param parames * @return */ - Boolean download(EDDataParams parames); + Boolean uploadFile(EDDataParams parames); /** - * 检查文件夹是否存在 - * @param path + * 文件下载 + * @param parames * @return */ - Boolean checkFolderIsExist(String path); - - /** - * 创建多级目录 - * @param path - * @return - */ - Boolean createMultiLevelDirectory(String path); + List downloadFile(EDDataParams parames); /** * 导出数据 @@ -74,6 +77,6 @@ public interface EDDataService { * @param folderPath * @return */ - Boolean importData(String folderPath); + Map> importData(String folderPath); } diff --git a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/impl/EDDataServiceImpl.java b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/impl/EDDataServiceImpl.java index 0b8ee3e..3ea899d 100644 --- a/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/impl/EDDataServiceImpl.java +++ b/domain/src/main/java/com/electromagnetic/industry/software/data/manage/domain/boardservice/indicator/service/impl/EDDataServiceImpl.java @@ -31,6 +31,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.*; @@ -56,12 +57,48 @@ public class EDDataServiceImpl implements EDDataService { @Value("${zip.password}") private String passwordZIP; - @Value("${upload.file.dest.path}") - private String uploadFilePath; - @Value("${upload.file.cache.dir}") + @Value("${data.windows.path}") + private String windowsDir; + @Value("${data.file.cache.dir}") private String fileCacheDir; - @Value("${upload.file.store.dir}") - private String fileStoreDir; + @Value("${data.file.storage.dir}") + private String fileStorageDir; + @Value("${data.upload.cache.dir}") + private String uploadCacheDir; + @Value("${data.export.cache.dir}") + private String exportCacheDir; + + // 文件夹名称分隔符 + private static final String FOLDER_NAME_SEPARATOR = "_"; + + /** + * 获取时间戳字符串 + * @return + */ + public String getTimeStampString() { + long timestamp = System.currentTimeMillis(); + return String.valueOf(timestamp); + } + + /** + * 获取数据存储目录 + * @return + */ + public String getDataStoragePath() + { + String osName = System.getProperty("os.name").toLowerCase(); + return osName.startsWith("win") ? windowsDir + fileStorageDir : fileStorageDir; + } + + /** + * 获取数据缓存目录 + * @return + */ + public String getDataCachePath() + { + String osName = System.getProperty("os.name").toLowerCase(); + return osName.startsWith("win") ? windowsDir + fileCacheDir : fileCacheDir; + } /** * 创建文件/文件夹数据信息 @@ -83,11 +120,9 @@ public class EDDataServiceImpl implements EDDataService { // 获取新文件夹路径信息 categoryParent = categoryParentList.get(0); - String osName = System.getProperty("os.name").toLowerCase(); - String storageDirectory = osName.startsWith("win") ? uploadFilePath + fileStoreDir : fileStoreDir; - - String folderParent = categoryParent.getCategoryId() + "_" + categoryParent.getCategoryName() ; - String folderNew = storageDirectory + "/" + folderParent + "/" + edDataInfo.getDataName(); + String dataStoragePath = getDataStoragePath(); + String folderParent = categoryParent.getCategoryId() + FOLDER_NAME_SEPARATOR + categoryParent.getCategoryName() ; + String folderNew = dataStoragePath + File.separator + folderParent + File.separator + edDataInfo.getDataName(); // 判断文件夹名称是否存在 EDDataParams folderParames = new EDDataParams(); @@ -144,7 +179,33 @@ public class EDDataServiceImpl implements EDDataService { */ public Boolean updateFileInfo(EDDataParams parames) { + + String dataStoragePath = getDataStoragePath(); + if (!FileUtil.exist(dataStoragePath)){ + return Boolean.FALSE; + } + + EDDataParams paramesFind = new EDDataParams(); + paramesFind.setDataId(parames.getDataId()); + List edDataInfoList = edDataRepository.getDataInfoList(paramesFind); + if(edDataInfoList.size() < 1) { + return Boolean.FALSE; + } + + EDDataInfo edDataInfo = edDataInfoList.get(0); + JSONObject implantJsonObject = JSON.parseObject(edDataInfo.getImplantJson()); + String filePathOfFolder = implantJsonObject.getString("folderPath"); + String fileStorageFullPath = dataStoragePath + filePathOfFolder + File.separator + edDataInfo.getDataName(); + + if (!FileUtil.exist(fileStorageFullPath)){ + return Boolean.FALSE; + } + + String fileNameNew = parames.getName(); + FileUtil.rename(Paths.get(fileStorageFullPath) ,fileNameNew,true); + edDataRepository.updateFileInfo(parames); + return Boolean.TRUE; } @@ -174,41 +235,210 @@ public class EDDataServiceImpl implements EDDataService { } /** - * 下载 + * 获取文件的文件夹路径 + * @param categoryId + * @return + */ + public String getFilePathOfFolder(String categoryId) + { + String filePathOfFolder = ""; //文件存放在文件夹的路径 + + String categoryIdHighest = categoryId; //最高级的目录编码 + EDDataParams folderParames = new EDDataParams(); + folderParames.setDataId(categoryId); + EDDataInfo edDataInfoParent = edDataRepository.getDataInfo(folderParames); + if(edDataInfoParent != null) { + categoryIdHighest = edDataInfoParent.getCategoryId(); + } + + Category categoryParent = new Category(); + categoryParent.setCategoryId(categoryIdHighest); + List categoryParentList = categoryRepository.selectCategories(categoryParent); + if(categoryParentList.size() > 0){ + categoryParent = categoryParentList.get(0); + filePathOfFolder = categoryParent.getCategoryId() + FOLDER_NAME_SEPARATOR + categoryParent.getCategoryName(); + if(edDataInfoParent != null){ + filePathOfFolder = filePathOfFolder + File.separator + edDataInfoParent.getDataName(); + } + } + + return filePathOfFolder; + } + + /** + * 文件上传 * @param parames * @return */ - public Boolean download(EDDataParams parames) + public Boolean uploadFile(EDDataParams parames) { - edDataRepository.download(parames); - return Boolean.TRUE; - } - /** - * 检查文件夹是否存在 - * @param path - * @return - */ - public Boolean checkFolderIsExist(String path) - { - return Files.exists(Paths.get(path)); - } + // 获取目录编码ID + String categoryId = parames.getParentId(); - /** - * 创建多级目录 - * @param path - * @return - */ - public Boolean createMultiLevelDirectory(String path) - { - try { - Files.createDirectories(Paths.get(path)); - return Boolean.TRUE; - } catch (IOException e) { + // 获取要上传的文件 + MultipartFile fileInput = parames.getFileData(); + + // 检查文件是否为空 + if (fileInput == null || fileInput.isEmpty()) { return Boolean.FALSE; } + + // 获取文件名 + String fileFullName = fileInput.getOriginalFilename(); + // 获取文件类型 + String fileType = ""; + // 获取文件名称 + String fileName = ""; + if (fileFullName.lastIndexOf(".") != -1 && fileFullName.lastIndexOf(".") != 0) { + fileType = fileFullName.substring(fileFullName.lastIndexOf(".") + 1); + fileName = fileFullName.substring(fileFullName.lastIndexOf(".")); + } + + String dataStoragePath = getDataStoragePath(); + if (!FileUtil.exist(dataStoragePath)){ + FileUtil.mkdir(dataStoragePath); + } + + //获取文件存放在文件夹的路径 + String filePathOfFolder = getFilePathOfFolder(categoryId); + + // 将文件数据信息写到数据库 + EDDataInfo edDataInfo = new EDDataInfo(); + { + // 临时数据设置 + if (Boolean.TRUE) { + if (parames.getUserId() == null || parames.getUserId().isEmpty()) parames.setUserId(IdWorker.getSnowFlakeIdString()); + if (parames.getUserName() == null || parames.getUserName().isEmpty()) parames.setUserName("user"); + } + + // 创建新文件数据 + edDataInfo.setCreator(parames.getUserId()); + edDataInfo.setCreatorName(parames.getUserName()); + edDataInfo.setModifier(parames.getUserId()); + edDataInfo.setModifierName(parames.getUserName()); + edDataInfo.setCategoryId(parames.getParentId()); + edDataInfo.setDataName(fileFullName); + edDataInfo.setNote(parames.getNote()); + edDataInfo.setFileType(fileType); + edDataInfo.setGmtBatchUpload(parames.getGmtBatchUpload()); + + edDataInfo.setDataId(IdWorker.getSnowFlakeIdString()); + edDataInfo.setDataNo(edDataInfo.getDataId()); + edDataInfo.setDataType("file"); + edDataInfo.setVersion("1.0.0"); + edDataInfo.setDataStatus("publish"); + edDataInfo.setSaveStatus("saving"); + + JSONObject newImplantJsonObject = new JSONObject(); + newImplantJsonObject.put("folderPath", filePathOfFolder); + + edDataInfo.setImplantJson(newImplantJsonObject.toJSONString()); + + boolean isSuccess = edDataRepository.createDataInfo(edDataInfo); + } + + // 保存文件数据 到 文件存储目录 + { + + // 文件保存目录路径 + String fileSavePath = dataStoragePath + File.separator + filePathOfFolder; + String newFileName = edDataInfo.getDataId() + FOLDER_NAME_SEPARATOR + fileFullName; + + String dataCachePath = getDataCachePath(); + String uploadFileCachePath = dataCachePath + uploadCacheDir + FOLDER_NAME_SEPARATOR + getTimeStampString(); + if (!FileUtil.exist(uploadFileCachePath)){ + FileUtil.mkdir(uploadFileCachePath); + } + + String fileCacheFullPath = uploadFileCachePath + File.separator + newFileName; + String fileSaveFullPath = fileSavePath + File.separator + fileFullName; + log.info("文件缓存路径为: " + fileCacheFullPath); + + + // 这里可以添加将文件保存到本地磁盘或其他存储介质的逻辑 + File saveFile = new File(fileCacheFullPath); + + // 将文件保存到硬盘 + try { + fileInput.transferTo(saveFile); + + EDDataParams fileParames = new EDDataParams(); + fileParames.setDataId(edDataInfo.getDataId()); + if(fileInput.getSize() == saveFile.length()) + { + Path source = Paths.get(fileCacheFullPath); + Path target = Paths.get(fileSaveFullPath); + Files.move(source, target); + fileParames.setSaveStatus("success"); + } + else + { + saveFile.delete(); + fileParames.setSaveStatus("failure"); + } + + boolean isSuccess = edDataRepository.updateFileInfo(fileParames); + + FileUtil.del(uploadFileCachePath);//删除临时目录 + + log.info("文件保存成功: " + fileSaveFullPath); + + return Boolean.TRUE; + + } catch (IOException e) { + e.printStackTrace(); + } + } + + return Boolean.FALSE; } + /** + * 文件下载 + * @param parames + * @return + */ + public List downloadFile(EDDataParams parames) + { + + // 获取文件存储的文件夹路径 + String dataStoragePath = getDataStoragePath(); + EDDataParams paramesFileInfo = new EDDataParams(); + List dataPathArr = new ArrayList(); + if (!FileUtil.exist(dataStoragePath)) { + dataPathArr.add("error : The directory where the file was stored was not found!"); + return dataPathArr; + } + + for(String dataId : parames.getDataIdArr()) + { + paramesFileInfo.setDataId(dataId); + EDDataInfo edDataInfo = edDataRepository.getDataInfo(paramesFileInfo); + if(edDataInfo != null) + { + JSONObject implantJsonObject = JSON.parseObject(edDataInfo.getImplantJson()); + String filePathOfFolder = implantJsonObject.getString("folderPath"); + String fileStoragePath = dataStoragePath + File.separator + filePathOfFolder; + String fileStorageFullPath = fileStoragePath + File.separator + edDataInfo.getDataName(); + if (FileUtil.exist(fileStoragePath)) { + if (!FileUtil.exist(fileStorageFullPath)) { + fileStorageFullPath = "error : No file found : " + fileStorageFullPath; + } + } + else { + //获取文件存放在文件夹的路径 + String filePathOfFolderByDB = getFilePathOfFolder(edDataInfo.getCategoryId()); + if (!FileUtil.exist(filePathOfFolderByDB)) { + fileStorageFullPath = "error : The directory path does not exist : " + edDataInfo.getCategoryId(); + } + } + dataPathArr.add(fileStorageFullPath); + } + } + + return dataPathArr; + } /** * 导出数据 @@ -221,116 +451,85 @@ public class EDDataServiceImpl implements EDDataService { // 获取文件夹编码ID数组 List categoryIdInputList = Arrays.asList(parames.getDataIdArr()); - String osName = System.getProperty("os.name").toLowerCase(); + String dataCachePath = getDataCachePath(); - fileCacheDir = osName.startsWith("win") ? uploadFilePath + fileCacheDir : fileCacheDir; - - String exportDataDirectory = ""; - - { - exportDataDirectory = fileCacheDir + "/ExportData"; - File cacheDirectory = new File(exportDataDirectory); - if (!cacheDirectory.exists()) { - cacheDirectory.mkdirs(); - } + // 导出数据时的临时存放目录 + String exportDataCachePath = dataCachePath + exportCacheDir + FOLDER_NAME_SEPARATOR + getTimeStampString(); + if (!FileUtil.exist(exportDataCachePath)){ + FileUtil.mkdir(exportDataCachePath); } List categoryAllList = categoryRepository.getAllCategories(); Map categoryAllMap = new HashMap(); //所有目录数组map - List categoryInputList = new ArrayList(); //客户端输入的目录数组map - Map categoryInputMap = new HashMap(); //客户端输入的目录数组map - for (Category category : categoryAllList) - { + for (Category category : categoryAllList) { categoryAllMap.put(category.getCategoryId(), category); } - for (String categoryId : categoryIdInputList) - { + + EDDataParams folderParames = new EDDataParams(); + List fileAllList = edDataRepository.getDataInfoList(folderParames); //获取所有文件信息数据 + Map fileAllMap = new HashMap(); //所有文件数组map + for (EDDataInfo fileFinfo : fileAllList) { + fileAllMap.put(fileFinfo.getDataId(), fileFinfo); + } + + List categoryInputList = new ArrayList(); //客户端输入的目录数组 + Map categoryInputMap = new HashMap(); //客户端输入的目录数组map + List fileInputList = new ArrayList(); //客户端输入的目录下的文件夹数组 + Map fileInputMap = new HashMap(); //客户端输入的目录下的文件夹数组map + for (String categoryId : categoryIdInputList) { Category category = categoryAllMap.get(categoryId); - categoryInputList.add(category); - categoryInputMap.put(categoryId, category); - } - - - List categoryHighestList = new ArrayList(); - List 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 topCategoriesPathList = categoryRepository.getTopCategoriesPathList(category, categoryAllMap); - for (Category categoryPath : topCategoriesPathList) { - if(!highestToTopCategoriesPathList.contains(categoryPath)) { - highestToTopCategoriesPathList.add(categoryPath); - } + if(category != null) { + categoryInputList.add(category); + categoryInputMap.put(categoryId, category); + } else { + EDDataInfo folder = fileAllMap.get(categoryId); + if(folder != null) { + fileInputList.add(folder); + fileInputMap.put(categoryId, folder); } } } + // 导出目录树数据为json文件 { - List categoryExportList = new ArrayList(); //需要导出的目录数据数组 - categoryExportList.addAll(highestToTopCategoriesPathList); - for (Category category : categoryInputList) { - if(!categoryExportList.contains(category)) { - categoryExportList.add(category); - } - } // 创建ObjectMapper对象,用于JSON处理 ObjectMapper objectMapper = new ObjectMapper(); - // 将List转换为JSON字符串 - String jsonString = ""; + // 将List转换为JSON字符串 try { - jsonString = objectMapper.writeValueAsString(categoryExportList); + String jsonString = objectMapper.writeValueAsString(categoryInputList); + // 将JSON字符串写入文件 + File jsonFile = new File(exportDataCachePath + "/categoryList.json"); + objectMapper.writeValue(jsonFile, jsonString); + log.info("目录树数据已成功导出为JSON文件。" + jsonFile.getAbsolutePath()); } catch (JsonProcessingException e) { e.printStackTrace(); } - - // 将JSON字符串写入文件 - File jsonFile = new File(exportDataDirectory + "/categoryList.json"); - try { - objectMapper.writeValue(jsonFile, jsonString); - } catch (IOException e) { + catch (IOException e) { e.printStackTrace(); } - System.out.println("目录树数据已成功导出为JSON文件。" + jsonFile.getAbsolutePath()); + } // 导出文件信息数据和文件数据 { // 保存文件信息数据为json文件 - EDDataParams folderParames = new EDDataParams(); - List fileAllList = edDataRepository.getDataInfoList(folderParames); //获取所有文件信息数据 - Map fileAllMap = new HashMap(); //所有文件数组map - for (EDDataInfo fileFinfo : fileAllList) - { - fileAllMap.put(fileFinfo.getDataId(), fileFinfo); - } + List fileExportList = new ArrayList(); //需要导出的文件信息数据数组 - for (EDDataInfo fileFinfo : fileAllList) - { - if(categoryInputMap.get(fileFinfo.getCategoryId()) != null) - { - fileExportList.add(fileFinfo); + for (EDDataInfo fileFinfo : fileAllList) { + if(fileFinfo.getDataType().equals("folder")) { + if(categoryInputMap.get(fileFinfo.getCategoryId()) != null) { + fileExportList.add(fileFinfo); + } + } else if(fileFinfo.getDataType().equals("file")) { + if(fileInputMap.get(fileFinfo.getCategoryId()) != null) { + fileExportList.add(fileFinfo); + } else if(categoryInputMap.get(fileFinfo.getCategoryId()) != null) { + fileExportList.add(fileFinfo); + } } } @@ -338,40 +537,42 @@ public class EDDataServiceImpl implements EDDataService { // 创建ObjectMapper对象,用于JSON处理 ObjectMapper objectMapper = new ObjectMapper(); - // 将List转换为JSON字符串 - String jsonString = ""; + // 将List转换为JSON字符串 try { - jsonString = objectMapper.writeValueAsString(fileExportList); + String jsonString = objectMapper.writeValueAsString(fileExportList); + // 将JSON字符串写入文件 + File jsonFile = new File(exportDataCachePath + "/fileInfoList.json"); + objectMapper.writeValue(jsonFile, jsonString); + log.info("目录树数据已成功导出为JSON文件。" + jsonFile.getAbsolutePath()); } catch (JsonProcessingException e) { e.printStackTrace(); - } - - // 将JSON字符串写入文件 - File jsonFile = new File(exportDataDirectory + "/fileInfoList.json"); - try { - objectMapper.writeValue(jsonFile, jsonString); } catch (IOException e) { e.printStackTrace(); } - System.out.println("目录树数据已成功导出为JSON文件。" + jsonFile.getAbsolutePath()); - - // 将文件 复制到 数据导出的缓存目录中 - //String storageDirectory = osName.startsWith("win") ? uploadFilePath + fileStoreDir : fileStoreDir; - //error Path source = Paths.get(storageDirectory + "/testFolder3"); - //Path target = Paths.get(exportDataDirectory); - //FileUtil.copy(source, target); // StandardCopyOption.REPLACE_EXISTING - //System.out.println("文件数据已成功复制到目标目录。"); + String dataStoragePath = getDataStoragePath(); + String needExportfolder = ""; + for (Category category : categoryInputList) + { + needExportfolder = dataStoragePath + category.getCategoryId() + FOLDER_NAME_SEPARATOR + category.getCategoryName(); + if (FileUtil.exist(needExportfolder)){ + Path source = Paths.get(needExportfolder); + Path target = Paths.get(exportDataCachePath); + FileUtil.copy(source, target); // StandardCopyOption.REPLACE_EXISTING + } + } + + log.info("文件数据已成功复制到目标目录。"); } // 将目录树数据 和 文件夹及文件夹内数据 进行压缩打包 { - String zipPathFileName = fileCacheDir + "/comac_exportData1.comac"; - String enCodeZipPathFileName = fileCacheDir + "/comac_exportData.comac"; + String zipPathFileName = dataCachePath + "/comac_exportData1.comac"; + String enCodeZipPathFileName = dataCachePath + "/comac_exportData.comac"; // EleZipUtil.zipFile(exportDataDirectory, zipPathFileName, passwordZIP); - ZipUtil.zip(exportDataDirectory, zipPathFileName); + ZipUtil.zip(exportDataCachePath, zipPathFileName); String password = "adknfhkj87654knd"; AES aes = SecureUtil.aes(password.getBytes()); // aesKey是加密密钥 try( @@ -383,13 +584,15 @@ public class EDDataServiceImpl implements EDDataService { log.error("文件加密错误..", e); } - System.out.println("目录树数据+文件数据已成功复制到目标目录。" + zipPathFileName); + //FileUtil.del(zipPathFileName);//删除临时目录 + + log.info("目录树数据+文件数据已成功复制到目标目录。" + zipPathFileName); } // 删除 导出数据的 缓存目录 - FileUtil.del(exportDataDirectory); + FileUtil.del(exportDataCachePath); - return fileCacheDir + "/comac_exportData.comac"; + return dataCachePath + "/comac_exportData.comac"; } /** @@ -397,7 +600,7 @@ public class EDDataServiceImpl implements EDDataService { * @param folderPath 解压后的数据目录 * @return */ - public Boolean importData(String folderPath) + public Map> importData(String folderPath) { // 获取所有目录树节点数据 List categoryAllList = categoryRepository.getAllCategories(); @@ -432,15 +635,14 @@ public class EDDataServiceImpl implements EDDataService { // 将JSON数据从文件中读取并反序列化为List categoryImportList = objectMapper.readValue(jsonFile, objectMapper.getTypeFactory().constructCollectionType(List.class, Category.class)); if (categoryImportList == null) { - System.out.println("读取并反序列化JSON文件数据为List失败!"); - return Boolean.FALSE; + log.error("读取并反序列化JSON文件数据为List失败!"); + return null; } } catch (IOException e) { e.printStackTrace(); } // 将目录树数据写入到数据库中 - for (Category category : categoryImportList) { if (categoryAllMap.get(category.getCategoryId()) == null) { categoryRepository.createCategory(category); @@ -463,15 +665,14 @@ public class EDDataServiceImpl implements EDDataService { // 将JSON数据从文件中读取并反序列化为List fileInfoImportList = objectMapper.readValue(jsonFile, objectMapper.getTypeFactory().constructCollectionType(List.class, Category.class)); if (fileInfoImportList == null) { - log.info("读取并反序列化JSON文件数据为List失败!"); - return Boolean.FALSE; + log.error("读取并反序列化JSON文件数据为List失败!"); + return null; } } catch (IOException e) { e.printStackTrace(); } // 将文件信息数据写入到数据库中 - for (EDDataInfo fileInfo : fileInfoImportList) { if (fileInfoAllMap.get(fileInfo.getDataId()) == null) { edDataRepository.createDataInfo(fileInfo); @@ -480,22 +681,51 @@ public class EDDataServiceImpl implements EDDataService { } // 将解压后的文件夹和文件 移动到 上传文件的存储目录中 + List importFileSuccess = new ArrayList(); + List importFileFail = new ArrayList(); { - String osName = System.getProperty("os.name").toLowerCase(); - String storageFilePath = osName.startsWith("win") ? uploadFilePath + fileStoreDir : fileStoreDir; - String cacheFilePath = folderPath; + String dataStoragePath = getDataStoragePath(); + if (!FileUtil.exist(dataStoragePath)){ + FileUtil.mkdir(dataStoragePath); + } + + String importDataCachePath = folderPath; //导入数据时 数据文件解压后的目录 + String importFileCachePath = ""; //需要导入的文件的缓存路径 + String importFileCacheFullPath = ""; //需要导入的文件的全路径 + String fileStorageFolder = ""; //文件存储的文件夹 + String fileStoragePath = ""; //文件存储的文件夹路径 + String fileStorageFullPath = ""; //文件存储的文件全路径 try { for (EDDataInfo fileInfo : fileInfoImportList) { - if (fileInfoAllMap.get(fileInfo.getDataId()) == null) { - if (!FileUtil.exist(storageFilePath)){ - FileUtil.mkdir(storageFilePath); + JSONObject newImplantJsonObject = JSONObject.parseObject(fileInfo.getImplantJson()); + fileStorageFolder = newImplantJsonObject.getString("folderPath"); + importFileCachePath = importDataCachePath + fileStorageFolder; + importFileCacheFullPath = importFileCachePath + File.separator + fileInfo.getDataName(); + fileStoragePath = dataStoragePath + fileStorageFolder; + fileStorageFullPath = fileStoragePath + File.separator + fileInfo.getDataName(); + + if (fileInfoAllMap.get(fileInfo.getDataId()) == null + && !fileStorageFolder.isEmpty() + && FileUtil.exist(importFileCachePath) + && FileUtil.exist(importFileCacheFullPath) + && !FileUtil.exist(fileStorageFullPath) + ) + { + if(!FileUtil.exist(fileStoragePath)){ + FileUtil.mkdir(fileStoragePath); } - Path source = Paths.get(cacheFilePath); - Path target = Paths.get(storageFilePath); + Path source = Paths.get(importFileCacheFullPath); + Path target = Paths.get(fileStorageFullPath); Files.move(source, target); + + importFileSuccess.add(fileInfo.getDataId() + FOLDER_NAME_SEPARATOR + fileInfo.getDataName()); + } + else + { + importFileFail.add(fileInfo.getDataId() + FOLDER_NAME_SEPARATOR + fileInfo.getDataName()); } } } catch (IOException e) { @@ -504,7 +734,11 @@ public class EDDataServiceImpl implements EDDataService { } - return Boolean.TRUE; + Map> result = new HashMap<>(); + result.put("success", importFileSuccess); + result.put("fail", importFileFail); + + return result; } diff --git a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java index 6ca43af..721b5ed 100644 --- a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java +++ b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/facade/EDDataFacade.java @@ -50,7 +50,7 @@ public interface EDDataFacade { * @param request * @return */ - ElectromagneticResult upload(EDDataRequest request); + ElectromagneticResult uploadFile(EDDataRequest request); /** * 下载 diff --git a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileDownloadDTO.java b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileDownloadDTO.java index 0193210..244fe2f 100644 --- a/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileDownloadDTO.java +++ b/facade/src/main/java/com/electromagnetic/industry/software/data/manage/request/indicator/FileDownloadDTO.java @@ -4,5 +4,5 @@ import lombok.Data; @Data public class FileDownloadDTO { - private String dataIdArr; + private String dataId; } diff --git a/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/EDDataRepositoryImpl.java b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/EDDataRepositoryImpl.java index 20d17be..8a9182f 100644 --- a/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/EDDataRepositoryImpl.java +++ b/infrastructure/repository/src/main/java/com/electromagnetic/industry/software/data/manage/repository/impl/EDDataRepositoryImpl.java @@ -73,18 +73,5 @@ public class EDDataRepositoryImpl implements EDDataRepository { return edDataMapper.updateFileInfo(parames); } - /** - * 下载 - * @param parames - * @return - */ - @Override - public Boolean download(EDDataParams parames) - { - //return edDataMapper.download(parames); - return Boolean.TRUE; - } - - } \ No newline at end of file diff --git a/infrastructure/repository/src/main/resources/sqlmapper/CategoryMapper.xml b/infrastructure/repository/src/main/resources/sqlmapper/CategoryMapper.xml index d2ee3cc..33c9002 100644 --- a/infrastructure/repository/src/main/resources/sqlmapper/CategoryMapper.xml +++ b/infrastructure/repository/src/main/resources/sqlmapper/CategoryMapper.xml @@ -36,13 +36,13 @@ diff --git a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java index 8079804..7062bfc 100644 --- a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java +++ b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java @@ -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; @@ -27,13 +27,11 @@ import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.InputStreamResource; import org.springframework.http.*; import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.io.IOException; -import java.nio.file.*; import java.util.*; import java.util.stream.Collectors; @@ -44,16 +42,18 @@ public class EDDataFacadeImpl implements EDDataFacade { @Resource private EDDataService edDataService; - @Value("${zip.password}") - private String passwordZIP; - @Value("${upload.file.dest.path}") + @Value("${data.windows.path}") private String uploadFilePath; - @Value("${upload.file.cache.dir}") + @Value("${data.windows.path}") + private String windowsDir; + @Value("${data.file.cache.dir}") private String fileCacheDir; - @Value("${upload.file.store.dir}") - private String fileStoreDir; - - + @Value("${data.file.storage.dir}") + private String fileStorageDir; + @Value("${data.upload.cache.dir}") + private String uploadCacheDir; + @Value("${data.export.cache.dir}") + private String exportCacheDir; private static final String UPLOAD_FILE_CHUNK_SUFFIX = ".part"; @@ -74,8 +74,6 @@ public class EDDataFacadeImpl implements EDDataFacade { if(Boolean.TRUE) { if (request.getUserId() == null || request.getUserId().isEmpty()) request.setUserId(IdWorker.getSnowFlakeIdString()); if (request.getUserName() == null || request.getUserName().isEmpty()) request.setUserName("user"); - //if (request.getName() == null || request.getName().isEmpty()) request.setName("testFolder"); - //if (request.getParentId() == null || request.getParentId().isEmpty()) request.setParentId(IdWorker.getSnowFlakeIdString()); } edDataInfo.setCreator(request.getUserId()); @@ -153,150 +151,11 @@ public class EDDataFacadeImpl implements EDDataFacade { * @param request * @return */ - public ElectromagneticResult upload(EDDataRequest request) + public ElectromagneticResult uploadFile(EDDataRequest request) { EDDataParams parames= EDDataMappers.INSTANCE.getEDDataParames(request); - - try { - // 获取目录编码ID - String categoryId = request.getParentId(); - - // 获取要上传的文件 - MultipartFile fileInput = request.getFileData(); - - // 检查文件是否为空 - if (fileInput == null || fileInput.isEmpty()) { - return ElectromagneticResultUtil.fail(HttpStatus.BAD_REQUEST.toString(),"上传的文件为空"); - } - - // 获取文件名 - String fileFullName = fileInput.getOriginalFilename(); - // 获取文件类型 - String fileType = ""; - // 获取文件名称 - String fileName = ""; - if (fileFullName.lastIndexOf(".") != -1 && fileFullName.lastIndexOf(".") != 0) { - fileType = fileFullName.substring(fileFullName.lastIndexOf(".") + 1); - fileName = fileFullName.substring(fileFullName.lastIndexOf(".")); - } - - String osName = System.getProperty("os.name").toLowerCase(); - String storageFilePath = osName.startsWith("win") ? uploadFilePath + fileStoreDir : fileStoreDir; - if(!edDataService.checkFolderIsExist(storageFilePath)) { - edDataService.createMultiLevelDirectory(storageFilePath); - } - - String parentFolderPath = ""; //上级文件夹路径 - String parentFolderIdPath = ""; //上级文件夹ID路径 - String parentFolderName = ""; //上级文件夹名称 - - // 获取上级文件夹路径 - { - 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(); - } - - // 文件保存目录路径 - String fileSavePath = storageFilePath + "/" + parentFolderPath; - String treeName = "目录树名称"; - //String newFileName = treeName + "," + parentFolderName + "," + fileFullName; - String newFileName = fileFullName; - - // 文件数据信息写到数据库 - { - // 临时数据设置 - if(Boolean.TRUE) { - if (request.getUserId() == null || request.getUserId().isEmpty()) request.setUserId(IdWorker.getSnowFlakeIdString()); - if (request.getUserName() == null || request.getUserName().isEmpty()) request.setUserName("user"); - //if (request.getName() == null || request.getName().isEmpty()) request.setName("testFolder"); - if (request.getParentId() == null || request.getParentId().isEmpty()) request.setParentId(IdWorker.getSnowFlakeIdString()); - } - - // 创建新文件数据 - EDDataInfo edDataInfo = new EDDataInfo(); - edDataInfo.setCreator(request.getUserId()); - edDataInfo.setCreatorName(request.getUserName()); - edDataInfo.setModifier(request.getUserId()); - edDataInfo.setModifierName(request.getUserName()); - edDataInfo.setCategoryId(request.getParentId()); - edDataInfo.setDataName(newFileName); - edDataInfo.setNote(request.getNote()); - edDataInfo.setFileType(fileType); - edDataInfo.setGmtBatchUpload(request.getGmtBatchUpload()); - - edDataInfo.setDataId(IdWorker.getSnowFlakeIdString()); - edDataInfo.setDataNo(edDataInfo.getDataId()); - edDataInfo.setDataType("file"); - edDataInfo.setVersion("1.0.0"); - edDataInfo.setDataStatus("publish"); - edDataInfo.setSaveStatus("saving"); - - JSONObject newImplantJsonObject = new JSONObject(); - newImplantJsonObject.put("folderPath", parentFolderPath); - newImplantJsonObject.put("folderIdPath", parentFolderIdPath); - edDataInfo.setImplantJson(newImplantJsonObject.toJSONString()); - - boolean isSuccess = edDataService.createDataInfo(edDataInfo); - - String cacheUploadFilePath = osName.startsWith("win") ? uploadFilePath + fileCacheDir : fileCacheDir; - File cacheDirectory = new File(cacheUploadFilePath + "/Upload"); - if (!cacheDirectory.exists()) { - cacheDirectory.mkdirs(); - } - - String cacheFolder = cacheDirectory.getAbsolutePath(); - - String cachePath = cacheFolder + "/" + newFileName; - System.out.println("文件缓存路径为: " + cacheDirectory.getAbsolutePath()); - fileSavePath += "/" + newFileName; - - - // 这里可以添加将文件保存到本地磁盘或其他存储介质的逻辑 - File saveFile = new File(cachePath);//fileSavePath - - // 将文件保存到硬盘 - fileInput.transferTo(saveFile); - - EDDataParams fileParames = new EDDataParams(); - fileParames.setDataId(edDataInfo.getDataId()); - if(fileInput.getSize() == saveFile.length()) - { - Path source = Paths.get(cachePath); - Path target = Paths.get(fileSavePath); - Files.move(source, target); - fileParames.setSaveStatus("success"); - } - else - { - saveFile.delete(); - fileParames.setSaveStatus("failure"); - } - - isSuccess = edDataService.updateFileInfo(fileParames); - - } - - // 如果文件上传成功,返回成功消息 - return ElectromagneticResultUtil.success(Boolean.TRUE); - } catch (Exception e) { - // 如果出现异常,返回异常消息 - return ElectromagneticResultUtil.fail(HttpStatus.INTERNAL_SERVER_ERROR.toString(),"文件上传失败" + e.getMessage()); - } - + Boolean isSuccess = edDataService.uploadFile(parames); + return ElectromagneticResultUtil.success(isSuccess); } /** @@ -309,16 +168,18 @@ public class EDDataFacadeImpl implements EDDataFacade { */ public ResponseEntity download(FileDownloadDTO fileDownloadDTO, HttpServletResponse response) throws IOException { + // 获取文件存储的文件夹路径 String osName = System.getProperty("os.name").toLowerCase(); - String storageFilePath = osName.startsWith("win") ? uploadFilePath + fileStoreDir : fileStoreDir; + String storageFilePath = osName.startsWith("win") ? uploadFilePath + fileStorageDir : fileStorageDir; EDDataParams parames = new EDDataParams(); - String dataId = fileDownloadDTO.getDataIdArr(); + String dataId = fileDownloadDTO.getDataId(); parames.setDataId(dataId); EDDataInfo edDataInfo = edDataService.getDataInfo(parames); Assert.isTrue(edDataInfo != null, "没有找到该下载文件"); JSONObject implantJsonObject = JSON.parseObject(edDataInfo.getImplantJson()); String filePath = storageFilePath + "/" + implantJsonObject.getString("folderPath") + "/" + edDataInfo.getDataName(); + Assert.isTrue(FileUtil.exist(filePath), "下载文件不存在。"); File file = new File(filePath); FileSystemResource fileSystemResource = new FileSystemResource(file); @@ -335,6 +196,7 @@ public class EDDataFacadeImpl implements EDDataFacade { .contentLength(fileSystemResource.contentLength()) .contentType(MediaType.parseMediaType("application/octet-stream")) .body(new InputStreamResource(fileSystemResource.getInputStream())); + } /** @@ -464,7 +326,7 @@ public class EDDataFacadeImpl implements EDDataFacade { ZipUtil.unzip(destZipPath, uploadFilePath + identifier + File.separator); // 文件信息存入数据库 - Boolean result = edDataService.importData(destZipPath); + Map> result = edDataService.importData(destZipPath); return ElectromagneticResultUtil.success(result); } From 92699d253d85eaa19c160d1e2281192db21864b7 Mon Sep 17 00:00:00 2001 From: chenxudong Date: Wed, 27 Nov 2024 10:04:51 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=89=93=E5=8C=85?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + .../software/data/manage/service/facade/EDDataFacadeImpl.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a309f07..42918a0 100644 --- a/pom.xml +++ b/pom.xml @@ -255,6 +255,7 @@ + electromagnetic org.springframework.boot diff --git a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java index 7062bfc..4543d51 100644 --- a/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java +++ b/service/src/main/java/com/electromagnetic/industry/software/data/manage/service/facade/EDDataFacadeImpl.java @@ -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;