From 5b8e83c5170e570b9247946e799556b53445c458 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 18 八月 2026 15:17:09 +0800
Subject: [PATCH] feat(sales): 实现销售台账自动开票回款功能
---
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | 129 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 128 insertions(+), 1 deletions(-)
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index 3b0cc55..b2ef118 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.sales.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -8,6 +9,7 @@
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.pojo.AccountIncome;
import com.ruoyi.account.service.AccountIncomeService;
import com.ruoyi.basic.mapper.CustomerMapper;
import com.ruoyi.basic.mapper.ProductMapper;
@@ -38,6 +40,7 @@
import com.ruoyi.sales.mapper.*;
import com.ruoyi.sales.pojo.*;
import com.ruoyi.sales.service.ISalesLedgerService;
+import com.ruoyi.sales.service.ReceiptPaymentService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
@@ -128,6 +131,8 @@
;
@Autowired
private SysUserMapper sysUserMapper;
+ @Autowired
+ private ReceiptPaymentService receiptPaymentService;
@Override
public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) {
@@ -406,6 +411,7 @@
salesLedgerMapper.insert(salesLedger);
+ List<SalesLedgerProduct> insertedProducts = new ArrayList<>();
for (SalesLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) {
SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct();
BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
@@ -437,9 +443,12 @@
salesLedgerProduct.setApproveStatus(0);
salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice());
salesLedgerProductMapper.insert(salesLedgerProduct);
+ insertedProducts.add(salesLedgerProduct);
// 娣诲姞鐢熶骇鏁版嵁
salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
}
+ // 瀵煎叆鏃跺悓鏍疯嚜鍔ㄥ叏棰濆紑绁ㄣ�佽嚜鍔ㄥ叏棰濆洖娆�
+ autoInvoiceAndReceiptPayment(salesLedger, insertedProducts);
}
return AjaxResult.success("瀵煎叆鎴愬姛");
@@ -566,6 +575,16 @@
if (CollectionUtils.isNotEmpty(invoiceLedgerIds)) {
LambdaQueryWrapper<ReceiptPayment> wrapperTree = new LambdaQueryWrapper<>();
wrapperTree.in(ReceiptPayment::getInvoiceLedgerId, invoiceLedgerIds);
+ List<ReceiptPayment> receiptPayments = receiptPaymentMapper.selectList(wrapperTree);
+ // 鍚屾鍒犻櫎鍥炴瀵瑰簲鐨勮储鍔℃敹鍏ヨ褰曪紝閬垮厤浜х敓瀛ゅ効鏁版嵁
+ if (CollectionUtils.isNotEmpty(receiptPayments)) {
+ List<Long> receiptPaymentIds = receiptPayments.stream()
+ .map(item -> item.getId().longValue())
+ .collect(Collectors.toList());
+ accountIncomeService.remove(new LambdaQueryWrapper<AccountIncome>()
+ .in(AccountIncome::getBusinessId, receiptPaymentIds)
+ .eq(AccountIncome::getBusinessType, 1));
+ }
receiptPaymentMapper.delete(wrapperTree);
}
// 鍒犻櫎鍙戣揣鍙拌处璁板綍
@@ -604,7 +623,8 @@
salesLedger.setCustomerName(customer.getCustomerName());
salesLedger.setTenantId(customer.getTenantId());
// 3. 鏂板鎴栨洿鏂颁富琛�
- if (salesLedger.getId() == null) {
+ boolean isNew = salesLedger.getId() == null;
+ if (isNew) {
String contractNo = generateSalesContractNo();
salesLedger.setSalesContractNo(contractNo);
salesLedgerMapper.insert(salesLedger);
@@ -628,6 +648,11 @@
// 5. 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰�
if (salesLedgerDto.getTempFileIds() != null && !salesLedgerDto.getTempFileIds().isEmpty()) {
migrateTempFilesToFormal(salesLedger.getId(), salesLedgerDto.getTempFileIds());
+ }
+
+ // 6. 鏂板鍙拌处鏃惰嚜鍔ㄥ叏棰濆紑绁ㄣ�佽嚜鍔ㄥ叏棰濆洖娆�
+ if (isNew && productList != null && !productList.isEmpty()) {
+ autoInvoiceAndReceiptPayment(salesLedger, productList);
}
return 1;
} catch (IOException e) {
@@ -743,6 +768,108 @@
}
}
+ /**
+ * 鏂板閿�鍞彴璐︽椂鑷姩鍏ㄩ寮�绁ㄣ�佽嚜鍔ㄥ叏棰濆洖娆�
+ * <p>
+ * 1. 鎸夊悎鍚屽叏棰濊嚜鍔ㄧ敓鎴愬紑绁ㄧ櫥璁帮紙invoice_registration + invoice_registration_product + invoice_ledger锛夛紱
+ * 2. 鎸夊紑绁ㄥ叏棰濊嚜鍔ㄧ敓鎴愬洖娆剧櫥璁帮紙receipt_payment锛夊強璐㈠姟鏀跺叆璁板綍锛坅ccount_income锛夈��
+ *
+ * @param salesLedger 閿�鍞彴璐︿富琛紙宸插叆搴擄級
+ * @param products 鍙拌处浜у搧鍒楄〃锛堝凡鍏ュ簱锛屽惈涓婚敭ID锛�
+ */
+ private void autoInvoiceAndReceiptPayment(SalesLedger salesLedger, List<SalesLedgerProduct> products) {
+ // 浠呭鐞嗛攢鍞被浜у搧
+ List<SalesLedgerProduct> saleProducts = products.stream()
+ .filter(Objects::nonNull)
+ .filter(p -> p.getId() != null)
+ .filter(p -> SaleEnum.SALE.getCode().equals(p.getType()))
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(saleProducts)) {
+ return;
+ }
+
+ String register = SecurityUtils.getLoginUser().getUser().getNickName();
+
+ // 1. 鑷姩寮�绁細鐢熸垚涓�寮犲紑绁ㄧ櫥璁颁富琛紝瑕嗙洊璇ュ彴璐﹀叏閮ㄤ骇鍝�
+ InvoiceRegistration invoiceRegistration = new InvoiceRegistration();
+ invoiceRegistration.setSalesLedgerId(salesLedger.getId().intValue());
+ invoiceRegistration.setSalesContractNo(salesLedger.getSalesContractNo());
+ invoiceRegistration.setCustomerId(salesLedger.getCustomerId() == null ? null : salesLedger.getCustomerId().intValue());
+ invoiceRegistration.setSalesman(salesLedger.getSalesman());
+ invoiceRegistration.setProjectName(salesLedger.getProjectName());
+ invoiceRegistrationMapper.insert(invoiceRegistration);
+
+ List<ReceiptPayment> receiptPaymentList = new ArrayList<>();
+ for (SalesLedgerProduct product : saleProducts) {
+ BigDecimal invoiceNum = product.getQuantity();
+ BigDecimal invoiceAmount = product.getTaxInclusiveTotalPrice();
+ // 鏁伴噺鎴栭噾棰濈己澶辨椂璺宠繃锛屼笉闃绘柇鍙拌处鏂板
+ if (invoiceNum == null || invoiceAmount == null
+ || invoiceNum.compareTo(BigDecimal.ZERO) <= 0
+ || invoiceAmount.compareTo(BigDecimal.ZERO) <= 0) {
+ continue;
+ }
+
+ // 1.1 浜у搧鏈紑绁ㄦ暟閲�/閲戦娓呴浂锛堝叏棰濆紑绁級
+ salesLedgerProductMapper.update(
+ null,
+ new LambdaUpdateWrapper<SalesLedgerProduct>()
+ .eq(SalesLedgerProduct::getId, product.getId())
+ .set(SalesLedgerProduct::getNoInvoiceNum, BigDecimal.ZERO)
+ .set(SalesLedgerProduct::getNoInvoiceAmount, BigDecimal.ZERO)
+ );
+
+ // 1.2 寮�绁ㄧ櫥璁颁骇鍝�
+ InvoiceRegistrationProduct invoiceRegistrationProduct = new InvoiceRegistrationProduct();
+ BeanUtils.copyProperties(product, invoiceRegistrationProduct);
+ invoiceRegistrationProduct.setId(null);
+ invoiceRegistrationProduct.setSalesLedgerId(salesLedger.getId().intValue());
+ invoiceRegistrationProduct.setInvoiceRegistrationId(invoiceRegistration.getId());
+ invoiceRegistrationProduct.setSalesLedgerProductId(product.getId().intValue());
+ invoiceRegistrationProduct.setInvoiceNum(invoiceNum);
+ invoiceRegistrationProduct.setInvoiceAmount(invoiceAmount);
+ invoiceRegistrationProduct.setNoInvoiceNum(BigDecimal.ZERO);
+ invoiceRegistrationProduct.setNoInvoiceAmount(BigDecimal.ZERO);
+ invoiceRegistrationProductMapper.insert(invoiceRegistrationProduct);
+
+ // 1.3 寮�绁ㄥ彴璐︼紙鍙戠エ鍙疯嚜鍔ㄧ敓鎴愶級
+ InvoiceLedger invoiceLedger = new InvoiceLedger();
+ invoiceLedger.setInvoiceDate(LocalDate.now());
+ invoiceLedger.setInvoiceRegistrationProductId(invoiceRegistrationProduct.getId());
+ invoiceLedger.setInvoiceTotal(invoiceAmount);
+ invoiceLedger.setInvoiceNo(generateAutoInvoiceNo(product.getId()));
+ invoiceLedger.setCreateUser(SecurityUtils.getUserId().intValue());
+ invoiceLedger.setInvoicePerson(register);
+ invoiceLedgerMapper.insert(invoiceLedger);
+
+ // 2. 缁勮鑷姩鍥炴璁板綍锛堟寜寮�绁ㄥ叏棰濆洖娆撅級
+ ReceiptPayment receiptPayment = new ReceiptPayment();
+ receiptPayment.setReceiptPaymentType("0");
+ receiptPayment.setReceiptPaymentAmount(invoiceAmount);
+ receiptPayment.setRegistrant(register);
+ receiptPayment.setInvoiceLedgerId(invoiceLedger.getId());
+ receiptPayment.setSalesLedgerId(salesLedger.getId());
+ receiptPayment.setSalesLedgerProductId(product.getId());
+ receiptPayment.setReceiptPaymentDate(LocalDate.now());
+ receiptPaymentList.add(receiptPayment);
+ }
+
+ // 3. 鑷姩鍥炴锛堝唴閮ㄥ悓姝ユ洿鏂颁骇鍝佸洖娆鹃噾棰濆苟鐢熸垚璐㈠姟鏀跺叆璁板綍锛�
+ if (!receiptPaymentList.isEmpty()) {
+ receiptPaymentService.receiptPaymentSaveOrUpdate(receiptPaymentList);
+ }
+ }
+
+ /**
+ * 鐢熸垚鑷姩寮�绁ㄥ彂绁ㄥ彿
+ *
+ * @param salesLedgerProductId 閿�鍞彴璐︿骇鍝両D
+ * @return 鑷姩鍙戠エ鍙�
+ */
+ private String generateAutoInvoiceNo(Long salesLedgerProductId) {
+ return "AUTO" + System.currentTimeMillis() + salesLedgerProductId;
+ }
+
private SalesLedger convertToEntity(SalesLedgerDto dto) {
SalesLedger entity = new SalesLedger();
BeanUtils.copyProperties(dto, entity);
--
Gitblit v1.9.3