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