sen
2026-02-01 93f8c736fd50a80a72d633e888e2d65904bcd7fc
service/src/main/java/com/ruoyi/cwgl/service/impl/InvoiceManageServiceImpl.java
@@ -1,5 +1,6 @@
package com.ruoyi.cwgl.service.impl;
import java.math.BigDecimal;
import java.util.*;
import cn.hutool.core.collection.CollectionUtil;
@@ -15,6 +16,7 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.cwgl.domain.*;
import com.ruoyi.cwgl.domain.dto.CallbackReceiptDto;
import com.ruoyi.cwgl.mapper.*;
import com.ruoyi.cwgl.service.IInvoiceBillDetailService;
import com.ruoyi.cwgl.service.IInvoiceBusinessService;
import com.ruoyi.system.service.ISystemDataNoService;
@@ -31,8 +33,6 @@
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.common.core.service.BaseService;
import com.ruoyi.cwgl.mapper.InvoiceManageMapper;
import com.ruoyi.cwgl.mapper.InvoiceBillDetailMapper;
import com.ruoyi.cwgl.service.IInvoiceManageService;
import com.ruoyi.cwgl.service.IInvoiceManageLogService;
import com.ruoyi.common.core.text.Convert;
@@ -59,6 +59,7 @@
    @Resource
    private IInvoiceManageLogService invoiceManageLogService;
    @Autowired
    private ISystemDataNoService systemDataNoService;
    @Autowired
@@ -75,6 +76,15 @@
    private String returnAddress;
    @Autowired
    private IInvoiceBusinessService invoiceBusinessService;
    @Resource
    private ReceivableInvoiceBusinessMapper receivableInvoiceBusinessMapper;
    @Resource
    private ReceivableBillManagementMapper receivableBillManagementMapper;
    @Resource
    private PayableInvoiceBusinessMapper payableInvoiceBusinessMapper;
    @Resource
    private PayableBillManagementMapper payableBillManagementMapper;
    /**
     * 查询发票管理
     *
@@ -435,6 +445,235 @@
    }
    /**
     * 应收账单申请开票
     *
     * @param invoiceManage 发票管理对象
     * @param id 应收账单ID
     * @return 结果
     */
    @Override
    public AjaxResult applyReceivableInvoice(InvoiceManage invoiceManage, Integer id) {
        List<InvoiceBillDetail> invoiceReceivableBillDetails = invoiceManage.getInvoiceBillDetails();
        if (CollectionUtil.isEmpty(invoiceReceivableBillDetails)) {
            throw new ServiceException("应收账单商品明细无数据无法开发票");
        }
        // 获取应收账单信息
        ReceivableBillManagement receivableBill = receivableBillManagementMapper.selectReceivableBillManagementById(id);
        if (receivableBill == null) {
            throw new ServiceException("应收账单记录不存在");
        }
        // 查询应收账单的应结算金额
        BigDecimal totalAmount = receivableBill.getTotalAmount();
        if (totalAmount == null || totalAmount.compareTo(BigDecimal.ZERO) <= 0) {
            throw new ServiceException("应收账单应结算金额无效");
        }
        // 查询receivable_invoice_business表中的开票金额
        ReceivableInvoiceBusiness query = new ReceivableInvoiceBusiness();
        query.setHeadId(id);
        List<ReceivableInvoiceBusiness> existingInvoices = receivableInvoiceBusinessMapper.selectReceivableInvoiceBusinessList(query);
        // 计算已开票金额
        BigDecimal invoicedAmount = existingInvoices.stream()
                .map(ReceivableInvoiceBusiness::getInvoicingAmount)
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // 计算本次开票金额
        BigDecimal currentInvoiceAmount = invoiceReceivableBillDetails.stream()
                .map(InvoiceBillDetail::getPrice)
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // 校验开票金额不能超过应结算金额
        BigDecimal totalInvoicedAmount = invoicedAmount.add(currentInvoiceAmount);
        if (totalInvoicedAmount.compareTo(totalAmount) > 0) {
            throw new ServiceException("开票金额" + currentInvoiceAmount + "加上已开票金额" + invoicedAmount +
                    "超过应结算金额" + totalAmount + ",无法开票");
        }
        String noByKey = systemDataNoService.getNoByKey(SystemDataNoEnum.YSFP);
        // 在receivable_invoice_business表中添加开票数据
        ReceivableInvoiceBusiness receivableInvoiceBusiness = new ReceivableInvoiceBusiness();
        receivableInvoiceBusiness.setHeadId(id);
        receivableInvoiceBusiness.setOrderSn(noByKey); // 使用noByKey作为orderSn
        receivableInvoiceBusiness.setInvoiceType("应收发票");
        receivableInvoiceBusiness.setInvoiceCompanyName(receivableBill.getCustomerName());
        receivableInvoiceBusiness.setInvoicingAmount(currentInvoiceAmount);
        receivableInvoiceBusiness.setStatus(0); // 初始状态
        receivableInvoiceBusiness.setCreateTime(new java.util.Date());
        // 保存到receivable_invoice_business表
        receivableInvoiceBusinessMapper.insertReceivableInvoiceBusiness(receivableInvoiceBusiness);
        // 记录应收账单申请开票日志
        recordReceivableApplyInvoiceLog(receivableBill, invoiceReceivableBillDetails);
        return componentInvoice(noByKey, "FP_RECEIVABLE", invoiceManage, invoiceReceivableBillDetails);
    }
    /**
     * 应付账单申请开票
     *
     * @param invoiceManage 发票管理对象
     * @param id 应付账单ID
     * @return 结果
     */
    @Override
    public AjaxResult applyPayableInvoice(InvoiceManage invoiceManage, Integer id) {
        List<InvoiceBillDetail> invoiceBillDetails = invoiceManage.getInvoiceBillDetails();
        if (CollectionUtil.isEmpty(invoiceBillDetails)) {
            throw new ServiceException("应付账单商品明细无数据无法开发票");
        }
        // 获取应付账单信息
        PayableBillManagement payableBill = payableBillManagementMapper.selectPayableBillManagementById(id);
        if (payableBill == null) {
            throw new ServiceException("应付账单记录不存在");
        }
        // 查询应付账单的应结算金额
        BigDecimal totalAmount = payableBill.getTotalAmount();
        if (totalAmount == null || totalAmount.compareTo(BigDecimal.ZERO) <= 0) {
            throw new ServiceException("应付账单应结算金额无效");
        }
        // 查询payable_invoice_business表中的开票金额
        PayableInvoiceBusiness query = new PayableInvoiceBusiness();
        query.setHeadId(id);
        List<PayableInvoiceBusiness> existingInvoices = payableInvoiceBusinessMapper.selectPayableInvoiceBusinessList(query);
        // 计算已开票金额
        BigDecimal invoicedAmount = existingInvoices.stream()
                .map(PayableInvoiceBusiness::getInvoicingAmount)
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // 计算本次开票金额
        BigDecimal currentInvoiceAmount = invoiceBillDetails.stream()
                .map(InvoiceBillDetail::getPrice)
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // 校验开票金额不能超过应结算金额
        BigDecimal totalInvoicedAmount = invoicedAmount.add(currentInvoiceAmount);
        if (totalInvoicedAmount.compareTo(totalAmount) > 0) {
            throw new ServiceException("开票金额" + currentInvoiceAmount + "加上已开票金额" + invoicedAmount +
                    "超过应结算金额" + totalAmount + ",无法开票");
        }
        String noByKey = systemDataNoService.getNoByKey(SystemDataNoEnum.YFFP);
        // 在payable_invoice_business表中添加开票数据
        PayableInvoiceBusiness payableInvoiceBusiness = new PayableInvoiceBusiness();
        payableInvoiceBusiness.setHeadId(id);
        payableInvoiceBusiness.setOrderSn(noByKey); // 使用noByKey作为orderSn
        payableInvoiceBusiness.setInvoiceType("pc");
        payableInvoiceBusiness.setInvoiceCompanyName(payableBill.getSupplierName());
        payableInvoiceBusiness.setInvoicingAmount(currentInvoiceAmount);
        payableInvoiceBusiness.setStatus(0); // 初始状态
        payableInvoiceBusiness.setCreateTime(new java.util.Date());
        // 保存到payable_invoice_business表
        payableInvoiceBusinessMapper.insertPayableInvoiceBusiness(payableInvoiceBusiness);
        recordPayableApplyInvoiceLog(payableBill,invoiceBillDetails);
        // 调用现有的 componentInvoice 接口
        return componentInvoice(noByKey, "FP_PAYABLE", invoiceManage, invoiceBillDetails);
    }
    /**
     * 记录应收账单申请开票日志
     *
     * @param receivableBill 应收账单对象
     * @param invoiceBillDetails 应收账单商品明细列表
     */
    private void recordReceivableApplyInvoiceLog(ReceivableBillManagement receivableBill,List<InvoiceBillDetail> invoiceBillDetails) {
        try {
            InvoiceManageLog log = new InvoiceManageLog();
            log.setInvoiceManageId(receivableBill.getId());
            log.setOperator(SecurityUtils.getUsername());
            log.setOperationTime(new java.util.Date());
            // 构建操作描述,包含开票金额、关联应收账单编号和对应开票金额
            StringBuilder descBuilder = new StringBuilder();
            descBuilder.append("应收账单申请开票: ");
            if (receivableBill.getTotalAmount() != null) {
                descBuilder.append("账单总金额=").append(receivableBill.getTotalAmount()).append("; ");
            }
            // 获取关联应收账单信息
            if (invoiceBillDetails != null && !invoiceBillDetails.isEmpty()) {
                for (InvoiceBillDetail detail : invoiceBillDetails) {
                    if (detail.getGoodsName() != null) {
                        descBuilder.append("商品名称=").append(detail.getGoodsName());
                    }
                    if (detail.getPrice() != null) {
                        descBuilder.append(", 商品金额=").append(detail.getPrice());
                    }
                    descBuilder.append("; ");
                }
            }
            log.setOperationDesc(descBuilder.toString());
            log.setCreateTime(new java.util.Date());
            invoiceManageLogService.insertInvoiceManageLog(log);
        } catch (Exception e) {
            logger.error("记录应收账单申请开票日志失败: {}", e.getMessage());
        }
    }
    /**
     * 记录应付账单申请开票日志
     *
     * @param payableBill 应付账单对象
     * @param invoiceBillDetails 应付账单商品明细列表
     */
    private void recordPayableApplyInvoiceLog(PayableBillManagement payableBill, List<InvoiceBillDetail> invoiceBillDetails) {
        try {
            InvoiceManageLog log = new InvoiceManageLog();
            log.setInvoiceManageId(payableBill.getId());
            log.setOperator(SecurityUtils.getUsername());
            log.setOperationTime(new java.util.Date());
            // 构建操作描述,包含开票金额、关联应付账单编号和对应开票金额
            StringBuilder descBuilder = new StringBuilder();
            descBuilder.append("应付账单申请开票: ");
            if (payableBill.getTotalAmount() != null) {
                descBuilder.append("账单总金额=").append(payableBill.getTotalAmount()).append("; ");
            }
            // 获取关联应付账单信息
            if (invoiceBillDetails != null && !invoiceBillDetails.isEmpty()) {
                for (InvoiceBillDetail detail : invoiceBillDetails) {
                    if (detail.getGoodsName() != null) {
                        descBuilder.append("商品名称=").append(detail.getGoodsName());
                    }
                    if (detail.getPrice() != null) {
                        descBuilder.append(", 商品金额=").append(detail.getPrice());
                    }
                    descBuilder.append("; ");
                }
            }
            log.setOperationDesc(descBuilder.toString());
            log.setCreateTime(new java.util.Date());
            invoiceManageLogService.insertInvoiceManageLog(log);
        } catch (Exception e) {
            logger.error("记录应付账单申请开票日志失败: {}", e.getMessage());
        }
    }
    /**
     * 记录申请开票日志
     *
     * @param invoiceManage 发票管理对象