Browse Source

后台导出excel

24282 1 year ago
parent
commit
5045414a41
21 changed files with 637 additions and 73 deletions
  1. 46 0
      sd-business/src/main/java/com/sd/business/controller/excel/ExcelGenerateLogController.java
  2. 0 1
      sd-business/src/main/java/com/sd/business/controller/statement/StatementOfAccountController.java
  3. 0 1
      sd-business/src/main/java/com/sd/business/controller/statement/StatementOfAccountMergeController.java
  4. 17 0
      sd-business/src/main/java/com/sd/business/entity/excel/dto/ExcelGenerateLogDto.java
  5. 17 0
      sd-business/src/main/java/com/sd/business/entity/excel/dto/ExcelGenerateLogSelectDto.java
  6. 21 0
      sd-business/src/main/java/com/sd/business/entity/excel/enums/ExcelStatusEnum.java
  7. 17 0
      sd-business/src/main/java/com/sd/business/entity/excel/enums/ExcelTypeEnum.java
  8. 48 0
      sd-business/src/main/java/com/sd/business/entity/excel/po/ExcelGenerateLog.java
  9. 17 0
      sd-business/src/main/java/com/sd/business/entity/excel/vo/ExcelGenerateLogVo.java
  10. 26 0
      sd-business/src/main/java/com/sd/business/mapper/excel/ExcelGenerateLogMapper.java
  11. 50 0
      sd-business/src/main/java/com/sd/business/service/excel/ExcelGenerateLogService.java
  12. 172 0
      sd-business/src/main/java/com/sd/business/service/excel/impl/ExcelGenerateLogServiceImpl.java
  13. 0 5
      sd-business/src/main/java/com/sd/business/service/statement/StatementOfAccountExportService.java
  14. 8 5
      sd-business/src/main/java/com/sd/business/service/statement/impl/DocumentByOrderExcelCellMergeStrategy.java
  15. 0 55
      sd-business/src/main/java/com/sd/business/service/statement/impl/StatementOfAccountExportServiceImpl.java
  16. 10 5
      sd-business/src/main/java/com/sd/business/service/statement/impl/StatementOfAccountMergeServiceImpl.java
  17. 9 1
      sd-business/src/main/java/com/sd/business/service/statement/impl/StatementOfAccountServiceImpl.java
  18. 11 0
      sd-business/src/main/java/com/sd/business/strategy/ExcelExportStrategy.java
  19. 141 0
      sd-business/src/main/java/com/sd/business/strategy/impl/DocumentByOrderExcelExportStrategy.java
  20. 20 0
      sd-business/src/main/resources/mapper/excel/ExcelGenerateLogMapper.xml
  21. 7 0
      sd-starter/src/test/java/TestList.java

+ 46 - 0
sd-business/src/main/java/com/sd/business/controller/excel/ExcelGenerateLogController.java

@@ -0,0 +1,46 @@
+package com.sd.business.controller.excel;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.entity.excel.dto.ExcelGenerateLogSelectDto;
+import com.sd.business.entity.excel.vo.ExcelGenerateLogVo;
+import com.sd.business.service.excel.ExcelGenerateLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * <p>
+ * excel生成记录 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-09-21
+ */
+@RestController
+@RequestMapping("/excelGenerateLog")
+public class ExcelGenerateLogController {
+
+    @Autowired
+    private ExcelGenerateLogService excelGenerateLogService;
+
+    /**
+     * excel生成记录分页
+     */
+    @PostMapping("/page")
+    public Page<ExcelGenerateLogVo> page(@RequestBody ExcelGenerateLogSelectDto dto) {
+        return excelGenerateLogService.getPage(dto);
+    }
+
+    /**
+     * excel生成记录删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        excelGenerateLogService.delete(dto.getId());
+    }
+
+}

+ 0 - 1
sd-business/src/main/java/com/sd/business/controller/statement/StatementOfAccountController.java

@@ -132,7 +132,6 @@ public class StatementOfAccountController {
     /**
      * 导出订单对账单
      */
-    @NonInterception
     @GetMapping("/exportDocumentByOrder")
     public void exportDocumentByOrder(BaseSelectDto dto) {
         statementOfAccountService.export(dto.getId(), 3);

+ 0 - 1
sd-business/src/main/java/com/sd/business/controller/statement/StatementOfAccountMergeController.java

@@ -85,7 +85,6 @@ public class StatementOfAccountMergeController {
     /**
      * 导出订单对账单
      */
-    @NonInterception
     @GetMapping("/exportDocumentByOrder")
     public void exportDocumentByOrder(@Validated ExportDocumentDto dto) {
         statementOfAccountMergeService.export(dto, 3);

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/excel/dto/ExcelGenerateLogDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.excel.dto;
+
+import com.sd.business.entity.excel.po.ExcelGenerateLog;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * excel生成记录新增编辑入参实体
+ *
+ * @author
+ * @since 2023-09-21
+ */
+@Getter
+@Setter
+public class ExcelGenerateLogDto extends ExcelGenerateLog {
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/excel/dto/ExcelGenerateLogSelectDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.excel.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * excel生成记录列表查询入参实体
+ *
+ * @author
+ * @since 2023-09-21
+ */
+@Getter
+@Setter
+public class ExcelGenerateLogSelectDto extends BaseSelectDto {
+
+}

+ 21 - 0
sd-business/src/main/java/com/sd/business/entity/excel/enums/ExcelStatusEnum.java

@@ -0,0 +1,21 @@
+package com.sd.business.entity.excel.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum ExcelStatusEnum {
+
+    PROCESSING_DATA(1, "数据处理中"),
+    GENERATE(2, "excel生成中"),
+    UPLOAD(3, "excel上传中"),
+    COMPLETE(4, "完成"),
+
+    FAIL(99, "excel生成失败");
+
+
+    private final Integer status;
+    private final String explain;
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/excel/enums/ExcelTypeEnum.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.excel.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum ExcelTypeEnum {
+
+    DOCUMENT_BY_ORDER(1, "订单对账单"),
+    STATISTICS_DOCUMENT_BY_ORDER(2, "订单对账报表"),
+    ;
+
+    private final Integer type;
+    private final String explain;
+
+}

+ 48 - 0
sd-business/src/main/java/com/sd/business/entity/excel/po/ExcelGenerateLog.java

@@ -0,0 +1,48 @@
+package com.sd.business.entity.excel.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * excel生成记录
+ * </p>
+ *
+ * @author
+ * @since 2023-09-21
+ */
+@Getter
+@Setter
+@TableName("excel_generate_log")
+public class ExcelGenerateLog extends BasePo {
+
+    /**
+     * 业务类型
+     */
+    private Integer type;
+
+    /**
+     * 状态 1数据处理中 2excel生成中 3excel上传obs中 4完成
+     */
+    private Integer status;
+
+    /**
+     * excel文件名称
+     */
+    private String excelName;
+
+    /**
+     * excel文件路径
+     */
+    private String obsFileUrl;
+
+    /**
+     * 完成时间
+     */
+    private Date completionTime;
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/excel/vo/ExcelGenerateLogVo.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.excel.vo;
+
+import com.sd.business.entity.excel.po.ExcelGenerateLog;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * excel生成记录列表查询返回值实体
+ *
+ * @author
+ * @since 2023-09-21
+ */
+@Getter
+@Setter
+public class ExcelGenerateLogVo extends ExcelGenerateLog {
+
+}

+ 26 - 0
sd-business/src/main/java/com/sd/business/mapper/excel/ExcelGenerateLogMapper.java

@@ -0,0 +1,26 @@
+package com.sd.business.mapper.excel;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.excel.po.ExcelGenerateLog;
+import com.sd.business.entity.excel.vo.ExcelGenerateLogVo;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ * excel生成记录 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2023-09-21
+ */
+public interface ExcelGenerateLogMapper extends BaseMapper<ExcelGenerateLog> {
+
+    /**
+     * excel生成记录分页
+     */
+    Page<ExcelGenerateLogVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<ExcelGenerateLog> wrapper);
+
+}

+ 50 - 0
sd-business/src/main/java/com/sd/business/service/excel/ExcelGenerateLogService.java

@@ -0,0 +1,50 @@
+package com.sd.business.service.excel;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.excel.dto.ExcelGenerateLogDto;
+import com.sd.business.entity.excel.dto.ExcelGenerateLogSelectDto;
+import com.sd.business.entity.excel.enums.ExcelTypeEnum;
+import com.sd.business.entity.excel.po.ExcelGenerateLog;
+import com.sd.business.entity.excel.vo.ExcelGenerateLogVo;
+import com.sd.business.strategy.ExcelExportStrategy;
+
+
+/**
+ * <p>
+ * excel生成记录 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-09-21
+ */
+public interface ExcelGenerateLogService extends BaseService<ExcelGenerateLog> {
+
+    /**
+     * excel生成记录分页
+     */
+    Page<ExcelGenerateLogVo> getPage(ExcelGenerateLogSelectDto dto);
+
+    /**
+     * excel生成记录明细
+     */
+    ExcelGenerateLogVo detail(Long id);
+
+    /**
+     * excel生成记录新增
+     */
+    void add(ExcelGenerateLogDto excelGenerateLogDto);
+
+    /**
+     * excel生成记录编辑
+     */
+    void edit(ExcelGenerateLogDto excelGenerateLogDto);
+
+    /**
+     * excel生成记录删除
+     */
+    void delete(Long id);
+
+    <T> Long generateExcel(ExcelTypeEnum excelTypeEnum, ExcelExportStrategy<T> exportStrategy, String fileName);
+
+}

+ 172 - 0
sd-business/src/main/java/com/sd/business/service/excel/impl/ExcelGenerateLogServiceImpl.java

@@ -0,0 +1,172 @@
+package com.sd.business.service.excel.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.IdUtil;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.obs.services.ObsClient;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.excel.dto.ExcelGenerateLogDto;
+import com.sd.business.entity.excel.dto.ExcelGenerateLogSelectDto;
+import com.sd.business.entity.excel.enums.ExcelStatusEnum;
+import com.sd.business.entity.excel.enums.ExcelTypeEnum;
+import com.sd.business.entity.excel.po.ExcelGenerateLog;
+import com.sd.business.entity.excel.vo.ExcelGenerateLogVo;
+import com.sd.business.mapper.excel.ExcelGenerateLogMapper;
+import com.sd.business.service.excel.ExcelGenerateLogService;
+import com.sd.business.strategy.ExcelExportStrategy;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.InputStream;
+import java.util.Date;
+import java.util.StringJoiner;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * <p>
+ * excel生成记录 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-09-21
+ */
+@Service
+public class ExcelGenerateLogServiceImpl extends ServiceImpl<ExcelGenerateLogMapper, ExcelGenerateLog> implements ExcelGenerateLogService {
+
+
+    private static final ThreadPoolExecutor excelExecutor = new ThreadPoolExecutor(
+            3,
+            6,
+            60,
+            TimeUnit.SECONDS,
+            new LinkedBlockingQueue<>(6),
+            Executors.defaultThreadFactory(),
+            (Runnable runnable, ThreadPoolExecutor executor) -> {
+                throw new ServiceException("当前系统导出excel数量过多,系统负载过大,请稍后重试");
+            }
+    );
+
+    @Value("${obs.ak}")
+    private String ak;
+
+    @Value("${obs.sk}")
+    private String sk;
+
+    @Value("${obs.endPoint}")
+    private String endPoint;
+
+    @Value("${obs.url}")
+    private String url;
+
+    @Value("${obs.bucketName}")
+    private String bucketName;
+
+    @Value("${spring.profiles.active}")
+    private String active;
+
+    @Value("${ruoyi.name}")
+    private String name;
+
+
+    @Override
+    public Page<ExcelGenerateLogVo> getPage(ExcelGenerateLogSelectDto dto) {
+        IWrapper<ExcelGenerateLog> wrapper = getWrapper();
+        wrapper.orderByDesc("egl", ExcelGenerateLog::getId);
+        wrapper.eq("egl", ExcelGenerateLog::getCreateUser, SecurityUtils.getUserId());
+        Page<ExcelGenerateLogVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        return page;
+    }
+
+    @Override
+    public ExcelGenerateLogVo detail(Long id) {
+        ExcelGenerateLog ExcelGenerateLog = this.getById(id);
+        ExcelGenerateLogVo result = BeanUtil.toBean(ExcelGenerateLog, ExcelGenerateLogVo.class);
+        return result;
+    }
+
+    @Override
+    public void add(ExcelGenerateLogDto excelGenerateLogDto) {
+        this.save(excelGenerateLogDto);
+    }
+
+    @Override
+    public void edit(ExcelGenerateLogDto excelGenerateLogDto) {
+        this.updateById(excelGenerateLogDto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        this.removeById(id);
+    }
+
+    @Override
+    public <T> Long generateExcel(ExcelTypeEnum excelTypeEnum, ExcelExportStrategy<T> exportStrategy, String fileName) {
+
+        fileName = fileName + (fileName.endsWith(".xlsx") ? "" : fileName.endsWith(".xls?") ?
+                "x" : fileName.endsWith(".") ? "xlsx" : ".xlsx");
+
+        // 文件路径
+        String objectKey = new StringJoiner("/")
+                .add(name)
+                .add(active)
+                .add("excel")
+                .add(DateUtil.format(new Date(), "yyyy/MM/dd"))
+                .add(IdUtil.fastSimpleUUID())
+                .add(fileName)
+                .toString();
+
+        ExcelGenerateLog excelGenerateLog = new ExcelGenerateLog();
+        excelGenerateLog.setType(excelTypeEnum.getType());
+        excelGenerateLog.setStatus(ExcelStatusEnum.PROCESSING_DATA.getStatus());
+        excelGenerateLog.setExcelName(fileName);
+        excelGenerateLog.setObsFileUrl(url + objectKey);
+        save(excelGenerateLog);
+
+        Long id = excelGenerateLog.getId();
+
+        excelExecutor.execute(() -> {
+
+            DynamicDataSourceContextHolder.push("business");
+
+            try {
+                T data = exportStrategy.getData();
+                update(q -> q.eq(BaseIdPo::getId, id).set(ExcelGenerateLog::getStatus, ExcelStatusEnum.GENERATE.getStatus()));
+
+                InputStream inputStream = exportStrategy.getInputStream(data);
+                update(q -> q.eq(BaseIdPo::getId, id).set(ExcelGenerateLog::getStatus, ExcelStatusEnum.UPLOAD.getStatus()));
+
+                getObsClient().putObject(bucketName, objectKey, inputStream);
+                update(q -> q.eq(BaseIdPo::getId, id)
+                        .set(ExcelGenerateLog::getStatus, ExcelStatusEnum.COMPLETE.getStatus())
+                        .set(ExcelGenerateLog::getCompletionTime, new Date())
+                );
+            } catch (Exception e) {
+                log.error("导出失败", e);
+                update(q -> q.eq(BaseIdPo::getId, id)
+                        .set(ExcelGenerateLog::getStatus, ExcelStatusEnum.FAIL.getStatus())
+                        .set(ExcelGenerateLog::getCompletionTime, null));
+            } finally {
+                DynamicDataSourceContextHolder.poll();
+            }
+
+        });
+
+        return id;
+    }
+
+    private ObsClient getObsClient() {
+        return new ObsClient(ak, sk, endPoint);
+    }
+
+
+}

+ 0 - 5
sd-business/src/main/java/com/sd/business/service/statement/StatementOfAccountExportService.java

@@ -14,9 +14,4 @@ public interface StatementOfAccountExportService {
      */
     void exportDocumentByBom(List<Long> idList, String departmentName, String beginDate, String endDate);
 
-    /**
-     * 导出订单对账单
-     */
-    void exportDocumentByOrder(List<Long> idList, String departmentName, String beginDate, String endDate);
-
 }

+ 8 - 5
sd-business/src/main/java/com/sd/business/service/statement/impl/DocumentByOrderExcelCellMergeStrategy.java

@@ -16,6 +16,9 @@ import java.util.List;
 
 public class DocumentByOrderExcelCellMergeStrategy implements CellWriteHandler {
 
+    // sku需要合并的列
+    private final List<Integer> skuColIndex = Arrays.asList(3, 4, 5, 16, 17, 18, 19);
+
     // 无需合并的行数
     private final int mergeRowIndex = 3;
     // 订单无需合并的行
@@ -24,8 +27,7 @@ public class DocumentByOrderExcelCellMergeStrategy implements CellWriteHandler {
     private final List<Integer> orderColIndex = Arrays.asList(0, 1, 2, 20, 21);
     // sku无需合并的行
     private final List<Integer> skuRowIndex = new ArrayList<>();
-    // sku需要合并的列
-    private final List<Integer> skuColIndex = Arrays.asList(3, 4, 5, 15, 16, 17, 18, 19);
+    private Integer flag = 0;
 
     public DocumentByOrderExcelCellMergeStrategy(List<DocumentByOrderVo> documentByOrderVoList) {
         for (DocumentByOrderVo documentByOrderVo : documentByOrderVoList) {
@@ -72,7 +74,7 @@ public class DocumentByOrderExcelCellMergeStrategy implements CellWriteHandler {
         }
 
         // 合并sku列
-        if (skuColIndex.contains(curColIndex) && !skuRowIndex.contains(curRowIndex)) {
+        else if (skuColIndex.contains(curColIndex) && !skuRowIndex.contains(curRowIndex)) {
             mergeWithPrevRow(writeSheetHolder, curRowIndex, curColIndex);
         }
 
@@ -85,14 +87,15 @@ public class DocumentByOrderExcelCellMergeStrategy implements CellWriteHandler {
 
         Sheet sheet = writeSheetHolder.getSheet();
         List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
-
-        for (int i = 0; i < mergeRegions.size(); i++) {
+        for (int i = flag; i < mergeRegions.size(); i++) {
             CellRangeAddress cellRangeAddr = mergeRegions.get(i);
             // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
             if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
                 sheet.removeMergedRegion(i);
                 cellRangeAddr.setLastRow(curRowIndex);
                 sheet.addMergedRegion(cellRangeAddr);
+
+                flag = i;
                 return;
             }
         }

+ 0 - 55
sd-business/src/main/java/com/sd/business/service/statement/impl/StatementOfAccountExportServiceImpl.java

@@ -2,9 +2,7 @@ package com.sd.business.service.statement.impl;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.sd.business.entity.statement.bo.ExportDocumentByOrderBo;
 import com.sd.business.entity.statement.vo.DocumentByBomVo;
-import com.sd.business.entity.statement.vo.DocumentByOrderVo;
 import com.sd.business.entity.statement.vo.DocumentBySkuVo;
 import com.sd.business.service.statement.StatementOfAccountExportService;
 import com.sd.business.service.statement.StatementOfAccountService;
@@ -14,8 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletResponse;
-import java.math.BigDecimal;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -64,55 +60,4 @@ public class StatementOfAccountExportServiceImpl implements StatementOfAccountEx
         TemplateExcelUtil.writeBrowser("bomDocument.xlsx", "bom对账单", response, list, map);
     }
 
-    @Override
-    public void exportDocumentByOrder(List<Long> idList, String departmentName, String beginDate, String endDate) {
-
-        List<DocumentByOrderVo> list = statementOfAccountService.getDocumentByOrder(idList);
-
-        BigDecimal all = BigDecimal.ZERO;
-
-        List<ExportDocumentByOrderBo> exportDocumentByOrderBos = new ArrayList<>();
-        for (DocumentByOrderVo documentByOrderVo : list) {
-            List<DocumentByOrderVo.SkuSpec> skuSpecList = documentByOrderVo.getSkuSpecList();
-            for (DocumentByOrderVo.SkuSpec skuSpec : skuSpecList) {
-                List<DocumentByOrderVo.BomSpec> bomSpecList = skuSpec.getBomSpecList();
-                for (DocumentByOrderVo.BomSpec bomSpec : bomSpecList) {
-                    ExportDocumentByOrderBo exportDocumentByOrderBo = ExportDocumentByOrderBo.builder()
-                            .wlnCreateTime(documentByOrderVo.getWlnCreateTime())
-                            .code(documentByOrderVo.getCode())
-                            .wlnCode(documentByOrderVo.getWlnCode())
-                            .skuSpecCode(skuSpec.getSkuSpecCode())
-                            .skuSpecName(skuSpec.getSkuSpecName())
-                            .quantity(skuSpec.getQuantity())
-                            .unitPrice(skuSpec.getUnitPrice())
-                            .subtotal(skuSpec.getSubtotal())
-                            .bomSpecCode(bomSpec.getBomSpecCode())
-                            .bomSpecName(bomSpec.getBomSpecName())
-                            .bomQuantity(bomSpec.getQuantity())
-                            .bomUnitPrice(bomSpec.getUnitPrice())
-                            .laserLogoSummary(bomSpec.getLaserLogoSummary())
-                            .laserMitochondrialSummary(bomSpec.getLaserMitochondrialSummary())
-                            .lssueFeeSummary(bomSpec.getLssueFeeSummary())
-                            .deliveryMaterialsFeeSummary(bomSpec.getDeliveryMaterialsFeeSummary())
-                            .packingLaborSummary(bomSpec.getPackingLaborSummary())
-                            .managementFeeSummary(bomSpec.getManagementFeeSummary())
-                            .outerBoxPackingFee(documentByOrderVo.getOuterBoxPackingFee())
-                            .total(documentByOrderVo.getTotal())
-                            .build();
-                    exportDocumentByOrderBos.add(exportDocumentByOrderBo);
-                }
-            }
-            all = all.add(documentByOrderVo.getTotal());
-        }
-
-        Map<String, Object> map = new HashMap<>();
-        map.put("department", StrUtil.isBlank(departmentName) ? StringPool.EMPTY : departmentName + StringPool.DASH);
-        map.put("beginDate", beginDate);
-        map.put("endDate", endDate);
-        map.put("all", all);
-
-        TemplateExcelUtil.writeBrowser("orderDocument.xlsx", "订单对账单",
-                new DocumentByOrderExcelCellMergeStrategy(list), response, exportDocumentByOrderBos, map);
-    }
-
 }

+ 10 - 5
sd-business/src/main/java/com/sd/business/service/statement/impl/StatementOfAccountMergeServiceImpl.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.PageUtils;
+import com.sd.business.entity.excel.enums.ExcelTypeEnum;
 import com.sd.business.entity.order.po.OrderInfo;
 import com.sd.business.entity.statement.dto.ExportDocumentDto;
 import com.sd.business.entity.statement.dto.GetDocumentDto;
@@ -19,19 +20,18 @@ import com.sd.business.entity.statement.vo.DocumentByOrderVo;
 import com.sd.business.entity.statement.vo.DocumentBySkuVo;
 import com.sd.business.entity.statement.vo.StatementOfAccountMergePageVo;
 import com.sd.business.service.department.DepartmentService;
+import com.sd.business.service.excel.ExcelGenerateLogService;
 import com.sd.business.service.order.OrderService;
 import com.sd.business.service.statement.StatementOfAccountExportService;
 import com.sd.business.service.statement.StatementOfAccountMergeService;
 import com.sd.business.service.statement.StatementOfAccountService;
+import com.sd.business.strategy.impl.DocumentByOrderExcelExportStrategy;
 import com.sd.framework.util.Assert;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -57,6 +57,9 @@ public class StatementOfAccountMergeServiceImpl implements StatementOfAccountMer
     @Autowired
     private StatementOfAccountExportService statementOfAccountExportService;
 
+    @Autowired
+    private ExcelGenerateLogService excelGenerateLogService;
+
 
     @Override
     public Page<StatementOfAccountMergePageVo> getPage(StatementOfAccountMergePageDto dto) {
@@ -193,7 +196,9 @@ public class StatementOfAccountMergeServiceImpl implements StatementOfAccountMer
                 statementOfAccountExportService.exportDocumentByBom(idList, departmentName, beginDate, endDate);
                 break;
             case 3:
-                statementOfAccountExportService.exportDocumentByOrder(idList, departmentName, beginDate, endDate);
+                excelGenerateLogService.generateExcel(ExcelTypeEnum.STATISTICS_DOCUMENT_BY_ORDER,
+                        new DocumentByOrderExcelExportStrategy(idList, departmentName, beginDate, endDate),
+                        DateUtil.formatDate(new Date()) + " 对账报表");
                 break;
             default:
                 throw new ServiceException("未知对账单类型");

+ 9 - 1
sd-business/src/main/java/com/sd/business/service/statement/impl/StatementOfAccountServiceImpl.java

@@ -16,6 +16,7 @@ import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.framework.config.ThreadPoolConfig;
 import com.sd.business.entity.department.po.Department;
+import com.sd.business.entity.excel.enums.ExcelTypeEnum;
 import com.sd.business.entity.order.po.OrderInfo;
 import com.sd.business.entity.order.po.OrderSku;
 import com.sd.business.entity.order.po.OrderSkuBom;
@@ -27,12 +28,14 @@ import com.sd.business.entity.statement.vo.*;
 import com.sd.business.mapper.statement.StatementOfAccountMapper;
 import com.sd.business.service.bom.BomSpecService;
 import com.sd.business.service.department.DepartmentService;
+import com.sd.business.service.excel.ExcelGenerateLogService;
 import com.sd.business.service.order.OrderService;
 import com.sd.business.service.order.OrderSkuBomService;
 import com.sd.business.service.order.OrderSkuService;
 import com.sd.business.service.sku.SkuSpecService;
 import com.sd.business.service.statement.StatementOfAccountExportService;
 import com.sd.business.service.statement.StatementOfAccountService;
+import com.sd.business.strategy.impl.DocumentByOrderExcelExportStrategy;
 import com.sd.business.util.CodeEnum;
 import com.sd.framework.util.Assert;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -88,6 +91,9 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
     @Autowired
     private ThreadPoolExecutor threadPoolExecutor;
 
+    @Autowired
+    private ExcelGenerateLogService excelGenerateLogService;
+
     @Override
     public Page<StatementOfAccountVo> getPage(StatementOfAccountSelectDto dto) {
 
@@ -500,7 +506,9 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
                 statementOfAccountExportService.exportDocumentByBom(idList, departmentName, date, date);
                 break;
             case 3:
-                statementOfAccountExportService.exportDocumentByOrder(idList, departmentName, date, date);
+                excelGenerateLogService.generateExcel(ExcelTypeEnum.STATISTICS_DOCUMENT_BY_ORDER,
+                        new DocumentByOrderExcelExportStrategy(idList, departmentName, date, date),
+                        DateUtil.formatDate(new Date()) + " 对账单");
                 break;
             default:
                 throw new ServiceException("未知对账单类型");

+ 11 - 0
sd-business/src/main/java/com/sd/business/strategy/ExcelExportStrategy.java

@@ -0,0 +1,11 @@
+package com.sd.business.strategy;
+
+import java.io.InputStream;
+
+public interface ExcelExportStrategy<T> {
+
+    T getData();
+
+    InputStream getInputStream(T data);
+
+}

+ 141 - 0
sd-business/src/main/java/com/sd/business/strategy/impl/DocumentByOrderExcelExportStrategy.java

@@ -0,0 +1,141 @@
+package com.sd.business.strategy.impl;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.ruoyi.common.exception.ServiceException;
+import com.sd.business.entity.statement.bo.ExportDocumentByOrderBo;
+import com.sd.business.entity.statement.vo.DocumentByOrderVo;
+import com.sd.business.service.statement.StatementOfAccountService;
+import com.sd.business.service.statement.impl.DocumentByOrderExcelCellMergeStrategy;
+import com.sd.business.strategy.ExcelExportStrategy;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.ClassPathResource;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 订单对账单
+ */
+@Slf4j
+public class DocumentByOrderExcelExportStrategy implements ExcelExportStrategy<Map<String, Object>> {
+
+    private static final StatementOfAccountService statementOfAccountService = SpringUtil.getBean(StatementOfAccountService.class);
+
+    private final List<Long> idList;
+    private final String departmentName;
+    private final String beginDate;
+    private final String endDate;
+
+    private List<DocumentByOrderVo> list;
+
+    public DocumentByOrderExcelExportStrategy(List<Long> idList, String departmentName, String beginDate, String endDate) {
+        this.idList = idList;
+        this.departmentName = departmentName;
+        this.beginDate = beginDate;
+        this.endDate = endDate;
+    }
+
+    @Override
+    public Map<String, Object> getData() {
+        list = statementOfAccountService.getDocumentByOrder(idList);
+
+        BigDecimal all = BigDecimal.ZERO;
+
+        List<ExportDocumentByOrderBo> exportDocumentByOrderBos = new ArrayList<>();
+        for (DocumentByOrderVo documentByOrderVo : list) {
+            List<DocumentByOrderVo.SkuSpec> skuSpecList = documentByOrderVo.getSkuSpecList();
+            for (DocumentByOrderVo.SkuSpec skuSpec : skuSpecList) {
+                List<DocumentByOrderVo.BomSpec> bomSpecList = skuSpec.getBomSpecList();
+                for (DocumentByOrderVo.BomSpec bomSpec : bomSpecList) {
+                    ExportDocumentByOrderBo exportDocumentByOrderBo = ExportDocumentByOrderBo.builder()
+                            .wlnCreateTime(documentByOrderVo.getWlnCreateTime())
+                            .code(documentByOrderVo.getCode())
+                            .wlnCode(documentByOrderVo.getWlnCode())
+                            .skuSpecCode(skuSpec.getSkuSpecCode())
+                            .skuSpecName(skuSpec.getSkuSpecName())
+                            .quantity(skuSpec.getQuantity())
+                            .unitPrice(skuSpec.getUnitPrice())
+                            .subtotal(skuSpec.getSubtotal())
+                            .bomSpecCode(bomSpec.getBomSpecCode())
+                            .bomSpecName(bomSpec.getBomSpecName())
+                            .bomQuantity(bomSpec.getQuantity())
+                            .bomUnitPrice(bomSpec.getUnitPrice())
+                            .laserLogoSummary(bomSpec.getLaserLogoSummary())
+                            .laserMitochondrialSummary(bomSpec.getLaserMitochondrialSummary())
+                            .lssueFeeSummary(bomSpec.getLssueFeeSummary())
+                            .deliveryMaterialsFeeSummary(bomSpec.getDeliveryMaterialsFeeSummary())
+                            .packingLaborSummary(bomSpec.getPackingLaborSummary())
+                            .managementFeeSummary(bomSpec.getManagementFeeSummary())
+                            .outerBoxPackingFee(documentByOrderVo.getOuterBoxPackingFee())
+                            .total(documentByOrderVo.getTotal())
+                            .build();
+                    exportDocumentByOrderBos.add(exportDocumentByOrderBo);
+                }
+            }
+            all = all.add(documentByOrderVo.getTotal());
+        }
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("department", StrUtil.isBlank(departmentName) ? StringPool.EMPTY : departmentName + StringPool.DASH);
+        map.put("beginDate", beginDate);
+        map.put("endDate", endDate);
+        map.put("all", all);
+        map.put("exportDocumentByOrderBos", exportDocumentByOrderBos);
+        return map;
+    }
+
+    @Override
+    public InputStream getInputStream(Map<String, Object> data) {
+        List<ExportDocumentByOrderBo> exportDocumentByOrderBos = (List<ExportDocumentByOrderBo>) data.remove("exportDocumentByOrderBos");
+
+        try {
+            String filePath = "tempExcel" + File.separator + IdWorker.getId() + ".xlsx";
+            File tempExcel = new File("tempExcel");
+            if (!tempExcel.exists()) {
+                tempExcel.mkdir();
+            }
+            FileOutputStream os = new FileOutputStream(filePath);
+
+            ClassPathResource classPathResource = new ClassPathResource("template" + File.separator + "orderDocument.xlsx");
+            InputStream is = classPathResource.getInputStream();
+            ExcelWriter excelWriter = EasyExcel.write(os).withTemplate(is).build();
+            try {
+                DocumentByOrderExcelCellMergeStrategy strategy = new DocumentByOrderExcelCellMergeStrategy(list);
+                WriteSheet writeSheet = EasyExcel.writerSheet().registerWriteHandler(strategy).build();
+                FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
+
+                excelWriter.fill(data, fillConfig, writeSheet);
+                excelWriter.fill(exportDocumentByOrderBos, fillConfig, writeSheet);
+            } finally {
+                if (excelWriter != null) {
+                    excelWriter.finish();
+                    excelWriter.close();
+                }
+                os.close();
+                is.close();
+            }
+
+            File file = new File(filePath);
+            ByteArrayInputStream inputStream = new ByteArrayInputStream(FileUtil.readBytes(file));
+            file.delete();
+
+            return inputStream;
+        } catch (IOException e) {
+            log.error("excel导出失败", e);
+            throw new ServiceException("excel导出失败");
+        }
+    }
+
+}

+ 20 - 0
sd-business/src/main/resources/mapper/excel/ExcelGenerateLogMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sd.business.mapper.excel.ExcelGenerateLogMapper">
+    <select id="getPage" resultType="com.sd.business.entity.excel.vo.ExcelGenerateLogVo">
+        select egl.id,
+               egl.type,
+               egl.param,
+               egl.status,
+               egl.obs_file_url,
+               egl.excel_name,
+               egl.completion_time,
+               egl.create_user,
+               egl.create_time,
+               egl.update_user,
+               egl.update_time
+        from excel_generate_log egl
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>

+ 7 - 0
sd-starter/src/test/java/TestList.java

@@ -139,4 +139,11 @@ public class TestList {
         System.out.println(JSON.toJSONString(collect));
     }
 
+    public static void main(String[] args) {
+        String a = "{\n" +
+                "    \"idGroupConcat\": \"1699739286011727873,1702638389020454914,1700101673936044034,1700464061822562305,1702276001603575809,1700826449696530434,1701928713001660417,1701551225520091137,1701106726288019458,1701106725822451713,1701106725755342850,1701106725625319426,1701106725558210565,1701106725558210564,1699376899223990273\"\n" +
+                "}";
+        System.out.println(a);
+    }
+
 }