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); } }