package com.ruoyi.account.service.impl.sales;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.bean.dto.sales.AccountInvoiceApplicationDto;
import com.ruoyi.account.bean.vo.sales.AccountInvoiceApplicationVo;
import com.ruoyi.account.bean.vo.sales.SalesOutboundVo;
import com.ruoyi.account.mapper.sales.AccountInvoiceApplicationMapper;
import com.ruoyi.account.mapper.sales.AccountSalesInvoiceMapper;
import com.ruoyi.account.pojo.sales.AccountInvoiceApplication;
import com.ruoyi.account.pojo.sales.AccountSalesInvoice;
import com.ruoyi.account.service.sales.AccountInvoiceApplicationService;
import com.ruoyi.basic.mapper.StorageAttachmentMapper;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
/**
*
* 财务管理--开票申请 服务实现类
*
*
* @author 芯导软件(江苏)有限公司
* @since 2026-05-18 01:38:32
*/
@Service
@RequiredArgsConstructor
public class AccountInvoiceApplicationServiceImpl extends ServiceImpl implements AccountInvoiceApplicationService {
private final AccountInvoiceApplicationMapper accountInvoiceApplicationMapper;
private final AccountSalesInvoiceMapper accountSalesInvoiceMapper;
private final StorageAttachmentMapper storageAttachmentMapper;
private static final DateTimeFormatter CODE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyMMddHHmmss");
@Override
public IPage listPageAccountInvoiceApplication(Page page, AccountInvoiceApplicationDto accountInvoiceApplicationDto) {
return accountInvoiceApplicationMapper.listPageAccountInvoiceApplication(page, accountInvoiceApplicationDto);
}
@Override
public List getOutboundBatchesByCustomer(Integer customerId) {
return accountInvoiceApplicationMapper.getOutboundBatchesByCustomer(customerId);
}
@Override
public boolean addAccountInvoiceApplication(AccountInvoiceApplication accountInvoiceApplication) {
if (StringUtils.isEmpty(accountInvoiceApplication.getInvoiceApplicationNo())) {
accountInvoiceApplication.setInvoiceApplicationNo(genInvoiceApplicationNo());
}
String stockOutRecordIds = accountInvoiceApplication.getStockOutRecordIds();
if (stockOutRecordIds != null && !stockOutRecordIds.isEmpty()) {
List ids = Arrays.stream(stockOutRecordIds.split(","))
.map(Long::valueOf)
.toList();
if (accountInvoiceApplicationMapper.existsByStockOutRecordId(ids)){
throw new ServiceException("存在重复的出库单");
}
}
return save(accountInvoiceApplication);
}
@Override
public void exportAccountInvoiceApplication(HttpServletResponse response, AccountInvoiceApplicationDto accountInvoiceApplicationDto) {
List list = accountInvoiceApplicationMapper.listPageAccountInvoiceApplication(new Page(1,-1),accountInvoiceApplicationDto).getRecords();
ExcelUtil util = new ExcelUtil<>(AccountInvoiceApplicationVo.class);
util.exportExcel(response, list , "开票申请");
}
@Override
public boolean deleteAccountInvoiceApplication(List ids) {
if (ids == null || ids.isEmpty()) {
throw new ServiceException("删除失败,请选择要删除的数据");
}
//删除相关附件
List accountSalesInvoices = accountSalesInvoiceMapper.selectList(Wrappers.lambdaQuery().in(AccountSalesInvoice::getAccountInvoiceApplicationId,ids));
storageAttachmentMapper.deleteBatchIds(accountSalesInvoices.stream().map(AccountSalesInvoice::getStorageAttachmentId).toList());
//删除相关的销项发票
accountSalesInvoiceMapper.delete(Wrappers.lambdaQuery().in(AccountSalesInvoice::getAccountInvoiceApplicationId,ids));
//删除开票申请
return removeBatchByIds(ids);
}
private String genInvoiceApplicationNo() {
return "KP" + LocalDateTime.now().format(CODE_TIME_FORMATTER) + new Random().nextInt(10);
}
}