gongchunyi
昨天 da54b18e2934c39eb21e246aeda8baef9d1af933
src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java
@@ -1,22 +1,18 @@
package com.ruoyi.sales.service.impl;
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.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.SupplierManageDto;
import com.ruoyi.basic.excel.SupplierManageExcelDto;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.vo.FileVo;
import com.ruoyi.sales.dto.InvoiceLedgerDto;
import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
import com.ruoyi.sales.excel.InvoiceLedgerExcelDto;
import com.ruoyi.sales.mapper.InvoiceLedgerFileMapper;
import com.ruoyi.sales.mapper.InvoiceLedgerMapper;
import com.ruoyi.sales.pojo.InvoiceLedger;
import com.ruoyi.sales.pojo.InvoiceLedgerFile;
import com.ruoyi.sales.mapper.*;
import com.ruoyi.sales.pojo.*;
import com.ruoyi.sales.service.InvoiceLedgerService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
@@ -24,11 +20,18 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.YearMonth;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
@Service
@@ -43,25 +46,78 @@
    @Autowired
    private InvoiceLedgerFileMapper invoiceLedgerFileMapper;
    @Autowired
    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    @Autowired
    private ReceiptPaymentMapper receiptPaymentMapper;
    @Autowired
    private SalesLedgerProductMapper salesLedgerProductMapper;
    @Autowired
    private CommonFileMapper commonFileMapper;
    /**
     * 开票台账新增
     * @param invoiceLedgerDto
     * @param productDto
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int invoiceLedgerAdd(InvoiceLedgerDto invoiceLedgerDto) {
        InvoiceLedger invoiceLedger = new InvoiceLedger();
        BeanUtils.copyProperties(invoiceLedgerDto, invoiceLedger);
        int result = invoiceLedgerMapper.insert(invoiceLedger);
        List<FileVo> fileList = invoiceLedgerDto.getFileList();
    public int invoiceLedgerSaveOrUpdate(InvoiceRegistrationProductDto productDto) {
        // 判断是否已经新增开票台账
        QueryWrapper<InvoiceLedger> ledgerQueryWrapper = new QueryWrapper<>();
        ledgerQueryWrapper.eq("invoice_registration_product_id", productDto.getId());
        InvoiceLedger invoiceLedger = invoiceLedgerMapper.selectOne(ledgerQueryWrapper);
        int result;
        if(ObjectUtils.isEmpty(invoiceLedger)){
            invoiceLedger = new InvoiceLedger();
            invoiceLedger.setInvoiceRegistrationProductId(productDto.getId());
            invoiceLedger.setInvoiceNo(productDto.getInvoiceNo());
            invoiceLedger.setInvoiceTotal(productDto.getInvoiceTotal());
            invoiceLedger.setInvoiceDate(productDto.getInvoiceDate());
            invoiceLedger.setInvoicePerson(productDto.getInvoicePerson());
            result = invoiceLedgerMapper.insert(invoiceLedger);
        }else {
            // 修改sale_leger_product
            InvoiceRegistrationProduct invoiceRegistrationProduct = invoiceRegistrationProductMapper.selectById(productDto.getId());
            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(invoiceRegistrationProduct.getSalesLedgerProductId());
            BigDecimal invoiceNum = productDto.getInvoiceTotal().divide(invoiceRegistrationProduct.getTaxInclusiveUnitPrice(), 2, BigDecimal.ROUND_HALF_UP);
            //计算 未开票数/未开票金额
            BigDecimal noInvoiceAmount = salesLedgerProduct.getNoInvoiceAmount().add(invoiceRegistrationProduct.getInvoiceAmount()).subtract(productDto.getInvoiceTotal());
            BigDecimal noInvoiceNum = salesLedgerProduct.getNoInvoiceNum().add(invoiceRegistrationProduct.getInvoiceNum()).subtract(invoiceNum);
            salesLedgerProduct.setNoInvoiceAmount(noInvoiceAmount);
            salesLedgerProduct.setNoInvoiceNum(noInvoiceNum);
            salesLedgerProductMapper.updateById(salesLedgerProduct);
            // 修改当前产品开票登记记录数据
            BigDecimal currentNoInvoiceNum = invoiceRegistrationProduct.getNoInvoiceNum().add(invoiceRegistrationProduct.getInvoiceNum()).subtract(invoiceNum);
            BigDecimal currentNoInvoiceAmount = invoiceRegistrationProduct.getNoInvoiceAmount().add(invoiceRegistrationProduct.getInvoiceAmount()).subtract(productDto.getInvoiceTotal());
            invoiceRegistrationProduct.setInvoiceNum(invoiceNum);
            invoiceRegistrationProduct.setInvoiceAmount(productDto.getInvoiceTotal());
            invoiceRegistrationProduct.setNoInvoiceNum(currentNoInvoiceNum);
            invoiceRegistrationProduct.setNoInvoiceAmount(currentNoInvoiceAmount);
            invoiceRegistrationProductMapper.updateById(invoiceRegistrationProduct);
            invoiceLedger.setInvoiceNo(productDto.getInvoiceNo());
            invoiceLedger.setInvoiceTotal(productDto.getInvoiceTotal());
            invoiceLedger.setInvoiceDate(productDto.getInvoiceDate());
            invoiceLedger.setInvoicePerson(productDto.getInvoicePerson());
            result = invoiceLedgerMapper.updateById(invoiceLedger);
            //删除所有附件关联
            LambdaQueryWrapper<InvoiceLedgerFile> delWrapper = new LambdaQueryWrapper<>();
            delWrapper.eq(InvoiceLedgerFile::getInvoiceLedgerId, invoiceLedger.getId());
            invoiceLedgerFileMapper.delete(delWrapper);
        }
        List<FileVo> fileList = productDto.getFileList();
        if(CollectionUtils.isNotEmpty(fileList)){
            fileList.forEach(fileVo -> {
            for (FileVo fileVo : fileList) {
                InvoiceLedgerFile invoiceLedgerFile = new InvoiceLedgerFile();
                BeanUtils.copyProperties(fileVo, invoiceLedgerFile);
                invoiceLedgerFile.setInvoiceLedgerId(invoiceLedger.getId());
                invoiceLedgerFileMapper.insert(invoiceLedgerFile);
            });
            }
        }
        return result;
    }
@@ -76,34 +132,6 @@
        LambdaQueryWrapper<InvoiceLedger> delWrapper = new LambdaQueryWrapper<>();
        delWrapper.in(InvoiceLedger::getId, ids);
        return invoiceLedgerMapper.delete(delWrapper);
    }
    /**
     * 开票台账修改
     * @param invoiceLedgerDto
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int invoiceLedgerUpdate(InvoiceLedgerDto invoiceLedgerDto) {
        InvoiceLedger invoiceLedger = new InvoiceLedger();
        BeanUtils.copyProperties(invoiceLedgerDto, invoiceLedger);
        int result = invoiceLedgerMapper.updateById(invoiceLedger);
        // 删除关联附件
        LambdaQueryWrapper<InvoiceLedgerFile> delWrapper = new LambdaQueryWrapper<>();
        delWrapper.eq(InvoiceLedgerFile::getInvoiceLedgerId, invoiceLedger.getId());
        invoiceLedgerFileMapper.delete(delWrapper);
        // 重新插入附件关联表
        List<FileVo> fileList = invoiceLedgerDto.getFileList();
        if(CollectionUtils.isNotEmpty(fileList)){
            fileList.forEach(fileVo -> {
                InvoiceLedgerFile invoiceLedgerFile = new InvoiceLedgerFile();
                BeanUtils.copyProperties(fileVo, invoiceLedgerFile);
                invoiceLedgerFile.setInvoiceLedgerId(invoiceLedger.getId());
                invoiceLedgerFileMapper.insert(invoiceLedgerFile);
            });
        }
        return result;
    }
    /**
@@ -139,9 +167,14 @@
        FileVo fileVo = new FileVo();
        try {
            String baseDir = uploadFile + File.separatorChar + "invoiceLedger";
            String filePath = FileUploadUtils.upload(baseDir, file);
            fileVo.setFileName(file.getOriginalFilename());
            fileVo.setFilePath(filePath);
            File dirFile = new File(baseDir);
            if(!dirFile.exists()){
                dirFile.mkdirs();
            }
            String filePath = baseDir + File.separatorChar + UUID.randomUUID() + "_" + file.getOriginalFilename();
            file.transferTo(new File(filePath));
            fileVo.setName(file.getOriginalFilename());
            fileVo.setUrl(filePath);
            fileVo.setFileSize((int)file.getSize());
        }catch (Exception e){
            e.printStackTrace();
@@ -153,13 +186,13 @@
    /**
     * 附件下载
     * @param response
     * @param invoiceLedgerDto
     * @param invoiceRegistrationProductDto
     * @return
     */
    @Override
    public void invoiceLedgerDownload(HttpServletResponse response, InvoiceLedgerDto invoiceLedgerDto) {
        List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoiceLedgerList(invoiceLedgerDto);
        List<InvoiceLedgerExcelDto> invoiceLedgerExcelDtoList = invoiceLedgerDtoList.stream().map(item -> {
    public void invoiceLedgerExport(HttpServletResponse response, InvoiceRegistrationProductDto invoiceRegistrationProductDto) {
        List<InvoiceRegistrationProductDto> invoiceRegistrationProductList = invoiceRegistrationProductMapper.invoiceRegistrationProductList(invoiceRegistrationProductDto);
        List<InvoiceLedgerExcelDto> invoiceLedgerExcelDtoList = invoiceRegistrationProductList.stream().map(item -> {
            InvoiceLedgerExcelDto invoiceLedgerExcelDto = new InvoiceLedgerExcelDto();
            BeanUtils.copyProperties(item, invoiceLedgerExcelDto);
            return invoiceLedgerExcelDto;
@@ -168,4 +201,312 @@
        util.exportExcel(response, invoiceLedgerExcelDtoList, "供应商导出");
    }
    /**
     * 开票台账详情
     * @param id
     * @return
     */
    @Override
    public InvoiceLedgerDto invoiceLedgerDetail(Integer id) {
        InvoiceLedgerDto invoiceLedgerDto  = invoiceLedgerMapper.invoiceLedgerInfo(id);
        if(ObjectUtils.isEmpty(invoiceLedgerDto)){
            throw new RuntimeException("开票台账查找失败");
        }
        // 查询附件
        QueryWrapper<InvoiceLedgerFile> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("invoice_ledger_id", id);
        List<InvoiceLedgerFile> invoiceLedgerFileList = invoiceLedgerFileMapper.selectList(queryWrapper);
        List<FileVo> fileList = invoiceLedgerFileList.stream().map(item -> {
            FileVo fileVo = new FileVo();
            BeanUtils.copyProperties(item, fileVo);
            return fileVo;
        }).collect(Collectors.toList());
        invoiceLedgerDto.setFileList(fileList);
        return invoiceLedgerDto;
    }
    /**
     * 附件提交
     * @param invoiceLedgerDto
     * @return
     */
    @Override
    public void invoiceLedgerCommitFile(InvoiceLedgerDto invoiceLedgerDto) {
        if(null == invoiceLedgerDto.getId()){
            throw new RuntimeException("缺少发票台账主键");
        }
        if(CollectionUtils.isEmpty(invoiceLedgerDto.getFileList())){
            throw new RuntimeException("缺少文件信息");
        }
        QueryWrapper<InvoiceLedger> ledgerQueryWrapper = new QueryWrapper<>();
        ledgerQueryWrapper.eq("invoice_registration_product_id", invoiceLedgerDto.getId());
        InvoiceLedger invoiceLedger = invoiceLedgerMapper.selectOne(ledgerQueryWrapper);
        if(ObjectUtils.isEmpty(invoiceLedger)){
            throw new RuntimeException("开票台账未登记");
        }
        List<FileVo> fileList = invoiceLedgerDto.getFileList();
        fileList.forEach(fileVo -> {
            InvoiceLedgerFile invoiceLedgerFile = new InvoiceLedgerFile();
            BeanUtils.copyProperties(fileVo, invoiceLedgerFile);
            invoiceLedgerFile.setInvoiceLedgerId(invoiceLedger.getId());
            invoiceLedgerFileMapper.insert(invoiceLedgerFile);
        });
    }
    /**
     * 开票台账查询
     * @param invoiceLedgerDto
     * @return
     */
    @Override
    public List<InvoiceLedgerDto> invoiceLedgerList(InvoiceLedgerDto invoiceLedgerDto) {
        return invoiceLedgerMapper.invoiceLedgerList(invoiceLedgerDto);
    }
    /**
     * 客户销售记录
     * @param page
     * @param invoiceLedgerDto
     * @return
     */
    @Override
    public IPage<InvoiceLedgerDto> invoiceLedgerSalesAccount(Page page, InvoiceLedgerDto invoiceLedgerDto) {
        IPage<InvoiceLedgerDto> invoiceLedgerDtoIPage = invoiceLedgerMapper.invoiceLedgerSalesAccount(page, invoiceLedgerDto);
        return invoiceLedgerDtoIPage;
    }
    @Override
    public BigDecimal getInvoiceAmount() {
        LocalDate now = LocalDate.now();
        YearMonth currentMonth = YearMonth.from(now);
        // 创建LambdaQueryWrapper
        LambdaQueryWrapper<InvoiceLedger> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.ge(InvoiceLedger::getInvoiceDate, currentMonth.atDay(1).atStartOfDay())  // 大于等于本月第一天
                .lt(InvoiceLedger::getInvoiceDate, currentMonth.plusMonths(1).atDay(1).atStartOfDay()); // 小于下月第一天
        // 执行查询并计算总和
        List<InvoiceLedger> invoiceLedgers = invoiceLedgerMapper.selectList(queryWrapper);
        BigDecimal totalContractAmount = invoiceLedgers.stream()
                .map(InvoiceLedger::getInvoiceTotal)
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        return totalContractAmount;
    }
    /**
     * 开票登记产品分页查询
     * @param page
     * @param registrationProductDto
     * @return
     */
    @Override
    public IPage<InvoiceRegistrationProductDto> registrationProductPage(Page page, InvoiceRegistrationProductDto registrationProductDto) {
        IPage<InvoiceRegistrationProductDto> invoiceRegistrationProductDtoIPage = invoiceRegistrationProductMapper.invoiceRegistrationProductPage(page, registrationProductDto);
        if (registrationProductDto.getStatus()) {
            invoiceRegistrationProductDtoIPage.getRecords().removeIf(invoiceRegistrationProduct -> !StringUtils.isEmpty(invoiceRegistrationProduct.getInvoiceNo()));
        }
        invoiceRegistrationProductDtoIPage.getRecords().forEach(invoiceRegistrationProductDto -> {
                invoiceRegistrationProductDto.setCommonFiles(invoiceLedgerFileMapper.selectList(new QueryWrapper<InvoiceLedgerFile>().lambda()
                        .eq(InvoiceLedgerFile::getInvoiceLedgerId, invoiceRegistrationProductDto.getInvoiceLedgerId())));
        });
        return invoiceRegistrationProductDtoIPage;
    }
    /**
     * 产品开票台账详情
     * @param id
     * @return
     */
    @Override
    public InvoiceRegistrationProductDto invoiceLedgerProductDetail(Integer id) {
        InvoiceRegistrationProductDto invoiceRegistrationProductDto = invoiceLedgerMapper.invoiceLedgerProductInfo(id);
        if(ObjectUtils.isEmpty(invoiceRegistrationProductDto)){
            throw new RuntimeException("产品开票台账查找失败");
        }
        // 查询附件
        QueryWrapper<InvoiceLedgerFile> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("invoice_ledger_id", invoiceRegistrationProductDto.getInvoiceLedgerId());
        List<InvoiceLedgerFile> invoiceLedgerFileList = invoiceLedgerFileMapper.selectList(queryWrapper);
        List<FileVo> fileList = invoiceLedgerFileList.stream().map(item -> {
            FileVo fileVo = new FileVo();
            BeanUtils.copyProperties(item, fileVo);
            return fileVo;
        }).collect(Collectors.toList());
        invoiceRegistrationProductDto.setFileList(fileList);
        return invoiceRegistrationProductDto;
    }
    /**
     * 开票台账删除
     * @param invoiceRegistrationProductId
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delInvoiceLedger(Integer invoiceRegistrationProductId) {
        // 判断是否有回款记录
        List<ReceiptPayment> receiptPaymentList = receiptPaymentMapper.receiptPaymentListByProdRegId(invoiceRegistrationProductId);
        if(!CollectionUtils.isEmpty(receiptPaymentList)){
            throw new RuntimeException("请先删除回款记录");
        }
        // 判断是否有开票登记记录
        InvoiceRegistrationProduct invoiceRegistrationProduct = invoiceRegistrationProductMapper.selectById(invoiceRegistrationProductId);
        if(ObjectUtils.isEmpty(invoiceRegistrationProduct)){
            throw new RuntimeException("开票登记记录查找失败");
        }
        // 判断该开票台账是否未当月,如果为当月直接删除否则新增一条相反负数数据
        QueryWrapper<InvoiceLedger> ledgerQueryWrapper = new QueryWrapper<>();
        ledgerQueryWrapper.eq("invoice_registration_product_id", invoiceRegistrationProductId);
        InvoiceLedger invoiceLedger = invoiceLedgerMapper.selectOne(ledgerQueryWrapper);
        if(ObjectUtils.isEmpty(invoiceLedger)){
            throw new RuntimeException("开票台账查找失败");
        }
        if( invoiceLedger.getInvoiceDate() == null){
            dealCurrentMonthDel(invoiceRegistrationProductId,invoiceRegistrationProduct);
            return;
        }
        // 获取当前日期
        LocalDate today = LocalDate.now();
        // 使用YearMonth比较年份和月份是否相同
        boolean equalsFlag = YearMonth.from(invoiceLedger.getInvoiceDate()).equals(YearMonth.from(today));
        if(equalsFlag){
            dealCurrentMonthDel(invoiceRegistrationProductId,invoiceRegistrationProduct);
        }else {
            dealOtherMonthDel(invoiceRegistrationProduct,invoiceLedger);
        }
    }
    /**
     * 处理当月开票台账删除
     *
     * @param invoiceRegistrationProductId
     * @param invoiceRegistrationProduct
     */
    private void dealCurrentMonthDel(Integer invoiceRegistrationProductId, InvoiceRegistrationProduct invoiceRegistrationProduct) {
        // 删除开票台账
        QueryWrapper<InvoiceLedger> delLedgerWrapper = new QueryWrapper<>();
        delLedgerWrapper.eq("invoice_registration_product_id", invoiceRegistrationProductId);
        invoiceLedgerMapper.delete(delLedgerWrapper);
        // 查询当前产品下的所有开票登记
        QueryWrapper<InvoiceRegistrationProduct> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("sales_ledger_id", invoiceRegistrationProduct.getSalesLedgerId());
        queryWrapper.eq("sales_ledger_product_id", invoiceRegistrationProduct.getSalesLedgerProductId());
        queryWrapper.orderByAsc("create_time");
        List<InvoiceRegistrationProduct> allList = invoiceRegistrationProductMapper.selectList(queryWrapper);
        int index = -1;
        for (int i = 0; i < allList.size(); i++) {
            if (invoiceRegistrationProductId.equals(allList.get(i).getId())) {
                index = i;
                break;
            }
        }
        if (index == -1) {
            return;
        }
        for (int i = index + 1; i < allList.size(); i++) {
            InvoiceRegistrationProduct current = allList.get(i);
            current.setNoInvoiceNum(current.getNoInvoiceNum().add(invoiceRegistrationProduct.getInvoiceNum()));
            current.setNoInvoiceAmount(current.getNoInvoiceAmount().add(invoiceRegistrationProduct.getInvoiceAmount()));
            invoiceRegistrationProductMapper.updateById(current);
        }
        // 删除当前开票登记
        invoiceRegistrationProductMapper.deleteById(invoiceRegistrationProductId);
        // 查询删除后的剩余开票登记
        QueryWrapper<InvoiceRegistrationProduct> newQueryWrapper = new QueryWrapper<>();
        newQueryWrapper.eq("sales_ledger_id", invoiceRegistrationProduct.getSalesLedgerId());
        newQueryWrapper.eq("sales_ledger_product_id", invoiceRegistrationProduct.getSalesLedgerProductId());
        newQueryWrapper.orderByAsc("create_time");
        List<InvoiceRegistrationProduct> remainList = invoiceRegistrationProductMapper.selectList(newQueryWrapper);
        // 查询销售台账产品
        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(invoiceRegistrationProduct.getSalesLedgerProductId());
        if (CollectionUtils.isEmpty(remainList)) {
            // 没有任何开票记录,恢复初始状态
            salesLedgerProduct.setInvoiceNum(BigDecimal.ZERO);
            salesLedgerProduct.setInvoiceAmount(BigDecimal.ZERO);
            salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity());
            salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
        } else {
            salesLedgerProduct.setInvoiceNum(salesLedgerProduct.getInvoiceNum().subtract(invoiceRegistrationProduct.getInvoiceNum()));
            salesLedgerProduct.setInvoiceAmount(salesLedgerProduct.getInvoiceAmount().subtract(invoiceRegistrationProduct.getInvoiceAmount()));
            salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getNoInvoiceNum().add(invoiceRegistrationProduct.getInvoiceNum()));
            salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getNoInvoiceAmount().add(invoiceRegistrationProduct.getInvoiceAmount()));
        }
        salesLedgerProductMapper.updateById(salesLedgerProduct);
    }
    /**
     * 处理其他月份开票台账删除
     * @param invoiceRegistrationProduct
     * @param invoiceLedger
     */
    private void dealOtherMonthDel(InvoiceRegistrationProduct invoiceRegistrationProduct, InvoiceLedger invoiceLedger) {
        //查询历史开票登记
        QueryWrapper<InvoiceRegistrationProduct> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("sales_ledger_id", invoiceRegistrationProduct.getSalesLedgerId());
        queryWrapper.eq("sales_ledger_product_id", invoiceRegistrationProduct.getSalesLedgerProductId());
        queryWrapper.orderByAsc("create_time");
        List<InvoiceRegistrationProduct> list = invoiceRegistrationProductMapper.selectList(queryWrapper);
        if (CollectionUtils.isEmpty(list)) {
            return;
        }
        InvoiceRegistrationProduct last = list.get(list.size() - 1);
        BigDecimal negateInvoiceNum = invoiceRegistrationProduct.getInvoiceNum().negate();
        BigDecimal negateInvoiceAmount = invoiceRegistrationProduct.getInvoiceAmount().negate();
        InvoiceRegistrationProduct copy = new InvoiceRegistrationProduct();
        BeanUtils.copyProperties(invoiceRegistrationProduct, copy);
        copy.setId(null);
        copy.setInvoiceNum(negateInvoiceNum);
        copy.setInvoiceAmount(negateInvoiceAmount);
        // 未开票 = 上一条 + 本次冲回的数量
        copy.setNoInvoiceNum(last.getNoInvoiceNum().add(invoiceRegistrationProduct.getInvoiceNum()));
        copy.setNoInvoiceAmount(last.getNoInvoiceAmount().add(invoiceRegistrationProduct.getInvoiceAmount()));
        invoiceRegistrationProductMapper.insert(copy);
        // 复制开票台账
        InvoiceLedger ledgerCopy = new InvoiceLedger();
        BeanUtils.copyProperties(invoiceLedger, ledgerCopy);
        ledgerCopy.setId(null);
        ledgerCopy.setInvoiceRegistrationProductId(copy.getId());
        ledgerCopy.setInvoiceTotal(invoiceLedger.getInvoiceTotal().negate());
        ledgerCopy.setInvoiceDate(LocalDate.now());
        invoiceLedgerMapper.insert(ledgerCopy);
        // 回滚 sales_ledger_product
        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(invoiceRegistrationProduct.getSalesLedgerProductId());
        // 已开票
        salesLedgerProduct.setInvoiceNum(salesLedgerProduct.getInvoiceNum().add(negateInvoiceNum));
        salesLedgerProduct.setInvoiceAmount(salesLedgerProduct.getInvoiceAmount().add(negateInvoiceAmount));
        // 未开票
        salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getNoInvoiceNum().add(invoiceRegistrationProduct.getInvoiceNum()));
        salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getNoInvoiceAmount().add(invoiceRegistrationProduct.getInvoiceAmount()));
        salesLedgerProductMapper.updateById(salesLedgerProduct);
    }
}