From bd7a90b45aa2461caf6db78ed29d4cc3401a65c8 Mon Sep 17 00:00:00 2001
From: chenrui <1187576398@qq.com>
Date: 星期四, 29 五月 2025 17:35:42 +0800
Subject: [PATCH] 来票台账bug修复

---
 src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java |  302 +++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 236 insertions(+), 66 deletions(-)

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 e858038..ec355bd 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
@@ -2,6 +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;
@@ -10,23 +13,24 @@
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.purchase.dto.PaymentLedgerDto;
 import com.ruoyi.purchase.dto.PaymentRegistrationDto;
-import com.ruoyi.purchase.mapper.InvoicePurchaseMapper;
-import com.ruoyi.purchase.mapper.PaymentRegistrationMapper;
-import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
-import com.ruoyi.purchase.pojo.InvoicePurchase;
+import com.ruoyi.purchase.mapper.*;
 import com.ruoyi.purchase.pojo.PaymentRegistration;
+import com.ruoyi.purchase.pojo.ProductRecord;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
+import com.ruoyi.purchase.pojo.TicketRegistration;
 import com.ruoyi.purchase.service.IPaymentRegistrationService;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
-import org.springframework.beans.factory.annotation.Autowired;
+import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.YearMonth;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -37,24 +41,23 @@
  * @date 2025-05-15
  */
 @Service
+@AllArgsConstructor
 public class PaymentRegistrationServiceImpl extends ServiceImpl<PaymentRegistrationMapper, PaymentRegistration> implements IPaymentRegistrationService {
-    @Autowired
     private PaymentRegistrationMapper paymentRegistrationMapper;
 
-    @Autowired
     private PurchaseLedgerMapper purchaseLedgerMapper;
 
-    @Autowired
     private InvoicePurchaseMapper invoicePurchaseMapper;
 
-    @Autowired
     private SalesLedgerMapper salesLedgerMapper;
 
-    @Autowired
     private SupplierManageMapper supplierManageMapper;
 
-    @Autowired
     private SalesLedgerProductMapper salesLedgerProductMapper;
+
+    private TicketRegistrationMapper ticketRegistrationMapper;
+
+    private ProductRecordMapper productRecordMapper;
 
     /**
      * 鏌ヨ浠樻鐧昏
@@ -78,9 +81,10 @@
         List<PaymentRegistrationDto> list = paymentRegistrationMapper.selectPaymentRegistrationList(paymentRegistrationDto);
         for (PaymentRegistrationDto registrationDto : list) {
             List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>()
-                    .eq("invoice_purchase_id", registrationDto.getInvoicePurchaseId()));
+                    .eq("ticket_registration_id", registrationDto.getTicketRegistrationId()));
             BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
-            registrationDto.setUnPaymentAmount(registrationDto.getInvoiceAmount().subtract(total));
+            BigDecimal invoiceAmount = (null != registrationDto.getInvoiceAmount())? registrationDto.getInvoiceAmount() : BigDecimal.ZERO;
+            registrationDto.setUnPaymentAmount(invoiceAmount.subtract(total));
         }
         return list;
     }
@@ -103,25 +107,24 @@
         paymentRegistration.setSaleLedgerId(salesLedger.getId());
         paymentRegistration.setSupplierId(purchaseLedger.getSupplierId());
 
-        List<InvoicePurchase> invoicePurchases = invoicePurchaseMapper.selectList(new QueryWrapper<InvoicePurchase>().
-                eq("purchase_contract_no", purchaseLedger.getPurchaseContractNumber()));
-        if (invoicePurchases == null || invoicePurchases.size() == 0) {
+        TicketRegistration tr = ticketRegistrationMapper.selectOne(new LambdaQueryWrapper<TicketRegistration>().eq(TicketRegistration::getId, paymentRegistration.getTicketRegistrationId()));
+
+        if (tr == null) {
             throw new RuntimeException("鍏宠仈鍙戠エ涓嶅瓨鍦�");
         }
-        paymentRegistration.setInvoicePurchaseId(invoicePurchases.get(0).getId());
 
         List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>()
-                .eq("invoice_purchase_id", invoicePurchases.get(0).getId()));
+                .eq("ticket_registration_id", tr.getId()));
         BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 
-        if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(invoicePurchases.get(0).getInvoiceAmount()) > 0) {
+        if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(tr.getInvoiceAmount()) > 0) {
             throw new RuntimeException("浠樻閲戦瓒呭嚭鍙戠エ閲戦");
         }
-
 
         LoginUser loginUser = SecurityUtils.getLoginUser();
         Integer tenantId = loginUser.getTenantId();
         paymentRegistration.setTenantId(tenantId.longValue());
+        paymentRegistration.setRegistrantId(loginUser.getUserId());
         paymentRegistration.setCreateTime(DateUtils.getNowDate());
         paymentRegistration.setUpdateTime(DateUtils.getNowDate());
         return paymentRegistrationMapper.insert(paymentRegistration);
@@ -135,13 +138,13 @@
      */
     @Override
     public int updatePaymentRegistration(PaymentRegistration paymentRegistration) {
-        InvoicePurchase invoicePurchase = invoicePurchaseMapper.selectById(paymentRegistration.getInvoicePurchaseId());
+        TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(paymentRegistration.getTicketRegistrationId());
 
         List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>()
-                .eq("invoice_purchase_id", paymentRegistration.getInvoicePurchaseId()).ne("id", paymentRegistration.getId()));
+                .eq("ticket_registration_id", paymentRegistration.getTicketRegistrationId()).ne("id", paymentRegistration.getId()));
         BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 
-        if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(invoicePurchase.getInvoiceAmount()) > 0) {
+        if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(ticketRegistration.getInvoiceAmount()) > 0) {
             throw new RuntimeException("浠樻閲戦瓒呭嚭鍙戠エ閲戦");
         }
 
@@ -168,19 +171,21 @@
         paymentRegistrationDto.setSupplierName(purchaseLedger.getSupplierName());
         paymentRegistrationDto.setSupplierId(purchaseLedger.getSupplierId());
 
-        List<InvoicePurchase> invoicePurchaseList = invoicePurchaseMapper.selectList(new QueryWrapper<InvoicePurchase>()
-                .eq("purchase_contract_no", purchaseLedger.getPurchaseContractNumber()));
-        if (invoicePurchaseList != null && invoicePurchaseList.size() > 0) {
-            paymentRegistrationDto.setInvoiceNumber(invoicePurchaseList.get(0).getInvoiceNumber());
-            paymentRegistrationDto.setInvoiceAmount(invoicePurchaseList.get(0).getInvoiceAmount());
-            paymentRegistrationDto.setTaxRate(invoicePurchaseList.get(0).getTaxRate());
+        List<TicketRegistration> ticketRegistrations = ticketRegistrationMapper.selectList(new QueryWrapper<TicketRegistration>()
+                .eq("purchase_contract_number", purchaseLedger.getPurchaseContractNumber()));
+        if (ticketRegistrations != null && ticketRegistrations.size() > 0) {
+            paymentRegistrationDto.setInvoiceNumber(ticketRegistrations.get(0).getInvoiceNumber());
+            paymentRegistrationDto.setInvoiceAmount(ticketRegistrations.get(0).getInvoiceAmount());
         }
         return paymentRegistrationDto;
     }
 
     @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 -> {
@@ -189,58 +194,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<SalesLedger> salesLedgers = salesLedgerMapper.selectList(new QueryWrapper<SalesLedger>().eq("customer_id", supplierManage.getId()));
-            if (salesLedgers != null && salesLedgers.size() > 0) {
-                List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>()
-                        .in("sales_ledger_id", salesLedgers.stream().map(SalesLedger::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 = salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 浠樻璁板綍鍙婅鎯呭垎椤�
+            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);
 
-            // 浠樻閲戦
-            List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>()
-                    .eq("supplier_id", supplierManage.getId()));
+            // 璇︽儏鍒嗛〉澶勭悊
+            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);
 
-            BigDecimal paymentAmount = BigDecimal.ZERO;
-            if (paymentRegistrations != null && paymentRegistrations.size() > 0) {
-                paymentAmount = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
-            }
+            // 鏋勫缓璇︽儏鍒楄〃
+            List<Map<String, Object>> details = pagedDetails.stream()
+                    .filter(Objects::nonNull)
+                    .map(pr -> {
+                        Map<String, Object> detail = new HashMap<>();
+                        detail.put("paymentAmount", pr.getCurrentPaymentAmount());
+
+                        // 鎵归噺鏌ヨ 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("voteCount", 1); // 绁ㄦ暟锛屾湭鐭ユ暟鎹簮锛屾殏鏃剁敤1
-                detail.put("paymentAmount", paymentRegistration.getCurrentPaymentAmount()); // 浠樻閲戦
-                InvoicePurchase  invoicePurchase = invoicePurchaseMapper.selectById(paymentRegistration.getInvoicePurchaseId());
-                detail.put("payableAmount", invoicePurchase.getInvoiceAmount()); // 搴斾粯閲戦
-                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-                String formattedDate = sdf.format(paymentRegistration.getPaymentDate());
-                detail.put("createTime", formattedDate); // 鍙戠敓鏃堕棿
-                details.add(detail);
-            }
-
-            res.put("details", paymentRegistrations);
-
+            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);
+    }
 }

--
Gitblit v1.9.3