From 93b93bacbe43fcd2f13884ec02782baf77193d35 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期二, 21 四月 2026 11:05:00 +0800
Subject: [PATCH] feat: 销售台账增加一个宽高搜索,页面加面积、数量的字段展示

---
 src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java                  |    7 +
 src/main/java/com/ruoyi/sales/dto/SalesLedgerProductTotalsDto.java     |   13 ++
 src/main/resources/mapper/sales/SalesLedgerMapper.xml                  |   14 ++
 src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java    |  100 +-------------------
 src/main/resources/mapper/sales/SalesLedgerProductMapper.xml           |   16 +++
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java |  108 +++++++++++++++++++++
 src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java     |    3 
 src/main/java/com/ruoyi/sales/pojo/SalesLedger.java                    |   13 ++
 src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java                |    3 
 9 files changed, 181 insertions(+), 96 deletions(-)

diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index b8863c1..807aeaf 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -1,8 +1,6 @@
 package com.ruoyi.sales.controller;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.basic.pojo.Customer;
 import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -14,8 +12,6 @@
 import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.sales.dto.*;
 import com.ruoyi.sales.mapper.InvoiceLedgerMapper;
-import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
-import com.ruoyi.sales.pojo.ReceiptPayment;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProcessRoute;
 import com.ruoyi.sales.service.ICommonFileService;
@@ -59,9 +55,6 @@
 
     @Autowired
     private InvoiceLedgerMapper invoiceLedgerMapper;
-
-    @Autowired
-    private ReceiptPaymentMapper receiptPaymentMapper;
 
     /**
      * 瀵煎叆閿�鍞彴璐�
@@ -118,7 +111,7 @@
      * 鏌ヨ閿�鍞彴璐﹀垪琛�
      */
     @GetMapping("/list")
-    public TableDataInfo list(Page page, SalesLedgerDto salesLedgerDto) {
+    public TableDataInfo list(Page<?> page, SalesLedgerDto salesLedgerDto) {
         startPage();
         List<SalesLedger> list = salesLedgerService.selectSalesLedgerList(salesLedgerDto);
         // 璁$畻宸插紑绁ㄩ噾棰�/鏈紑绁ㄩ噾棰�(宸插~鍐欏彂绁ㄩ噾棰濅负鍑�)
@@ -156,7 +149,7 @@
     @Log(title = "閿�鍞彴璐�", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, SalesLedgerDto salesLedgerDto) {
-        Page page = new Page(-1, -1);
+        Page<?> page = new Page<>(-1, -1);
         IPage<SalesLedger> salesLedgerIPage = listPage(page, salesLedgerDto);
         ExcelUtil<SalesLedger> util = new ExcelUtil<SalesLedger>(SalesLedger.class);
         if (salesLedgerIPage == null) {
@@ -173,7 +166,7 @@
     @Log(title = "瀵煎嚭寮�绁ㄧ櫥璁板垪琛�", businessType = BusinessType.EXPORT)
     @PostMapping("/exportOne")
     public void exportOne(HttpServletResponse response, SalesLedgerDto salesLedgerDto) {
-        Page page = new Page();
+        Page<?> page = new Page<>();
         page.setCurrent(-1);
         page.setSize(-1);
         IPage<SalesLedger> salesLedgerIPage = listPage(page, salesLedgerDto);
@@ -269,91 +262,8 @@
      * 鏌ヨ閿�鍞彴璐﹀垪琛�
      */
     @GetMapping("/listPage")
-    public IPage<SalesLedger> listPage(Page page, SalesLedgerDto salesLedgerDto) {
-        IPage<SalesLedger> iPage = salesLedgerService.selectSalesLedgerListPage(page, salesLedgerDto);
-
-        //  鏌ヨ缁撴灉涓虹┖,鐩存帴杩斿洖
-        if (CollectionUtils.isEmpty(iPage.getRecords())) {
-            return iPage;
-        }
-
-        //  鑾峰彇褰撳墠椤垫墍鏈夊彴璐﹁褰曠殑 ID 闆嗗悎
-        List<Long> salesLedgerIds = iPage.getRecords().stream().map(SalesLedger::getId).collect(Collectors.toList());
-
-        //  鏌ヨ鍙戠エ淇℃伅鐨勫凡寮�绁ㄩ噾棰�
-        List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds);
-        if (CollectionUtils.isEmpty(invoiceLedgerDtoList)) {
-            invoiceLedgerDtoList = Collections.emptyList();
-        }
-
-        //  杞崲鍙戠エ鏁版嵁, key 涓哄彴璐D, value 涓鸿鍙拌处鐨勬�诲紑绁ㄩ噾棰�
-        Map<Long, BigDecimal> invoiceTotals = invoiceLedgerDtoList.stream()
-                .filter(dto -> dto.getSalesLedgerId() != null && dto.getInvoiceTotal() != null)
-                .collect(Collectors.toMap(
-                        dto -> dto.getSalesLedgerId().longValue(),
-                        InvoiceLedgerDto::getInvoiceTotal,
-                        BigDecimal::add // 瀛樺湪閲嶅ID鎵ц绱姞
-                ));
-
-        //  鏌ヨ鍥炴/浠樻璁板綍
-        List<ReceiptPayment> receiptPayments = Collections.emptyList();
-        if (!CollectionUtils.isEmpty(salesLedgerIds)) {
-            receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>()
-                    .in(ReceiptPayment::getSalesLedgerId, salesLedgerIds));
-        }
-
-        //  杞崲鍥炴鏁版嵁, key 涓哄彴璐D, value 涓鸿鍙拌处鐨勬�诲洖娆鹃噾棰�
-        Map<Long, BigDecimal> receiptTotals = new HashMap<>();
-        if (!CollectionUtils.isEmpty(receiptPayments)) {
-            for (ReceiptPayment receiptPayment : receiptPayments) {
-                if (receiptPayment.getSalesLedgerId() != null && receiptPayment.getReceiptPaymentAmount() != null) {
-                    //  濡傛灉 key 瀛樺湪鍒欑浉鍔�,涓嶅瓨鍦ㄥ垯鏀惧叆
-                    receiptTotals.merge(receiptPayment.getSalesLedgerId(), receiptPayment.getReceiptPaymentAmount(), BigDecimal::add);
-                }
-            }
-        }
-
-        for (SalesLedger salesLedger : iPage.getRecords()) {
-            Long ledgerId = salesLedger.getId();
-            // 鍚堝悓鎬婚噾棰�
-            BigDecimal contractAmount = salesLedger.getContractAmount() == null ? BigDecimal.ZERO : salesLedger.getContractAmount();
-            // 寮�绁ㄦ�婚鍜屽洖娆炬�婚
-            BigDecimal invoiceTotal = invoiceTotals.getOrDefault(ledgerId, BigDecimal.ZERO);
-            BigDecimal receiptPaymentAmountTotal = receiptTotals.getOrDefault(ledgerId, BigDecimal.ZERO);
-
-            //  鏈紑绁ㄩ噾棰� = 鍚堝悓閲戦 - 宸插紑绁ㄩ噾棰�
-            BigDecimal noInvoiceAmountTotal = contractAmount.subtract(invoiceTotal);
-            if (noInvoiceAmountTotal.compareTo(BigDecimal.ZERO) < 0) {
-                noInvoiceAmountTotal = BigDecimal.ZERO;
-            }
-
-            //  寰呭洖娆鹃噾棰� = 宸插紑绁ㄩ噾棰� - 宸插洖娆鹃噾棰�
-            BigDecimal noReceiptPaymentAmountTotal = invoiceTotal.subtract(receiptPaymentAmountTotal);
-            if (noReceiptPaymentAmountTotal.compareTo(BigDecimal.ZERO) < 0) {
-                noReceiptPaymentAmountTotal = BigDecimal.ZERO;
-            }
-
-            salesLedger.setNoInvoiceAmountTotal(noInvoiceAmountTotal);
-            salesLedger.setInvoiceTotal(invoiceTotal);
-            salesLedger.setReceiptPaymentAmountTotal(receiptPaymentAmountTotal);
-            salesLedger.setNoReceiptAmount(noReceiptPaymentAmountTotal);
-
-            //  濡傛灉宸茬粡鏈夎繃寮�绁ㄦ垨鍥炴鎿嶄綔,鍒欎笉鍏佽缂栬緫
-            boolean hasInvoiceOperation = invoiceTotal.compareTo(BigDecimal.ZERO) > 0;
-            boolean hasReceiptOperation = receiptPaymentAmountTotal.compareTo(BigDecimal.ZERO) > 0;
-            salesLedger.setIsEdit(!(hasInvoiceOperation || hasReceiptOperation));
-        }
-
-        if (ObjectUtils.isNotEmpty(salesLedgerDto.getStatus())) {
-            if (salesLedgerDto.getStatus()) {
-                // 娓呴櫎鎵�鏈夆�滄湭寮�绁ㄩ噾棰濃�濅负 0 鐨勮褰�
-                iPage.getRecords().removeIf(salesLedger ->
-                        Objects.equals(salesLedger.getNoInvoiceAmountTotal(), new BigDecimal("0.00")));
-                iPage.setTotal(iPage.getRecords().size());
-            }
-        }
-
-        return iPage;
+    public IPage<SalesLedger> listPage(Page<?> page, SalesLedgerDto salesLedgerDto) {
+        return salesLedgerService.selectSalesLedgerListPage(page, salesLedgerDto);
     }
 
     @ApiOperation("鏌ヨ閿�鍞彴璐︽秷鑰楃墿鏂欎俊鎭�")
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java b/src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java
index e81bae8..1aca386 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java
@@ -65,6 +65,9 @@
         @ApiModelProperty("浜у搧鍚嶇О")
         private String productName;
 
+        @ApiModelProperty("瑙勬牸鍨嬪彿")
+        private String specificationModel;
+
         @ApiModelProperty("鏄庣粏鍒楄〃")
         private List<InvoiceItemDto> items;
 
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
index 19e872b..daf8781 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -8,6 +8,7 @@
 import lombok.Data;
 
 import java.time.LocalDate;
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -65,4 +66,10 @@
 
     @ApiModelProperty(value = "鍏ュ簱鐘舵��")
     private Integer stockStatus;
+
+    @ApiModelProperty(value = "浜у搧瀹�")
+    private BigDecimal width;
+
+    @ApiModelProperty(value = "浜у搧楂�")
+    private BigDecimal height;
 }
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductTotalsDto.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductTotalsDto.java
new file mode 100644
index 0000000..06afbe7
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductTotalsDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.sales.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class SalesLedgerProductTotalsDto {
+    private Long salesLedgerId;
+    private BigDecimal totalQuantity;
+    private BigDecimal totalArea;
+}
+
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
index bd095e7..649f322 100644
--- a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
+++ b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
@@ -5,6 +5,7 @@
 import com.ruoyi.common.config.MyBaseMapper;
 import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto;
 import com.ruoyi.purchase.dto.ProcurementBusinessSummaryStatisticsDto;
+import com.ruoyi.sales.dto.SalesLedgerProductTotalsDto;
 import com.ruoyi.sales.dto.LossProductModelDto;
 import com.ruoyi.sales.dto.SalesLedgerProductDto;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
@@ -36,6 +37,8 @@
 
     ProcurementBusinessSummaryStatisticsDto procurementBusinessSummaryStatistics(@Param("req") ProcurementBusinessSummaryDto procurementBusinessSummaryDto);
 
+    List<SalesLedgerProductTotalsDto> selectSalesLedgerProductTotals(@Param("salesLedgerIds") List<Long> salesLedgerIds, @Param("type") Integer type);
+
     List<LossProductModelDto> selectProductBomStructure(@Param("salesLedegerId") Long salesLedegerId);
 
     List<Map<String, Object>> selectProductSalesAnalysis();
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
index 18cecc3..692cbfc 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -10,6 +10,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
+import java.util.List;
 
 /**
  * 閿�鍞彴璐﹀璞� sales_ledger
@@ -165,5 +166,17 @@
     @TableField(exist = false)
     //鏄惁鍙紪杈�
     private Boolean isEdit;
+
+    @TableField(exist = false)
+    @ApiModelProperty("璁㈠崟浜у搧鎬绘暟閲�")
+    private BigDecimal productTotalQuantity = BigDecimal.ZERO;
+
+    @TableField(exist = false)
+    @ApiModelProperty("璁㈠崟浜у搧鎬婚潰绉�(銕�)")
+    private BigDecimal productTotalArea = BigDecimal.ZERO;
+
+    @TableField(exist = false)
+    @ApiModelProperty("鍛戒腑鐨勯攢鍞骇鍝佸垪琛�")
+    private List<SalesLedgerProduct> matchedProducts;
 }
 
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 280568a..9b21618 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -418,7 +418,112 @@
 
     @Override
     public IPage<SalesLedger> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto) {
-        return salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto);
+        IPage<SalesLedger> iPage = salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto);
+
+        if (CollectionUtils.isEmpty(iPage.getRecords())) {
+            return iPage;
+        }
+
+        List<Long> salesLedgerIds = iPage.getRecords().stream().map(SalesLedger::getId).collect(Collectors.toList());
+
+        boolean hasWidthHeightFilter = salesLedgerDto.getWidth() != null || salesLedgerDto.getHeight() != null;
+        Map<Long, List<SalesLedgerProduct>> matchedProductsMap = Collections.emptyMap();
+        if (hasWidthHeightFilter) {
+            LambdaQueryWrapper<SalesLedgerProduct> productQueryWrapper = new LambdaQueryWrapper<SalesLedgerProduct>()
+                    .in(SalesLedgerProduct::getSalesLedgerId, salesLedgerIds)
+                    .eq(SalesLedgerProduct::getType, 1);
+            if (salesLedgerDto.getWidth() != null) {
+                productQueryWrapper.eq(SalesLedgerProduct::getWidth, salesLedgerDto.getWidth());
+            }
+            if (salesLedgerDto.getHeight() != null) {
+                productQueryWrapper.eq(SalesLedgerProduct::getHeight, salesLedgerDto.getHeight());
+            }
+            List<SalesLedgerProduct> matchedProducts = salesLedgerProductMapper.selectList(productQueryWrapper);
+            matchedProductsMap = CollectionUtils.isEmpty(matchedProducts) ? Collections.emptyMap()
+                    : matchedProducts.stream().collect(Collectors.groupingBy(SalesLedgerProduct::getSalesLedgerId));
+        }
+
+        List<SalesLedgerProductTotalsDto> productTotals = salesLedgerProductMapper.selectSalesLedgerProductTotals(salesLedgerIds, 1);
+        Map<Long, SalesLedgerProductTotalsDto> productTotalsMap = CollectionUtils.isEmpty(productTotals)
+                ? Collections.emptyMap()
+                : productTotals.stream()
+                .filter(t -> t.getSalesLedgerId() != null)
+                .collect(Collectors.toMap(SalesLedgerProductTotalsDto::getSalesLedgerId, Function.identity(), (a, b) -> a));
+
+        List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds);
+        if (CollectionUtils.isEmpty(invoiceLedgerDtoList)) {
+            invoiceLedgerDtoList = Collections.emptyList();
+        }
+
+        Map<Long, BigDecimal> invoiceTotals = invoiceLedgerDtoList.stream()
+                .filter(dto -> dto.getSalesLedgerId() != null && dto.getInvoiceTotal() != null)
+                .collect(Collectors.toMap(
+                        dto -> dto.getSalesLedgerId().longValue(),
+                        InvoiceLedgerDto::getInvoiceTotal,
+                        BigDecimal::add
+                ));
+
+        List<ReceiptPayment> receiptPayments = Collections.emptyList();
+        if (!CollectionUtils.isEmpty(salesLedgerIds)) {
+            receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>()
+                    .in(ReceiptPayment::getSalesLedgerId, salesLedgerIds));
+        }
+
+        Map<Long, BigDecimal> receiptTotals = new HashMap<>();
+        if (!CollectionUtils.isEmpty(receiptPayments)) {
+            for (ReceiptPayment receiptPayment : receiptPayments) {
+                if (receiptPayment.getSalesLedgerId() != null && receiptPayment.getReceiptPaymentAmount() != null) {
+                    receiptTotals.merge(receiptPayment.getSalesLedgerId(), receiptPayment.getReceiptPaymentAmount(), BigDecimal::add);
+                }
+            }
+        }
+
+        for (SalesLedger salesLedger : iPage.getRecords()) {
+            Long ledgerId = salesLedger.getId();
+
+            SalesLedgerProductTotalsDto totals = productTotalsMap.get(ledgerId);
+            if (totals != null) {
+                salesLedger.setProductTotalQuantity(totals.getTotalQuantity() != null ? totals.getTotalQuantity() : BigDecimal.ZERO);
+                salesLedger.setProductTotalArea(totals.getTotalArea() != null ? totals.getTotalArea() : BigDecimal.ZERO);
+            } else {
+                salesLedger.setProductTotalQuantity(BigDecimal.ZERO);
+                salesLedger.setProductTotalArea(BigDecimal.ZERO);
+            }
+            if (hasWidthHeightFilter) {
+                salesLedger.setMatchedProducts(matchedProductsMap.getOrDefault(ledgerId, Collections.emptyList()));
+            }
+
+            BigDecimal contractAmount = salesLedger.getContractAmount() == null ? BigDecimal.ZERO : salesLedger.getContractAmount();
+            BigDecimal invoiceTotal = invoiceTotals.getOrDefault(ledgerId, BigDecimal.ZERO);
+            BigDecimal receiptPaymentAmountTotal = receiptTotals.getOrDefault(ledgerId, BigDecimal.ZERO);
+
+            BigDecimal noInvoiceAmountTotal = contractAmount.subtract(invoiceTotal);
+            if (noInvoiceAmountTotal.compareTo(BigDecimal.ZERO) < 0) {
+                noInvoiceAmountTotal = BigDecimal.ZERO;
+            }
+
+            BigDecimal noReceiptPaymentAmountTotal = invoiceTotal.subtract(receiptPaymentAmountTotal);
+            if (noReceiptPaymentAmountTotal.compareTo(BigDecimal.ZERO) < 0) {
+                noReceiptPaymentAmountTotal = BigDecimal.ZERO;
+            }
+
+            salesLedger.setNoInvoiceAmountTotal(noInvoiceAmountTotal);
+            salesLedger.setInvoiceTotal(invoiceTotal);
+            salesLedger.setReceiptPaymentAmountTotal(receiptPaymentAmountTotal);
+            salesLedger.setNoReceiptAmount(noReceiptPaymentAmountTotal);
+
+            boolean hasInvoiceOperation = invoiceTotal.compareTo(BigDecimal.ZERO) > 0;
+            boolean hasReceiptOperation = receiptPaymentAmountTotal.compareTo(BigDecimal.ZERO) > 0;
+            salesLedger.setIsEdit(!(hasInvoiceOperation || hasReceiptOperation));
+        }
+
+        if (salesLedgerDto.getStatus() != null && salesLedgerDto.getStatus()) {
+            iPage.getRecords().removeIf(salesLedger ->
+                    Objects.equals(salesLedger.getNoInvoiceAmountTotal(), new BigDecimal("0.00")));
+            iPage.setTotal(iPage.getRecords().size());
+        }
+
+        return iPage;
     }
 
     @Override
@@ -1536,6 +1641,7 @@
                 Set<String> orderNos = groupOrderNos.getOrDefault(key, Collections.emptySet());
                 group.setSalesContractNo(String.join(",", orderNos));
                 group.setProductName(productName);
+                group.setSpecificationModel(specificationModel);
 
                 Map<String, SalesInvoicesDto.InvoiceItemDto> mergedItems = new LinkedHashMap<>();
                 BigDecimal groupQty = BigDecimal.ZERO;
diff --git a/src/main/resources/mapper/sales/SalesLedgerMapper.xml b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
index 38592a3..99f36e8 100644
--- a/src/main/resources/mapper/sales/SalesLedgerMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -95,6 +95,20 @@
             <if test="salesLedgerDto.stockStatus != null">
                 AND T1.stock_status = #{salesLedgerDto.stockStatus}
             </if>
+            <if test="salesLedgerDto.width != null or salesLedgerDto.height != null">
+                AND EXISTS (
+                SELECT 1
+                FROM sales_ledger_product SLP
+                WHERE SLP.sales_ledger_id = T1.id
+                AND SLP.type = 1
+                <if test="salesLedgerDto.width != null">
+                    AND SLP.width = #{salesLedgerDto.width}
+                </if>
+                <if test="salesLedgerDto.height != null">
+                    AND SLP.height = #{salesLedgerDto.height}
+                </if>
+                )
+            </if>
         </where>
         ORDER BY T1.entry_date DESC,T1.id DESC
     </select>
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
index 46db172..e7791c9 100644
--- a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -278,4 +278,20 @@
                                  FROM product_tree);
 
     </select>
+
+    <select id="selectSalesLedgerProductTotals" resultType="com.ruoyi.sales.dto.SalesLedgerProductTotalsDto">
+        SELECT
+            slp.sales_ledger_id AS salesLedgerId,
+            COALESCE(SUM(slp.quantity), 0) AS totalQuantity,
+            COALESCE(SUM(COALESCE(slp.settle_total_area, slp.actual_total_area, 0)), 0) AS totalArea
+        FROM sales_ledger_product slp
+        WHERE slp.sales_ledger_id IN
+        <foreach collection="salesLedgerIds" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        <if test="type != null">
+            AND slp.type = #{type}
+        </if>
+        GROUP BY slp.sales_ledger_id
+    </select>
 </mapper>

--
Gitblit v1.9.3