From 000205578dc02b9d9ac0e2e5dee740142f4cff80 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期二, 21 四月 2026 10:36:30 +0800
Subject: [PATCH] fix: 销售发货单打印有多个产品时只展示一个产品名称

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java |   92 ++++++++++++++++++++++++++--------------------
 src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java                |    3 +
 2 files changed, 55 insertions(+), 40 deletions(-)

diff --git a/src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java b/src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java
index 5026f2d..e81bae8 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java
@@ -86,6 +86,9 @@
         @ApiModelProperty("瀹�*楂�")
         private String widthHeight;
 
+        @ApiModelProperty("瑙勬牸鍨嬪彿")
+        private String specificationModel;
+
         @ApiModelProperty("鏁伴噺")
         private BigDecimal quantity;
 
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 4d7e21f..9b4d1a1 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -1498,64 +1498,76 @@
 
         //  鏌ヨ鎵�鏈変骇鍝�
         List<SalesLedgerProduct> allProducts = salesLedgerProductMapper.selectList(
-                new LambdaQueryWrapper<SalesLedgerProduct>().in(SalesLedgerProduct::getSalesLedgerId, salesLedgerIds));
+                new LambdaQueryWrapper<SalesLedgerProduct>()
+                        .in(SalesLedgerProduct::getSalesLedgerId, salesLedgerIds)
+                        .eq(SalesLedgerProduct::getType, 1));
 
         if (CollectionUtils.isNotEmpty(allProducts)) {
             Map<Long, SalesLedger> ledgerMap = ledgers.stream()
                     .collect(Collectors.toMap(SalesLedger::getId, Function.identity()));
 
-            Map<Long, List<SalesLedgerProduct>> groupedData = new LinkedHashMap<>();
-            for (SalesLedgerProduct p : allProducts) {
-                groupedData.computeIfAbsent(p.getSalesLedgerId(), k -> new ArrayList<>()).add(p);
-            }
-
             List<SalesInvoicesDto.InvoiceOrderGroupDto> groups = new ArrayList<>();
             BigDecimal totalQty = BigDecimal.ZERO;
             BigDecimal totalArea = BigDecimal.ZERO;
 
-            for (Map.Entry<Long, List<SalesLedgerProduct>> ledgerEntry : groupedData.entrySet()) {
+            Map<Long, Map<String, List<SalesLedgerProduct>>> groupedData = new LinkedHashMap<>();
+            for (SalesLedgerProduct p : allProducts) {
+                Long ledgerId = p.getSalesLedgerId();
+                String productCategory = StringUtils.defaultString(p.getProductCategory(), "");
+                String specificationModel = StringUtils.defaultString(p.getSpecificationModel(), "");
+                String groupKey = productCategory + "||" + specificationModel;
+                groupedData.computeIfAbsent(ledgerId, k -> new LinkedHashMap<>())
+                        .computeIfAbsent(groupKey, k -> new ArrayList<>())
+                        .add(p);
+            }
+
+            for (Map.Entry<Long, Map<String, List<SalesLedgerProduct>>> ledgerEntry : groupedData.entrySet()) {
                 SalesLedger ledger = ledgerMap.get(ledgerEntry.getKey());
                 String orderNo = ledger != null ? ledger.getSalesContractNo() : "";
-                List<SalesLedgerProduct> products = ledgerEntry.getValue();
 
-                SalesInvoicesDto.InvoiceOrderGroupDto group = new SalesInvoicesDto.InvoiceOrderGroupDto();
-                group.setSalesContractNo(orderNo);
-                if (CollectionUtils.isNotEmpty(products)) {
-                    group.setProductName(products.get(0).getProductCategory());
-                }
+                for (Map.Entry<String, List<SalesLedgerProduct>> productEntry : ledgerEntry.getValue().entrySet()) {
+                    String key = productEntry.getKey();
+                    String[] parts = key.split("\\|\\|", -1);
+                    String productName = parts.length > 0 ? parts[0] : "";
+                    List<SalesLedgerProduct> products = productEntry.getValue();
 
-                List<SalesInvoicesDto.InvoiceItemDto> itemDtos = new ArrayList<>();
-                BigDecimal groupQty = BigDecimal.ZERO;
-                BigDecimal groupArea = BigDecimal.ZERO;
+                    SalesInvoicesDto.InvoiceOrderGroupDto group = new SalesInvoicesDto.InvoiceOrderGroupDto();
+                    group.setSalesContractNo(orderNo);
+                    group.setProductName(productName);
+                    List<SalesInvoicesDto.InvoiceItemDto> itemDtos = new ArrayList<>();
+                    BigDecimal groupQty = BigDecimal.ZERO;
+                    BigDecimal groupArea = BigDecimal.ZERO;
 
-                for (SalesLedgerProduct p : products) {
-                    SalesInvoicesDto.InvoiceItemDto item = new SalesInvoicesDto.InvoiceItemDto();
-                    item.setFloorCode(p.getFloorCode());
-                    item.setWidthHeight((p.getWidth() != null ? p.getWidth().stripTrailingZeros().toPlainString() : "0") +
-                            " * " + (p.getHeight() != null ? p.getHeight().stripTrailingZeros().toPlainString() : "0"));
-                    item.setQuantity(p.getQuantity());
+                    for (SalesLedgerProduct p : products) {
+                        SalesInvoicesDto.InvoiceItemDto item = new SalesInvoicesDto.InvoiceItemDto();
+                        item.setFloorCode(p.getFloorCode());
+                        item.setWidthHeight((p.getWidth() != null ? p.getWidth().stripTrailingZeros().toPlainString() : "0") +
+                                " * " + (p.getHeight() != null ? p.getHeight().stripTrailingZeros().toPlainString() : "0"));
+                        item.setSpecificationModel(p.getSpecificationModel());
+                        item.setQuantity(p.getQuantity());
 
-                    // 闈㈢Н
-                    BigDecimal area = p.getSettleTotalArea() != null ? p.getSettleTotalArea() : p.getActualTotalArea();
-                    if (area == null && p.getWidth() != null && p.getHeight() != null && p.getQuantity() != null) {
-                        area = p.getWidth().multiply(p.getHeight()).multiply(p.getQuantity()).divide(new BigDecimal(1000000), 2, RoundingMode.HALF_UP);
+                        // 闈㈢Н
+                        BigDecimal area = p.getSettleTotalArea() != null ? p.getSettleTotalArea() : p.getActualTotalArea();
+                        if (area == null && p.getWidth() != null && p.getHeight() != null && p.getQuantity() != null) {
+                            area = p.getWidth().multiply(p.getHeight()).multiply(p.getQuantity()).divide(new BigDecimal(1000000), 2, RoundingMode.HALF_UP);
+                        }
+                        item.setArea(area);
+                        item.setRemark(p.getRemark());
+                        item.setProcessRequirement(p.getProcessRequirement());
+
+                        itemDtos.add(item);
+                        groupQty = groupQty.add(p.getQuantity() != null ? p.getQuantity() : BigDecimal.ZERO);
+                        groupArea = groupArea.add(area != null ? area : BigDecimal.ZERO);
                     }
-                    item.setArea(area);
-                    item.setRemark(p.getRemark());
-                    item.setProcessRequirement(p.getProcessRequirement());
 
-                    itemDtos.add(item);
-                    groupQty = groupQty.add(p.getQuantity() != null ? p.getQuantity() : BigDecimal.ZERO);
-                    groupArea = groupArea.add(area != null ? area : BigDecimal.ZERO);
+                    group.setItems(itemDtos);
+                    group.setGroupTotalQuantity(groupQty);
+                    group.setGroupTotalArea(groupArea.setScale(2, RoundingMode.HALF_UP));
+                    groups.add(group);
+
+                    totalQty = totalQty.add(groupQty);
+                    totalArea = totalArea.add(groupArea);
                 }
-
-                group.setItems(itemDtos);
-                group.setGroupTotalQuantity(groupQty);
-                group.setGroupTotalArea(groupArea.setScale(2, RoundingMode.HALF_UP));
-                groups.add(group);
-
-                totalQty = totalQty.add(groupQty);
-                totalArea = totalArea.add(groupArea);
             }
             dto.setGroups(groups);
             dto.setTotalQuantity(totalQty);

--
Gitblit v1.9.3