package com.ruoyi.purchase.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.mapper.SupplierManageMapper; import com.ruoyi.basic.pojo.SupplierManage; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; 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.pojo.PaymentRegistration; import com.ruoyi.purchase.pojo.PurchaseLedger; 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 org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * 付款登记Service业务层处理 * * @author ruoyi * @date 2025-05-15 */ @Service public class PaymentRegistrationServiceImpl extends ServiceImpl 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; /** * 查询付款登记 * * @param id 付款登记主键 * @return 付款登记 */ @Override public PaymentRegistration selectPaymentRegistrationById(Long id) { return paymentRegistrationMapper.selectPaymentRegistrationById(id); } /** * 查询付款登记列表 * * @param paymentRegistrationDto 付款登记 * @return 付款登记 */ @Override public List selectPaymentRegistrationList(PaymentRegistrationDto paymentRegistrationDto) { List list = paymentRegistrationMapper.selectPaymentRegistrationList(paymentRegistrationDto); for (PaymentRegistrationDto registrationDto : list) { List paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper() .eq("invoice_purchase_id", registrationDto.getInvoicePurchaseId())); BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add); registrationDto.setUnPaymentAmount(registrationDto.getInvoiceAmount().subtract(total)); } return list; } /** * 新增付款登记 * * @param paymentRegistration 付款登记 * @return 结果 */ @Override public int insertPaymentRegistration(PaymentRegistration paymentRegistration) { PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(paymentRegistration.getPurchaseLedgerId()); SalesLedger salesLedger = salesLedgerMapper.selectOne(new QueryWrapper(). eq("sales_contract_no", purchaseLedger.getSalesContractNo())); if (salesLedger == null) { throw new RuntimeException("关联销售合同号不存在"); } paymentRegistration.setSaleLedgerId(salesLedger.getId()); paymentRegistration.setSupplierId(purchaseLedger.getSupplierId()); List invoicePurchases = invoicePurchaseMapper.selectList(new QueryWrapper(). eq("purchase_contract_no", purchaseLedger.getPurchaseContractNumber())); if (invoicePurchases == null || invoicePurchases.size() == 0) { throw new RuntimeException("关联发票不存在"); } paymentRegistration.setInvoicePurchaseId(invoicePurchases.get(0).getId()); List paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper() .eq("invoice_purchase_id", invoicePurchases.get(0).getId())); BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add); if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(invoicePurchases.get(0).getInvoiceAmount()) > 0) { throw new RuntimeException("付款金额超出发票金额"); } LoginUser loginUser = SecurityUtils.getLoginUser(); Integer tenantId = loginUser.getTenantId(); paymentRegistration.setTenantId(tenantId.longValue()); paymentRegistration.setCreateTime(DateUtils.getNowDate()); paymentRegistration.setUpdateTime(DateUtils.getNowDate()); return paymentRegistrationMapper.insert(paymentRegistration); } /** * 修改付款登记 * * @param paymentRegistration 付款登记 * @return 结果 */ @Override public int updatePaymentRegistration(PaymentRegistration paymentRegistration) { InvoicePurchase invoicePurchase = invoicePurchaseMapper.selectById(paymentRegistration.getInvoicePurchaseId()); List paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper() .eq("invoice_purchase_id", paymentRegistration.getInvoicePurchaseId()).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) { throw new RuntimeException("付款金额超出发票金额"); } paymentRegistration.setUpdateTime(DateUtils.getNowDate()); return paymentRegistrationMapper.updateById(paymentRegistration); } /** * 批量删除付款登记 * * @param ids 需要删除的付款登记主键 * @return 结果 */ @Override public int deletePaymentRegistrationByIds(Long[] ids) { return paymentRegistrationMapper.delete(new QueryWrapper().in("id", ids)); } @Override public PaymentRegistration selectPaymentRegistrationByPurchaseId(Long id) { PaymentRegistrationDto paymentRegistrationDto = new PaymentRegistrationDto(); PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id); paymentRegistrationDto.setSalesContractNo(purchaseLedger.getSalesContractNo()); paymentRegistrationDto.setSupplierName(purchaseLedger.getSupplierName()); paymentRegistrationDto.setSupplierId(purchaseLedger.getSupplierId()); List invoicePurchaseList = invoicePurchaseMapper.selectList(new QueryWrapper() .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()); } return paymentRegistrationDto; } @Override public List> selectPaymentLedgerList(PaymentLedgerDto paymentLedgerDto) { List> result = new ArrayList<>(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); Optional.ofNullable(paymentLedgerDto) .ifPresent(dto -> { if (StringUtils.hasText(dto.getSupplierName())) { queryWrapper.like(SupplierManage::getSupplierName, dto.getSupplierName()); } }); List supplierManages = supplierManageMapper.selectList(queryWrapper); for (SupplierManage supplierManage : supplierManages) { Map res = new HashMap<>(); res.put("supplierName", supplierManage.getSupplierName()); // 应付金额 BigDecimal payableAmount = BigDecimal.ZERO; List salesLedgers = salesLedgerMapper.selectList(new QueryWrapper().eq("customer_id", supplierManage.getId())); if (salesLedgers != null && salesLedgers.size() > 0) { List salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper() .in("sales_ledger_id", salesLedgers.stream().map(SalesLedger::getId).collect(Collectors.toList()))); // 应付金额 payableAmount = salesLedgerProducts.stream().map(SalesLedgerProduct::getTaxInclusiveTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add); } // 开票金额 BigDecimal invoiceAmount = salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add); // 付款金额 List paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper() .eq("supplier_id", supplierManage.getId())); BigDecimal paymentAmount = BigDecimal.ZERO; if (paymentRegistrations != null && paymentRegistrations.size() > 0) { paymentAmount = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add); } res.put("invoiceAmount", invoiceAmount); res.put("payableAmount", payableAmount); res.put("paymentAmount", paymentAmount); // 详情 List> details = new ArrayList<>(); for (PaymentRegistration paymentRegistration : paymentRegistrations) { Map 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); result.add(res); } return result; } }