Ver Fonte

登记簿批量导出代码提交

jingyuanchao há 1 ano atrás
pai
commit
fff0a5c992
18 ficheiros alterados com 471 adições e 170 exclusões
  1. 8 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteFileService.java
  2. 12 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteFileFallbackFactory.java
  3. 2 4
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/drill/dto/CoreDrillTaskRecPageDto.java
  4. 2 4
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/drill/dto/CoreDrillTaskReportDto.java
  5. 26 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/dto/CoreRegisterBookPdfExportDto.java
  6. 2 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/dto/CoreRegisterBookPdfPageDto.java
  7. 29 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/dto/ExportPdfDto.java
  8. 11 1
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/vo/CoreRegisterBookPdfPageVo.java
  9. 19 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/vo/PdfLocalFileTempVo.java
  10. 33 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/vo/PdfToZipTempVo.java
  11. 7 14
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillTaskServiceImpl.java
  12. 34 53
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/registerbook/controller/CoreRegisterBookPdfController.java
  13. 6 52
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/registerbook/service/ICoreRegisterBookPdfService.java
  14. 75 31
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/registerbook/service/impl/CoreRegisterBookPdfServiceImpl.java
  15. 9 1
      soc-modules/soc-modules-file/pom.xml
  16. 13 2
      soc-modules/soc-modules-file/src/main/java/com/xunmei/file/controller/SysFileController.java
  17. 13 1
      soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/ISysFileService.java
  18. 170 7
      soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/LocalSysFileServiceImpl.java

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

@@ -2,6 +2,8 @@ package com.xunmei.system.api;
 
 import com.xunmei.common.core.constant.ServiceNameConstants;
 import com.xunmei.common.core.domain.R;
+import com.xunmei.common.core.domain.registerbook.dto.CoreRegisterBookPdfExportDto;
+import com.xunmei.common.core.domain.registerbook.dto.ExportPdfDto;
 import com.xunmei.system.api.domain.SysFile;
 import com.xunmei.system.api.factory.RemoteFileFallbackFactory;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -68,4 +70,10 @@ public interface RemoteFileService {
      */
     @GetMapping(value = "/file/getStaticPathPrefix")
     String getStaticPathPrefix();
+
+    @PostMapping(value = "/file/registerBookCompressPdf",consumes = MediaType.APPLICATION_JSON_VALUE)
+    void registerBookCompressPdf(@RequestBody ExportPdfDto exportDto);
+
+    @PostMapping(value = "/file/cutFileCompress")
+    void cutFileCompress(@RequestBody CoreRegisterBookPdfExportDto exportDto);
 }

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

@@ -2,6 +2,8 @@ package com.xunmei.system.api.factory;
 
 import com.alibaba.fastjson2.JSON;
 import com.xunmei.common.core.domain.R;
+import com.xunmei.common.core.domain.registerbook.dto.CoreRegisterBookPdfExportDto;
+import com.xunmei.common.core.domain.registerbook.dto.ExportPdfDto;
 import com.xunmei.system.api.RemoteFileService;
 import com.xunmei.system.api.domain.SysFile;
 import org.slf4j.Logger;
@@ -56,6 +58,16 @@ public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileServ
             public String getStaticPathPrefix() {
                 return null;
             }
+
+            @Override
+            public void registerBookCompressPdf(ExportPdfDto exportDto) {
+
+            }
+
+            @Override
+            public void cutFileCompress(CoreRegisterBookPdfExportDto exportDto) {
+
+            }
         };
     }
 }

+ 2 - 4
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/drill/dto/CoreDrillTaskRecPageDto.java

@@ -16,12 +16,10 @@ public class CoreDrillTaskRecPageDto extends PageRequest {
     @ApiModelProperty(value = "状态")
     private Integer recStatus;
 
-    @NotNull(message = "请选择具体时间进行查看!")
-    @ApiModelProperty(value = "任务时间范围", notes = "App传递此参数")
-    private Date date;
-
+    @NotNull(message = "开始时间不能为空")
     private Date startTime;
 
+    @NotNull(message = "结束时间不能为空")
     private Date endTime;
 
 

+ 2 - 4
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/drill/dto/CoreDrillTaskReportDto.java

@@ -17,13 +17,11 @@ public class CoreDrillTaskReportDto {
     @ApiModelProperty(value = "机构")
     private Long orgId;
 
-    @NotNull(message = "请选择具体月份进行查看!")
-    @ApiModelProperty(value = "统计月份")
-    private Date date;
-
+    @NotNull(message = "统计月份开始日期不能为空!")
     @ApiModelProperty(value = "统计月份开始日期")
     private Date startTime;
 
+    @NotNull(message = "统计月份结束日期不能为空!")
     @ApiModelProperty(value = "统计月份结束日期")
     private Date endTime;
 

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

@@ -0,0 +1,26 @@
+package com.xunmei.common.core.domain.registerbook.dto;
+
+import cn.hutool.core.lang.UUID;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/10/10 14:36
+ */
+@Data
+
+public class CoreRegisterBookPdfExportDto extends CoreRegisterBookPdfPageDto {
+
+    @NotNull(message = "请选择具体登记表类型进行导出!")
+    @ApiModelProperty(value = "导出类型",notes = "导出全部:0,导出勾选:1")
+    private Integer exportType;
+
+    @ApiModelProperty(value = "文件id数组")
+    private List<Long> pdfIdList;
+
+    private String guid= UUID.fastUUID().toString();
+}

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

@@ -18,4 +18,6 @@ public class CoreRegisterBookPdfPageDto  extends PageRequest {
 
     @ApiModelProperty(value = "登记簿类型")
     private Integer registerBookType;
+
+    private Boolean isRegisterBookPage=Boolean.TRUE;
 }

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

@@ -0,0 +1,29 @@
+package com.xunmei.common.core.domain.registerbook.dto;
+
+import com.xunmei.common.core.domain.registerbook.vo.CoreRegisterBookPdfPageVo;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/11/11 10:28
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ExportPdfDto {
+
+    private List<CoreRegisterBookPdfPageVo> registerBookPdfList;
+
+    private String fileName;
+
+    private String guid;
+
+    private Boolean checkSub;
+
+    private Long orgId;
+
+}

+ 11 - 1
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/CoreRegisterBookPdfPageVo.java → soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/vo/CoreRegisterBookPdfPageVo.java

@@ -1,10 +1,13 @@
-package com.xunmei.common.core.domain.registerbook;
+package com.xunmei.common.core.domain.registerbook.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.xunmei.common.core.domain.IdName;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.util.Date;
+import java.util.List;
 
 @Data
 public class CoreRegisterBookPdfPageVo {
@@ -33,4 +36,11 @@ public class CoreRegisterBookPdfPageVo {
 
     @ApiModelProperty(value = "pdf文件地址")
     private String fileUrl;
+
+    @JsonIgnore
+    @ApiModelProperty(value = "机构名称")
+    private String orgPath;
+
+    @JsonIgnore
+    private List<IdName<Long, String>> orgList;
 }

+ 19 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/vo/PdfLocalFileTempVo.java

@@ -0,0 +1,19 @@
+package com.xunmei.common.core.domain.registerbook.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class PdfLocalFileTempVo {
+
+    private Long orgId;
+    private String orgName;
+    private String orgPath;
+    private String localFileName;
+    private String zipName;
+    private String fileSize;
+    private String downLoadTime;
+    private Boolean isRegisterBookPage;
+    private Date createTime;
+}

+ 33 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/vo/PdfToZipTempVo.java

@@ -0,0 +1,33 @@
+package com.xunmei.common.core.domain.registerbook.vo;
+
+import com.xunmei.common.core.enums.RegisterBookType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.File;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/11/10 11:21
+ */
+@Data
+public class PdfToZipTempVo {
+
+    private byte[] bytes;
+    @ApiModelProperty(value = "pdf文件名称")
+    private String fileName;
+
+    @ApiModelProperty(value = "机构名称")
+    private String orgName;
+
+    @ApiModelProperty(value = "机构id")
+    private Long orgId;
+
+    @ApiModelProperty(value = "文件类型")
+    private RegisterBookType registerBookType;
+
+    private String entryName;
+
+    private File file;
+
+}

+ 7 - 14
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillTaskServiceImpl.java

@@ -25,7 +25,6 @@ import com.xunmei.common.core.domain.panel.vo.PanelListVo;
 import com.xunmei.common.core.domain.registerbook.domain.CoreRegisterBookPdf;
 import com.xunmei.common.core.domain.worktime.domain.SysWorkTime;
 import com.xunmei.common.core.domain.worktime.dto.WorkTimeDto;
-import com.xunmei.common.core.enums.CycleCommonEnum;
 import com.xunmei.common.core.enums.OrgTypeEnum;
 import com.xunmei.common.core.enums.RegisterBookType;
 import com.xunmei.common.core.enums.drill.*;
@@ -159,16 +158,14 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
             //App的查询, App 默认下穿
             request.setCheckSub(true);
             //App端的时间按季度查询
-            DateRange dateRange = DateUtils.getStartAndEnd(request.getDate(), CycleCommonEnum.QUARTERLY);
-            request.setStartTime(dateRange.getStartTime());
-            request.setEndTime(dateRange.getEndTime());
+            request.setStartTime(DateUtil.beginOfMonth(request.getStartTime()));
+            request.setEndTime(DateUtil.endOfMonth(request.getEndTime()));
         } else {
             if (ObjectUtil.isNotEmpty(request.getRange())) {
                 //web的查询
                 request.setStartTime(DateUtil.beginOfDay(request.getRange()[0]));
                 request.setEndTime(DateUtil.endOfDay(request.getRange()[1]));
             }
-
         }
         if (Boolean.TRUE.equals(request.getCheckSub())) {
             SysOrg org = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.selectOrgById(request.getOrgId(), SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
@@ -500,9 +497,8 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
             planIdList = coreDrillPlanMapper.selectIdByParentId(plan.getId());
             planId = null;
         }
-        DateRange range = DateUtils.getStartAndEnd(request.getDate(), CycleCommonEnum.QUARTERLY);
-        request.setStartTime(range.getStartTime());
-        request.setEndTime(range.getEndTime());
+        request.setStartTime(DateUtil.beginOfMonth(request.getStartTime()));
+        request.setEndTime(DateUtil.endOfMonth(request.getEndTime()));
 
         Long orgId = request.getOrgId();
         SysOrg sysOrg = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.selectOrgById(orgId, SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
@@ -745,9 +741,7 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
     @Override
     public TableDataInfo<CoreDrillTaskRecPageVo> recList(CoreDrillTaskRecPageDto request) {
         dealRecListParam(request);
-        IPage<CoreDrillTaskRecPageVo> page;
-
-        page = coreDrillTaskMapper.selectRecPage(request.getPageRequest(), request);
+        IPage<CoreDrillTaskRecPageVo> page = coreDrillTaskMapper.selectRecPage(request.getPageRequest(), request);
         for (CoreDrillTaskRecPageVo record : page.getRecords()) {
             //处理演练任务类型字典
             record.setTypeText(DictUtils.getDictLabel(DictConstants.CORE_DRILL_TYPE, record.getType()));
@@ -778,9 +772,8 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
         //App的查询, App 默认下穿
         request.setCheckSub(true);
         //App端的时间按季度查询
-        DateRange dateRange = DateUtils.getStartAndEnd(request.getDate(), CycleCommonEnum.QUARTERLY);
-        request.setStartTime(dateRange.getStartTime());
-        request.setEndTime(dateRange.getEndTime());
+        request.setStartTime(DateUtil.beginOfMonth(request.getStartTime()));
+        request.setEndTime(DateUtil.endOfMonth(request.getEndTime()));
         SysOrg sysOrg = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.selectOrgById(request.getOrgId(), SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
         request.setOrgPath(sysOrg.getPath());
     }

+ 34 - 53
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/registerbook/controller/CoreRegisterBookPdfController.java

@@ -1,20 +1,24 @@
 package com.xunmei.core.registerbook.controller;
 
-import com.xunmei.common.core.domain.registerbook.CoreRegisterBookPdfPageVo;
-import com.xunmei.common.core.domain.registerbook.domain.CoreRegisterBookPdf;
+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.log.annotation.Log;
-import com.xunmei.common.log.enums.BusinessType;
 import com.xunmei.common.security.annotation.RequiresPermissions;
 import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
+import com.xunmei.system.api.RemoteOrgService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * registerBookController
  *
@@ -26,60 +30,37 @@ import org.springframework.web.bind.annotation.*;
 @RequestMapping("/registerBook")
 public class CoreRegisterBookPdfController extends BaseController {
     @Autowired
-    private ICoreRegisterBookPdfService coreRegisterBookPdfService;
-
-    /**
-     * 查询registerBook列表
-     */
-    @ApiOperation(value = "查询CoreRegisterBookPdf列表")
+    private ICoreRegisterBookPdfService registerBookPdfService;
+    @Autowired
+    private RedisTemplate redisTemplate;
+    @Autowired
+    private RemoteOrgService orgService;
+    @ApiOperation(value = "登记簿分页")
     @RequiresPermissions("core:registerBook:list")
     @GetMapping("/list")
     public TableDataInfo<CoreRegisterBookPdfPageVo> list(CoreRegisterBookPdfPageDto req) {
 
-        return coreRegisterBookPdfService.selectPage(req);
-    }
-
-
-    /**
-     * 获取registerBook详细信息
-     */
-    @ApiOperation(value = "获取CoreRegisterBookPdf详细信息")
-    @RequiresPermissions("core:registerBook:query")
-    @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id) {
-        return success(coreRegisterBookPdfService.selectCoreRegisterBookPdfById(id));
+        return registerBookPdfService.selectPage(req);
     }
 
-    /**
-     * 新增registerBook
-     */
-    @ApiOperation(value = "新增CoreRegisterBookPdf")
-    @RequiresPermissions("core:registerBook:add")
-    @Log(title = "registerBook", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody CoreRegisterBookPdf coreRegisterBookPdf) {
-        return toAjax(coreRegisterBookPdfService.insertCoreRegisterBookPdf(coreRegisterBookPdf));
+    @ApiOperation(value = "批量导出登记簿zip")
+    @PostMapping("/batch/export")
+    public void exportPdfZip(@RequestBody CoreRegisterBookPdfExportDto exportDto) {
+        if (ObjectUtil.isEmpty(exportDto.getGuid())) {
+            throw new RuntimeException("guid不能为空!");
+        }
+        redisTemplate.opsForValue().increment(exportDto.getGuid(), 9);
+        final String orgName = orgService.selectOrgById(exportDto.getOrgId(), SecurityConstants.INNER).getName();
+        final List<CoreRegisterBookPdfPageVo> registerBookPdfList = registerBookPdfService.queryExportData(exportDto);
+        if (registerBookPdfList.size() == 0) {
+            throw new RuntimeException("暂无可用数据导出");
+        }
+        String fileName = exportDto.getIsRegisterBookPage() ? orgName + "_登记簿_" : orgName + "_数据报表_";
+        ExportPdfDto pdfDto = new ExportPdfDto();
+        pdfDto.setRegisterBookPdfList(registerBookPdfList);
+        pdfDto.setFileName(fileName);
+        pdfDto.setGuid(exportDto.getGuid());
+        registerBookPdfService.export(pdfDto);
     }
 
-    /**
-     * 修改registerBook
-     */
-    @ApiOperation(value = "修改CoreRegisterBookPdf")
-    @RequiresPermissions("core:registerBook:edit")
-    @Log(title = "registerBook", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody CoreRegisterBookPdf coreRegisterBookPdf) {
-        return toAjax(coreRegisterBookPdfService.updateCoreRegisterBookPdf(coreRegisterBookPdf));
-    }
-
-    /**
-     * 删除registerBook
-     */
-    @ApiOperation(value = "删除CoreRegisterBookPdf")
-    @RequiresPermissions("core:registerBook:remove")
-    @Log(title = "registerBook", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids) {
-        return toAjax(coreRegisterBookPdfService.deleteCoreRegisterBookPdfByIds(ids));
-    }
 }

+ 6 - 52
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/registerbook/service/ICoreRegisterBookPdfService.java

@@ -1,9 +1,11 @@
 package com.xunmei.core.registerbook.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xunmei.common.core.domain.registerbook.CoreRegisterBookPdfPageVo;
 import com.xunmei.common.core.domain.registerbook.domain.CoreRegisterBookPdf;
+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.page.TableDataInfo;
 
 import java.util.List;
@@ -15,59 +17,11 @@ import java.util.List;
  * @date 2023-11-08
  */
 public interface ICoreRegisterBookPdfService extends IService<CoreRegisterBookPdf> {
-    /**
-     * 查询registerBook
-     *
-     * @param id registerBook主键
-     * @return registerBook
-     */
-     CoreRegisterBookPdf selectCoreRegisterBookPdfById(Long id);
 
-    /**
-     * 查询registerBook列表
-     *
-     * @param coreRegisterBookPdf registerBook
-     * @return registerBook集合
-     */
-    List<CoreRegisterBookPdf> selectCoreRegisterBookPdfList(CoreRegisterBookPdf coreRegisterBookPdf);
 
-    /**
-     * 新增registerBook
-     *
-     * @param coreRegisterBookPdf registerBook
-     * @return 结果
-     */
-    int insertCoreRegisterBookPdf(CoreRegisterBookPdf coreRegisterBookPdf);
-
-    /**
-     * 修改registerBook
-     *
-     * @param coreRegisterBookPdf registerBook
-     * @return 结果
-     */
-    int updateCoreRegisterBookPdf(CoreRegisterBookPdf coreRegisterBookPdf);
-
-    /**
-     * 批量删除registerBook
-     *
-     * @param ids 需要删除的registerBook主键集合
-     * @return 结果
-     */
-    int deleteCoreRegisterBookPdfByIds(Long[] ids);
+    TableDataInfo<CoreRegisterBookPdfPageVo> selectPage(CoreRegisterBookPdfPageDto coreRegisterBookPdf);
 
-    /**
-     * 删除registerBook信息
-     *
-     * @param id registerBook主键
-     * @return 结果
-     */
-    int deleteCoreRegisterBookPdfById(Long id);
+    List<CoreRegisterBookPdfPageVo> queryExportData(CoreRegisterBookPdfExportDto exportDto);
 
-    /**
-     * 查询registerBook分页数据
-     *
-     * @param coreRegisterBookPdf 查询条件对象
-     * @return Page
-     */
-    TableDataInfo<CoreRegisterBookPdfPageVo> selectPage(CoreRegisterBookPdfPageDto coreRegisterBookPdf);
+    void export(ExportPdfDto pdfDto);
 }

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

@@ -1,27 +1,37 @@
 package com.xunmei.core.registerbook.service.impl;
 
+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.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.CacheConstants;
 import com.xunmei.common.core.constant.ErrorMsgConstants;
 import com.xunmei.common.core.constant.SecurityConstants;
-import com.xunmei.common.core.domain.registerbook.CoreRegisterBookPdfPageVo;
+import com.xunmei.common.core.domain.IdName;
 import com.xunmei.common.core.domain.registerbook.domain.CoreRegisterBookPdf;
+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.util.BeanHelper;
 import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.core.registerbook.mapper.CoreRegisterBookPdfMapper;
 import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
+import com.xunmei.system.api.RemoteFileService;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
+import com.xunmei.system.api.vo.SysOrgVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * registerBookService业务层处理
@@ -35,6 +45,8 @@ public class CoreRegisterBookPdfServiceImpl extends ServiceImpl<CoreRegisterBook
     private CoreRegisterBookPdfMapper coreRegisterBookPdfMapper;
     @Autowired
     private RemoteOrgService orgService;
+    @Autowired
+    private RemoteFileService fileService;
 
     @Override
     public TableDataInfo<CoreRegisterBookPdfPageVo> selectPage(CoreRegisterBookPdfPageDto req) {
@@ -56,8 +68,6 @@ public class CoreRegisterBookPdfServiceImpl extends ServiceImpl<CoreRegisterBook
             return TableDataInfo.build(page1);
         }
         return TableDataInfo.build();
-
-
     }
 
     private CoreRegisterBookPdfPageVo getCoreRegisterBookPdfPageVo(CoreRegisterBookPdf coreRegisterBookPdf) {
@@ -67,39 +77,73 @@ public class CoreRegisterBookPdfServiceImpl extends ServiceImpl<CoreRegisterBook
 
     }
 
-
-    @Override
-    public CoreRegisterBookPdf selectCoreRegisterBookPdfById(Long id) {
-        return coreRegisterBookPdfMapper.selectById(id);
-    }
-
-
     @Override
-    public List<CoreRegisterBookPdf> selectCoreRegisterBookPdfList(CoreRegisterBookPdf coreRegisterBookPdf) {
-        return coreRegisterBookPdfMapper.selectList(new QueryWrapper<>(coreRegisterBookPdf));
+    public void export(ExportPdfDto pdfDto) {
+        fileService.registerBookCompressPdf(pdfDto);
     }
 
-
     @Override
-    public int insertCoreRegisterBookPdf(CoreRegisterBookPdf coreRegisterBookPdf) {
-        return coreRegisterBookPdfMapper.insert(coreRegisterBookPdf);
-    }
-
-
-    @Override
-    public int updateCoreRegisterBookPdf(CoreRegisterBookPdf coreRegisterBookPdf) {
-        return coreRegisterBookPdfMapper.updateById(coreRegisterBookPdf);
+    public List<CoreRegisterBookPdfPageVo> queryExportData(CoreRegisterBookPdfExportDto exportDto) {
+        final Long orgId = exportDto.getOrgId();
+        List<CoreRegisterBookPdfPageVo> result = new ArrayList<>();
+        final List<SysOrgVO> all = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
+        if (0 == exportDto.getExportType()) {
+            //根据查询结果导出
+            exportDto.setPageSize(Integer.MAX_VALUE);
+            TableDataInfo<CoreRegisterBookPdfPageVo> tableDataInfo = this.selectPage(exportDto);
+            result = tableDataInfo.getRows();
+        } else {
+            //根据选择数据导出
+            if (ObjectUtil.isEmpty(exportDto.getPdfIdList())) {
+                throw new RuntimeException("请选择具体需要导出的数据!");
+            }
+            List<CoreRegisterBookPdf> pdfList = baseMapper.selectBatchIds(exportDto.getPdfIdList());
+            result = BeanHelper.copyProperties(pdfList, CoreRegisterBookPdfPageVo.class);
+        }
+        if (ObjectUtil.isEmpty(result)) {
+            throw new RuntimeException("请选择具体需要导出的数据!");
+        }
+        //final Org org = orgService.find(orgId);
+        for (CoreRegisterBookPdfPageVo registerBookPdf : result) {
+            if (registerBookPdf.getOrgId().equals(orgId)) {
+                continue;
+            }
+            List<IdName<Long, String>> orgList = new ArrayList<>();
+            String orgName = registerBookPdf.getOrgName();
+            if (orgName.contains(" ")) {
+                orgName = orgName.replace(" ", "_");
+            }
+            orgList.add(new IdName<>(registerBookPdf.getOrgId(), orgName));
+            final Optional<SysOrgVO> first = all.stream().filter(allOrg -> allOrg.getId().equals(registerBookPdf.getOrgId())).findFirst();
+            if (!first.isPresent()) {
+                continue;
+            }
+            final List<IdName<Long, String>> nameList = get(all, orgList, first.get(), orgId);
+            Collections.reverse(nameList);
+            registerBookPdf.setOrgList(nameList);
+        }
+        return result;
     }
 
+    private List<IdName<Long, String>> get(List<SysOrgVO> all, List<IdName<Long, String>> orgList, SysOrgVO org, Long orgId) {
 
-    @Override
-    public int deleteCoreRegisterBookPdfByIds(Long[] ids) {
-        return coreRegisterBookPdfMapper.deleteBatchIds(Arrays.asList((ids)));
-    }
-
+        final Optional<SysOrgVO> optional = all.stream()
+                .filter(org1 -> org1.getId().equals(org.getParentId()) && org.getPath().contains(org1.getPath()))
+                .findFirst();
+        if (!optional.isPresent()) {
+            return orgList;
+        }
+        final SysOrgVO parentOrg = optional.get();
+        String name = parentOrg.getShortName();
+        if (name.contains(" ")) {
+            name = name.replace(" ", "_");
+        }
+        orgList.add(new IdName<>(parentOrg.getId(), name));
+        if (!parentOrg.getId().equals(orgId)) {
+            return get(all, orgList, parentOrg, orgId);
+            // orgList.addAll();
+        }
+        return orgList;
 
-    @Override
-    public int deleteCoreRegisterBookPdfById(Long id) {
-        return coreRegisterBookPdfMapper.deleteById(id);
     }
 }

+ 9 - 1
soc-modules/soc-modules-file/pom.xml

@@ -28,6 +28,10 @@
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
 
         <!-- SpringCloud Alibaba Sentinel -->
         <dependency>
@@ -61,7 +65,11 @@
             <artifactId>hutool-all</artifactId>
         </dependency>
 
-       
+        <dependency>
+            <groupId>ant</groupId>
+            <artifactId>ant</artifactId>
+            <version>1.6.5</version>
+        </dependency>
 
         <dependency>
             <groupId>com.lowagie</groupId>

+ 13 - 2
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/controller/SysFileController.java

@@ -1,8 +1,8 @@
 package com.xunmei.file.controller;
 
-import cn.hutool.Hutool;
-import cn.hutool.core.codec.Base64;
 import com.xunmei.common.core.domain.R;
+import com.xunmei.common.core.domain.registerbook.dto.CoreRegisterBookPdfExportDto;
+import com.xunmei.common.core.domain.registerbook.dto.ExportPdfDto;
 import com.xunmei.common.core.utils.file.FileUtils;
 import com.xunmei.file.service.ISysFileService;
 import com.xunmei.file.utils.DesUtil;
@@ -174,4 +174,15 @@ public class SysFileController {
     String getStaticPathPrefix() {
         return this.prefix;
     }
+
+
+    @PostMapping(value = "/registerBookCompressPdf")
+    void registerBookCompressPdf(@RequestBody ExportPdfDto exportDto,HttpServletResponse response){
+        sysFileService.registerBookCompressPdf(exportDto,response);
+    }
+
+    @PostMapping(value = "/cutFileCompress")
+    void cutFileCompress(@RequestBody CoreRegisterBookPdfExportDto exportDto){
+        sysFileService.cutFileCompress(exportDto);
+    }
 }

+ 13 - 1
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/ISysFileService.java

@@ -1,10 +1,13 @@
 package com.xunmei.file.service;
 
+import com.xunmei.common.core.domain.registerbook.dto.CoreRegisterBookPdfExportDto;
+import com.xunmei.common.core.domain.registerbook.dto.ExportPdfDto;
 import com.xunmei.file.vo.FileBase64Vo;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
-import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Map;
 
 /**
@@ -59,4 +62,13 @@ public interface ISysFileService
      * @throws Exception
      */
     String uploadFileBase64(FileBase64Vo file)throws Exception;
+
+    String absolutePath(String path);
+
+    InputStream getFileStream(String path) throws IOException;
+
+    void registerBookCompressPdf(ExportPdfDto exportDto,HttpServletResponse response);
+
+    void cutFileCompress(CoreRegisterBookPdfExportDto exportDto);
+
 }

+ 170 - 7
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/LocalSysFileServiceImpl.java

@@ -1,14 +1,20 @@
 package com.xunmei.file.service;
 
-import cn.hutool.Hutool;
-import cn.hutool.core.codec.Base64;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.lowagie.text.*;
 import com.lowagie.text.pdf.BaseFont;
 import com.lowagie.text.pdf.PdfPCell;
 import com.lowagie.text.pdf.PdfPTable;
 import com.lowagie.text.pdf.PdfWriter;
+import com.xunmei.common.core.domain.IdName;
+import com.xunmei.common.core.domain.registerbook.dto.CoreRegisterBookPdfExportDto;
+import com.xunmei.common.core.domain.registerbook.dto.ExportPdfDto;
+import com.xunmei.common.core.domain.registerbook.vo.CoreRegisterBookPdfPageVo;
+import com.xunmei.common.core.domain.registerbook.vo.PdfToZipTempVo;
+import com.xunmei.common.core.enums.RegisterBookType;
+import com.xunmei.common.core.utils.DateHelper;
 import com.xunmei.common.core.utils.uuid.UUID;
 import com.xunmei.file.utils.FileDownUtils;
 import com.xunmei.file.utils.FileUploadUtils;
@@ -16,38 +22,49 @@ import com.xunmei.file.utils.PdfUtil;
 import com.xunmei.file.vo.FileBase64Vo;
 import com.xunmei.file.vo.ItextPdfTableVo;
 import com.xunmei.file.vo.PdfFilePathVo;
+import io.netty.util.internal.StringUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.tools.zip.ZipEntry;
+import org.apache.tools.zip.ZipOutputStream;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Primary;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.net.URLDecoder;
+import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
-import java.util.Date;
-import java.util.Map;
+import java.nio.file.Files;
+import java.util.List;
+import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.stream.Collectors;
+
 /**
  * 本地文件存储
  *
  * @author xunmei
  */
+
 @Primary
 @Service
 public class LocalSysFileServiceImpl implements ISysFileService {
 
     private static final Logger log = LoggerFactory.getLogger(LocalSysFileServiceImpl.class);
+    public static final String TEMP_DIR_NAME = "registerBookPdfBatchExportTempDir";
+    @Autowired
+    RedisTemplate redisTemplate;
 
-    /**
-     * 上传文件存储在本地的根路径
-     */
     @Value("${file.path}")
     private String localFilePath;
 
@@ -486,4 +503,150 @@ public class LocalSysFileServiceImpl implements ISysFileService {
 
         document.close();
     }
+
+    @Override
+    public String absolutePath(String path) {
+        if (ObjectUtil.isEmpty(path)) {
+            return StringUtil.EMPTY_STRING;
+        }
+        if (path.startsWith(this.localFilePath)) {
+            return path;
+        }
+        if (path.startsWith(this.prefix)) {
+            return this.localFilePath + path.substring(this.prefix.length());
+        }
+        return StringUtil.EMPTY_STRING;
+    }
+
+    @Override
+    public InputStream getFileStream(String path) throws IOException {
+        String absolutePath = this.absolutePath(path);
+        File file = new File(absolutePath);
+        return Files.newInputStream(file.toPath());
+    }
+
+    @Override
+    public void registerBookCompressPdf(ExportPdfDto pdfDto,HttpServletResponse response) {
+        if (ObjectUtil.isEmpty(pdfDto.getGuid())) {
+            pdfDto.setGuid(cn.hutool.core.lang.UUID.fastUUID().toString());
+        }
+        final List<CoreRegisterBookPdfPageVo> registerBookPdfList = pdfDto.getRegisterBookPdfList();
+        try {
+            String zipName = URLEncoder.encode(pdfDto.getFileName() + DateHelper.getDateString(new Date()) + ".zip", "UTF-8");
+            final CountDownLatch count = new CountDownLatch(registerBookPdfList.size());
+            ServletOutputStream outputStream = response.getOutputStream();
+            ZipOutputStream zos = new ZipOutputStream(outputStream);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment; filename=" + zipName);
+            List<PdfToZipTempVo> pdfToZipTempVoList = registerBookPdfList.parallelStream().map(pdf -> {
+                        return resolve(pdf, pdfDto, count);
+                    }).filter(Objects::nonNull)
+                    .collect(Collectors.toList());
+            count.await();
+            pdfToZipTempVoList.removeIf(pdfToZipTempVo -> !FileUtil.exist(pdfToZipTempVo.getFile()));
+            log.info("登记簿全部下载完成,开始压缩文件,数量:{}", pdfToZipTempVoList.size());
+            for (PdfToZipTempVo tempVo : pdfToZipTempVoList) {
+                log.info("当前开始处理第{}个文件 ", pdfToZipTempVoList.indexOf(tempVo) + 1);
+                deal(zos, pdfDto, tempVo);
+            }
+
+
+            outputStream.flush();
+            outputStream.close();
+
+            log.info("登记簿批量导出压缩文件完成,文件数量:{}", pdfToZipTempVoList.size());
+        } catch (Throwable e) {
+            String errMsg = String.format("登记簿导出失败:%s", e);
+            log.error(errMsg);
+        } finally {
+            final File temp = new File(TEMP_DIR_NAME);
+            if (temp.exists()) {
+                FileUtil.del(temp);
+                log.info("临时目录已删除");
+            }
+            // redisTemplate.delete(pdfDto.getGuid());
+        }
+    }
+
+
+    public PdfToZipTempVo resolve(CoreRegisterBookPdfPageVo pdf, ExportPdfDto pdfDto, CountDownLatch count) {
+
+        final File temp = new File(TEMP_DIR_NAME);
+        if (!temp.exists()) {
+            temp.mkdirs();
+        }
+        InputStream inputStream;
+        try {
+
+            inputStream = getFileStream(pdf.getFileUrl());
+            if (pdfDto != null) {
+                redisTemplate.opsForValue().increment(pdfDto.getGuid(), 9);
+            }
+            if (ObjectUtil.isEmpty(inputStream)) {
+                log.error("登记簿导出失败,文件不存在,文件名:{}", pdf.getFileUrl());
+                return null;
+            }
+            final String pdfFileName = pdf.getFileName();
+            final PdfToZipTempVo tempVo = new PdfToZipTempVo();
+            //tempVo.setBytes(bytes);
+            tempVo.setFileName(pdfFileName);
+            tempVo.setOrgId(pdf.getOrgId());
+            tempVo.setOrgName(pdf.getOrgName());
+            tempVo.setRegisterBookType(RegisterBookType.getEnums(pdf.getRegisterBookType()));
+
+            final File file = new File(temp + File.separator + pdfFileName);
+            final FileOutputStream outputStream = new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int len;
+            while ((len = inputStream.read(buffer)) > 0) {
+                outputStream.write(buffer, 0, len);
+            }
+            outputStream.close();
+            inputStream.close();
+            tempVo.setFile(file);
+            final List<IdName<Long, String>> idNameList = pdf.getOrgList();
+            if (ObjectUtil.isEmpty(idNameList)) {
+                tempVo.setEntryName(File.separator + RegisterBookType.getEnums(pdf.getRegisterBookType()).getText() + File.separator + pdfFileName);
+                return tempVo;
+            }
+            StringJoiner stringJoiner = new StringJoiner(File.separator);
+            for (IdName<Long, String> org : idNameList) {
+                stringJoiner.add(org.getName());
+                if (idNameList.lastIndexOf(org) == idNameList.size() - 1) {
+                    stringJoiner.add(RegisterBookType.getEnums(pdf.getRegisterBookType()).getText() + File.separator + pdfFileName);
+                }
+            }
+            tempVo.setEntryName(stringJoiner.toString());
+            return tempVo;
+        } catch (Exception e) {
+            log.error("读取文件失败", e);
+            return null;
+        } finally {
+            count.countDown();
+        }
+    }
+
+
+    public void deal(ZipOutputStream zos, ExportPdfDto pdfDto, PdfToZipTempVo zipTempVo) throws Throwable {
+        zos.setEncoding("GBK");
+        FileInputStream fileInputStream = new FileInputStream(zipTempVo.getFile());
+        zos.putNextEntry(new ZipEntry(zipTempVo.getEntryName()));
+        byte[] buffer = new byte[4096];
+        int len;
+        while ((len = fileInputStream.read(buffer)) > 0) {
+            zos.write(buffer, 0, len);
+        }
+        fileInputStream.close();
+        if (pdfDto != null) {
+            redisTemplate.opsForValue().increment(pdfDto.getGuid(), 9);
+        }
+
+    }
+
+
+
+    @Override
+    public void cutFileCompress(CoreRegisterBookPdfExportDto exportDto) {
+
+    }
 }