From 1d9cfc91e7255b9e139b20ff230cb19246f19193 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 09 十一月 2026 14:32:11 +0800
Subject: [PATCH] refactor(erp): 重构ERP单据单号生成逻辑以支持冲突重试

---
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java |   25 +++++++++++++------------
 1 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
index 82b0986..4c2366e 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
@@ -114,10 +114,8 @@
             supplierService.validateSupplier(createReqVO.getSupplierId());
         }
         // 3. 鐢熸垚鐢宠鍗曞彿
-        String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_REQUEST_NO_PREFIX);
-        if (purchaseRequestMapper.selectByNo(no) != null) {
-            throw exception(PURCHASE_REQUEST_NO_EXISTS);
-        }
+        String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_REQUEST_NO_PREFIX,
+                candidate -> purchaseRequestMapper.selectByNo(candidate) != null);
 
         // 4. 鑾峰彇褰撳墠鐢ㄦ埛淇℃伅
         Long userId = Long.parseLong(getCurrentUserId());
@@ -276,10 +274,15 @@
         }
 
         // 3. 鍗曞彿锛氬~浜嗗氨鐢紙鏍¢獙鍞竴锛夛紝娌″~鑷姩鐢熸垚 CGSQ...
-        String no = StrUtil.isNotBlank(head.getNo()) ? head.getNo().trim()
-                : noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_REQUEST_NO_PREFIX);
-        if (purchaseRequestMapper.selectByNo(no) != null) {
-            throw new IllegalArgumentException("閲囪喘鐢宠鍗曞彿宸插瓨鍦細" + no);
+        String no;
+        if (StrUtil.isNotBlank(head.getNo())) {
+            no = head.getNo().trim();
+            if (purchaseRequestMapper.selectByNo(no) != null) {
+                throw new IllegalArgumentException("閲囪喘鐢宠鍗曞彿宸插瓨鍦細" + no);
+            }
+        } else {
+            no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_REQUEST_NO_PREFIX,
+                    candidate -> purchaseRequestMapper.selectByNo(candidate) != null);
         }
 
         // 4. 鐢宠浜� / 鐢宠閮ㄩ棬锛氬彇褰撳墠鐧诲綍鐢ㄦ埛鍙婂叾閮ㄩ棬
@@ -596,10 +599,8 @@
         }
 
         // 2. 鐢熸垚閲囪喘璁㈠崟鍙�
-        String orderNo = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX);
-        if (purchaseOrderMapper.selectByNo(orderNo) != null) {
-            throw exception(PURCHASE_ORDER_NO_EXISTS);
-        }
+        String orderNo = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX,
+                candidate -> purchaseOrderMapper.selectByNo(candidate) != null);
 
         // 3. 鍒涘缓閲囪喘璁㈠崟
         ErpPurchaseOrderDO purchaseOrder = new ErpPurchaseOrderDO();

--
Gitblit v1.9.3