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