From 360f96ffb62a0ba418c0de0a4a5b5f537912872e Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 26 五月 2025 14:05:08 +0800
Subject: [PATCH] 首页数据

---
 src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java |  266 ++++++++++++++++++++-----
 src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java            |   14 +
 src/main/java/com/ruoyi/purchase/service/IPaymentRegistrationService.java         |    9 
 src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java               |   12 +
 src/main/java/com/ruoyi/sales/service/ReceiptPaymentService.java                  |    3 
 src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java                       |    8 
 src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java          |   17 -
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java            |  127 +++++++++++-
 src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java         |   37 +++
 src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java                    |    3 
 src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java    |   44 ++-
 src/main/java/com/ruoyi/sales/dto/MonthlyAmountDto.java                           |   13 +
 12 files changed, 446 insertions(+), 107 deletions(-)

diff --git a/src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java b/src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java
index b8f233d..6ba3a59 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java
@@ -1,5 +1,7 @@
 package com.ruoyi.purchase.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
@@ -13,17 +15,17 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 浠樻鐧昏Controller
- * 
+ *
  * @author ruoyi
  * @date 2025-05-15
  */
 @RestController
 @RequestMapping("/purchase/paymentRegistration")
-public class PaymentRegistrationController extends BaseController
-{
+public class PaymentRegistrationController extends BaseController {
     @Autowired
     private IPaymentRegistrationService paymentRegistrationService;
 
@@ -32,8 +34,7 @@
      */
 //    @PreAuthorize("@ss.hasPermi('system:registration:list')")
     @GetMapping("/list")
-    public TableDataInfo list(PaymentRegistrationDto paymentRegistrationDto)
-    {
+    public TableDataInfo list(PaymentRegistrationDto paymentRegistrationDto) {
         startPage();
         List<PaymentRegistrationDto> list = paymentRegistrationService.selectPaymentRegistrationList(paymentRegistrationDto);
         return getDataTable(list);
@@ -55,8 +56,7 @@
      * 鑾峰彇浠樻鐧昏璇︾粏淇℃伅
      */
     @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id)
-    {
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
         return success(paymentRegistrationService.selectPaymentRegistrationById(id));
     }
 
@@ -65,8 +65,7 @@
      */
     @Log(title = "浠樻鐧昏", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody PaymentRegistration paymentRegistration)
-    {
+    public AjaxResult add(@RequestBody PaymentRegistration paymentRegistration) {
         return toAjax(paymentRegistrationService.insertPaymentRegistration(paymentRegistration));
     }
 
@@ -75,8 +74,7 @@
      */
     @Log(title = "浠樻鐧昏", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody PaymentRegistration paymentRegistration)
-    {
+    public AjaxResult edit(@RequestBody PaymentRegistration paymentRegistration) {
         return toAjax(paymentRegistrationService.updatePaymentRegistration(paymentRegistration));
     }
 
@@ -84,9 +82,8 @@
      * 鍒犻櫎浠樻鐧昏
      */
     @Log(title = "浠樻鐧昏", businessType = BusinessType.DELETE)
-	@DeleteMapping("/del")
-    public AjaxResult remove(@RequestBody Long[] ids)
-    {
+    @DeleteMapping("/del")
+    public AjaxResult remove(@RequestBody Long[] ids) {
         return toAjax(paymentRegistrationService.deletePaymentRegistrationByIds(ids));
     }
 
@@ -94,8 +91,7 @@
      * 鑾峰彇浠樻鐧昏璇︾粏淇℃伅
      */
     @GetMapping(value = "/byPurchaseId/{id}")
-    public AjaxResult getPurchaseInfo(@PathVariable("id") Long id)
-    {
+    public AjaxResult getPurchaseInfo(@PathVariable("id") Long id) {
         return success(paymentRegistrationService.selectPaymentRegistrationByPurchaseId(id));
     }
 
@@ -103,8 +99,18 @@
      * 鑾峰彇浠樻鐧昏璇︾粏淇℃伅
      */
     @GetMapping(value = "/paymentLedgerList")
-    public AjaxResult paymentLedgerList(PaymentLedgerDto paymentLedgerDto)
-    {
-        return success(paymentRegistrationService.selectPaymentLedgerList(paymentLedgerDto));
+    public AjaxResult paymentLedgerList(PaymentLedgerDto paymentLedgerDto, Page page,
+                                        Integer detailPageNum,
+                                        Integer detailPageSize) {
+        IPage<Map<String, Object>> mapIPage = paymentRegistrationService.selectPaymentLedgerList(paymentLedgerDto, page, detailPageNum, detailPageSize);
+        return success(mapIPage);
+    }
+
+    /**
+     * 鑾峰彇鏈湀搴斾粯淇℃伅
+     */
+    @GetMapping(value = "/paymentMonthList")
+    public AjaxResult paymentMonthList() {
+        return success(paymentRegistrationService.paymentMonthList());
     }
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/IPaymentRegistrationService.java b/src/main/java/com/ruoyi/purchase/service/IPaymentRegistrationService.java
index cbf484f..ec1244b 100644
--- a/src/main/java/com/ruoyi/purchase/service/IPaymentRegistrationService.java
+++ b/src/main/java/com/ruoyi/purchase/service/IPaymentRegistrationService.java
@@ -1,10 +1,13 @@
 package com.ruoyi.purchase.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.purchase.dto.PaymentLedgerDto;
 import com.ruoyi.purchase.dto.PaymentRegistrationDto;
 import com.ruoyi.purchase.pojo.PaymentRegistration;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -63,5 +66,9 @@
      */
     PaymentRegistration selectPaymentRegistrationByPurchaseId(Long purchaseId);
 
-    List<Map<String, Object>> selectPaymentLedgerList(PaymentLedgerDto paymentLedgerDto);
+    IPage<Map<String, Object>> selectPaymentLedgerList(PaymentLedgerDto paymentLedgerDto, Page page,
+                                                       Integer detailPageNum,
+                                                       Integer detailPageSize);
+
+    Map<String, BigDecimal> paymentMonthList();
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
index 2d78a62..667df89 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
@@ -2,7 +2,9 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.mapper.SupplierManageMapper;
 import com.ruoyi.basic.pojo.SupplierManage;
@@ -27,6 +29,8 @@
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.YearMonth;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -176,8 +180,11 @@
     }
 
     @Override
-    public List<Map<String, Object>> selectPaymentLedgerList(PaymentLedgerDto paymentLedgerDto) {
-        List<Map<String, Object>> result = new ArrayList<>();
+    public IPage<Map<String, Object>> selectPaymentLedgerList(
+            PaymentLedgerDto paymentLedgerDto,
+            Page page,
+            Integer detailPageNum,
+            Integer detailPageSize) {
         LambdaQueryWrapper<SupplierManage> queryWrapper = new LambdaQueryWrapper<>();
         Optional.ofNullable(paymentLedgerDto)
                 .ifPresent(dto -> {
@@ -186,80 +193,223 @@
                     }
                 });
 
-        List<SupplierManage> supplierManages = supplierManageMapper.selectList(queryWrapper);
+        IPage<SupplierManage> supplierPage = supplierManageMapper.selectPage(page, queryWrapper);
+        List<SupplierManage> supplierManages = supplierPage.getRecords();
+
+        IPage<Map<String, Object>> resultPage = new Page<>(page.getCurrent(), page.getSize(), supplierPage.getTotal());
+        List<Map<String, Object>> result = new ArrayList<>();
 
         for (SupplierManage supplierManage : supplierManages) {
             Map<String, Object> res = new HashMap<>();
             res.put("supplierName", supplierManage.getSupplierName());
 
-            // 搴斾粯閲戦
+            // 搴斾粯閲戦璁$畻
             BigDecimal payableAmount = BigDecimal.ZERO;
-            List<PurchaseLedger> purchaseLedgers = purchaseLedgerMapper.selectList(new QueryWrapper<PurchaseLedger>().eq("supplier_id", supplierManage.getId()));
-            if (purchaseLedgers != null && purchaseLedgers.size() > 0) {
-                List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>()
-                        .in("sales_ledger_id", purchaseLedgers.stream().map(PurchaseLedger::getId).collect(Collectors.toList())));
-                // 搴斾粯閲戦
-                payableAmount = salesLedgerProducts.stream().map(SalesLedgerProduct::getTaxInclusiveTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+            List<PurchaseLedger> purchaseLedgers = purchaseLedgerMapper.selectList(
+                    new QueryWrapper<PurchaseLedger>().eq("supplier_id", supplierManage.getId())
+            );
+            List<SalesLedgerProduct> salesLedgerProducts = purchaseLedgers.stream()
+                    .filter(Objects::nonNull)
+                    .map(PurchaseLedger::getId)
+                    .filter(Objects::nonNull)
+                    .flatMap(id -> salesLedgerProductMapper.selectList(
+                            new QueryWrapper<SalesLedgerProduct>().eq("sales_ledger_id", id)
+                    ).stream())
+                    .collect(Collectors.toList());
+            payableAmount = salesLedgerProducts.stream()
+                    .map(SalesLedgerProduct::getTaxInclusiveTotalPrice)
+                    .filter(Objects::nonNull)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
 
-            }
+            // 鏉ョエ閲戦璁$畻
+            List<TicketRegistration> ticketRegistrations = purchaseLedgers.stream()
+                    .map(PurchaseLedger::getId)
+                    .filter(Objects::nonNull)
+                    .map(id -> ticketRegistrationMapper.selectList(
+                            new LambdaQueryWrapper<TicketRegistration>().eq(TicketRegistration::getPurchaseLedgerId, id)
+                    ))
+                    .flatMap(Collection::stream)
+                    .collect(Collectors.toList());
+            BigDecimal invoiceAmount = ticketRegistrations.stream()
+                    .map(TicketRegistration::getInvoiceAmount)
+                    .filter(Objects::nonNull)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
 
-            BigDecimal invoiceAmount = BigDecimal.ZERO;
-            List<TicketRegistration> ticketRegistrations = Collections.emptyList();
+            // 浠樻璁板綍鍙婅鎯呭垎椤�
+            List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(
+                    new QueryWrapper<PaymentRegistration>().eq("supplier_id", supplierManage.getId())
+            );
+            BigDecimal paymentAmount = paymentRegistrations.stream()
+                    .map(PaymentRegistration::getCurrentPaymentAmount)
+                    .filter(Objects::nonNull)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
 
-            // 澧炲姞绌哄�兼鏌ワ紝閬垮厤NullPointerException
-            if (CollectionUtils.isNotEmpty(purchaseLedgers)) {
-                Long[] ids = purchaseLedgers.stream()
-                        .map(PurchaseLedger::getId)
-                        .toArray(Long[]::new);
+            // 璇︽儏鍒嗛〉澶勭悊
+            detailPageNum = detailPageNum != null ? detailPageNum : 1;
+            detailPageSize = detailPageSize != null ? detailPageSize : paymentRegistrations.size(); // 榛樿鏄剧ず鍏ㄩ儴
+            int totalDetails = paymentRegistrations.size();
+            int start = (detailPageNum - 1) * detailPageSize;
+            int end = Math.min(start + detailPageSize, totalDetails);
+            List<PaymentRegistration> pagedDetails = paymentRegistrations.subList(start, end);
 
-                // 妫�鏌ユ暟缁勬槸鍚︽湁鍏冪礌
-                if (ids.length > 0) {
-                    ticketRegistrations = ticketRegistrationMapper.selectList(
-                            new LambdaQueryWrapper<TicketRegistration>()
-                                    .in(TicketRegistration::getPurchaseLedgerId, ids)
-                    );
-                }
-            }
-            if (ticketRegistrations != null && ticketRegistrations.size() > 0) {
-                // 鏉ョエ閲戦
-                invoiceAmount = ticketRegistrations.stream().map(TicketRegistration::getInvoiceAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
-            }
-            // 浠樻閲戦
-            List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>()
-                    .eq("supplier_id", supplierManage.getId()));
+            // 鏋勫缓璇︽儏鍒楄〃
+            List<Map<String, Object>> details = pagedDetails.stream()
+                    .filter(Objects::nonNull)
+                    .map(pr -> {
+                        Map<String, Object> detail = new HashMap<>();
+                        detail.put("paymentAmount", pr.getCurrentPaymentAmount());
 
-            BigDecimal paymentAmount = BigDecimal.ZERO;
-            if (paymentRegistrations != null && paymentRegistrations.size() > 0) {
-                paymentAmount = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
-            }
+                        // 鎵归噺鏌ヨ TicketRegistration锛堥伩鍏� N+1锛�
+                        TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(pr.getTicketRegistrationId());
+                        if (ticketRegistration != null) {
+                            detail.put("payableAmount", ticketRegistration.getInvoiceAmount());
+                            BigDecimal voteCount = productRecordMapper.selectList(
+                                            new LambdaQueryWrapper<ProductRecord>().eq(ProductRecord::getTicketRegistrationId, ticketRegistration.getId())
+                                    ).stream()
+                                    .map(ProductRecord::getTicketsNum)
+                                    .map(BigDecimal::new)
+                                    .filter(Objects::nonNull)
+                                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+                            detail.put("voteCount", voteCount);
+                        }
+
+                        // 鏃ユ湡鏍煎紡鍖栵紙寤鸿浣跨敤 LocalDateTime锛�
+                        if (pr.getPaymentDate() != null) {
+                            detail.put("paymentDate", new SimpleDateFormat("yyyy-MM-dd").format(pr.getPaymentDate()));
+                        }
+                        return detail;
+                    })
+                    .collect(Collectors.toList());
+
+            // 灏佽璇︽儏鍒嗛〉鍏冩暟鎹�
+            Map<String, Object> detailPagination = new HashMap<>();
+            detailPagination.put("total", totalDetails);
+            detailPagination.put("pageNum", detailPageNum);
+            detailPagination.put("pageSize", detailPageSize);
+            detailPagination.put("pages", (int) Math.ceil((double) totalDetails / detailPageSize));
 
             res.put("invoiceAmount", invoiceAmount);
             res.put("payableAmount", payableAmount);
             res.put("paymentAmount", paymentAmount);
-
-            // 璇︽儏
-            List<Map<String, Object>> details = new ArrayList<>();
-            for (PaymentRegistration paymentRegistration : paymentRegistrations) {
-                Map<String, Object> detail = new HashMap<>();
-                detail.put("paymentAmount", paymentRegistration.getCurrentPaymentAmount()); // 浠樻閲戦
-                TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(paymentRegistration.getTicketRegistrationId());
-                detail.put("payableAmount", ticketRegistration.getInvoiceAmount()); // 搴斾粯閲戦
-                BigDecimal voteCount = productRecordMapper.selectList(
-                                new LambdaQueryWrapper<ProductRecord>()
-                                        .eq(ProductRecord::getTicketRegistrationId, ticketRegistration.getId()))
-                        .stream()
-                        .map(ProductRecord::getTicketsNum)
-                        .map(BigDecimal::new)
-                        .reduce(BigDecimal.ZERO, BigDecimal::add);
-                detail.put("voteCount", voteCount); // 绁ㄦ暟
-                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-                String formattedDate = sdf.format(paymentRegistration.getPaymentDate());
-                detail.put("paymentDate", formattedDate); // 鍙戠敓鏃堕棿
-                details.add(detail);
-            }
             res.put("details", details);
+            res.put("detailPagination", detailPagination); // 娣诲姞璇︽儏鍒嗛〉淇℃伅
             result.add(res);
         }
+
+        resultPage.setRecords(result);
+        return resultPage;
+    }
+
+    @Override
+    public Map<String, BigDecimal> paymentMonthList() {
+
+        // 鏌ヨ渚涘簲鍟嗗垪琛�
+        List<SupplierManage> suppliers = supplierManageMapper.selectList(null);
+        if (CollectionUtils.isEmpty(suppliers)) {
+            Map<String, BigDecimal> result = new HashMap<>();
+            result.put("payableAmount", BigDecimal.ZERO);
+            result.put("paymentAmount", BigDecimal.ZERO);
+            return result;
+        }
+
+        // 鎻愬彇鎵�鏈変緵搴斿晢ID
+        List<Long> supplierIds = suppliers.stream()
+                .map(SupplierManage::getId) // 鍏堣幏鍙朓nteger绫诲瀷鐨処D
+                .filter(Objects::nonNull)    // 杩囨护鎺夊彲鑳界殑null鍊�
+                .map(Integer::longValue)    // 灏咺nteger杞崲涓篖ong
+                .collect(Collectors.toList());
+
+        // 鑾峰彇褰撴湀鐨勫紑濮嬪拰缁撴潫鏃ユ湡
+        YearMonth currentMonth = YearMonth.now();
+        LocalDate startDate = currentMonth.atDay(1);
+        LocalDate endDate = currentMonth.atEndOfMonth();
+
+        // 鎵归噺鏌ヨ閲囪喘鍙拌处锛堝綋鏈堬級
+        Map<Long, List<PurchaseLedger>> purchaseLedgerMap = batchQueryPurchaseLedgers(supplierIds, startDate, endDate);
+
+        // 鎵归噺鏌ヨ閿�鍞彴璐︿骇鍝�
+        Map<Long, List<SalesLedgerProduct>> salesLedgerProductMap = batchQuerySalesLedgerProducts(purchaseLedgerMap);
+
+        // 鎵归噺鏌ヨ浠樻璁板綍锛堝綋鏈堬級
+        Map<Long, List<PaymentRegistration>> paymentRegistrationMap = batchQueryPaymentRegistrations(supplierIds, startDate, endDate);
+
+        // 璁$畻搴斾粯閲戦鍜屼粯娆鹃噾棰�
+        BigDecimal totalPayableAmount = calculateTotalPayableAmount(purchaseLedgerMap, salesLedgerProductMap);
+        BigDecimal totalPaymentAmount = calculateTotalPaymentAmount(paymentRegistrationMap);
+
+        // 鏋勫缓缁撴灉
+        Map<String, BigDecimal> result = new HashMap<>();
+        result.put("payableAmount", totalPayableAmount);
+        result.put("paymentAmount", totalPaymentAmount);
         return result;
     }
+
+    // 鎵归噺鏌ヨ閲囪喘鍙拌处锛堝綋鏈堬級
+    private Map<Long, List<PurchaseLedger>> batchQueryPurchaseLedgers(List<Long> supplierIds, LocalDate startDate, LocalDate endDate) {
+        LambdaQueryWrapper<PurchaseLedger> query = new LambdaQueryWrapper<>();
+        query.in(PurchaseLedger::getSupplierId, supplierIds)
+                .ge(PurchaseLedger::getCreatedAt, startDate)
+                .le(PurchaseLedger::getCreatedAt, endDate);
+        List<PurchaseLedger> purchaseLedgers = purchaseLedgerMapper.selectList(query);
+
+        return purchaseLedgers.stream()
+                .filter(pl -> pl.getSupplierId() != null)
+                .collect(Collectors.groupingBy(PurchaseLedger::getSupplierId));
+    }
+
+    // 鎵归噺鏌ヨ閿�鍞彴璐︿骇鍝�
+    private Map<Long, List<SalesLedgerProduct>> batchQuerySalesLedgerProducts(Map<Long, List<PurchaseLedger>> purchaseLedgerMap) {
+        // 鎻愬彇鎵�鏈夐噰璐彴璐D
+        List<Long> purchaseLedgerIds = purchaseLedgerMap.values().stream()
+                .flatMap(Collection::stream)
+                .map(PurchaseLedger::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+        if (purchaseLedgerIds.isEmpty()) {
+            return Collections.emptyMap();
+        }
+
+        LambdaQueryWrapper<SalesLedgerProduct> query = new LambdaQueryWrapper<>();
+        query.in(SalesLedgerProduct::getSalesLedgerId, purchaseLedgerIds);
+        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(query);
+
+        return products.stream()
+                .filter(slp -> slp.getSalesLedgerId() != null)
+                .collect(Collectors.groupingBy(SalesLedgerProduct::getSalesLedgerId));
+    }
+
+    // 鎵归噺鏌ヨ浠樻璁板綍锛堝綋鏈堬級
+    private Map<Long, List<PaymentRegistration>> batchQueryPaymentRegistrations(List<Long> supplierIds, LocalDate startDate, LocalDate endDate) {
+        LambdaQueryWrapper<PaymentRegistration> query = new LambdaQueryWrapper<>();
+        query.in(PaymentRegistration::getSupplierId, supplierIds)
+                .ge(PaymentRegistration::getPaymentDate, startDate)
+                .le(PaymentRegistration::getPaymentDate, endDate);
+        List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(query);
+
+        return paymentRegistrations.stream()
+                .filter(pr -> pr.getSupplierId() != null)
+                .collect(Collectors.groupingBy(PaymentRegistration::getSupplierId));
+    }
+
+    // 璁$畻鎬诲簲浠橀噾棰�
+    private BigDecimal calculateTotalPayableAmount(Map<Long, List<PurchaseLedger>> purchaseLedgerMap,
+                                                   Map<Long, List<SalesLedgerProduct>> salesLedgerProductMap) {
+        return purchaseLedgerMap.values().stream()
+                .flatMap(Collection::stream)
+                .map(pl -> salesLedgerProductMap.getOrDefault(pl.getId(), Collections.emptyList()))
+                .flatMap(Collection::stream)
+                .map(SalesLedgerProduct::getTaxInclusiveTotalPrice)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+    // 璁$畻鎬讳粯娆鹃噾棰�
+    private BigDecimal calculateTotalPaymentAmount(Map<Long, List<PaymentRegistration>> paymentRegistrationMap) {
+        return paymentRegistrationMap.values().stream()
+                .flatMap(Collection::stream)
+                .map(PaymentRegistration::getCurrentPaymentAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
 }
diff --git a/src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java b/src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
index 6549c3b..3078365 100644
--- a/src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
@@ -76,10 +76,10 @@
     @GetMapping("/getReceiptAmount")
     public AjaxResult getReceiptAmount() {
         try {
-            BigDecimal amount = receiptPaymentService.getReceiptAmount();
-            return AjaxResult.success(amount != null ? amount : BigDecimal.ZERO);
+            BigDecimal receiptAmount = receiptPaymentService.getReceiptAmount();
+            return AjaxResult.success(receiptAmount != null ? receiptAmount : BigDecimal.ZERO);
         } catch (Exception e) {
-            return AjaxResult.error("鑾峰彇鍚堝悓閲戦澶辫触锛�" + e.getMessage());
+            return AjaxResult.error("鑾峰彇鍥炴閲戦澶辫触锛�" + e.getMessage());
         }
     }
 
@@ -103,4 +103,12 @@
     public AjaxResult invoiceInfo (Integer id) {
         return AjaxResult.success(receiptPaymentService.invoiceInfo(id));
     }
+
+    /**
+     * 鏈湀搴旀敹,鍥炴閲戦
+     */
+    @GetMapping("/getAmountMouth")
+    public AjaxResult getAmountMouth() {
+        return  AjaxResult.success(receiptPaymentService.getAmountMouth());
+    }
 }
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index d21a2dd..a85c360 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -112,8 +112,8 @@
     @GetMapping("/getContractAmount")
     public AjaxResult getContractAmount() {
         try {
-            BigDecimal amount = salesLedgerService.getContractAmount();
-            return AjaxResult.success(amount != null ? amount : BigDecimal.ZERO);
+            BigDecimal contractAmount = salesLedgerService.getContractAmount();
+            return AjaxResult.success(contractAmount != null ? contractAmount : BigDecimal.ZERO);
         } catch (Exception e) {
             return AjaxResult.error("鑾峰彇鍚堝悓閲戦澶辫触锛�" + e.getMessage());
         }
@@ -126,4 +126,12 @@
     public AjaxResult getTopFiveList() {
         return AjaxResult.success(salesLedgerService.getTopFiveList());
     }
+
+    /**
+     * 杩戝崐骞村紑绁�,鍥炴閲戦
+     */
+    @GetMapping("/getAmountHalfYear")
+    public AjaxResult getAmountHalfYear() {
+        return AjaxResult.success(salesLedgerService.getAmountHalfYear());
+    }
 }
diff --git a/src/main/java/com/ruoyi/sales/dto/MonthlyAmountDto.java b/src/main/java/com/ruoyi/sales/dto/MonthlyAmountDto.java
new file mode 100644
index 0000000..155fc5f
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/dto/MonthlyAmountDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.sales.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class MonthlyAmountDto {
+
+    private String month;
+    private BigDecimal invoiceAmount; // 寮�绁ㄩ噾棰�
+    private BigDecimal receiptAmount; // 鍥炴閲戦
+}
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
index 8656614..f0d8353 100644
--- a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
+++ b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
@@ -1,9 +1,13 @@
 package com.ruoyi.sales.mapper;
 
-import java.util.List;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.ruoyi.sales.pojo.SalesLedger;
 import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
 
 
 /**
@@ -21,4 +25,6 @@
     List<Integer> selectSequencesByDate(@Param("datePart") String datePart);
 
     List getSalesNo();
+
+    <T> BigDecimal selectSum(LambdaQueryWrapper<T> wrapper, SFunction<T, BigDecimal> column);
 }
diff --git a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
index 4f736c7..0c8bcad 100644
--- a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
+++ b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.sales.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.sales.dto.MonthlyAmountDto;
 import com.ruoyi.sales.dto.SalesLedgerDto;
 import com.ruoyi.sales.pojo.SalesLedger;
 
@@ -28,4 +29,6 @@
     BigDecimal getContractAmount();
 
     List getTopFiveList();
+
+    List<MonthlyAmountDto> getAmountHalfYear();
 }
diff --git a/src/main/java/com/ruoyi/sales/service/ReceiptPaymentService.java b/src/main/java/com/ruoyi/sales/service/ReceiptPaymentService.java
index c77cb8d..dbb85ce 100644
--- a/src/main/java/com/ruoyi/sales/service/ReceiptPaymentService.java
+++ b/src/main/java/com/ruoyi/sales/service/ReceiptPaymentService.java
@@ -8,6 +8,7 @@
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 public interface ReceiptPaymentService {
 
@@ -63,4 +64,6 @@
      * @return
      */
     InvoiceLedgerDto invoiceInfo(Integer id);
+
+    Map<String,BigDecimal> getAmountMouth();
 }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java
index 8d40b1c..696f72e 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java
@@ -13,11 +13,8 @@
 import com.ruoyi.sales.mapper.InvoiceLedgerFileMapper;
 import com.ruoyi.sales.mapper.InvoiceLedgerMapper;
 import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
-import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
 import com.ruoyi.sales.pojo.InvoiceLedger;
 import com.ruoyi.sales.pojo.InvoiceLedgerFile;
-import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
-import com.ruoyi.sales.pojo.ReceiptPayment;
 import com.ruoyi.sales.service.InvoiceLedgerService;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.BeanUtils;
@@ -33,7 +30,6 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.YearMonth;
-import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.UUID;
@@ -258,13 +254,12 @@
         // 鎵ц鏌ヨ骞惰绠楁�诲拰
         List<InvoiceLedger> invoiceLedgers = invoiceLedgerMapper.selectList(queryWrapper);
 
-//        BigDecimal totalContractAmount = invoiceLedgers.stream()
-//                .map(InvoiceLedger::getInvoiceAmount)
-//                .filter(Objects::nonNull)
-//                .reduce(BigDecimal.ZERO, BigDecimal::add);
-//
-//        return totalContractAmount;
-        return null;
+        BigDecimal totalContractAmount = invoiceLedgers.stream()
+                .map(InvoiceLedger::getInvoiceTotal)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        return totalContractAmount;
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java
index 7ee2762..16cc5e9 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java
@@ -7,7 +7,9 @@
 import com.ruoyi.sales.dto.InvoiceLedgerDto;
 import com.ruoyi.sales.dto.ReceiptPaymentDto;
 import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.pojo.ReceiptPayment;
+import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.service.ReceiptPaymentService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -17,7 +19,9 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.YearMonth;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 @Service
@@ -25,6 +29,9 @@
 
     @Autowired
     private ReceiptPaymentMapper receiptPaymentMapper;
+
+    @Autowired
+    private SalesLedgerMapper salesLedgerMapper;
 
     /**
      * 鍥炴鐧昏鏂板
@@ -140,4 +147,34 @@
     public InvoiceLedgerDto invoiceInfo(Integer id) {
         return receiptPaymentMapper.invoiceInfo(id);
     }
+
+    @Override
+    public Map<String,BigDecimal> getAmountMouth() {
+        List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(null);
+        BigDecimal contractAmount = salesLedgers.stream().map(SalesLedger::getContractAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        LocalDate now = LocalDate.now();
+        YearMonth currentMonth = YearMonth.from(now);
+
+        // 鍒涘缓LambdaQueryWrapper
+        LambdaQueryWrapper<ReceiptPayment> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.ge(ReceiptPayment::getReceiptPaymentDate, currentMonth.atDay(1).atStartOfDay())  // 澶т簬绛変簬鏈湀绗竴澶�
+                .lt(ReceiptPayment::getReceiptPaymentDate, currentMonth.plusMonths(1).atDay(1).atStartOfDay()); // 灏忎簬涓嬫湀绗竴澶�
+
+        // 鎵ц鏌ヨ骞惰绠楁�诲拰
+        List<ReceiptPayment> receiptPayments = receiptPaymentMapper.selectList(queryWrapper);
+
+        BigDecimal receiveAmount = receiptPayments.stream()
+                .map(ReceiptPayment::getReceiptPaymentAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        // 鏋勫缓缁撴灉
+        Map<String, BigDecimal> result = new HashMap<>();
+        result.put("receiveAmount", receiveAmount);
+        result.put("contractAmount", contractAmount);
+        return result;
+    }
 }
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 c20172e..1b33c06 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -1,7 +1,6 @@
 package com.ruoyi.sales.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -12,15 +11,10 @@
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.other.mapper.TempFileMapper;
 import com.ruoyi.other.pojo.TempFile;
+import com.ruoyi.sales.dto.MonthlyAmountDto;
 import com.ruoyi.sales.dto.SalesLedgerDto;
-import com.ruoyi.sales.mapper.CommonFileMapper;
-import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
-import com.ruoyi.sales.mapper.SalesLedgerMapper;
-import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
-import com.ruoyi.sales.pojo.CommonFile;
-import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
-import com.ruoyi.sales.pojo.SalesLedger;
-import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.mapper.*;
+import com.ruoyi.sales.pojo.*;
 import com.ruoyi.sales.service.ISalesLedgerService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -32,7 +26,6 @@
 import org.springframework.data.redis.core.script.DefaultRedisScript;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.ObjectUtils;
 
 import java.io.IOException;
 import java.lang.reflect.Field;
@@ -70,6 +63,10 @@
     private final CommonFileMapper commonFileMapper;
 
     private final TempFileMapper tempFileMapper;
+
+    private final ReceiptPaymentMapper receiptPaymentMapper;
+
+    private final InvoiceLedgerMapper invoiceLedgerMapper;
 
     @Autowired
     private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
@@ -159,8 +156,114 @@
 
     @Override
     public List getTopFiveList() {
-        
-        return null;
+        // 鏌ヨ鍘熷鏁版嵁
+        LambdaQueryWrapper<SalesLedger> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.select(SalesLedger::getCustomerId,
+                        SalesLedger::getCustomerName,
+                        SalesLedger::getContractAmount)
+                .orderByDesc(SalesLedger::getContractAmount);
+        List<SalesLedger> records = salesLedgerMapper.selectList(queryWrapper);
+
+        // 鎸夊鎴稩D鍒嗙粍骞惰仛鍚堥噾棰�
+        Map<Long, GroupedCustomer> groupedMap = new LinkedHashMap<>(); // 浣跨敤LinkedHashMap淇濇寔鎺掑簭
+        for (SalesLedger record : records) {
+            groupedMap.computeIfAbsent(record.getCustomerId(),
+                            k -> new GroupedCustomer(record.getCustomerId(), record.getCustomerName()))
+                    .addAmount(record.getContractAmount());
+        }
+
+        // 杞崲涓虹粨鏋滃垪琛ㄥ苟鍙栧墠5
+        return groupedMap.values().stream()
+                .sorted(Comparator.comparing(GroupedCustomer::getTotalAmount).reversed())
+                .limit(5)
+                .map(customer -> {
+                    Map<String, Object> result = new HashMap<>();
+                    result.put("customerId", customer.getCustomerId());
+                    result.put("customerName", customer.getCustomerName());
+                    result.put("totalAmount", customer.getTotalAmount());
+                    return result;
+                })
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<MonthlyAmountDto> getAmountHalfYear() {
+        LocalDate now = LocalDate.now();
+        YearMonth currentMonth = YearMonth.from(now);
+
+        List<MonthlyAmountDto> monthlyAmounts = new ArrayList<>();
+
+        for (int i = 0; i < 6; i++) {
+            YearMonth targetMonth = currentMonth.minusMonths(i);
+            LocalDate firstDayOfMonth = targetMonth.atDay(1);
+            LocalDate firstDayOfNextMonth = targetMonth.plusMonths(1).atDay(1);
+
+            LocalDateTime startOfMonth = firstDayOfMonth.atStartOfDay();
+            LocalDateTime startOfNextMonth = firstDayOfNextMonth.atStartOfDay();
+
+            LambdaQueryWrapper<ReceiptPayment> receiptPaymentLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            receiptPaymentLambdaQueryWrapper.ge(ReceiptPayment::getCreateTime, startOfMonth)
+                    .lt(ReceiptPayment::getCreateTime, startOfNextMonth);
+
+            LambdaQueryWrapper<InvoiceLedger> invoiceLedgerLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            invoiceLedgerLambdaQueryWrapper.ge(InvoiceLedger::getCreateTime, startOfMonth)
+                    .lt(InvoiceLedger::getCreateTime, startOfNextMonth);
+
+            // 鑾峰彇鍥炴閲戦
+            List<ReceiptPayment> receiptPaymentList = receiptPaymentMapper.selectList(receiptPaymentLambdaQueryWrapper);
+            //寮�绁ㄩ噾棰�
+            List<InvoiceLedger> invoiceLedgerList = invoiceLedgerMapper.selectList(invoiceLedgerLambdaQueryWrapper);
+
+            // 浣跨敤 Stream 姹傚拰
+            BigDecimal invoiceAmount = invoiceLedgerList.stream()
+                    .map(InvoiceLedger::getInvoiceTotal)
+                    .filter(Objects::nonNull)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            BigDecimal receiptAmount = receiptPaymentList.stream()
+                    .map(ReceiptPayment::getReceiptPaymentAmount)
+                    .filter(Objects::nonNull)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            MonthlyAmountDto monthlyAmount = new MonthlyAmountDto();
+            monthlyAmount.setMonth(targetMonth.format(DateTimeFormatter.ofPattern("yyyy-MM")));
+            monthlyAmount.setInvoiceAmount(invoiceAmount);
+            monthlyAmount.setReceiptAmount(receiptAmount);
+
+            monthlyAmounts.add(monthlyAmount);
+        }
+
+        return monthlyAmounts;
+    }
+
+    // 鍐呴儴绫荤敤浜庡瓨鍌ㄨ仛鍚堢粨鏋�
+    private static class GroupedCustomer {
+        private final Long customerId;
+        private final String customerName;
+        private BigDecimal totalAmount = BigDecimal.ZERO;
+
+        public GroupedCustomer(Long customerId, String customerName) {
+            this.customerId = customerId;
+            this.customerName = customerName;
+        }
+
+        public void addAmount(BigDecimal amount) {
+            if (amount != null) {
+                this.totalAmount = this.totalAmount.add(amount);
+            }
+        }
+
+        public Long getCustomerId() {
+            return customerId;
+        }
+
+        public String getCustomerName() {
+            return customerName;
+        }
+
+        public BigDecimal getTotalAmount() {
+            return totalAmount;
+        }
     }
 
     /**

--
Gitblit v1.9.3