diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java index 13194cb..c840549 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java @@ -17,6 +17,7 @@ import com.casic.missiles.enums.resource.LabCodeDictEnum; import com.casic.missiles.model.quality.BizLabRelDept; import com.casic.missiles.model.quality.BizQualitySupervisionRecord; +import com.casic.missiles.model.quality.BizQualityTechnicalAnalysisRep; import com.casic.missiles.service.quality.IBizQualitySupervisionRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -146,6 +147,7 @@ bizQualitySupervisionRecordService.removeBatchByIds(idsDTO.getIds()); return ReturnUtil.success(); } + /** * 质量活动监督记录详情 */ @@ -156,14 +158,18 @@ } @ApiOperation("导出") - @PostMapping("/listExport") - public void export(@RequestBody OutsourceAssessApprovalListRequest request) throws Exception { + @GetMapping("/listExport") + public void export( BizQualitySupervisionRecordVO bizQualitySupervisionRecordVO, HttpServletResponse response) throws Exception { //to-do 所有文件压缩包导出 + Page page = PageFactory.defaultPage(); + QueryWrapper query = bizQualitySupervisionRecordVO.genQuery(); + List recordList = bizQualitySupervisionRecordService.selectBizQualitySupervisionRecordPage(query, page); + bizQualitySupervisionRecordService.exportZip(recordList, response); } @ApiOperation("导出word/pdf/打印") @PostMapping("/exportFile") public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { - bizQualitySupervisionRecordService.exportFile(exportDTO,response); + bizQualitySupervisionRecordService.exportFile(exportDTO, response); } } \ No newline at end of file diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java index 13194cb..c840549 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java @@ -17,6 +17,7 @@ import com.casic.missiles.enums.resource.LabCodeDictEnum; import com.casic.missiles.model.quality.BizLabRelDept; import com.casic.missiles.model.quality.BizQualitySupervisionRecord; +import com.casic.missiles.model.quality.BizQualityTechnicalAnalysisRep; import com.casic.missiles.service.quality.IBizQualitySupervisionRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -146,6 +147,7 @@ bizQualitySupervisionRecordService.removeBatchByIds(idsDTO.getIds()); return ReturnUtil.success(); } + /** * 质量活动监督记录详情 */ @@ -156,14 +158,18 @@ } @ApiOperation("导出") - @PostMapping("/listExport") - public void export(@RequestBody OutsourceAssessApprovalListRequest request) throws Exception { + @GetMapping("/listExport") + public void export( BizQualitySupervisionRecordVO bizQualitySupervisionRecordVO, HttpServletResponse response) throws Exception { //to-do 所有文件压缩包导出 + Page page = PageFactory.defaultPage(); + QueryWrapper query = bizQualitySupervisionRecordVO.genQuery(); + List recordList = bizQualitySupervisionRecordService.selectBizQualitySupervisionRecordPage(query, page); + bizQualitySupervisionRecordService.exportZip(recordList, response); } @ApiOperation("导出word/pdf/打印") @PostMapping("/exportFile") public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { - bizQualitySupervisionRecordService.exportFile(exportDTO,response); + bizQualitySupervisionRecordService.exportFile(exportDTO, response); } } \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java index d0df3a7..725d146 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java @@ -17,7 +17,7 @@ public class ZipUtils { - public static void batchDownloadFiles(String rootFileName, HttpServletResponse response,String localFileDir) { + public static void batchDownloadFiles(String rootFileName, HttpServletResponse response, String localFileDir) { FileInputStream is = null; BufferedOutputStream out = null; String rootFilePath = rootFileName + ".zip"; @@ -28,7 +28,7 @@ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(rootFilePath, StandardCharsets.UTF_8.name())); response.setHeader("Access-Control-Allow-Origin", "*"); System.out.println(response.getHeader("Content-Disposition")); - rootFilePath =zipFileCreator(localFileDir, rootFileName, rootFilePath); + rootFilePath = createZipFile(localFileDir, rootFileName, rootFilePath); //开始下载 is = new FileInputStream(new File(rootFilePath)); out = new BufferedOutputStream(response.getOutputStream()); @@ -41,6 +41,7 @@ } catch (Exception e) { e.printStackTrace(); } finally { + //删除文件 if (is != null) { try { is.close(); @@ -59,37 +60,25 @@ } } } - } + /** * 批量打包 * * @param downloadPath 项目根目录 * @return tempDir 文件保存绝对路径 */ - public static String zipFileCreator(String downloadPath, String tempDir,String papersZipName) { + public static String createZipFile(String downloadPath, String tempDir, String papersZipName) { ZipOutputStream out = null; try { //zip文件保存路径 - String zipPath = downloadPath + papersZipName; - String fileSaveRootPath=downloadPath+tempDir; + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath = downloadPath + tempDir; File file = new File(fileSaveRootPath); File[] files = file.listFiles(); out = new ZipOutputStream(new FileOutputStream(zipPath)); //遍历jsonArray列表获取所有JSONObject对象 - for (int i = 0; i < files.length; i++) { - //以论文标题为每个文件命名 - FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); - out.putNextEntry(new ZipEntry(files[i].getName())); - //写入压缩包 - int len; - byte[] buffer = new byte[1024]; - while ((len = fis.read(buffer)) > 0) { - out.write(buffer, 0, len); - } - out.closeEntry(); - fis.close(); - } + doCreateZipFile(files, fileSaveRootPath, out); out.close(); out.flush(); return zipPath; @@ -107,6 +96,45 @@ return null; } + + /** + * 递归调用 + * + * @param files + * @param fileSaveRootPath + * @param out + * @return + * @throws Exception + */ + private static void doCreateZipFile(File[] files, String fileSaveRootPath, ZipOutputStream out) throws Exception { + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + if (files[i].isFile()) { + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + File[] childFiles = files[i].listFiles(); + // 需要保留原来的文件结构时,需要对空文件夹进行处理 + // 空文件夹的处理 + out.putNextEntry(new ZipEntry(files[i].getName() + "/")); + // 没有文件,不需要文件的copy + out.closeEntry();//关闭当前zip条目读取下一条 + doCreateZipFile(childFiles, files[i].getAbsolutePath(), out); + + } + } + } + /** * 批量打包 * @@ -115,7 +143,7 @@ */ public void zipFileDeletor(String zipPath) { try { - File zipFile=new File(zipPath); + File zipFile = new File(zipPath); zipFile.delete(); } catch (Exception e) { e.printStackTrace(); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java index 13194cb..c840549 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java @@ -17,6 +17,7 @@ import com.casic.missiles.enums.resource.LabCodeDictEnum; import com.casic.missiles.model.quality.BizLabRelDept; import com.casic.missiles.model.quality.BizQualitySupervisionRecord; +import com.casic.missiles.model.quality.BizQualityTechnicalAnalysisRep; import com.casic.missiles.service.quality.IBizQualitySupervisionRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -146,6 +147,7 @@ bizQualitySupervisionRecordService.removeBatchByIds(idsDTO.getIds()); return ReturnUtil.success(); } + /** * 质量活动监督记录详情 */ @@ -156,14 +158,18 @@ } @ApiOperation("导出") - @PostMapping("/listExport") - public void export(@RequestBody OutsourceAssessApprovalListRequest request) throws Exception { + @GetMapping("/listExport") + public void export( BizQualitySupervisionRecordVO bizQualitySupervisionRecordVO, HttpServletResponse response) throws Exception { //to-do 所有文件压缩包导出 + Page page = PageFactory.defaultPage(); + QueryWrapper query = bizQualitySupervisionRecordVO.genQuery(); + List recordList = bizQualitySupervisionRecordService.selectBizQualitySupervisionRecordPage(query, page); + bizQualitySupervisionRecordService.exportZip(recordList, response); } @ApiOperation("导出word/pdf/打印") @PostMapping("/exportFile") public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { - bizQualitySupervisionRecordService.exportFile(exportDTO,response); + bizQualitySupervisionRecordService.exportFile(exportDTO, response); } } \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java index d0df3a7..725d146 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java @@ -17,7 +17,7 @@ public class ZipUtils { - public static void batchDownloadFiles(String rootFileName, HttpServletResponse response,String localFileDir) { + public static void batchDownloadFiles(String rootFileName, HttpServletResponse response, String localFileDir) { FileInputStream is = null; BufferedOutputStream out = null; String rootFilePath = rootFileName + ".zip"; @@ -28,7 +28,7 @@ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(rootFilePath, StandardCharsets.UTF_8.name())); response.setHeader("Access-Control-Allow-Origin", "*"); System.out.println(response.getHeader("Content-Disposition")); - rootFilePath =zipFileCreator(localFileDir, rootFileName, rootFilePath); + rootFilePath = createZipFile(localFileDir, rootFileName, rootFilePath); //开始下载 is = new FileInputStream(new File(rootFilePath)); out = new BufferedOutputStream(response.getOutputStream()); @@ -41,6 +41,7 @@ } catch (Exception e) { e.printStackTrace(); } finally { + //删除文件 if (is != null) { try { is.close(); @@ -59,37 +60,25 @@ } } } - } + /** * 批量打包 * * @param downloadPath 项目根目录 * @return tempDir 文件保存绝对路径 */ - public static String zipFileCreator(String downloadPath, String tempDir,String papersZipName) { + public static String createZipFile(String downloadPath, String tempDir, String papersZipName) { ZipOutputStream out = null; try { //zip文件保存路径 - String zipPath = downloadPath + papersZipName; - String fileSaveRootPath=downloadPath+tempDir; + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath = downloadPath + tempDir; File file = new File(fileSaveRootPath); File[] files = file.listFiles(); out = new ZipOutputStream(new FileOutputStream(zipPath)); //遍历jsonArray列表获取所有JSONObject对象 - for (int i = 0; i < files.length; i++) { - //以论文标题为每个文件命名 - FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); - out.putNextEntry(new ZipEntry(files[i].getName())); - //写入压缩包 - int len; - byte[] buffer = new byte[1024]; - while ((len = fis.read(buffer)) > 0) { - out.write(buffer, 0, len); - } - out.closeEntry(); - fis.close(); - } + doCreateZipFile(files, fileSaveRootPath, out); out.close(); out.flush(); return zipPath; @@ -107,6 +96,45 @@ return null; } + + /** + * 递归调用 + * + * @param files + * @param fileSaveRootPath + * @param out + * @return + * @throws Exception + */ + private static void doCreateZipFile(File[] files, String fileSaveRootPath, ZipOutputStream out) throws Exception { + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + if (files[i].isFile()) { + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + File[] childFiles = files[i].listFiles(); + // 需要保留原来的文件结构时,需要对空文件夹进行处理 + // 空文件夹的处理 + out.putNextEntry(new ZipEntry(files[i].getName() + "/")); + // 没有文件,不需要文件的copy + out.closeEntry();//关闭当前zip条目读取下一条 + doCreateZipFile(childFiles, files[i].getAbsolutePath(), out); + + } + } + } + /** * 批量打包 * @@ -115,7 +143,7 @@ */ public void zipFileDeletor(String zipPath) { try { - File zipFile=new File(zipPath); + File zipFile = new File(zipPath); zipFile.delete(); } catch (Exception e) { e.printStackTrace(); diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java index ac536c8..b822990 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java @@ -3,6 +3,8 @@ import lombok.Builder; import lombok.Data; +import java.util.List; + @Data @Builder public class CompressParameter { @@ -15,4 +17,10 @@ * 根目录名称 */ private String rootDirName; + + + /** + * 附件文件列表 + */ + private List attachmentFiles; } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java index 13194cb..c840549 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java @@ -17,6 +17,7 @@ import com.casic.missiles.enums.resource.LabCodeDictEnum; import com.casic.missiles.model.quality.BizLabRelDept; import com.casic.missiles.model.quality.BizQualitySupervisionRecord; +import com.casic.missiles.model.quality.BizQualityTechnicalAnalysisRep; import com.casic.missiles.service.quality.IBizQualitySupervisionRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -146,6 +147,7 @@ bizQualitySupervisionRecordService.removeBatchByIds(idsDTO.getIds()); return ReturnUtil.success(); } + /** * 质量活动监督记录详情 */ @@ -156,14 +158,18 @@ } @ApiOperation("导出") - @PostMapping("/listExport") - public void export(@RequestBody OutsourceAssessApprovalListRequest request) throws Exception { + @GetMapping("/listExport") + public void export( BizQualitySupervisionRecordVO bizQualitySupervisionRecordVO, HttpServletResponse response) throws Exception { //to-do 所有文件压缩包导出 + Page page = PageFactory.defaultPage(); + QueryWrapper query = bizQualitySupervisionRecordVO.genQuery(); + List recordList = bizQualitySupervisionRecordService.selectBizQualitySupervisionRecordPage(query, page); + bizQualitySupervisionRecordService.exportZip(recordList, response); } @ApiOperation("导出word/pdf/打印") @PostMapping("/exportFile") public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { - bizQualitySupervisionRecordService.exportFile(exportDTO,response); + bizQualitySupervisionRecordService.exportFile(exportDTO, response); } } \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java index d0df3a7..725d146 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java @@ -17,7 +17,7 @@ public class ZipUtils { - public static void batchDownloadFiles(String rootFileName, HttpServletResponse response,String localFileDir) { + public static void batchDownloadFiles(String rootFileName, HttpServletResponse response, String localFileDir) { FileInputStream is = null; BufferedOutputStream out = null; String rootFilePath = rootFileName + ".zip"; @@ -28,7 +28,7 @@ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(rootFilePath, StandardCharsets.UTF_8.name())); response.setHeader("Access-Control-Allow-Origin", "*"); System.out.println(response.getHeader("Content-Disposition")); - rootFilePath =zipFileCreator(localFileDir, rootFileName, rootFilePath); + rootFilePath = createZipFile(localFileDir, rootFileName, rootFilePath); //开始下载 is = new FileInputStream(new File(rootFilePath)); out = new BufferedOutputStream(response.getOutputStream()); @@ -41,6 +41,7 @@ } catch (Exception e) { e.printStackTrace(); } finally { + //删除文件 if (is != null) { try { is.close(); @@ -59,37 +60,25 @@ } } } - } + /** * 批量打包 * * @param downloadPath 项目根目录 * @return tempDir 文件保存绝对路径 */ - public static String zipFileCreator(String downloadPath, String tempDir,String papersZipName) { + public static String createZipFile(String downloadPath, String tempDir, String papersZipName) { ZipOutputStream out = null; try { //zip文件保存路径 - String zipPath = downloadPath + papersZipName; - String fileSaveRootPath=downloadPath+tempDir; + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath = downloadPath + tempDir; File file = new File(fileSaveRootPath); File[] files = file.listFiles(); out = new ZipOutputStream(new FileOutputStream(zipPath)); //遍历jsonArray列表获取所有JSONObject对象 - for (int i = 0; i < files.length; i++) { - //以论文标题为每个文件命名 - FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); - out.putNextEntry(new ZipEntry(files[i].getName())); - //写入压缩包 - int len; - byte[] buffer = new byte[1024]; - while ((len = fis.read(buffer)) > 0) { - out.write(buffer, 0, len); - } - out.closeEntry(); - fis.close(); - } + doCreateZipFile(files, fileSaveRootPath, out); out.close(); out.flush(); return zipPath; @@ -107,6 +96,45 @@ return null; } + + /** + * 递归调用 + * + * @param files + * @param fileSaveRootPath + * @param out + * @return + * @throws Exception + */ + private static void doCreateZipFile(File[] files, String fileSaveRootPath, ZipOutputStream out) throws Exception { + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + if (files[i].isFile()) { + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + File[] childFiles = files[i].listFiles(); + // 需要保留原来的文件结构时,需要对空文件夹进行处理 + // 空文件夹的处理 + out.putNextEntry(new ZipEntry(files[i].getName() + "/")); + // 没有文件,不需要文件的copy + out.closeEntry();//关闭当前zip条目读取下一条 + doCreateZipFile(childFiles, files[i].getAbsolutePath(), out); + + } + } + } + /** * 批量打包 * @@ -115,7 +143,7 @@ */ public void zipFileDeletor(String zipPath) { try { - File zipFile=new File(zipPath); + File zipFile = new File(zipPath); zipFile.delete(); } catch (Exception e) { e.printStackTrace(); diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java index ac536c8..b822990 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java @@ -3,6 +3,8 @@ import lombok.Builder; import lombok.Data; +import java.util.List; + @Data @Builder public class CompressParameter { @@ -15,4 +17,10 @@ * 根目录名称 */ private String rootDirName; + + + /** + * 附件文件列表 + */ + private List attachmentFiles; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java index c5dd4d4..d432bac 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java @@ -151,6 +151,7 @@ BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); + measureItemInfo.setLabCodeName("12222"); //定制化原始记录参数 prepareCustomCoverParams(map, measureItemInfo.getMeasureDataCalibratorList()); log.debug("--------get original template is"); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java index 13194cb..c840549 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java @@ -17,6 +17,7 @@ import com.casic.missiles.enums.resource.LabCodeDictEnum; import com.casic.missiles.model.quality.BizLabRelDept; import com.casic.missiles.model.quality.BizQualitySupervisionRecord; +import com.casic.missiles.model.quality.BizQualityTechnicalAnalysisRep; import com.casic.missiles.service.quality.IBizQualitySupervisionRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -146,6 +147,7 @@ bizQualitySupervisionRecordService.removeBatchByIds(idsDTO.getIds()); return ReturnUtil.success(); } + /** * 质量活动监督记录详情 */ @@ -156,14 +158,18 @@ } @ApiOperation("导出") - @PostMapping("/listExport") - public void export(@RequestBody OutsourceAssessApprovalListRequest request) throws Exception { + @GetMapping("/listExport") + public void export( BizQualitySupervisionRecordVO bizQualitySupervisionRecordVO, HttpServletResponse response) throws Exception { //to-do 所有文件压缩包导出 + Page page = PageFactory.defaultPage(); + QueryWrapper query = bizQualitySupervisionRecordVO.genQuery(); + List recordList = bizQualitySupervisionRecordService.selectBizQualitySupervisionRecordPage(query, page); + bizQualitySupervisionRecordService.exportZip(recordList, response); } @ApiOperation("导出word/pdf/打印") @PostMapping("/exportFile") public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { - bizQualitySupervisionRecordService.exportFile(exportDTO,response); + bizQualitySupervisionRecordService.exportFile(exportDTO, response); } } \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java index d0df3a7..725d146 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java @@ -17,7 +17,7 @@ public class ZipUtils { - public static void batchDownloadFiles(String rootFileName, HttpServletResponse response,String localFileDir) { + public static void batchDownloadFiles(String rootFileName, HttpServletResponse response, String localFileDir) { FileInputStream is = null; BufferedOutputStream out = null; String rootFilePath = rootFileName + ".zip"; @@ -28,7 +28,7 @@ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(rootFilePath, StandardCharsets.UTF_8.name())); response.setHeader("Access-Control-Allow-Origin", "*"); System.out.println(response.getHeader("Content-Disposition")); - rootFilePath =zipFileCreator(localFileDir, rootFileName, rootFilePath); + rootFilePath = createZipFile(localFileDir, rootFileName, rootFilePath); //开始下载 is = new FileInputStream(new File(rootFilePath)); out = new BufferedOutputStream(response.getOutputStream()); @@ -41,6 +41,7 @@ } catch (Exception e) { e.printStackTrace(); } finally { + //删除文件 if (is != null) { try { is.close(); @@ -59,37 +60,25 @@ } } } - } + /** * 批量打包 * * @param downloadPath 项目根目录 * @return tempDir 文件保存绝对路径 */ - public static String zipFileCreator(String downloadPath, String tempDir,String papersZipName) { + public static String createZipFile(String downloadPath, String tempDir, String papersZipName) { ZipOutputStream out = null; try { //zip文件保存路径 - String zipPath = downloadPath + papersZipName; - String fileSaveRootPath=downloadPath+tempDir; + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath = downloadPath + tempDir; File file = new File(fileSaveRootPath); File[] files = file.listFiles(); out = new ZipOutputStream(new FileOutputStream(zipPath)); //遍历jsonArray列表获取所有JSONObject对象 - for (int i = 0; i < files.length; i++) { - //以论文标题为每个文件命名 - FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); - out.putNextEntry(new ZipEntry(files[i].getName())); - //写入压缩包 - int len; - byte[] buffer = new byte[1024]; - while ((len = fis.read(buffer)) > 0) { - out.write(buffer, 0, len); - } - out.closeEntry(); - fis.close(); - } + doCreateZipFile(files, fileSaveRootPath, out); out.close(); out.flush(); return zipPath; @@ -107,6 +96,45 @@ return null; } + + /** + * 递归调用 + * + * @param files + * @param fileSaveRootPath + * @param out + * @return + * @throws Exception + */ + private static void doCreateZipFile(File[] files, String fileSaveRootPath, ZipOutputStream out) throws Exception { + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + if (files[i].isFile()) { + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + File[] childFiles = files[i].listFiles(); + // 需要保留原来的文件结构时,需要对空文件夹进行处理 + // 空文件夹的处理 + out.putNextEntry(new ZipEntry(files[i].getName() + "/")); + // 没有文件,不需要文件的copy + out.closeEntry();//关闭当前zip条目读取下一条 + doCreateZipFile(childFiles, files[i].getAbsolutePath(), out); + + } + } + } + /** * 批量打包 * @@ -115,7 +143,7 @@ */ public void zipFileDeletor(String zipPath) { try { - File zipFile=new File(zipPath); + File zipFile = new File(zipPath); zipFile.delete(); } catch (Exception e) { e.printStackTrace(); diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java index ac536c8..b822990 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java @@ -3,6 +3,8 @@ import lombok.Builder; import lombok.Data; +import java.util.List; + @Data @Builder public class CompressParameter { @@ -15,4 +17,10 @@ * 根目录名称 */ private String rootDirName; + + + /** + * 附件文件列表 + */ + private List attachmentFiles; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java index c5dd4d4..d432bac 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java @@ -151,6 +151,7 @@ BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); + measureItemInfo.setLabCodeName("12222"); //定制化原始记录参数 prepareCustomCoverParams(map, measureItemInfo.getMeasureDataCalibratorList()); log.debug("--------get original template is"); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java index 442d494..bd1fac4 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java @@ -5,12 +5,15 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.constants.MeterDictCode; import com.casic.missiles.core.application.context.AbstractPermissionContext; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.dto.ExportDTO; +import com.casic.missiles.dto.certificate.CompressParameter; +import com.casic.missiles.dto.certificate.RegisterCustomParameters; import com.casic.missiles.dto.quality.CorrectiveDTO; import com.casic.missiles.enums.quality.QualityTableEnum; import com.casic.missiles.exception.BusinessException; @@ -21,7 +24,9 @@ import com.casic.missiles.service.quality.*; import com.casic.missiles.service.quality.base.IBaseFileCodeService; import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.utils.ZipUtils; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; @@ -32,9 +37,12 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; -import static com.casic.missiles.enums.PrintFileModuleNameEnum.FILE_GRANT_NOTICE_FORM; -import static com.casic.missiles.enums.PrintFileModuleNameEnum.QUALITY_SUPERVISION_RECORD; +import static com.casic.missiles.enums.PrintFileModuleNameEnum.*; /** @@ -54,6 +62,8 @@ private final IBizQualityRepRelService bizQualityRepRelService; private final IBizQualityNonConformanceRepService bizQualityNonConformanceRepService; private final PrintFileRegister printFileRegister; + @Value("${casic.file.dir}") + private String localFileDir; /** * 预防措施处理单 @@ -132,6 +142,56 @@ } @Override + public void exportZip(List recordList, HttpServletResponse response) { + //健壮性校验 + if (CollectionUtils.isEmpty(recordList)) { + return; + } + //创建线程组 + ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, recordList.size(), 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); + String rootFileName = "质量监督记录" + new SimpleDateFormat("yyyyMMddHHmm").format(new Date()); + List> futures = new ArrayList<>(); + for (BizQualitySupervisionRecord supervisionRecord : recordList) { + //todo 技术能力分析报告 + if (ObjectUtil.isNotEmpty(supervisionRecord)) { + Map map = BeanUtil.beanToMap(supervisionRecord); + CompletableFuture exportFileTask = CompletableFuture.supplyAsync( + () -> { + //添加附件 + List attachmentFiles = new ArrayList<>(); + for (BizQualityNonConformanceRep conformanceRep : supervisionRecord.getNonConformanceRep()) { + for (BizQualityNonConformanceFileRel conformanceFileRel : conformanceRep.getConformanceFileRels()) { + attachmentFiles.add(conformanceFileRel.getFileName()); + } + } + printFileRegister.registerPrintFile(QUALITY_TECHNICAL_ANALYSIS_REPORT, EXPORT_TEMPLATE, null, + RegisterCustomParameters.builder() + .pdf(false) + .customParam(map) + .response(null) + .customFileName(supervisionRecord.getFileCode() + supervisionRecord.getFileName()) + .compressParameter(CompressParameter.builder() + .zip(true) + .attachmentFiles(attachmentFiles) + .rootDirName(rootFileName) + .build()) + .customTemplateUrls(null) + .build()); + return null; + }, threadPool); + futures.add(exportFileTask); + } + } + CompletableFuture[] futuresArr = futures.toArray(new CompletableFuture[0]); + //所有线程并发执行 + CompletableFuture.allOf(futuresArr).join(); + //等待所有生成的线程结束,则进行数据的打包下载 + ZipUtils.batchDownloadFiles(rootFileName, response,localFileDir); + } + + + @Override public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { BizQualitySupervisionRecord record = super.getById(exportDTO.getId()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -160,7 +220,7 @@ contentList.add(content); } map.put("contentList", contentList); - map.put("fileName",sign.getMinioFileName()); + map.put("fileName", sign.getMinioFileName()); printFileRegister.registerPrintFile(QUALITY_SUPERVISION_RECORD, "导出模板", null, map, exportDTO.isPdf(), response); } } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java index 13194cb..c840549 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java @@ -17,6 +17,7 @@ import com.casic.missiles.enums.resource.LabCodeDictEnum; import com.casic.missiles.model.quality.BizLabRelDept; import com.casic.missiles.model.quality.BizQualitySupervisionRecord; +import com.casic.missiles.model.quality.BizQualityTechnicalAnalysisRep; import com.casic.missiles.service.quality.IBizQualitySupervisionRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -146,6 +147,7 @@ bizQualitySupervisionRecordService.removeBatchByIds(idsDTO.getIds()); return ReturnUtil.success(); } + /** * 质量活动监督记录详情 */ @@ -156,14 +158,18 @@ } @ApiOperation("导出") - @PostMapping("/listExport") - public void export(@RequestBody OutsourceAssessApprovalListRequest request) throws Exception { + @GetMapping("/listExport") + public void export( BizQualitySupervisionRecordVO bizQualitySupervisionRecordVO, HttpServletResponse response) throws Exception { //to-do 所有文件压缩包导出 + Page page = PageFactory.defaultPage(); + QueryWrapper query = bizQualitySupervisionRecordVO.genQuery(); + List recordList = bizQualitySupervisionRecordService.selectBizQualitySupervisionRecordPage(query, page); + bizQualitySupervisionRecordService.exportZip(recordList, response); } @ApiOperation("导出word/pdf/打印") @PostMapping("/exportFile") public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { - bizQualitySupervisionRecordService.exportFile(exportDTO,response); + bizQualitySupervisionRecordService.exportFile(exportDTO, response); } } \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java index d0df3a7..725d146 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java @@ -17,7 +17,7 @@ public class ZipUtils { - public static void batchDownloadFiles(String rootFileName, HttpServletResponse response,String localFileDir) { + public static void batchDownloadFiles(String rootFileName, HttpServletResponse response, String localFileDir) { FileInputStream is = null; BufferedOutputStream out = null; String rootFilePath = rootFileName + ".zip"; @@ -28,7 +28,7 @@ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(rootFilePath, StandardCharsets.UTF_8.name())); response.setHeader("Access-Control-Allow-Origin", "*"); System.out.println(response.getHeader("Content-Disposition")); - rootFilePath =zipFileCreator(localFileDir, rootFileName, rootFilePath); + rootFilePath = createZipFile(localFileDir, rootFileName, rootFilePath); //开始下载 is = new FileInputStream(new File(rootFilePath)); out = new BufferedOutputStream(response.getOutputStream()); @@ -41,6 +41,7 @@ } catch (Exception e) { e.printStackTrace(); } finally { + //删除文件 if (is != null) { try { is.close(); @@ -59,37 +60,25 @@ } } } - } + /** * 批量打包 * * @param downloadPath 项目根目录 * @return tempDir 文件保存绝对路径 */ - public static String zipFileCreator(String downloadPath, String tempDir,String papersZipName) { + public static String createZipFile(String downloadPath, String tempDir, String papersZipName) { ZipOutputStream out = null; try { //zip文件保存路径 - String zipPath = downloadPath + papersZipName; - String fileSaveRootPath=downloadPath+tempDir; + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath = downloadPath + tempDir; File file = new File(fileSaveRootPath); File[] files = file.listFiles(); out = new ZipOutputStream(new FileOutputStream(zipPath)); //遍历jsonArray列表获取所有JSONObject对象 - for (int i = 0; i < files.length; i++) { - //以论文标题为每个文件命名 - FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); - out.putNextEntry(new ZipEntry(files[i].getName())); - //写入压缩包 - int len; - byte[] buffer = new byte[1024]; - while ((len = fis.read(buffer)) > 0) { - out.write(buffer, 0, len); - } - out.closeEntry(); - fis.close(); - } + doCreateZipFile(files, fileSaveRootPath, out); out.close(); out.flush(); return zipPath; @@ -107,6 +96,45 @@ return null; } + + /** + * 递归调用 + * + * @param files + * @param fileSaveRootPath + * @param out + * @return + * @throws Exception + */ + private static void doCreateZipFile(File[] files, String fileSaveRootPath, ZipOutputStream out) throws Exception { + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + if (files[i].isFile()) { + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + File[] childFiles = files[i].listFiles(); + // 需要保留原来的文件结构时,需要对空文件夹进行处理 + // 空文件夹的处理 + out.putNextEntry(new ZipEntry(files[i].getName() + "/")); + // 没有文件,不需要文件的copy + out.closeEntry();//关闭当前zip条目读取下一条 + doCreateZipFile(childFiles, files[i].getAbsolutePath(), out); + + } + } + } + /** * 批量打包 * @@ -115,7 +143,7 @@ */ public void zipFileDeletor(String zipPath) { try { - File zipFile=new File(zipPath); + File zipFile = new File(zipPath); zipFile.delete(); } catch (Exception e) { e.printStackTrace(); diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java index ac536c8..b822990 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java @@ -3,6 +3,8 @@ import lombok.Builder; import lombok.Data; +import java.util.List; + @Data @Builder public class CompressParameter { @@ -15,4 +17,10 @@ * 根目录名称 */ private String rootDirName; + + + /** + * 附件文件列表 + */ + private List attachmentFiles; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java index c5dd4d4..d432bac 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java @@ -151,6 +151,7 @@ BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); + measureItemInfo.setLabCodeName("12222"); //定制化原始记录参数 prepareCustomCoverParams(map, measureItemInfo.getMeasureDataCalibratorList()); log.debug("--------get original template is"); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java index 442d494..bd1fac4 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java @@ -5,12 +5,15 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.constants.MeterDictCode; import com.casic.missiles.core.application.context.AbstractPermissionContext; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.dto.ExportDTO; +import com.casic.missiles.dto.certificate.CompressParameter; +import com.casic.missiles.dto.certificate.RegisterCustomParameters; import com.casic.missiles.dto.quality.CorrectiveDTO; import com.casic.missiles.enums.quality.QualityTableEnum; import com.casic.missiles.exception.BusinessException; @@ -21,7 +24,9 @@ import com.casic.missiles.service.quality.*; import com.casic.missiles.service.quality.base.IBaseFileCodeService; import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.utils.ZipUtils; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; @@ -32,9 +37,12 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; -import static com.casic.missiles.enums.PrintFileModuleNameEnum.FILE_GRANT_NOTICE_FORM; -import static com.casic.missiles.enums.PrintFileModuleNameEnum.QUALITY_SUPERVISION_RECORD; +import static com.casic.missiles.enums.PrintFileModuleNameEnum.*; /** @@ -54,6 +62,8 @@ private final IBizQualityRepRelService bizQualityRepRelService; private final IBizQualityNonConformanceRepService bizQualityNonConformanceRepService; private final PrintFileRegister printFileRegister; + @Value("${casic.file.dir}") + private String localFileDir; /** * 预防措施处理单 @@ -132,6 +142,56 @@ } @Override + public void exportZip(List recordList, HttpServletResponse response) { + //健壮性校验 + if (CollectionUtils.isEmpty(recordList)) { + return; + } + //创建线程组 + ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, recordList.size(), 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); + String rootFileName = "质量监督记录" + new SimpleDateFormat("yyyyMMddHHmm").format(new Date()); + List> futures = new ArrayList<>(); + for (BizQualitySupervisionRecord supervisionRecord : recordList) { + //todo 技术能力分析报告 + if (ObjectUtil.isNotEmpty(supervisionRecord)) { + Map map = BeanUtil.beanToMap(supervisionRecord); + CompletableFuture exportFileTask = CompletableFuture.supplyAsync( + () -> { + //添加附件 + List attachmentFiles = new ArrayList<>(); + for (BizQualityNonConformanceRep conformanceRep : supervisionRecord.getNonConformanceRep()) { + for (BizQualityNonConformanceFileRel conformanceFileRel : conformanceRep.getConformanceFileRels()) { + attachmentFiles.add(conformanceFileRel.getFileName()); + } + } + printFileRegister.registerPrintFile(QUALITY_TECHNICAL_ANALYSIS_REPORT, EXPORT_TEMPLATE, null, + RegisterCustomParameters.builder() + .pdf(false) + .customParam(map) + .response(null) + .customFileName(supervisionRecord.getFileCode() + supervisionRecord.getFileName()) + .compressParameter(CompressParameter.builder() + .zip(true) + .attachmentFiles(attachmentFiles) + .rootDirName(rootFileName) + .build()) + .customTemplateUrls(null) + .build()); + return null; + }, threadPool); + futures.add(exportFileTask); + } + } + CompletableFuture[] futuresArr = futures.toArray(new CompletableFuture[0]); + //所有线程并发执行 + CompletableFuture.allOf(futuresArr).join(); + //等待所有生成的线程结束,则进行数据的打包下载 + ZipUtils.batchDownloadFiles(rootFileName, response,localFileDir); + } + + + @Override public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { BizQualitySupervisionRecord record = super.getById(exportDTO.getId()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -160,7 +220,7 @@ contentList.add(content); } map.put("contentList", contentList); - map.put("fileName",sign.getMinioFileName()); + map.put("fileName", sign.getMinioFileName()); printFileRegister.registerPrintFile(QUALITY_SUPERVISION_RECORD, "导出模板", null, map, exportDTO.isPdf(), response); } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java index de33384..dc86e04 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.listeners.register; -import com.aspose.words.SectionCollection; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.dto.certificate.CropPicture; diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java index 13194cb..c840549 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java @@ -17,6 +17,7 @@ import com.casic.missiles.enums.resource.LabCodeDictEnum; import com.casic.missiles.model.quality.BizLabRelDept; import com.casic.missiles.model.quality.BizQualitySupervisionRecord; +import com.casic.missiles.model.quality.BizQualityTechnicalAnalysisRep; import com.casic.missiles.service.quality.IBizQualitySupervisionRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -146,6 +147,7 @@ bizQualitySupervisionRecordService.removeBatchByIds(idsDTO.getIds()); return ReturnUtil.success(); } + /** * 质量活动监督记录详情 */ @@ -156,14 +158,18 @@ } @ApiOperation("导出") - @PostMapping("/listExport") - public void export(@RequestBody OutsourceAssessApprovalListRequest request) throws Exception { + @GetMapping("/listExport") + public void export( BizQualitySupervisionRecordVO bizQualitySupervisionRecordVO, HttpServletResponse response) throws Exception { //to-do 所有文件压缩包导出 + Page page = PageFactory.defaultPage(); + QueryWrapper query = bizQualitySupervisionRecordVO.genQuery(); + List recordList = bizQualitySupervisionRecordService.selectBizQualitySupervisionRecordPage(query, page); + bizQualitySupervisionRecordService.exportZip(recordList, response); } @ApiOperation("导出word/pdf/打印") @PostMapping("/exportFile") public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { - bizQualitySupervisionRecordService.exportFile(exportDTO,response); + bizQualitySupervisionRecordService.exportFile(exportDTO, response); } } \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java index d0df3a7..725d146 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java @@ -17,7 +17,7 @@ public class ZipUtils { - public static void batchDownloadFiles(String rootFileName, HttpServletResponse response,String localFileDir) { + public static void batchDownloadFiles(String rootFileName, HttpServletResponse response, String localFileDir) { FileInputStream is = null; BufferedOutputStream out = null; String rootFilePath = rootFileName + ".zip"; @@ -28,7 +28,7 @@ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(rootFilePath, StandardCharsets.UTF_8.name())); response.setHeader("Access-Control-Allow-Origin", "*"); System.out.println(response.getHeader("Content-Disposition")); - rootFilePath =zipFileCreator(localFileDir, rootFileName, rootFilePath); + rootFilePath = createZipFile(localFileDir, rootFileName, rootFilePath); //开始下载 is = new FileInputStream(new File(rootFilePath)); out = new BufferedOutputStream(response.getOutputStream()); @@ -41,6 +41,7 @@ } catch (Exception e) { e.printStackTrace(); } finally { + //删除文件 if (is != null) { try { is.close(); @@ -59,37 +60,25 @@ } } } - } + /** * 批量打包 * * @param downloadPath 项目根目录 * @return tempDir 文件保存绝对路径 */ - public static String zipFileCreator(String downloadPath, String tempDir,String papersZipName) { + public static String createZipFile(String downloadPath, String tempDir, String papersZipName) { ZipOutputStream out = null; try { //zip文件保存路径 - String zipPath = downloadPath + papersZipName; - String fileSaveRootPath=downloadPath+tempDir; + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath = downloadPath + tempDir; File file = new File(fileSaveRootPath); File[] files = file.listFiles(); out = new ZipOutputStream(new FileOutputStream(zipPath)); //遍历jsonArray列表获取所有JSONObject对象 - for (int i = 0; i < files.length; i++) { - //以论文标题为每个文件命名 - FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); - out.putNextEntry(new ZipEntry(files[i].getName())); - //写入压缩包 - int len; - byte[] buffer = new byte[1024]; - while ((len = fis.read(buffer)) > 0) { - out.write(buffer, 0, len); - } - out.closeEntry(); - fis.close(); - } + doCreateZipFile(files, fileSaveRootPath, out); out.close(); out.flush(); return zipPath; @@ -107,6 +96,45 @@ return null; } + + /** + * 递归调用 + * + * @param files + * @param fileSaveRootPath + * @param out + * @return + * @throws Exception + */ + private static void doCreateZipFile(File[] files, String fileSaveRootPath, ZipOutputStream out) throws Exception { + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + if (files[i].isFile()) { + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + File[] childFiles = files[i].listFiles(); + // 需要保留原来的文件结构时,需要对空文件夹进行处理 + // 空文件夹的处理 + out.putNextEntry(new ZipEntry(files[i].getName() + "/")); + // 没有文件,不需要文件的copy + out.closeEntry();//关闭当前zip条目读取下一条 + doCreateZipFile(childFiles, files[i].getAbsolutePath(), out); + + } + } + } + /** * 批量打包 * @@ -115,7 +143,7 @@ */ public void zipFileDeletor(String zipPath) { try { - File zipFile=new File(zipPath); + File zipFile = new File(zipPath); zipFile.delete(); } catch (Exception e) { e.printStackTrace(); diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java index ac536c8..b822990 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java @@ -3,6 +3,8 @@ import lombok.Builder; import lombok.Data; +import java.util.List; + @Data @Builder public class CompressParameter { @@ -15,4 +17,10 @@ * 根目录名称 */ private String rootDirName; + + + /** + * 附件文件列表 + */ + private List attachmentFiles; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java index c5dd4d4..d432bac 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java @@ -151,6 +151,7 @@ BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); + measureItemInfo.setLabCodeName("12222"); //定制化原始记录参数 prepareCustomCoverParams(map, measureItemInfo.getMeasureDataCalibratorList()); log.debug("--------get original template is"); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java index 442d494..bd1fac4 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java @@ -5,12 +5,15 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.constants.MeterDictCode; import com.casic.missiles.core.application.context.AbstractPermissionContext; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.dto.ExportDTO; +import com.casic.missiles.dto.certificate.CompressParameter; +import com.casic.missiles.dto.certificate.RegisterCustomParameters; import com.casic.missiles.dto.quality.CorrectiveDTO; import com.casic.missiles.enums.quality.QualityTableEnum; import com.casic.missiles.exception.BusinessException; @@ -21,7 +24,9 @@ import com.casic.missiles.service.quality.*; import com.casic.missiles.service.quality.base.IBaseFileCodeService; import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.utils.ZipUtils; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; @@ -32,9 +37,12 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; -import static com.casic.missiles.enums.PrintFileModuleNameEnum.FILE_GRANT_NOTICE_FORM; -import static com.casic.missiles.enums.PrintFileModuleNameEnum.QUALITY_SUPERVISION_RECORD; +import static com.casic.missiles.enums.PrintFileModuleNameEnum.*; /** @@ -54,6 +62,8 @@ private final IBizQualityRepRelService bizQualityRepRelService; private final IBizQualityNonConformanceRepService bizQualityNonConformanceRepService; private final PrintFileRegister printFileRegister; + @Value("${casic.file.dir}") + private String localFileDir; /** * 预防措施处理单 @@ -132,6 +142,56 @@ } @Override + public void exportZip(List recordList, HttpServletResponse response) { + //健壮性校验 + if (CollectionUtils.isEmpty(recordList)) { + return; + } + //创建线程组 + ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, recordList.size(), 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); + String rootFileName = "质量监督记录" + new SimpleDateFormat("yyyyMMddHHmm").format(new Date()); + List> futures = new ArrayList<>(); + for (BizQualitySupervisionRecord supervisionRecord : recordList) { + //todo 技术能力分析报告 + if (ObjectUtil.isNotEmpty(supervisionRecord)) { + Map map = BeanUtil.beanToMap(supervisionRecord); + CompletableFuture exportFileTask = CompletableFuture.supplyAsync( + () -> { + //添加附件 + List attachmentFiles = new ArrayList<>(); + for (BizQualityNonConformanceRep conformanceRep : supervisionRecord.getNonConformanceRep()) { + for (BizQualityNonConformanceFileRel conformanceFileRel : conformanceRep.getConformanceFileRels()) { + attachmentFiles.add(conformanceFileRel.getFileName()); + } + } + printFileRegister.registerPrintFile(QUALITY_TECHNICAL_ANALYSIS_REPORT, EXPORT_TEMPLATE, null, + RegisterCustomParameters.builder() + .pdf(false) + .customParam(map) + .response(null) + .customFileName(supervisionRecord.getFileCode() + supervisionRecord.getFileName()) + .compressParameter(CompressParameter.builder() + .zip(true) + .attachmentFiles(attachmentFiles) + .rootDirName(rootFileName) + .build()) + .customTemplateUrls(null) + .build()); + return null; + }, threadPool); + futures.add(exportFileTask); + } + } + CompletableFuture[] futuresArr = futures.toArray(new CompletableFuture[0]); + //所有线程并发执行 + CompletableFuture.allOf(futuresArr).join(); + //等待所有生成的线程结束,则进行数据的打包下载 + ZipUtils.batchDownloadFiles(rootFileName, response,localFileDir); + } + + + @Override public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { BizQualitySupervisionRecord record = super.getById(exportDTO.getId()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -160,7 +220,7 @@ contentList.add(content); } map.put("contentList", contentList); - map.put("fileName",sign.getMinioFileName()); + map.put("fileName", sign.getMinioFileName()); printFileRegister.registerPrintFile(QUALITY_SUPERVISION_RECORD, "导出模板", null, map, exportDTO.isPdf(), response); } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java index de33384..dc86e04 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.listeners.register; -import com.aspose.words.SectionCollection; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.dto.certificate.CropPicture; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index d720da7..da150f8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -131,8 +131,21 @@ log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(filePrintRegister), rex); } finally { if (ObjectUtils.isNotEmpty(registerParameters.getCompressParameter()) && registerParameters.getCompressParameter().getZip()) { - //转移文件 - fileMove(localFileDir + registerParameters.getCompressParameter().getRootDirName(), printDocUrl); + String zipLocalFileDir=""; + //先判断是否附属文件,再进行文件转移 + if (CollectionUtils.isNotEmpty(registerParameters.getCompressParameter().getAttachmentFiles()) && !StringUtils.isEmpty(registerParameters.getCustomFileName())) { + zipLocalFileDir = localFileDir + registerParameters.getCompressParameter().getRootDirName() + File.separator + registerParameters.getCustomFileName(); + // 创建源文件和目标文件对象 + File tempDir = new File(zipLocalFileDir); + //如果不存在则进行创建 + if (!tempDir.exists()) { + tempDir.mkdirs(); //创建目录 + } + downTemplateFile(registerParameters.getCompressParameter().getAttachmentFiles(), zipLocalFileDir); + } else { + zipLocalFileDir = localFileDir + registerParameters.getCompressParameter().getRootDirName(); + } + fileMove(zipLocalFileDir, printDocUrl); } else if (StringUtils.isNotEmpty(printDocUrl)) { //如果文件路径不为空,回传文件流 miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java index 13194cb..c840549 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java @@ -17,6 +17,7 @@ import com.casic.missiles.enums.resource.LabCodeDictEnum; import com.casic.missiles.model.quality.BizLabRelDept; import com.casic.missiles.model.quality.BizQualitySupervisionRecord; +import com.casic.missiles.model.quality.BizQualityTechnicalAnalysisRep; import com.casic.missiles.service.quality.IBizQualitySupervisionRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -146,6 +147,7 @@ bizQualitySupervisionRecordService.removeBatchByIds(idsDTO.getIds()); return ReturnUtil.success(); } + /** * 质量活动监督记录详情 */ @@ -156,14 +158,18 @@ } @ApiOperation("导出") - @PostMapping("/listExport") - public void export(@RequestBody OutsourceAssessApprovalListRequest request) throws Exception { + @GetMapping("/listExport") + public void export( BizQualitySupervisionRecordVO bizQualitySupervisionRecordVO, HttpServletResponse response) throws Exception { //to-do 所有文件压缩包导出 + Page page = PageFactory.defaultPage(); + QueryWrapper query = bizQualitySupervisionRecordVO.genQuery(); + List recordList = bizQualitySupervisionRecordService.selectBizQualitySupervisionRecordPage(query, page); + bizQualitySupervisionRecordService.exportZip(recordList, response); } @ApiOperation("导出word/pdf/打印") @PostMapping("/exportFile") public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { - bizQualitySupervisionRecordService.exportFile(exportDTO,response); + bizQualitySupervisionRecordService.exportFile(exportDTO, response); } } \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java index d0df3a7..725d146 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java @@ -17,7 +17,7 @@ public class ZipUtils { - public static void batchDownloadFiles(String rootFileName, HttpServletResponse response,String localFileDir) { + public static void batchDownloadFiles(String rootFileName, HttpServletResponse response, String localFileDir) { FileInputStream is = null; BufferedOutputStream out = null; String rootFilePath = rootFileName + ".zip"; @@ -28,7 +28,7 @@ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(rootFilePath, StandardCharsets.UTF_8.name())); response.setHeader("Access-Control-Allow-Origin", "*"); System.out.println(response.getHeader("Content-Disposition")); - rootFilePath =zipFileCreator(localFileDir, rootFileName, rootFilePath); + rootFilePath = createZipFile(localFileDir, rootFileName, rootFilePath); //开始下载 is = new FileInputStream(new File(rootFilePath)); out = new BufferedOutputStream(response.getOutputStream()); @@ -41,6 +41,7 @@ } catch (Exception e) { e.printStackTrace(); } finally { + //删除文件 if (is != null) { try { is.close(); @@ -59,37 +60,25 @@ } } } - } + /** * 批量打包 * * @param downloadPath 项目根目录 * @return tempDir 文件保存绝对路径 */ - public static String zipFileCreator(String downloadPath, String tempDir,String papersZipName) { + public static String createZipFile(String downloadPath, String tempDir, String papersZipName) { ZipOutputStream out = null; try { //zip文件保存路径 - String zipPath = downloadPath + papersZipName; - String fileSaveRootPath=downloadPath+tempDir; + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath = downloadPath + tempDir; File file = new File(fileSaveRootPath); File[] files = file.listFiles(); out = new ZipOutputStream(new FileOutputStream(zipPath)); //遍历jsonArray列表获取所有JSONObject对象 - for (int i = 0; i < files.length; i++) { - //以论文标题为每个文件命名 - FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); - out.putNextEntry(new ZipEntry(files[i].getName())); - //写入压缩包 - int len; - byte[] buffer = new byte[1024]; - while ((len = fis.read(buffer)) > 0) { - out.write(buffer, 0, len); - } - out.closeEntry(); - fis.close(); - } + doCreateZipFile(files, fileSaveRootPath, out); out.close(); out.flush(); return zipPath; @@ -107,6 +96,45 @@ return null; } + + /** + * 递归调用 + * + * @param files + * @param fileSaveRootPath + * @param out + * @return + * @throws Exception + */ + private static void doCreateZipFile(File[] files, String fileSaveRootPath, ZipOutputStream out) throws Exception { + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + if (files[i].isFile()) { + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + File[] childFiles = files[i].listFiles(); + // 需要保留原来的文件结构时,需要对空文件夹进行处理 + // 空文件夹的处理 + out.putNextEntry(new ZipEntry(files[i].getName() + "/")); + // 没有文件,不需要文件的copy + out.closeEntry();//关闭当前zip条目读取下一条 + doCreateZipFile(childFiles, files[i].getAbsolutePath(), out); + + } + } + } + /** * 批量打包 * @@ -115,7 +143,7 @@ */ public void zipFileDeletor(String zipPath) { try { - File zipFile=new File(zipPath); + File zipFile = new File(zipPath); zipFile.delete(); } catch (Exception e) { e.printStackTrace(); diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java index ac536c8..b822990 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java @@ -3,6 +3,8 @@ import lombok.Builder; import lombok.Data; +import java.util.List; + @Data @Builder public class CompressParameter { @@ -15,4 +17,10 @@ * 根目录名称 */ private String rootDirName; + + + /** + * 附件文件列表 + */ + private List attachmentFiles; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java index c5dd4d4..d432bac 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java @@ -151,6 +151,7 @@ BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); + measureItemInfo.setLabCodeName("12222"); //定制化原始记录参数 prepareCustomCoverParams(map, measureItemInfo.getMeasureDataCalibratorList()); log.debug("--------get original template is"); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java index 442d494..bd1fac4 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java @@ -5,12 +5,15 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.constants.MeterDictCode; import com.casic.missiles.core.application.context.AbstractPermissionContext; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.dto.ExportDTO; +import com.casic.missiles.dto.certificate.CompressParameter; +import com.casic.missiles.dto.certificate.RegisterCustomParameters; import com.casic.missiles.dto.quality.CorrectiveDTO; import com.casic.missiles.enums.quality.QualityTableEnum; import com.casic.missiles.exception.BusinessException; @@ -21,7 +24,9 @@ import com.casic.missiles.service.quality.*; import com.casic.missiles.service.quality.base.IBaseFileCodeService; import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.utils.ZipUtils; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; @@ -32,9 +37,12 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; -import static com.casic.missiles.enums.PrintFileModuleNameEnum.FILE_GRANT_NOTICE_FORM; -import static com.casic.missiles.enums.PrintFileModuleNameEnum.QUALITY_SUPERVISION_RECORD; +import static com.casic.missiles.enums.PrintFileModuleNameEnum.*; /** @@ -54,6 +62,8 @@ private final IBizQualityRepRelService bizQualityRepRelService; private final IBizQualityNonConformanceRepService bizQualityNonConformanceRepService; private final PrintFileRegister printFileRegister; + @Value("${casic.file.dir}") + private String localFileDir; /** * 预防措施处理单 @@ -132,6 +142,56 @@ } @Override + public void exportZip(List recordList, HttpServletResponse response) { + //健壮性校验 + if (CollectionUtils.isEmpty(recordList)) { + return; + } + //创建线程组 + ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, recordList.size(), 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); + String rootFileName = "质量监督记录" + new SimpleDateFormat("yyyyMMddHHmm").format(new Date()); + List> futures = new ArrayList<>(); + for (BizQualitySupervisionRecord supervisionRecord : recordList) { + //todo 技术能力分析报告 + if (ObjectUtil.isNotEmpty(supervisionRecord)) { + Map map = BeanUtil.beanToMap(supervisionRecord); + CompletableFuture exportFileTask = CompletableFuture.supplyAsync( + () -> { + //添加附件 + List attachmentFiles = new ArrayList<>(); + for (BizQualityNonConformanceRep conformanceRep : supervisionRecord.getNonConformanceRep()) { + for (BizQualityNonConformanceFileRel conformanceFileRel : conformanceRep.getConformanceFileRels()) { + attachmentFiles.add(conformanceFileRel.getFileName()); + } + } + printFileRegister.registerPrintFile(QUALITY_TECHNICAL_ANALYSIS_REPORT, EXPORT_TEMPLATE, null, + RegisterCustomParameters.builder() + .pdf(false) + .customParam(map) + .response(null) + .customFileName(supervisionRecord.getFileCode() + supervisionRecord.getFileName()) + .compressParameter(CompressParameter.builder() + .zip(true) + .attachmentFiles(attachmentFiles) + .rootDirName(rootFileName) + .build()) + .customTemplateUrls(null) + .build()); + return null; + }, threadPool); + futures.add(exportFileTask); + } + } + CompletableFuture[] futuresArr = futures.toArray(new CompletableFuture[0]); + //所有线程并发执行 + CompletableFuture.allOf(futuresArr).join(); + //等待所有生成的线程结束,则进行数据的打包下载 + ZipUtils.batchDownloadFiles(rootFileName, response,localFileDir); + } + + + @Override public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { BizQualitySupervisionRecord record = super.getById(exportDTO.getId()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -160,7 +220,7 @@ contentList.add(content); } map.put("contentList", contentList); - map.put("fileName",sign.getMinioFileName()); + map.put("fileName", sign.getMinioFileName()); printFileRegister.registerPrintFile(QUALITY_SUPERVISION_RECORD, "导出模板", null, map, exportDTO.isPdf(), response); } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java index de33384..dc86e04 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.listeners.register; -import com.aspose.words.SectionCollection; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.dto.certificate.CropPicture; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index d720da7..da150f8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -131,8 +131,21 @@ log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(filePrintRegister), rex); } finally { if (ObjectUtils.isNotEmpty(registerParameters.getCompressParameter()) && registerParameters.getCompressParameter().getZip()) { - //转移文件 - fileMove(localFileDir + registerParameters.getCompressParameter().getRootDirName(), printDocUrl); + String zipLocalFileDir=""; + //先判断是否附属文件,再进行文件转移 + if (CollectionUtils.isNotEmpty(registerParameters.getCompressParameter().getAttachmentFiles()) && !StringUtils.isEmpty(registerParameters.getCustomFileName())) { + zipLocalFileDir = localFileDir + registerParameters.getCompressParameter().getRootDirName() + File.separator + registerParameters.getCustomFileName(); + // 创建源文件和目标文件对象 + File tempDir = new File(zipLocalFileDir); + //如果不存在则进行创建 + if (!tempDir.exists()) { + tempDir.mkdirs(); //创建目录 + } + downTemplateFile(registerParameters.getCompressParameter().getAttachmentFiles(), zipLocalFileDir); + } else { + zipLocalFileDir = localFileDir + registerParameters.getCompressParameter().getRootDirName(); + } + fileMove(zipLocalFileDir, printDocUrl); } else if (StringUtils.isNotEmpty(printDocUrl)) { //如果文件路径不为空,回传文件流 miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java index 37d259c..8c49c8c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java @@ -1,7 +1,10 @@ package com.casic.missiles.service.listeners.register; +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; import com.casic.missiles.utils.MinioUtil; +import com.spire.ms.System.Collections.ArrayList; import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; @@ -19,6 +22,7 @@ import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.StandardCopyOption; +import java.util.Arrays; import java.util.List; @Component @@ -92,15 +96,13 @@ /** * 从mini文件服务器下载文件,获取文件的读写权限,用户证书报告的生成 */ - protected void downTemplateFile(String fileNames, String tempLocalFileDir) { - if (StringUtils.isEmpty(fileNames)) { + protected synchronized void downTemplateFile(List fileNameList, String tempLocalFileDir) { + if (CollectionUtils.isEmpty(fileNameList)) { return; } - InputStream in = null; ByteArrayOutputStream out = null; try { - String[] fileNameList = fileNames.split(","); for (String fileName : fileNameList) { in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); out = new ByteArrayOutputStream(); @@ -130,6 +132,20 @@ } /** + * 从mini文件服务器下载文件,获取文件的读写权限,用户证书报告的生成 + */ + protected void downTemplateFile(String fileNames, String tempLocalFileDir) { + if (StringUtils.isEmpty(fileNames)) { + return; + } + InputStream in = null; + ByteArrayOutputStream out = null; + String[] fileNameStr = fileNames.split(","); + List fileNameList = Arrays.asList(fileNameStr); + downTemplateFile(fileNameList, tempLocalFileDir); + } + + /** * 通过生成的证书报告,将证书报告上传到远程mini的文件服务器 */ protected String uploadCertificate(String certificatePrintUrl) { @@ -175,7 +191,7 @@ protected void deleteFile(File invalidFile) { //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 File[] files = invalidFile.listFiles(); - int length=files.length; + int length = files.length; if (files != null) {//如果包含文件进行删除操作 for (int i = 0; i < length; i++) { if (files[i].isFile()) { @@ -196,6 +212,9 @@ } } + //先下载,再进行文件的转移 + + /** * 文件转移,将源文件转移到指定的目录下面 * diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java index 13194cb..c840549 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/quality/BizQualitySupervisionRecordController.java @@ -17,6 +17,7 @@ import com.casic.missiles.enums.resource.LabCodeDictEnum; import com.casic.missiles.model.quality.BizLabRelDept; import com.casic.missiles.model.quality.BizQualitySupervisionRecord; +import com.casic.missiles.model.quality.BizQualityTechnicalAnalysisRep; import com.casic.missiles.service.quality.IBizQualitySupervisionRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -146,6 +147,7 @@ bizQualitySupervisionRecordService.removeBatchByIds(idsDTO.getIds()); return ReturnUtil.success(); } + /** * 质量活动监督记录详情 */ @@ -156,14 +158,18 @@ } @ApiOperation("导出") - @PostMapping("/listExport") - public void export(@RequestBody OutsourceAssessApprovalListRequest request) throws Exception { + @GetMapping("/listExport") + public void export( BizQualitySupervisionRecordVO bizQualitySupervisionRecordVO, HttpServletResponse response) throws Exception { //to-do 所有文件压缩包导出 + Page page = PageFactory.defaultPage(); + QueryWrapper query = bizQualitySupervisionRecordVO.genQuery(); + List recordList = bizQualitySupervisionRecordService.selectBizQualitySupervisionRecordPage(query, page); + bizQualitySupervisionRecordService.exportZip(recordList, response); } @ApiOperation("导出word/pdf/打印") @PostMapping("/exportFile") public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { - bizQualitySupervisionRecordService.exportFile(exportDTO,response); + bizQualitySupervisionRecordService.exportFile(exportDTO, response); } } \ No newline at end of file diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java index d0df3a7..725d146 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/ZipUtils.java @@ -17,7 +17,7 @@ public class ZipUtils { - public static void batchDownloadFiles(String rootFileName, HttpServletResponse response,String localFileDir) { + public static void batchDownloadFiles(String rootFileName, HttpServletResponse response, String localFileDir) { FileInputStream is = null; BufferedOutputStream out = null; String rootFilePath = rootFileName + ".zip"; @@ -28,7 +28,7 @@ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(rootFilePath, StandardCharsets.UTF_8.name())); response.setHeader("Access-Control-Allow-Origin", "*"); System.out.println(response.getHeader("Content-Disposition")); - rootFilePath =zipFileCreator(localFileDir, rootFileName, rootFilePath); + rootFilePath = createZipFile(localFileDir, rootFileName, rootFilePath); //开始下载 is = new FileInputStream(new File(rootFilePath)); out = new BufferedOutputStream(response.getOutputStream()); @@ -41,6 +41,7 @@ } catch (Exception e) { e.printStackTrace(); } finally { + //删除文件 if (is != null) { try { is.close(); @@ -59,37 +60,25 @@ } } } - } + /** * 批量打包 * * @param downloadPath 项目根目录 * @return tempDir 文件保存绝对路径 */ - public static String zipFileCreator(String downloadPath, String tempDir,String papersZipName) { + public static String createZipFile(String downloadPath, String tempDir, String papersZipName) { ZipOutputStream out = null; try { //zip文件保存路径 - String zipPath = downloadPath + papersZipName; - String fileSaveRootPath=downloadPath+tempDir; + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath = downloadPath + tempDir; File file = new File(fileSaveRootPath); File[] files = file.listFiles(); out = new ZipOutputStream(new FileOutputStream(zipPath)); //遍历jsonArray列表获取所有JSONObject对象 - for (int i = 0; i < files.length; i++) { - //以论文标题为每个文件命名 - FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); - out.putNextEntry(new ZipEntry(files[i].getName())); - //写入压缩包 - int len; - byte[] buffer = new byte[1024]; - while ((len = fis.read(buffer)) > 0) { - out.write(buffer, 0, len); - } - out.closeEntry(); - fis.close(); - } + doCreateZipFile(files, fileSaveRootPath, out); out.close(); out.flush(); return zipPath; @@ -107,6 +96,45 @@ return null; } + + /** + * 递归调用 + * + * @param files + * @param fileSaveRootPath + * @param out + * @return + * @throws Exception + */ + private static void doCreateZipFile(File[] files, String fileSaveRootPath, ZipOutputStream out) throws Exception { + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + if (files[i].isFile()) { + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + File[] childFiles = files[i].listFiles(); + // 需要保留原来的文件结构时,需要对空文件夹进行处理 + // 空文件夹的处理 + out.putNextEntry(new ZipEntry(files[i].getName() + "/")); + // 没有文件,不需要文件的copy + out.closeEntry();//关闭当前zip条目读取下一条 + doCreateZipFile(childFiles, files[i].getAbsolutePath(), out); + + } + } + } + /** * 批量打包 * @@ -115,7 +143,7 @@ */ public void zipFileDeletor(String zipPath) { try { - File zipFile=new File(zipPath); + File zipFile = new File(zipPath); zipFile.delete(); } catch (Exception e) { e.printStackTrace(); diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java index ac536c8..b822990 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/CompressParameter.java @@ -3,6 +3,8 @@ import lombok.Builder; import lombok.Data; +import java.util.List; + @Data @Builder public class CompressParameter { @@ -15,4 +17,10 @@ * 根目录名称 */ private String rootDirName; + + + /** + * 附件文件列表 + */ + private List attachmentFiles; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java index c5dd4d4..d432bac 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/eqpt/standard/impl/MultiCalibrationHandler.java @@ -151,6 +151,7 @@ BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); + measureItemInfo.setLabCodeName("12222"); //定制化原始记录参数 prepareCustomCoverParams(map, measureItemInfo.getMeasureDataCalibratorList()); log.debug("--------get original template is"); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java index 442d494..bd1fac4 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/quality/BizQualitySupervisionRecordServiceImpl.java @@ -5,12 +5,15 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.constants.MeterDictCode; import com.casic.missiles.core.application.context.AbstractPermissionContext; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.dto.ExportDTO; +import com.casic.missiles.dto.certificate.CompressParameter; +import com.casic.missiles.dto.certificate.RegisterCustomParameters; import com.casic.missiles.dto.quality.CorrectiveDTO; import com.casic.missiles.enums.quality.QualityTableEnum; import com.casic.missiles.exception.BusinessException; @@ -21,7 +24,9 @@ import com.casic.missiles.service.quality.*; import com.casic.missiles.service.quality.base.IBaseFileCodeService; import com.casic.missiles.service.system.ISystemSignService; +import com.casic.missiles.utils.ZipUtils; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; @@ -32,9 +37,12 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; -import static com.casic.missiles.enums.PrintFileModuleNameEnum.FILE_GRANT_NOTICE_FORM; -import static com.casic.missiles.enums.PrintFileModuleNameEnum.QUALITY_SUPERVISION_RECORD; +import static com.casic.missiles.enums.PrintFileModuleNameEnum.*; /** @@ -54,6 +62,8 @@ private final IBizQualityRepRelService bizQualityRepRelService; private final IBizQualityNonConformanceRepService bizQualityNonConformanceRepService; private final PrintFileRegister printFileRegister; + @Value("${casic.file.dir}") + private String localFileDir; /** * 预防措施处理单 @@ -132,6 +142,56 @@ } @Override + public void exportZip(List recordList, HttpServletResponse response) { + //健壮性校验 + if (CollectionUtils.isEmpty(recordList)) { + return; + } + //创建线程组 + ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, recordList.size(), 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); + String rootFileName = "质量监督记录" + new SimpleDateFormat("yyyyMMddHHmm").format(new Date()); + List> futures = new ArrayList<>(); + for (BizQualitySupervisionRecord supervisionRecord : recordList) { + //todo 技术能力分析报告 + if (ObjectUtil.isNotEmpty(supervisionRecord)) { + Map map = BeanUtil.beanToMap(supervisionRecord); + CompletableFuture exportFileTask = CompletableFuture.supplyAsync( + () -> { + //添加附件 + List attachmentFiles = new ArrayList<>(); + for (BizQualityNonConformanceRep conformanceRep : supervisionRecord.getNonConformanceRep()) { + for (BizQualityNonConformanceFileRel conformanceFileRel : conformanceRep.getConformanceFileRels()) { + attachmentFiles.add(conformanceFileRel.getFileName()); + } + } + printFileRegister.registerPrintFile(QUALITY_TECHNICAL_ANALYSIS_REPORT, EXPORT_TEMPLATE, null, + RegisterCustomParameters.builder() + .pdf(false) + .customParam(map) + .response(null) + .customFileName(supervisionRecord.getFileCode() + supervisionRecord.getFileName()) + .compressParameter(CompressParameter.builder() + .zip(true) + .attachmentFiles(attachmentFiles) + .rootDirName(rootFileName) + .build()) + .customTemplateUrls(null) + .build()); + return null; + }, threadPool); + futures.add(exportFileTask); + } + } + CompletableFuture[] futuresArr = futures.toArray(new CompletableFuture[0]); + //所有线程并发执行 + CompletableFuture.allOf(futuresArr).join(); + //等待所有生成的线程结束,则进行数据的打包下载 + ZipUtils.batchDownloadFiles(rootFileName, response,localFileDir); + } + + + @Override public void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException { BizQualitySupervisionRecord record = super.getById(exportDTO.getId()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -160,7 +220,7 @@ contentList.add(content); } map.put("contentList", contentList); - map.put("fileName",sign.getMinioFileName()); + map.put("fileName", sign.getMinioFileName()); printFileRegister.registerPrintFile(QUALITY_SUPERVISION_RECORD, "导出模板", null, map, exportDTO.isPdf(), response); } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java index de33384..dc86e04 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.listeners.register; -import com.aspose.words.SectionCollection; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.casic.missiles.dto.certificate.CropPicture; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index d720da7..da150f8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -131,8 +131,21 @@ log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(filePrintRegister), rex); } finally { if (ObjectUtils.isNotEmpty(registerParameters.getCompressParameter()) && registerParameters.getCompressParameter().getZip()) { - //转移文件 - fileMove(localFileDir + registerParameters.getCompressParameter().getRootDirName(), printDocUrl); + String zipLocalFileDir=""; + //先判断是否附属文件,再进行文件转移 + if (CollectionUtils.isNotEmpty(registerParameters.getCompressParameter().getAttachmentFiles()) && !StringUtils.isEmpty(registerParameters.getCustomFileName())) { + zipLocalFileDir = localFileDir + registerParameters.getCompressParameter().getRootDirName() + File.separator + registerParameters.getCustomFileName(); + // 创建源文件和目标文件对象 + File tempDir = new File(zipLocalFileDir); + //如果不存在则进行创建 + if (!tempDir.exists()) { + tempDir.mkdirs(); //创建目录 + } + downTemplateFile(registerParameters.getCompressParameter().getAttachmentFiles(), zipLocalFileDir); + } else { + zipLocalFileDir = localFileDir + registerParameters.getCompressParameter().getRootDirName(); + } + fileMove(zipLocalFileDir, printDocUrl); } else if (StringUtils.isNotEmpty(printDocUrl)) { //如果文件路径不为空,回传文件流 miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java index 37d259c..8c49c8c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java @@ -1,7 +1,10 @@ package com.casic.missiles.service.listeners.register; +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; import com.casic.missiles.utils.MinioUtil; +import com.spire.ms.System.Collections.ArrayList; import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; @@ -19,6 +22,7 @@ import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.StandardCopyOption; +import java.util.Arrays; import java.util.List; @Component @@ -92,15 +96,13 @@ /** * 从mini文件服务器下载文件,获取文件的读写权限,用户证书报告的生成 */ - protected void downTemplateFile(String fileNames, String tempLocalFileDir) { - if (StringUtils.isEmpty(fileNames)) { + protected synchronized void downTemplateFile(List fileNameList, String tempLocalFileDir) { + if (CollectionUtils.isEmpty(fileNameList)) { return; } - InputStream in = null; ByteArrayOutputStream out = null; try { - String[] fileNameList = fileNames.split(","); for (String fileName : fileNameList) { in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); out = new ByteArrayOutputStream(); @@ -130,6 +132,20 @@ } /** + * 从mini文件服务器下载文件,获取文件的读写权限,用户证书报告的生成 + */ + protected void downTemplateFile(String fileNames, String tempLocalFileDir) { + if (StringUtils.isEmpty(fileNames)) { + return; + } + InputStream in = null; + ByteArrayOutputStream out = null; + String[] fileNameStr = fileNames.split(","); + List fileNameList = Arrays.asList(fileNameStr); + downTemplateFile(fileNameList, tempLocalFileDir); + } + + /** * 通过生成的证书报告,将证书报告上传到远程mini的文件服务器 */ protected String uploadCertificate(String certificatePrintUrl) { @@ -175,7 +191,7 @@ protected void deleteFile(File invalidFile) { //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 File[] files = invalidFile.listFiles(); - int length=files.length; + int length = files.length; if (files != null) {//如果包含文件进行删除操作 for (int i = 0; i < length; i++) { if (files[i].isFile()) { @@ -196,6 +212,9 @@ } } + //先下载,再进行文件的转移 + + /** * 文件转移,将源文件转移到指定的目录下面 * diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/quality/IBizQualitySupervisionRecordService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/quality/IBizQualitySupervisionRecordService.java index 94f8a2b..015ee09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/quality/IBizQualitySupervisionRecordService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/quality/IBizQualitySupervisionRecordService.java @@ -45,5 +45,7 @@ */ BizQualitySupervisionRecord getByIdNoNonConformanceRep(Long superRecordId); + void exportZip(List recordList, HttpServletResponse response); + void exportFile(@RequestBody @Valid ExportDTO exportDTO, HttpServletResponse response) throws ParseException; }