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.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
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.InvoiceRegistrationDto;
|
import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
|
import com.ruoyi.sales.dto.SalesLedgerDto;
|
import com.ruoyi.sales.excel.InvoiceRegisAndProductExcelDto;
|
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.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.List;
|
import java.util.stream.Collectors;
|
|
@Service
|
public class InvoiceRegistrationServiceImpl extends ServiceImpl<InvoiceRegistrationMapper, InvoiceRegistration> implements InvoiceRegistrationService {
|
|
@Autowired
|
private InvoiceRegistrationMapper invoiceRegistrationMapper;
|
|
@Autowired
|
private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
|
|
@Autowired
|
private SalesLedgerProductMapper salesLedgerProductMapper;
|
|
@Autowired
|
private InvoiceLedgerMapper invoiceLedgerMapper;
|
|
/**
|
* 开票登记记录新增
|
* @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<SalesLedgerProduct> productData = salesLedgerDto.getProductData();
|
if (CollectionUtils.isEmpty(productData)) {
|
return;
|
}
|
|
for (SalesLedgerProduct productDatum : productData) {
|
// 本次开票数 / 金额
|
BigDecimal currentInvoiceNum = productDatum.getCurrentInvoiceNum();
|
BigDecimal currentInvoiceAmount = productDatum.getCurrentInvoiceAmount();
|
|
if (currentInvoiceNum == null || BigDecimal.ZERO.compareTo(currentInvoiceNum) == 0) {
|
continue;
|
}
|
|
LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<SalesLedgerProduct>()
|
.eq(SalesLedgerProduct::getId, productDatum.getId())
|
.eq(SalesLedgerProduct::getSalesLedgerId, productDatum.getSalesLedgerId());
|
SalesLedgerProduct dbProduct = salesLedgerProductMapper.selectOne(salesLedgerProductLambdaQueryWrapper);
|
|
if (dbProduct == null) {
|
throw new RuntimeException("销售台账产品不存在,ID:" + productDatum.getId());
|
}
|
|
// 计算累计开票
|
BigDecimal newInvoiceNum = dbProduct.getInvoiceNum().add(currentInvoiceNum);
|
|
BigDecimal newInvoiceAmount = dbProduct.getInvoiceAmount().add(currentInvoiceAmount);
|
|
// 计算未开票
|
BigDecimal newNoInvoiceNum = dbProduct.getQuantity().subtract(newInvoiceNum);
|
|
BigDecimal newNoInvoiceAmount = dbProduct.getTaxInclusiveTotalPrice().subtract(newInvoiceAmount);
|
|
if (newNoInvoiceNum.compareTo(BigDecimal.ZERO) < 0
|
|| newNoInvoiceAmount.compareTo(BigDecimal.ZERO) < 0) {
|
throw new RuntimeException("开票数量或金额超过合同总量");
|
}
|
|
// 更新 sales_ledger_product
|
salesLedgerProductMapper.update(
|
null,
|
new LambdaUpdateWrapper<SalesLedgerProduct>()
|
.eq(SalesLedgerProduct::getId, dbProduct.getId())
|
.set(SalesLedgerProduct::getInvoiceNum, newInvoiceNum)
|
.set(SalesLedgerProduct::getInvoiceAmount, newInvoiceAmount)
|
.set(SalesLedgerProduct::getNoInvoiceNum, newNoInvoiceNum)
|
.set(SalesLedgerProduct::getNoInvoiceAmount, newNoInvoiceAmount)
|
);
|
|
InvoiceRegistrationProduct invoiceRegistrationProduct = new InvoiceRegistrationProduct();
|
BeanUtils.copyProperties(dbProduct, invoiceRegistrationProduct);
|
|
invoiceRegistrationProduct.setId(null);
|
invoiceRegistrationProduct.setSalesLedgerId(salesLedgerDto.getId().intValue());
|
invoiceRegistrationProduct.setInvoiceRegistrationId(invoiceRegistration.getId());
|
invoiceRegistrationProduct.setSalesLedgerProductId(dbProduct.getId().intValue());
|
invoiceRegistrationProduct.setInvoiceNum(currentInvoiceNum);
|
invoiceRegistrationProduct.setInvoiceAmount(currentInvoiceAmount);
|
invoiceRegistrationProduct.setNoInvoiceAmount(newNoInvoiceAmount);
|
|
invoiceRegistrationProductMapper.insert(invoiceRegistrationProduct);
|
|
InvoiceLedger invoiceLedger = new InvoiceLedger();
|
invoiceLedger.setInvoiceDate(salesLedgerDto.getIssueDate());
|
invoiceLedger.setInvoiceRegistrationProductId(invoiceRegistrationProduct.getId());
|
invoiceLedger.setInvoiceTotal(currentInvoiceAmount);
|
invoiceLedger.setInvoiceNo(salesLedgerDto.getInvoiceNo());
|
invoiceLedger.setCreateUser(SecurityUtils.getUserId().intValue());
|
invoiceLedger.setInvoicePerson(dbProduct.getRegister());
|
|
invoiceLedgerMapper.insert(invoiceLedger);
|
}
|
}
|
|
/**
|
* 开票登记删除
|
* @param ids
|
* @return
|
*/
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public int invoiceRegistrationDel(List<Integer> ids) {
|
int excuteNum = invoiceRegistrationMapper.deleteBatchIds(ids);
|
LambdaQueryWrapper<InvoiceRegistrationProduct> 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<InvoiceRegistrationProductDto> 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<InvoiceRegistrationDto> invoiceRegistrationListPage(Page page, InvoiceRegistrationDto invoiceRegistrationDto) {
|
return invoiceRegistrationMapper.invoiceRegistrationListPage(page, invoiceRegistrationDto);
|
}
|
|
/**
|
* 开票登记产品查询
|
* @param invoiceRegistrationProductDto
|
* @return
|
*/
|
@Override
|
public List<InvoiceRegistrationProductDto> 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<InvoiceRegistrationProduct> queryWrapper = new QueryWrapper<>();
|
queryWrapper.eq("invoice_registration_id", id);
|
List<InvoiceRegistrationProduct> invoiceRegistrationProductList = invoiceRegistrationProductMapper.selectList(queryWrapper);
|
List<InvoiceRegistrationProductDto> invoiceRegistrationProductDtoList = invoiceRegistrationProductList.stream().map(item -> {
|
InvoiceRegistrationProductDto invoiceRegistrationProductDto = new InvoiceRegistrationProductDto();
|
BeanUtils.copyProperties(item, invoiceRegistrationProductDto);
|
return invoiceRegistrationProductDto;
|
}).collect(Collectors.toList());
|
invoiceRegistrationDto.setProductDtoList(invoiceRegistrationProductDtoList);
|
return invoiceRegistrationDto;
|
}
|
|
/**
|
* 开票登记导出
|
* @param response
|
* @param invoiceRegistrationDto
|
*/
|
@Override
|
public void invoiceRegistrationExport(HttpServletResponse response, InvoiceRegistrationDto invoiceRegistrationDto) {
|
List<InvoiceRegisAndProductExcelDto> invoiceRegisAndProductExcelDtoList = invoiceRegistrationMapper.invoiceRegisAndProductExcelDtoList();
|
ExcelUtil<InvoiceRegisAndProductExcelDto> util = new ExcelUtil<InvoiceRegisAndProductExcelDto>(InvoiceRegisAndProductExcelDto.class);
|
util.exportExcel(response, invoiceRegisAndProductExcelDtoList, "开票登记信息");
|
}
|
}
|