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.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.*;
|
import com.ruoyi.sales.pojo.*;
|
import com.ruoyi.sales.service.InvoiceLedgerService;
|
import org.apache.commons.collections4.CollectionUtils;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
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
|
public class InvoiceLedgerServiceImpl extends ServiceImpl<InvoiceLedgerMapper, InvoiceLedger> implements InvoiceLedgerService {
|
|
@Value("${ruoyi.profile}")
|
private String uploadFile;
|
|
@Autowired
|
private InvoiceLedgerMapper invoiceLedgerMapper;
|
|
@Autowired
|
private InvoiceLedgerFileMapper invoiceLedgerFileMapper;
|
|
@Autowired
|
private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
|
|
@Autowired
|
private ReceiptPaymentMapper receiptPaymentMapper;
|
|
@Autowired
|
private SalesLedgerProductMapper salesLedgerProductMapper;
|
@Autowired
|
private CommonFileMapper commonFileMapper;
|
|
/**
|
* 开票台账新增
|
* @param productDto
|
* @return
|
*/
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
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)){
|
for (FileVo fileVo : fileList) {
|
InvoiceLedgerFile invoiceLedgerFile = new InvoiceLedgerFile();
|
BeanUtils.copyProperties(fileVo, invoiceLedgerFile);
|
invoiceLedgerFile.setInvoiceLedgerId(invoiceLedger.getId());
|
invoiceLedgerFileMapper.insert(invoiceLedgerFile);
|
}
|
}
|
return result;
|
}
|
|
/**
|
* 开票台账删除
|
* @param ids
|
* @return
|
*/
|
@Override
|
public int invoiceLedgerDel(List<Integer> ids) {
|
LambdaQueryWrapper<InvoiceLedger> delWrapper = new LambdaQueryWrapper<>();
|
delWrapper.in(InvoiceLedger::getId, ids);
|
return invoiceLedgerMapper.delete(delWrapper);
|
}
|
|
/**
|
* 开票台账分页查询
|
* @param page
|
* @param invoiceLedgerDto
|
* @return
|
*/
|
@Override
|
public IPage<InvoiceLedgerDto> invoiceLedgerPage(Page page, InvoiceLedgerDto invoiceLedgerDto) {
|
return invoiceLedgerMapper.invoiceLedgerPage(page, invoiceLedgerDto);
|
}
|
|
/**
|
* 开票台账文件查询
|
* @param invoiceLedgerId
|
* @return
|
*/
|
@Override
|
public List<InvoiceLedgerFile> invoiceLedgerFileList(Integer invoiceLedgerId) {
|
LambdaQueryWrapper<InvoiceLedgerFile> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.eq(InvoiceLedgerFile::getInvoiceLedgerId, invoiceLedgerId);
|
return invoiceLedgerFileMapper.selectList(queryWrapper);
|
}
|
|
/**
|
* 开票台账文件上传
|
* @param file
|
* @return
|
*/
|
@Override
|
public FileVo invoiceLedgerUploadFile(MultipartFile file) {
|
FileVo fileVo = new FileVo();
|
try {
|
String baseDir = uploadFile + File.separatorChar + "invoiceLedger";
|
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();
|
throw new RuntimeException("文件上传失败");
|
}
|
return fileVo;
|
}
|
|
/**
|
* 附件下载
|
* @param response
|
* @param invoiceRegistrationProductDto
|
* @return
|
*/
|
@Override
|
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;
|
}).collect(Collectors.toList());
|
ExcelUtil<InvoiceLedgerExcelDto> util = new ExcelUtil<InvoiceLedgerExcelDto>(InvoiceLedgerExcelDto.class);
|
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);
|
}
|
|
}
|