From 7403a0bb5b6c69a830c326aa7bc4fa720d23477a Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期四, 23 四月 2026 11:21:03 +0800
Subject: [PATCH] 导出销售台账送货单

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java |  157 +++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 141 insertions(+), 16 deletions(-)

diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index c09ccd0..53dfed7 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -3,6 +3,8 @@
 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.alibaba.excel.write.metadata.fill.FillWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -242,11 +244,109 @@
             throw new BaseException("鏈壘鍒板搴旈攢鍞彴璐︽暟鎹�");
         }
 
+        // 鏍规嵁閿�鍞彴璐︽暟閲忓喅瀹氬鍑烘柟寮�
+        if (salesLedgerList.size() == 1) {
+            // 鍗曚釜閿�鍞彴璐︼紝鐩存帴瀵煎嚭xlsx鏂囦欢
+            exportSingleShippingNote(response, salesLedgerList.get(0));
+        } else {
+            // 澶氫釜閿�鍞彴璐︼紝鐢熸垚鍘嬬缉鍖�
+            exportBatchShippingNote(response, salesLedgerList);
+        }
+    }
+    
+    /**
+     * 瀵煎嚭鍗曚釜閫佽揣鍗�
+     */
+    private void exportSingleShippingNote(HttpServletResponse response, SalesLedger ledger) {
+        try {
+            // 璁剧疆鍝嶅簲澶�
+            String fileName = String.format("閫佽揣鍗昣%s.xlsx",
+                    Optional.ofNullable(ledger.getSalesContractNo()).orElse(String.valueOf(ledger.getId())));
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
+            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+
+            // 鏌ヨ鏄庣粏
+            SalesLedgerProduct cond = new SalesLedgerProduct();
+            cond.setSalesLedgerId(ledger.getId());
+            List<SalesLedgerProduct> productList = salesLedgerProductServiceImpl.selectSalesLedgerProductList(cond);
+
+            // 鑷姩搴忓彿+鐗╂枡缂栫爜璧嬪��
+            for (int i = 0; i < productList.size(); i++) {
+                SalesLedgerProduct product = productList.get(i);
+                if (product != null) {
+                    product.setSerialNumber(i + 1);
+                    product.setOrderNo(ledger.getSalesContractNo());
+                    Long productModelId = product.getProductModelId();
+                    if (productModelId != null) {
+                        ProductModel productModel = productModelMapper.selectById(productModelId);
+                        if (productModel != null) {
+                            product.setMaterialCode(productModel.getMaterialCode());
+                        }
+                    }
+                }
+            }
+
+            // 鍏宠仈瀹㈡埛淇℃伅
+            Customer customer = customerMapper.selectById(ledger.getCustomerId());
+
+            // 璁$畻鎬诲悎璁�
+            BigDecimal totalQuantity = BigDecimal.ZERO;
+            for (SalesLedgerProduct product : productList) {
+                totalQuantity = totalQuantity.add(product.getQuantity() == null ? BigDecimal.ZERO : product.getQuantity());
+            }
+
+            // 缁勮椤堕儴闈欐�佹暟鎹�
+            Map<String, Object> dataMap = new HashMap<>();
+            dataMap.put("customerName", ledger.getCustomerName());
+            dataMap.put("companyAddress", customer.getCompanyAddress());
+            dataMap.put("contactPerson", customer.getContactPerson());
+            dataMap.put("contactPhone", customer.getContactPhone());
+            dataMap.put("companyPhone", customer.getCompanyPhone());
+            dataMap.put("salesContractNo", ledger.getSalesContractNo());
+            dataMap.put("deliveryDate", formatDate(LocalDate.now()));
+            dataMap.put("totalQuantity", totalQuantity);
+
+            // 浣跨敤妯℃澘鐢熸垚Excel
+            InputStream templateIs = this.getClass().getResourceAsStream("/static/shipping-note.xlsx");
+            if (templateIs == null) {
+                throw new BaseException("妯℃澘鏂囦欢涓嶅瓨鍦�");
+            }
+
+            ExcelWriter writer = EasyExcel.write(response.getOutputStream()).withTemplate(templateIs).build();
+            WriteSheet sheet = EasyExcel.writerSheet().build();
+
+            // 鍏堝~鍏呮暟鎹紙鍖呮嫭鍚堣锛�
+            writer.fill(dataMap, sheet);
+
+            // 鍐嶅~鍏呬骇鍝佸垪琛�
+            if (!productList.isEmpty()) {
+                FillConfig fillConfig = FillConfig.builder()
+                        .forceNewRow(Boolean.TRUE)
+                        .build();
+                writer.fill(productList, fillConfig, sheet);
+            }
+
+            writer.finish();
+            templateIs.close();
+        } catch (BaseException e) {
+            log.error("瀵煎嚭澶辫触:{}", e.getMessage(), e);
+            throw e;
+        } catch (Exception e) {
+            log.error("瀵煎嚭寮傚父", e);
+            throw new BaseException("瀵煎嚭澶辫触锛�" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 鎵归噺瀵煎嚭閫佽揣鍗曚负鍘嬬缉鍖�
+     */
+    private void exportBatchShippingNote(HttpServletResponse response, List<SalesLedger> salesLedgerList) {
+        // 璁剧疆鍝嶅簲澶�
         response.setContentType("application/zip");
         response.setHeader("Content-Disposition", "attachment;filename=閫佽揣鍗�.zip");
         response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
 
-        // 鐩存帴鍐呭瓨鎵撳寘锛屾姏寮冧复鏃舵枃浠�
         try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
 
             for (SalesLedger ledger : salesLedgerList) {
@@ -257,14 +357,32 @@
                 cond.setSalesLedgerId(ledger.getId());
                 List<SalesLedgerProduct> productList = salesLedgerProductServiceImpl.selectSalesLedgerProductList(cond);
 
-                // 鑷姩搴忓彿
+                // 鑷姩搴忓彿+鐗╂枡缂栫爜璧嬪��
                 for (int i = 0; i < productList.size(); i++) {
-                    productList.get(i).setSerialNumber(i + 1);
+                    SalesLedgerProduct product = productList.get(i);
+                    if (product != null) {
+                        product.setSerialNumber(i + 1);
+                        product.setOrderNo(ledger.getSalesContractNo());
+                        Long productModelId = product.getProductModelId();
+                        if (productModelId != null) {
+                            ProductModel productModel = productModelMapper.selectById(productModelId);
+                            if (productModel != null) {
+                                product.setMaterialCode(productModel.getMaterialCode());
+                            }
+                        }
+                    }
                 }
 
-                // 鍏宠仈鏌ヨ瀹㈡埛淇℃伅
+                // 鍏宠仈瀹㈡埛淇℃伅
                 Customer customer = customerMapper.selectById(ledger.getCustomerId());
-                // 缁勮鏁版嵁
+
+                // 璁$畻鎬诲悎璁�
+                BigDecimal totalQuantity = BigDecimal.ZERO;
+                for (SalesLedgerProduct product : productList) {
+                    totalQuantity = totalQuantity.add(product.getQuantity() == null ? BigDecimal.ZERO : product.getQuantity());
+                }
+
+                // 缁勮椤堕儴闈欐�佹暟鎹�
                 Map<String, Object> dataMap = new HashMap<>();
                 dataMap.put("customerName", ledger.getCustomerName());
                 dataMap.put("companyAddress", customer.getCompanyAddress());
@@ -273,22 +391,29 @@
                 dataMap.put("companyPhone", customer.getCompanyPhone());
                 dataMap.put("salesContractNo", ledger.getSalesContractNo());
                 dataMap.put("deliveryDate", formatDate(LocalDate.now()));
-                // 鏀惧叆鍟嗗搧闆嗗悎
-                dataMap.put("products", productList);
+                dataMap.put("totalQuantity", totalQuantity);
 
-                // 姣忔寰幆鍏ㄦ柊璇诲彇妯℃澘锛屽交搴曡В鍐虫祦闂
                 ByteArrayOutputStream bos = new ByteArrayOutputStream();
-                try (InputStream templateIs = this.getClass().getResourceAsStream("/static/shipping-note.xlsx")) {
-                    if (templateIs == null) throw new BaseException("妯℃澘鏂囦欢涓嶅瓨鍦�");
+                InputStream templateIs = this.getClass().getResourceAsStream("/static/shipping-note.xlsx");
 
-                    // EasyExcel濉厖
-                    ExcelWriter writer = EasyExcel.write(bos).withTemplate(templateIs).build();
-                    WriteSheet sheet = EasyExcel.writerSheet().build();
-                    writer.fill(dataMap, sheet);
-                    writer.finish();
+                ExcelWriter writer = EasyExcel.write(bos).withTemplate(templateIs).build();
+                WriteSheet sheet = EasyExcel.writerSheet().build();
+
+                // 鍏堝~鍏呮暟鎹紙鍖呮嫭鍚堣锛�
+                writer.fill(dataMap, sheet);
+                
+                // 鍐嶅~鍏呬骇鍝佸垪琛�
+                if (!productList.isEmpty()) {
+                    FillConfig fillConfig = FillConfig.builder()
+                            .forceNewRow(Boolean.TRUE)
+                            .build();
+                    writer.fill(productList, fillConfig, sheet);
                 }
 
-                // 鎵撳寘杩沍IP
+                writer.finish();
+                templateIs.close();
+
+                // 鎵撳寘ZIP
                 String excelName = String.format("閫佽揣鍗昣%s.xlsx",
                         Optional.ofNullable(ledger.getSalesContractNo()).orElse(String.valueOf(ledger.getId())));
                 ZipEntry entry = new ZipEntry(excelName);

--
Gitblit v1.9.3