package com.ruoyi.account.service.impl.sales; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 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.AccountSalesCollectionDto; import com.ruoyi.account.bean.vo.sales.AccountSalesCollectionVo; import com.ruoyi.account.bean.vo.sales.SalesOutboundVo; import com.ruoyi.account.mapper.AccountStatementDetailsMapper; import com.ruoyi.account.mapper.sales.AccountSalesCollectionMapper; import com.ruoyi.account.pojo.AccountStatementDetails; import com.ruoyi.account.pojo.sales.AccountSalesCollection; import com.ruoyi.account.service.sales.AccountSalesCollectionService; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.sales.dto.SaveReceiptPaymentDto; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.pojo.SalesLedger; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.stream.Collectors; /** *

* 财务管理--收款单 服务实现类 *

* * @author 芯导软件(江苏)有限公司 * @since 2026-05-18 03:49:56 */ @Service @RequiredArgsConstructor public class AccountSalesCollectionServiceImpl extends ServiceImpl implements AccountSalesCollectionService { private final AccountSalesCollectionMapper accountSalesCollectionMapper; private final AccountStatementDetailsMapper accountStatementDetailsMapper; private final SalesLedgerMapper salesLedgerMapper; private static final DateTimeFormatter CODE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyMMddHHmmss"); @Override public IPage listPageAccountSalesCollection(Page page, AccountSalesCollectionDto accountSalesCollectionDto) { return accountSalesCollectionMapper.listPageAccountSalesCollection(page, accountSalesCollectionDto); } @Override public boolean addAccountSalesCollection(AccountSalesCollection accountSalesCollection) { if (StringUtils.isEmpty(accountSalesCollection.getCollectionNumber())) { accountSalesCollection.setCollectionNumber(genAccountSalesCollectionNo()); } String stockOutRecordIds = accountSalesCollection.getStockOutRecordIds(); if (stockOutRecordIds != null && !stockOutRecordIds.isEmpty()) { List ids = Arrays.stream(stockOutRecordIds.split(",")) .map(Long::valueOf) .toList(); if (accountSalesCollectionMapper.existsByStockOutRecordId(ids)){ throw new ServiceException("存在重复的出库单"); } } return save(accountSalesCollection); } @Override public void exportAccountSalesCollection(HttpServletResponse response, AccountSalesCollectionDto accountSalesCollectionDto) { List list = accountSalesCollectionMapper.listPageAccountSalesCollection(new Page(1,-1),accountSalesCollectionDto).getRecords(); ExcelUtil util = new ExcelUtil<>(AccountSalesCollectionVo.class); util.exportExcel(response, list , "收款单"); } @Override public boolean deleteAccountSalesCollection(List ids) { //如果该收款单已经生成对账单则无法删除 List accountSalesCollections = accountSalesCollectionMapper.selectByIds(ids); List strings = accountSalesCollections.stream().map(AccountSalesCollection::getCollectionNumber).toList(); List accountStatementDetails = accountStatementDetailsMapper.selectList(Wrappers.lambdaQuery() .in(AccountStatementDetails::getReceiptNumber, strings)); if (CollectionUtils.isNotEmpty(accountStatementDetails)){ throw new ServiceException("该收款单已经生成对账单,无法删除"); } return removeByIds(ids); } @Override public List getOutboundBatchesByCustomer(Integer customerId) { return accountSalesCollectionMapper.getOutboundBatchesByCustomer(customerId); } @Override public boolean saveReceiptPayment(SaveReceiptPaymentDto dto) { if (dto.getPaymentDate() == null) { throw new ServiceException("请选择回款日期"); } if (dto.getPaymentAmount() == null || dto.getPaymentAmount().compareTo(BigDecimal.valueOf(0.01)) < 0) { throw new ServiceException("请输入回款金额"); } if (StringUtils.isEmpty(dto.getSalesContractNo())) { throw new ServiceException("销售合同号不能为空"); } if (dto.getCustomerId() == null) { throw new ServiceException("客户不能为空"); } SalesLedger salesLedger = salesLedgerMapper.selectOne(new LambdaQueryWrapper() .eq(SalesLedger::getSalesContractNo, dto.getSalesContractNo())); if (salesLedger == null) { throw new ServiceException("销售合同不存在"); } if (salesLedger.getCustomerId() == null || salesLedger.getCustomerId().longValue() != dto.getCustomerId().longValue()) { throw new ServiceException("客户与合同不匹配"); } List stockOutRecordIds = accountSalesCollectionMapper.selectStockOutRecordIdsBySalesLedgerId(salesLedger.getId()); if (CollectionUtils.isEmpty(stockOutRecordIds)) { throw new ServiceException("该合同暂无可回款的销售出库记录"); } AccountSalesCollection collection = new AccountSalesCollection(); collection.setCustomerId(dto.getCustomerId().intValue()); collection.setStockOutRecordIds(stockOutRecordIds.stream().map(String::valueOf).collect(Collectors.joining(","))); collection.setCollectionDate(dto.getPaymentDate()); collection.setCollectionAmount(dto.getPaymentAmount()); collection.setCollectionMethod(dto.getPaymentMethod()); collection.setCollectionNumber(genAccountSalesCollectionNo()); collection.setRemark(dto.getRemark()); return save(collection); } private String genAccountSalesCollectionNo() { return "SK" + LocalDateTime.now().format(CODE_TIME_FORMATTER) + new Random().nextInt(10); } }