Эх сурвалжийг харах

登记簿批量导出代码提交

jingyuanchao 1 жил өмнө
parent
commit
c85b29c390

+ 2 - 2
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteFileService.java

@@ -75,6 +75,6 @@ public interface RemoteFileService {
     @PostMapping(value = "/file/registerBookCompressPdf",consumes = MediaType.APPLICATION_JSON_VALUE)
     Response registerBookCompressPdf(@RequestBody ExportPdfDto exportDto);
 
-    @PostMapping(value = "/file/cutFileCompress")
-    Response cutFileCompress(@RequestBody CoreRegisterBookPdfExportDto exportDto);
+    @PostMapping(value = "/file/cutFileCompress",consumes = MediaType.APPLICATION_JSON_VALUE)
+    void cutFileCompress(@RequestBody CoreRegisterBookPdfExportDto exportDto);
 }

+ 2 - 2
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteFileFallbackFactory.java

@@ -66,8 +66,8 @@ public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileServ
             }
 
             @Override
-            public Response cutFileCompress(CoreRegisterBookPdfExportDto exportDto) {
-                return null;
+            public void cutFileCompress(CoreRegisterBookPdfExportDto exportDto) {
+
             }
         };
     }

+ 3 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/dto/CoreRegisterBookPdfExportDto.java

@@ -1,5 +1,6 @@
 package com.xunmei.common.core.domain.registerbook.dto;
 
+import com.xunmei.common.core.domain.registerbook.vo.CoreRegisterBookPdfPageVo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -20,4 +21,6 @@ public class CoreRegisterBookPdfExportDto extends CoreRegisterBookPdfPageDto {
 
     @ApiModelProperty(value = "文件id数组")
     private List<Long> pdfIdList;
+
+    private List<CoreRegisterBookPdfPageVo> dataList;
 }

+ 33 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/registerbook/controller/CoreRegisterBookPdfController.java

@@ -1,24 +1,31 @@
 package com.xunmei.core.registerbook.controller;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.registerbook.dto.CoreRegisterBookPdfExportDto;
 import com.xunmei.common.core.domain.registerbook.dto.CoreRegisterBookPdfPageDto;
 import com.xunmei.common.core.domain.registerbook.dto.ExportPdfDto;
 import com.xunmei.common.core.domain.registerbook.vo.CoreRegisterBookPdfPageVo;
 import com.xunmei.common.core.web.controller.BaseController;
+import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.common.security.annotation.RequiresPermissions;
 import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
+import com.xunmei.core.thread.ThreadPoolConfig;
 import com.xunmei.system.api.RemoteOrgService;
+import com.xunmei.system.api.domain.SysOrg;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 
 /**
  * registerBookController
@@ -36,6 +43,9 @@ public class CoreRegisterBookPdfController extends BaseController {
     private RedisTemplate redisTemplate;
     @Autowired
     private RemoteOrgService orgService;
+    @Autowired
+    @Qualifier(ThreadPoolConfig.SOC_EXECUTOR)
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
     @ApiOperation(value = "登记簿分页")
     @RequiresPermissions("core:registerBook:list")
@@ -60,4 +70,27 @@ public class CoreRegisterBookPdfController extends BaseController {
         registerBookPdfService.export(pdfDto, response);
     }
 
+
+    @ApiOperation(value = "批量导出登记簿zip")
+    @PostMapping("/batch/cutExport")
+    public AjaxResult exportPdfZipByCut(@RequestBody CoreRegisterBookPdfExportDto exportDto) {
+        SysOrg org = orgService.selectTopOrg(SecurityConstants.INNER);
+        if (ObjectUtil.isNull(exportDto.getOrgId())&&ObjectUtil.equal(exportDto.getExportType(), 0)) {
+            throw new RuntimeException("请选择机构!");
+        }
+        if (exportDto.getCheckSub() && org != null && ObjectUtil.equal(org.getId(), exportDto.getOrgId()) && ObjectUtil.equal(exportDto.getExportType(), 0)) {
+            throw new RuntimeException("暂不支持导出全部机构数据!");
+        }
+        CompletableFuture.runAsync(() -> {
+            try {
+                registerBookPdfService.cutExport(exportDto);
+            } catch (Exception e) {
+                logger.error("导出异常", e);
+                throw new RuntimeException(e);
+            }
+        },threadPoolTaskExecutor);
+
+        return AjaxResult.success();
+    }
+
 }

+ 3 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/registerbook/service/ICoreRegisterBookPdfService.java

@@ -27,4 +27,7 @@ public interface ICoreRegisterBookPdfService extends IService<CoreRegisterBookPd
     List<CoreRegisterBookPdfPageVo> queryExportData(CoreRegisterBookPdfExportDto exportDto);
 
     void export(ExportPdfDto pdfDto, HttpServletResponse response) throws IOException;
+
+    void cutExport(CoreRegisterBookPdfExportDto exportDto);
+
 }

+ 9 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/registerbook/service/impl/CoreRegisterBookPdfServiceImpl.java

@@ -107,6 +107,15 @@ public class CoreRegisterBookPdfServiceImpl extends ServiceImpl<CoreRegisterBook
     }
 
     @Override
+    public void cutExport(CoreRegisterBookPdfExportDto exportDto) {
+        List<CoreRegisterBookPdfPageVo> dataList = queryExportData(exportDto);
+        exportDto.setDataList(dataList);
+        List<SysOrgVO> cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
+        //exportDto.setCacheList(cacheList);
+        fileService.cutFileCompress(exportDto);
+    }
+
+    @Override
     public List<CoreRegisterBookPdfPageVo> queryExportData(CoreRegisterBookPdfExportDto exportDto) {
         final Long orgId = exportDto.getOrgId();
         List<CoreRegisterBookPdfPageVo> result = new ArrayList<>();

+ 110 - 2
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/LocalSysFileServiceImpl.java

@@ -653,7 +653,115 @@ public class LocalSysFileServiceImpl implements ISysFileService {
 
 
     @Override
-    public void cutFileCompress(CoreRegisterBookPdfExportDto exportDto) {
-
+    public void cutFileCompress(CoreRegisterBookPdfExportDto pdfDto) {
+        // String orgName = objectMapper.selectOrgNameById(pdfDto.getOrgId());
+       /* Date date = new Date();
+        Sy org = objectMapper.selectOrg(pdfDto.getOrgId());
+        String fileName = pdfDto.getIsRegisterBookPage() ? org.getName() + "_登记簿_" : org.getName() + "_数据报表_";
+
+        //判断需要分几片导出
+        List<List<CoreRegisterBookPdfPageVo>> lists = checkSubList(pdfDto);
+        int num = 1;
+        for (List<CoreRegisterBookPdfPageVo> list : lists) {
+            CountDownLatch count = new CountDownLatch(list.size());
+            String zipName = null;
+            try {
+                String str = lists.size() == 1 ? "" : "_part_" + num;
+                String fileNameStr = fileName + DateHelper.getDateString(new Date()) + str;
+                zipName = URLEncoder.encode(fileNameStr + ".zip", "UTF-8");
+
+                List<PdfToZipTempVo> pdfToZipTempVoList = list.parallelStream().map(pdf -> {
+                            return resolve(pdf, null, count);
+                        }).filter(Objects::nonNull)
+                        .collect(Collectors.toList());
+                pdfToZipTempVoList.removeIf(pdfToZipTempVo -> !FileUtil.exist(pdfToZipTempVo.getFile()));
+                log.info("登记簿全部下载完成,开始压缩文件,数量:{}", pdfToZipTempVoList.size());
+
+                String localFileName = URLEncoder.encode(RedisConstantKey.REGISTER_PDF_FILE_KEY + DateHelper.getDateString(date) + str + ZipUtil.ZIP_EXT, "UTF-8");
+                FileOutputStream fos = new FileOutputStream(localFileName);
+                ZipOutputStream zos = new ZipOutputStream(fos);
+                long fileSize = 0L;
+                for (PdfToZipTempVo tempVo : pdfToZipTempVoList) {
+                    fileSize += tempVo.getFile().length();
+                    logger.info("当前开始处理第{}个文件 ", pdfToZipTempVoList.indexOf(tempVo) + 1);
+                    deal(zos, null, tempVo);
+                }
+                zos.flush();
+                fos.flush();
+                zos.close();
+                fos.close();
+                num++;
+                PdfLocalFileTempVo pdfLocalFileTempVo = new PdfLocalFileTempVo();
+                pdfLocalFileTempVo.setOrgId(pdfDto.getOrgId());
+                pdfLocalFileTempVo.setOrgName(org.getName());
+                pdfLocalFileTempVo.setOrgPath(org.getPath());
+                pdfLocalFileTempVo.setLocalFileName(localFileName);
+                pdfLocalFileTempVo.setZipName(URLDecoder.decode(zipName, "UTF-8"));
+                pdfLocalFileTempVo.setFileSize(changeUnit(fileSize));
+                pdfLocalFileTempVo.setDownLoadTime(DateUtil.format(date, "yyyy-MM-dd HH:mm:ss"));
+                pdfLocalFileTempVo.setIsRegisterBookPage(pdfDto.getIsRegisterBookPage());
+                pdfLocalFileTempVo.setCreateTime(new Date());
+                redisTemplate.opsForValue().set(URLDecoder.decode(localFileName, "UTF-8"), JSON.toJSONString(pdfLocalFileTempVo));
+                DateTime dateTime = DateUtil.offsetHour(new Date(), 1);
+                delayTaskService.add("ExportLocalFileBusiness", dateTime, URLDecoder.decode(localFileName, "UTF-8"), 5, 2);
+            } catch (Throwable e) {
+                throw new RuntimeException(e);
+            } finally {
+                File file = new File(TEMP_DIR_NAME);
+                if (file.exists()) {
+                    FileUtil.del(file);
+                }
+            }
+        }
+*/
+    }
+   /* private List<List<CoreRegisterBookPdfPageVo>> checkSubList(CoreRegisterBookPdfExportDto pdfDto) {
+        List<List<CoreRegisterBookPdfPageVo>> list = new ArrayList<>();
+        Long orgId = pdfDto.getOrgId();
+        List<CoreRegisterBookPdfPageVo> registerBookPdfList = pdfDto.getDataList();
+        if (registerBookPdfList == null || registerBookPdfList.size() == 0) {
+            throw new RuntimeException("暂无可下载数据!");
+        }
+        //小于3000条直接导出
+        if (registerBookPdfList.size() < 3000) {
+            list.add(registerBookPdfList);
+            return list;
+        }
+        List<SysOrgVO> orgList = objectMapper.selectChildOrgList(orgId);
+        //大于3000条需要分片
+        return splitList(registerBookPdfList, orgList, 3000);
     }
+
+    public static List<List<CoreRegisterBookPdfPageVo>> splitList(List<CoreRegisterBookPdfPageVo> list, List<SysOrgVO> orgList, int size) {
+        // 根据机构分组
+        List<List<CoreRegisterBookPdfPageVo>> collect = orgList.stream().map(org -> {
+            List<CoreRegisterBookPdfPageVo> arrayList = new ArrayList<>();
+            for (CoreRegisterBookPdfPageVo pdf : list) {
+                if (pdf.getOrgPath().startsWith(org.getPath())) {
+                    arrayList.add(pdf);
+                }
+            }
+            return arrayList;
+        }).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+
+        // 合并不满3000的数组
+        List<List<CoreRegisterBookPdfPageVo>> merged = new LinkedList<>();
+        List<CoreRegisterBookPdfPageVo> current = new ArrayList<>();
+        for (List<CoreRegisterBookPdfPageVo> group : collect) {
+            if (group.size() >= 3000) {
+                merged.add(group);
+            } else {
+                current.addAll(group);
+                if (current.size() >= 3000) {
+                    merged.add(current);
+                    current = new ArrayList<>();
+                }
+            }
+        }
+        if (!current.isEmpty()) {
+            merged.add(current);
+        }
+        return merged;
+        //return merged.stream().limit(size).collect(Collectors.toList());
+    }*/
 }