From d1e0a02c66f3f7bbce0a3b420e8272c4f739e59e Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Fri, 22 May 2026 14:54:10 +0800 Subject: [PATCH] =?UTF-8?q?2026-05-21=20=E5=AE=9E=E6=97=B6=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E5=AF=BC=E5=87=BA=EF=BC=8C=E8=B6=8510000=E6=9D=A1?= =?UTF-8?q?=E7=9A=84=EF=BC=8C=E5=AF=BC=E4=B8=8D=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/controller/WmsPrintController.java | 10 ++ .../modules/wms/service/WmsPrintService.java | 9 ++ .../wms/service/impl/WmsPrintServiceImpl.java | 138 +++++++++++++++--- 3 files changed, 139 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/gaotao/modules/wms/controller/WmsPrintController.java b/src/main/java/com/gaotao/modules/wms/controller/WmsPrintController.java index f13d0d4..63801a1 100644 --- a/src/main/java/com/gaotao/modules/wms/controller/WmsPrintController.java +++ b/src/main/java/com/gaotao/modules/wms/controller/WmsPrintController.java @@ -11,6 +11,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -99,6 +101,14 @@ public class WmsPrintController { PageUtils page = wmsPrintService.getKuCunLabelData( inData); return R.ok().put("page", page); } + + /** + * @description 实时库存导出(分批流式) + */ + @PostMapping("exportKuCunLabelData") + public void exportKuCunLabelData(@RequestBody InventoryStockOutData inData, HttpServletResponse response) throws IOException { + wmsPrintService.exportKuCunLabelData(inData, response); + } /** * * @description 库存表 状态 改为冻结 diff --git a/src/main/java/com/gaotao/modules/wms/service/WmsPrintService.java b/src/main/java/com/gaotao/modules/wms/service/WmsPrintService.java index 2bd5a9a..5eceef1 100644 --- a/src/main/java/com/gaotao/modules/wms/service/WmsPrintService.java +++ b/src/main/java/com/gaotao/modules/wms/service/WmsPrintService.java @@ -7,6 +7,8 @@ import com.gaotao.modules.wms.data.PoOrderRollNoOutData; import com.gaotao.modules.wms.entity.PoOrderRollNoImportData; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -45,6 +47,13 @@ public interface WmsPrintService { PageUtils getKuCunLabelData(InventoryStockOutData inData); + /** + * @description 实时库存导出(分批流式写出) + * @param inData 查询参数 + * @param response HttpServletResponse + */ + void exportKuCunLabelData(InventoryStockOutData inData, HttpServletResponse response) throws IOException; + /** * @description 批量更新库存标签属性(batch_no和remark) * @author AI diff --git a/src/main/java/com/gaotao/modules/wms/service/impl/WmsPrintServiceImpl.java b/src/main/java/com/gaotao/modules/wms/service/impl/WmsPrintServiceImpl.java index c9dd86f..6270eda 100644 --- a/src/main/java/com/gaotao/modules/wms/service/impl/WmsPrintServiceImpl.java +++ b/src/main/java/com/gaotao/modules/wms/service/impl/WmsPrintServiceImpl.java @@ -13,6 +13,9 @@ import com.gaotao.modules.wms.data.InboundQcResultData; import com.gaotao.modules.wms.data.PoOrderRollNoOutData; import com.gaotao.modules.wms.entity.PoOrderRollNoImportData; import com.gaotao.modules.wms.service.WmsPrintService; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.xssf.streaming.SXSSFSheet; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -22,11 +25,15 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.List; import java.util.Map; +import java.net.URLEncoder; /** * @CLASSNAME WmsPrintServiceImpl @@ -127,6 +134,62 @@ public class WmsPrintServiceImpl implements WmsPrintService { return new PageUtils(list); } + @Override + public void exportKuCunLabelData(InventoryStockOutData inData, HttpServletResponse response) throws IOException { + if (inData == null) { + inData = new InventoryStockOutData(); + } + + final int batchSize = 5000; + final SimpleDateFormat dateTimeFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); + + String fileName = URLEncoder.encode( + "实时库存数据_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new java.util.Date()), + "UTF-8" + ).replace("+", "%20"); + + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName + ".xlsx"); + + SXSSFWorkbook workbook = new SXSSFWorkbook(500); + workbook.setCompressTempFiles(true); + try { + SXSSFSheet sheet = workbook.createSheet("实时库存数据"); + int rowIndex = 0; + Row headerRow = sheet.createRow(rowIndex++); + fillInventoryHeader(headerRow); + + long currentPage = 1L; + long totalPages = 1L; + while (currentPage <= totalPages) { + IPage pageData = this.wmsPrintDao.getKuCunLabelData(new Page(currentPage, batchSize), inData); + totalPages = Math.max(pageData.getPages(), 1L); + List records = pageData.getRecords(); + if (records == null || records.isEmpty()) { + break; + } + + for (InventoryStockOutData item : records) { + Row row = sheet.createRow(rowIndex++); + fillInventoryRow(row, item, dateTimeFormatter, dateFormatter); + } + sheet.flushRows(500); + currentPage++; + } + + workbook.write(response.getOutputStream()); + response.flushBuffer(); + } finally { + try { + workbook.close(); + } finally { + workbook.dispose(); + } + } + } + @Override @Transactional public void updateInventoryStockAttribute(List inList){ @@ -147,13 +210,8 @@ public class WmsPrintServiceImpl implements WmsPrintService { @Override @Transactional public void uploadPoPartPrintExcel(MultipartFile file, PoOrderRollNoImportData importData) { - InputStream is = null; - XSSFWorkbook workbook = null; - try { - // 转流 - is = file.getInputStream(); - // 读取工作簿 - workbook = new XSSFWorkbook(is); + try (InputStream is = file.getInputStream(); + XSSFWorkbook workbook = new XSSFWorkbook(is)) { // 读取工作表 XSSFSheet sheet = workbook.getSheetAt(0); // 获取行数 @@ -285,17 +343,6 @@ public class WmsPrintServiceImpl implements WmsPrintService { } } catch (Exception e) { throw new RuntimeException("导入失败:" + e.getMessage()); - } finally { - try { - if (workbook != null) { - workbook.close(); - } - if (is != null) { - is.close(); - } - } catch (Exception e) { - // 忽略关闭异常 - } } } @@ -348,4 +395,59 @@ public class WmsPrintServiceImpl implements WmsPrintService { return result; } + + private void fillInventoryHeader(Row headerRow) { + String[] headers = new String[]{ + "BU", "标签条码", "标签数量", "标签状态", "物料编码", "物料名称", "规格型号", "单位", + "标签类型", "上级标签号", "上级标签类型", "仓库", "库位", "入库日期", "生产日期", "有效期", + "来源单据类型", "来源单据号", "来源单据行号", "合约号码", "批次号", "备注说明" + }; + for (int i = 0; i < headers.length; i++) { + headerRow.createCell(i).setCellValue(headers[i]); + } + } + + private void fillInventoryRow(Row row, InventoryStockOutData item, SimpleDateFormat dateTimeFormatter, SimpleDateFormat dateFormatter) { + String[] values = new String[]{ + safeValue(item.getBuNo()), + safeValue(item.getRollNo()), + safeValue(item.getQtyOnHand()), + safeValue(item.getStatus()), + safeValue(item.getPartNo()), + safeValue(item.getPartDescription()), + safeValue(item.getSpec()), + safeValue(item.getUmName()), + safeValue(item.getLabelType()), + safeValue(item.getParentRollNo()), + safeValue(item.getParentRollType()), + safeValue(item.getWarehouseName()), + safeValue(item.getLocationName()), + formatDate(item.getFirstInDate(), dateTimeFormatter), + formatDate(item.getManufactureDate(), dateFormatter), + formatDate(item.getExpiredDate(), dateFormatter), + safeValue(item.getOrderref0()), + safeValue(item.getOrderref1()), + safeValue(item.getOrderref2()), + safeValue(item.getBatchNo()), + safeValue(item.getWdr()), + safeValue(item.getRemark()) + }; + for (int i = 0; i < values.length; i++) { + row.createCell(i).setCellValue(values[i]); + } + } + + private String formatDate(java.util.Date value, SimpleDateFormat formatter) { + if (value == null) { + return ""; + } + return formatter.format(value); + } + + private String safeValue(Object value) { + if (value == null) { + return ""; + } + return String.valueOf(value); + } } \ No newline at end of file