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.core.toolkit.CollectionUtils; 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.*; 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 lombok.AllArgsConstructor; 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 @AllArgsConstructor public class PaymentRegistrationServiceImpl extends ServiceImpl implements IPaymentRegistrationService { private PaymentRegistrationMapper paymentRegistrationMapper; private PurchaseLedgerMapper purchaseLedgerMapper; private InvoicePurchaseMapper invoicePurchaseMapper; private SalesLedgerMapper salesLedgerMapper; private SupplierManageMapper supplierManageMapper; private SalesLedgerProductMapper salesLedgerProductMapper; private TicketRegistrationMapper ticketRegistrationMapper; private ProductRecordMapper productRecordMapper; /** * 查询付款登记 * * @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("ticket_registration_id", registrationDto.getTicketRegistrationId())); 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()); TicketRegistration tr = ticketRegistrationMapper.selectOne(new LambdaQueryWrapper().eq(TicketRegistration::getId, paymentRegistration.getTicketRegistrationId())); if (tr == null) { throw new RuntimeException("关联发票不存在"); } List paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper() .eq("ticket_registration_id", tr.getId())); BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add); 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); } /** * 修改付款登记 * * @param paymentRegistration 付款登记 * @return 结果 */ @Override public int updatePaymentRegistration(PaymentRegistration paymentRegistration) { TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(paymentRegistration.getTicketRegistrationId()); List paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper() .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(ticketRegistration.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 ticketRegistrations = ticketRegistrationMapper.selectList(new QueryWrapper() .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> 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 purchaseLedgers = purchaseLedgerMapper.selectList(new QueryWrapper().eq("supplier_id", supplierManage.getId())); if (purchaseLedgers != null && purchaseLedgers.size() > 0) { List salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper() .in("sales_ledger_id", purchaseLedgers.stream().map(PurchaseLedger::getId).collect(Collectors.toList()))); // 应付金额 payableAmount = salesLedgerProducts.stream().map(SalesLedgerProduct::getTaxInclusiveTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add); } BigDecimal invoiceAmount = BigDecimal.ZERO; List ticketRegistrations = Collections.emptyList(); // 增加空值检查,避免NullPointerException if (CollectionUtils.isNotEmpty(purchaseLedgers)) { Long[] ids = purchaseLedgers.stream() .map(PurchaseLedger::getId) .toArray(Long[]::new); // 检查数组是否有元素 if (ids.length > 0) { ticketRegistrations = ticketRegistrationMapper.selectList( new LambdaQueryWrapper() .in(TicketRegistration::getPurchaseLedgerId, ids) ); } } if (ticketRegistrations != null && ticketRegistrations.size() > 0) { // 来票金额 invoiceAmount = ticketRegistrations.stream().map(TicketRegistration::getInvoiceAmount).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("paymentAmount", paymentRegistration.getCurrentPaymentAmount()); // 付款金额 TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(paymentRegistration.getTicketRegistrationId()); detail.put("payableAmount", ticketRegistration.getInvoiceAmount()); // 应付金额 BigDecimal voteCount = productRecordMapper.selectList( new LambdaQueryWrapper() .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); result.add(res); } return result; } }