From 4aa8f25ae83a724a86cb3ccd1326fd32a5c897f4 Mon Sep 17 00:00:00 2001 From: "HUOJIN\\92525" <925258474@qq.com> Date: Fri, 9 May 2025 14:26:15 +0800 Subject: [PATCH] no message --- .../address/controller/AddressController.java | 1 - .../address/service/AddressQueryService.java | 2 +- .../service/impl/AddressQueryServiceImpl.java | 93 +++++++------------ .../business/wms/excel/ExportTaskService.java | 4 - .../sa/base/common/util/SmartExcelUtil.java | 77 +++++++++++++-- 5 files changed, 100 insertions(+), 77 deletions(-) diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/base/address/controller/AddressController.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/base/address/controller/AddressController.java index 33f9760..d482fdb 100644 --- a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/base/address/controller/AddressController.java +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/base/address/controller/AddressController.java @@ -124,7 +124,6 @@ public class AddressController { @GetMapping("/address/exportAddress/{taskId}") @SaCheckPermission("address:exportAddress") public void exportAddress(@PathVariable String taskId, HttpServletResponse response) { - System.out.println(exportTaskService.isTaskExists(taskId)); addressQueryService.exportAddress(taskId, response); } } diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/base/address/service/AddressQueryService.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/base/address/service/AddressQueryService.java index 5f09933..a4896f5 100644 --- a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/base/address/service/AddressQueryService.java +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/base/address/service/AddressQueryService.java @@ -56,7 +56,7 @@ public interface AddressQueryService { List queryAddressExcel(); - List queryAddressExcel2(); + List queryAddressExcel2(String taskId); List queryAddressExcel3(); diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/base/address/service/impl/AddressQueryServiceImpl.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/base/address/service/impl/AddressQueryServiceImpl.java index 807a988..538d580 100644 --- a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/base/address/service/impl/AddressQueryServiceImpl.java +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/base/address/service/impl/AddressQueryServiceImpl.java @@ -1,11 +1,5 @@ package net.lab1024.sa.admin.module.business.wms.base.address.service.impl; -import cn.idev.excel.ExcelWriter; -import cn.idev.excel.FastExcel; -import cn.idev.excel.write.metadata.WriteSheet; -import cn.idev.excel.write.metadata.style.WriteCellStyle; -import cn.idev.excel.write.metadata.style.WriteFont; -import cn.idev.excel.write.style.HorizontalCellStyleStrategy; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Maps; @@ -24,6 +18,7 @@ import net.lab1024.sa.admin.module.business.wms.base.item.domain.vo.ItemsExcelVO import net.lab1024.sa.admin.module.business.wms.excel.ExportTaskService; import net.lab1024.sa.base.common.domain.PageResult; import net.lab1024.sa.base.common.exception.BusinessException; +import net.lab1024.sa.base.common.util.SmartExcelUtil; import net.lab1024.sa.base.common.util.SmartPageUtil; import net.lab1024.sa.base.common.util.SmartResponseUtil; import net.lab1024.sa.base.module.support.dict.constant.DictConst; @@ -158,12 +153,16 @@ public class AddressQueryServiceImpl implements AddressQueryService { return excelData; } - public List queryAddressExcel2() { + public List queryAddressExcel2(String taskId) { System.out.println("开始读取地址数据..."); long startTime = System.currentTimeMillis(); List excelData = new ArrayList<>(); + //总条数 + long total = addressManager.count(); long lastId = 0; // 初始化为最小ID-1 int pageSize = 2000; // 根据测试调整 + //进度条 + long processed = 0; while (true) { List batch = addressDao.listByCursor(lastId, pageSize); if (batch.isEmpty()) { @@ -179,7 +178,14 @@ public class AddressQueryServiceImpl implements AddressQueryService { excelData.add(excelVO); } lastId = batch.stream().mapToLong(AddressVO::getAddressId).max().orElse(0); + processed += batch.size(); + + //计算进度条 + long progress = processed * 100 / total; + exportTaskService.updateProgress(taskId, progress); + System.out.println("已处理:" + processed + "条数据,进度:" + progress + "%"); } + exportTaskService.updateProgress(taskId, 100); long endTime = System.currentTimeMillis(); System.out.println("查询,共" + excelData.size() + "条数据,耗时:" + (endTime - startTime) + "ms"); return excelData; @@ -209,66 +215,31 @@ public class AddressQueryServiceImpl implements AddressQueryService { return list; } - public void exportAddress(String taskId, HttpServletResponse response) { - System.out.println("开始读取地址数据..."); - long startTime = System.currentTimeMillis(); - SmartResponseUtil.setDownloadFileHeader(response, "收货地址信息.xlsx", null); - WriteCellStyle headWriteCellStyle = new WriteCellStyle(); - headWriteCellStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex()); - - WriteFont headWriteFont = new WriteFont(); - headWriteFont.setFontName("宋体"); - headWriteFont.setColor(IndexedColors.WHITE.getIndex()); - headWriteCellStyle.setWriteFont(headWriteFont); - - WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); - contentWriteCellStyle.setFillForegroundColor(IndexedColors.BLACK.getIndex()); - - HorizontalCellStyleStrategy horizontalCellStyleStrategy = - new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); - - try (ExcelWriter excelWriter = FastExcel.write(response.getOutputStream(), AddressExcelVO.class).registerWriteHandler(horizontalCellStyleStrategy).build()) { - WriteSheet writeSheet = FastExcel.writerSheet("收货地址信息").build(); - //总条数 - long total = addressManager.count(); - // 初始化为最小ID-1 - long lastId = 0; - // 根据测试调整 - int pageSize = 2000; - //进度条 - long processed = 0; - while (true) { - List batch = addressDao.listByCursor(lastId, pageSize); - if (batch.isEmpty()) { - break; - } - List excelData = new ArrayList<>(); - for (AddressVO address : batch) { - AddressExcelVO excelVO = AddressExcelVO.builder() + public void exportAddress(String taskId, HttpServletResponse response){ + try { + SmartExcelUtil.batchExportExcel( + response, + "收货地址信息.xlsx", + "收货地址信息", + AddressExcelVO.class, + taskId, + addressManager.count(), + (lastId, pageSize) -> addressDao.listByCursor(lastId, pageSize), + address -> AddressExcelVO.builder() .name(address.getName()) .person(address.getPerson()) .telephone(address.getTelephone()) .address(address.getAddress()) - .build(); - excelData.add(excelVO); - } - excelWriter.write(excelData, writeSheet); - lastId = batch.stream().mapToLong(AddressVO::getAddressId).max().orElse(0); - processed += batch.size(); - - //计算进度条 - long progress = processed * 100 / total; - exportTaskService.updateProgress(taskId, progress); - System.out.println("已处理:" + processed + "条数据,进度:" + progress + "%"); - } - System.out.println("导出耗时:" + (System.currentTimeMillis() - startTime) + "ms"); - excelWriter.finish(); + .build(), + AddressVO::getAddressId, + 2000, + (processed, progress) -> exportTaskService.updateProgress(taskId, progress) + ); + } catch (Exception e) { + exportTaskService.updateProgress(taskId, -1); + } finally { exportTaskService.updateProgress(taskId, 100); exportTaskService.cleanupTask(taskId); - } catch (Exception e) { - throw new BusinessException("导出失败"); } } - - } diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/excel/ExportTaskService.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/excel/ExportTaskService.java index 1ed2884..88883c4 100644 --- a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/excel/ExportTaskService.java +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/excel/ExportTaskService.java @@ -20,10 +20,6 @@ public class ExportTaskService { return taskId; } - public boolean isTaskExists(String taskId) { - return progressMap.containsKey(taskId); - } - public void updateProgress(String taskId, long progress) { progressMap.put(taskId, progress); } diff --git a/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartExcelUtil.java b/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartExcelUtil.java index 27bdb16..57544fb 100644 --- a/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartExcelUtil.java +++ b/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartExcelUtil.java @@ -1,14 +1,18 @@ package net.lab1024.sa.base.common.util; +import cn.idev.excel.ExcelWriter; import cn.idev.excel.FastExcel; import cn.idev.excel.write.handler.SheetWriteHandler; +import cn.idev.excel.write.metadata.WriteSheet; import cn.idev.excel.write.metadata.holder.WriteSheetHolder; import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder; import cn.idev.excel.write.metadata.style.WriteCellStyle; import cn.idev.excel.write.metadata.style.WriteFont; +import cn.idev.excel.write.style.HorizontalCellStyleStrategy; import jakarta.servlet.http.HttpServletResponse; import lombok.Data; import lombok.extern.slf4j.Slf4j; +import net.lab1024.sa.base.common.exception.BusinessException; import org.apache.poi.openxml4j.opc.PackagePartName; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.openxml4j.opc.TargetMode; @@ -26,9 +30,14 @@ import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Collection; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.function.ToLongFunction; +import java.util.stream.Collectors; /** - * * excel 工具类 * * @Author 1024创新实验室-主任:卓大 @@ -42,27 +51,75 @@ public final class SmartExcelUtil { /** * 通用单sheet导出 */ - public static void exportExcel(HttpServletResponse response, String fileName, String sheetName, Class head,Collection data) throws IOException { + public static void exportExcel(HttpServletResponse response, String fileName, String sheetName, Class head, Collection data) throws IOException { // 设置下载消息头 SmartResponseUtil.setDownloadFileHeader(response, fileName, null); - WriteCellStyle headWriteCellStyle = new WriteCellStyle(); - headWriteCellStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex()); - WriteFont headWriteFont = new WriteFont(); - headWriteFont.setFontName("宋体"); - headWriteFont.setColor(IndexedColors.WHITE.getIndex()); - headWriteCellStyle.setWriteFont(headWriteFont); + //样式 + HorizontalCellStyleStrategy horizontalCellStyleStrategy = getHorizontalCellStyleStrategy(); // 下载 FastExcel.write(response.getOutputStream(), head) .autoCloseStream(Boolean.FALSE) .sheet(sheetName) + .registerWriteHandler(horizontalCellStyleStrategy) .doWrite(data); } + public static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy() { + + WriteCellStyle headWriteCellStyle = new WriteCellStyle(); + headWriteCellStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex()); + + WriteFont headWriteFont = new WriteFont(); + headWriteFont.setFontName("宋体"); + headWriteFont.setColor(IndexedColors.WHITE.getIndex()); + headWriteCellStyle.setWriteFont(headWriteFont); + + WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); + contentWriteCellStyle.setFillForegroundColor(IndexedColors.BLACK.getIndex()); + + return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); + } + + public static void batchExportExcel(HttpServletResponse response, String fileName, String sheetName, Class head, String taskId, long total, BiFunction> pageQueryFunction, Function convertFunction, ToLongFunction idExtractor, int pageSize, BiConsumer progressUpdater) throws IOException { + SmartResponseUtil.setDownloadFileHeader(response, fileName, null); + HorizontalCellStyleStrategy horizontalCellStyleStrategy = getHorizontalCellStyleStrategy(); + try (ExcelWriter excelWriter = FastExcel.write(response.getOutputStream(), head).registerWriteHandler(horizontalCellStyleStrategy).build()) { + WriteSheet writeSheet = FastExcel.writerSheet(sheetName).build(); + long lastId = 0;//最后一个id + long processed = 0;//进度条 + while (true) { + List batch = pageQueryFunction.apply(lastId, pageSize); + if (batch.isEmpty()) { + break; + } + + List excelData = batch.stream() + .map(convertFunction) + .collect(Collectors.toList()); + excelWriter.write(excelData, writeSheet); + + lastId = batch.stream() + .mapToLong(idExtractor) + .max() + .orElse(lastId); + + processed += batch.size(); + + long progress = processed * 100 / total; + progressUpdater.accept(taskId, progress); + } + excelWriter.finish(); + } catch (Exception e) { + throw new BusinessException("导出失败"); + } + + } + /** * 通用单 sheet水印 导出 */ - public static void exportExcelWithWatermark(HttpServletResponse response, String fileName, String sheetName, Class head,Collection data, String watermarkString) throws IOException { + public static void exportExcelWithWatermark(HttpServletResponse response, String fileName, String sheetName, Class head, Collection data, String watermarkString) throws IOException { // 设置下载消息头 SmartResponseUtil.setDownloadFileHeader(response, fileName, null); // 水印 @@ -191,7 +248,7 @@ public final class SmartExcelUtil { /** * 画笔颜色 */ - private Color color = new Color(239,239,239); + private Color color = new Color(239, 239, 239); /** * 字体样式