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.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.sales.dto.InvoiceLedgerDto; import com.ruoyi.sales.dto.InvoiceRegistrationDto; import com.ruoyi.sales.dto.InvoiceRegistrationProductDto; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.excel.InvoiceRegistrationExportVo; import com.ruoyi.sales.mapper.*; import com.ruoyi.sales.pojo.InvoiceLedger; import com.ruoyi.sales.pojo.InvoiceRegistration; import com.ruoyi.sales.pojo.InvoiceRegistrationProduct; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.InvoiceRegistrationService; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service public class InvoiceRegistrationServiceImpl extends ServiceImpl implements InvoiceRegistrationService { @Autowired private InvoiceRegistrationMapper invoiceRegistrationMapper; @Autowired private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper; @Autowired private SalesLedgerProductMapper salesLedgerProductMapper; @Autowired private InvoiceLedgerMapper invoiceLedgerMapper; @Autowired private SalesLedgerMapper salesLedgerMapper; /** * 开票登记记录新增 * @param salesLedgerDto * @return */ @Override @Transactional(rollbackFor = Exception.class) public void invoiceRegistrationSave(SalesLedgerDto salesLedgerDto) { InvoiceRegistration invoiceRegistration = new InvoiceRegistration(); BeanUtils.copyProperties(salesLedgerDto, invoiceRegistration); invoiceRegistration.setId(null); invoiceRegistration.setCustomerId(salesLedgerDto.getCustomerId().intValue()); invoiceRegistration.setSalesLedgerId(salesLedgerDto.getId().intValue()); invoiceRegistrationMapper.insert(invoiceRegistration); List productData = salesLedgerDto.getProductData(); BigDecimal invoiceAmountTotal = BigDecimal.ZERO; if(CollectionUtils.isNotEmpty(productData)){ for (SalesLedgerProduct productDatum : productData) { // 如果开票数为0 跳过 BigDecimal currentInvoiceNum = productDatum.getCurrentInvoiceNum(); if(null == currentInvoiceNum || BigDecimal.ZERO.compareTo(currentInvoiceNum) == 0){ continue; } invoiceAmountTotal = invoiceAmountTotal.add(currentInvoiceNum); InvoiceRegistrationProduct invoiceRegistrationProduct = new InvoiceRegistrationProduct(); BeanUtils.copyProperties(productDatum, invoiceRegistrationProduct); invoiceRegistrationProduct.setId(null); invoiceRegistrationProduct.setSalesLedgerId(salesLedgerDto.getId().intValue()); invoiceRegistrationProduct.setInvoiceRegistrationId(invoiceRegistration.getId()); invoiceRegistrationProduct.setInvoiceAmount(productDatum.getCurrentInvoiceAmount()); invoiceRegistrationProduct.setInvoiceNum(productDatum.getCurrentInvoiceNum()); invoiceRegistrationProduct.setSalesLedgerProductId(productDatum.getId().intValue()); invoiceRegistrationProductMapper.insert(invoiceRegistrationProduct); salesLedgerProductMapper.updateById(productDatum); // 新增一条开票台账数据 InvoiceLedger invoiceLedger = new InvoiceLedger(); invoiceLedger.setInvoiceDate(salesLedgerDto.getIssueDate()); invoiceLedger.setInvoiceRegistrationProductId(invoiceRegistrationProduct.getId()); invoiceLedger.setInvoiceTotal(invoiceRegistrationProduct.getInvoiceAmount()); invoiceLedger.setInvoiceNo(salesLedgerDto.getInvoiceNo()); invoiceLedger.setCreateUser(SecurityUtils.getUserId().intValue()); invoiceLedger.setInvoicePerson(productDatum.getRegister()); invoiceLedgerMapper.insert(invoiceLedger); } } } /** * 开票登记删除 * @param ids * @return */ @Override @Transactional(rollbackFor = Exception.class) public int invoiceRegistrationDel(List ids) { int excuteNum = invoiceRegistrationMapper.deleteBatchIds(ids); LambdaQueryWrapper delWrapper = new LambdaQueryWrapper<>(); delWrapper.in(InvoiceRegistrationProduct::getInvoiceRegistrationId, ids); invoiceRegistrationProductMapper.delete(delWrapper); return excuteNum; } /** * 开票记录修改 * @param invoiceRegistrationDto * @return */ @Override public void invoiceRegistrationUpdate(InvoiceRegistrationDto invoiceRegistrationDto) { InvoiceRegistration invoiceRegistration = new InvoiceRegistration(); BeanUtils.copyProperties(invoiceRegistrationDto, invoiceRegistration); // 开票登记修改 invoiceRegistrationMapper.updateById(invoiceRegistration); List productDtoList = invoiceRegistrationDto.getProductDtoList(); // 开票产品登记修改 if(CollectionUtils.isNotEmpty(productDtoList)){ for (InvoiceRegistrationProductDto invoiceRegistrationProductDto : productDtoList) { InvoiceRegistrationProduct invoiceRegistrationProduct = new InvoiceRegistrationProduct(); BeanUtils.copyProperties(invoiceRegistrationProductDto, invoiceRegistrationProduct); invoiceRegistrationProductMapper.updateById(invoiceRegistrationProduct); } } } /** * 开票登记分页查询 * @param page * @param invoiceRegistrationDto * @return */ @Override public IPage invoiceRegistrationListPage(Page page, InvoiceRegistrationDto invoiceRegistrationDto) { return invoiceRegistrationMapper.invoiceRegistrationListPage(page, invoiceRegistrationDto); } /** * 开票登记产品查询 * @param invoiceRegistrationProductDto * @return */ @Override public List invoiceRegistrationProductList(InvoiceRegistrationProductDto invoiceRegistrationProductDto) { return invoiceRegistrationProductMapper.invoiceRegistrationProductList(invoiceRegistrationProductDto); } /** * 开票登记详情 * @param id * @return */ @Override public InvoiceRegistrationDto invoiceRegistrationDetail(Integer id) { InvoiceRegistration invoiceRegistration = invoiceRegistrationMapper.selectById(id); if(ObjectUtils.isEmpty(invoiceRegistration)){ throw new RuntimeException("开票登记信息查找失败"); } InvoiceRegistrationDto invoiceRegistrationDto = new InvoiceRegistrationDto(); BeanUtils.copyProperties(invoiceRegistration, invoiceRegistrationDto); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("invoice_registration_id", id); List invoiceRegistrationProductList = invoiceRegistrationProductMapper.selectList(queryWrapper); List invoiceRegistrationProductDtoList = invoiceRegistrationProductList.stream().map(item -> { InvoiceRegistrationProductDto invoiceRegistrationProductDto = new InvoiceRegistrationProductDto(); BeanUtils.copyProperties(item, invoiceRegistrationProductDto); return invoiceRegistrationProductDto; }).collect(Collectors.toList()); invoiceRegistrationDto.setProductDtoList(invoiceRegistrationProductDtoList); return invoiceRegistrationDto; } /** * 开票登记导出 * 导出列:销售合同号、客户合同号、客户名称、合同金额、已开票金额、未开票金额 * 已开票/未开票金额口径与 /sales/ledger/listPage 页面一致 * @param response * @param salesLedgerDto */ @Override public void invoiceRegistrationExport(HttpServletResponse response, SalesLedgerDto salesLedgerDto) { Page page = new Page(); page.setCurrent(-1); page.setSize(-1); IPage iPage = salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto); List records = iPage.getRecords(); // 按销售台账汇总已开票金额 Map invoicedMap = new HashMap<>(); List salesLedgerIds = records.stream().map(SalesLedger::getId).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(salesLedgerIds)) { List invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds); for (InvoiceLedgerDto invoiceLedgerDto : invoiceLedgerDtoList) { invoicedMap.put(invoiceLedgerDto.getSalesLedgerId(), invoiceLedgerDto.getInvoiceTotal()); } } List exportList = new ArrayList<>(); for (SalesLedger record : records) { BigDecimal contractAmount = record.getContractAmount() == null ? BigDecimal.ZERO : record.getContractAmount(); BigDecimal invoiceTotal = invoicedMap.getOrDefault(record.getId().intValue(), BigDecimal.ZERO); BigDecimal noInvoiceAmountTotal = contractAmount.subtract(invoiceTotal); InvoiceRegistrationExportVo exportVo = new InvoiceRegistrationExportVo(); exportVo.setSalesContractNo(record.getSalesContractNo()); exportVo.setCustomerContractNo(record.getCustomerContractNo()); exportVo.setCustomerName(record.getCustomerName()); exportVo.setContractAmount(contractAmount); exportVo.setInvoiceTotal(invoiceTotal); exportVo.setNoInvoiceAmountTotal(noInvoiceAmountTotal); exportList.add(exportVo); } ExcelUtil util = new ExcelUtil(InvoiceRegistrationExportVo.class); util.exportExcel(response, exportList, "开票登记信息"); } }