From 0ddbb4ec727ffce844ef672107e3410d84b1f11a Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期三, 30 九月 2026 09:42:08 +0800
Subject: [PATCH] feat: 业务编码改为随机16位数字并保证全系统唯一

---
 yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/number/BizNoUtils.java |   50 +++++++++++++++++++++++++++++++-------------------
 1 files changed, 31 insertions(+), 19 deletions(-)

diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/number/BizNoUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/number/BizNoUtils.java
index c1045ac..e19d041 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/number/BizNoUtils.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/number/BizNoUtils.java
@@ -1,29 +1,30 @@
 package cn.iocoder.yudao.framework.common.util.number;
 
+import java.util.concurrent.ThreadLocalRandom;
+
 /**
  * 涓氬姟缂栫爜锛堝崟鎹彿 / 涓绘暟鎹紪鐮侊級鐢熸垚鐨勫叕鍏辩害瀹氥��
  *
- * <p>闇�姹傦細绯荤粺涓墍鏈夎嚜鍔ㄧ敓鎴愮殑涓氬姟缂栫爜缁熶竴涓恒��16 浣嶇函鏁板瓧銆嶏紝涓斿叏绯荤粺鍞竴锛堜换鎰忎袱鏉$紪鐮侀兘涓嶉噸澶嶏級銆�
+ * <p>闇�姹傦細绯荤粺涓墍鏈夎嚜鍔ㄧ敓鎴愮殑涓氬姟缂栫爜缁熶竴涓恒��16 浣嶇函鏁板瓧銆嶏紝涓�**闅忔満鐢熸垚銆佷笉浣跨敤鑷/椤哄簭**锛�
+ * 鍚屾椂淇濊瘉鍏ㄧ郴缁熷敮涓�锛堜换鎰忎袱鏉$紪鐮侀兘涓嶉噸澶嶏級銆�
  *
- * <p>瀹炵幇绾﹀畾锛氬叏绯荤粺鍏辩敤鍚屼竴涓� Redis 鑷 KEY锛坽@link #GLOBAL_SEQ_KEY}锛夛紝
- * 姣忔鐢熸垚鏃跺鍏舵墽琛� INCR 寰楀埌鍗曡皟閫掑鐨勫簭鍒楀彿锛屽啀宸﹁ˉ '0' 鍒� {@link #CODE_LENGTH} 浣嶃��
- * 鐢变簬鎵�鏈夌紪鐮侀兘鏉ヨ嚜鍚屼竴鏉¢�掑搴忓垪锛屾晠澶╃劧淇濊瘉銆屽叏绯荤粺鍞竴銆嶃��
- *
- * <p>娉ㄦ剰锛�
+ * <p>瀹炵幇绾﹀畾锛�
  * <ul>
- *     <li>璇� KEY 涓嶈缃繃鏈熸椂闂达紝閬垮厤杩囨湡褰掗浂瀵艰嚧閲嶅彿锛�</li>
- *     <li>Redis 鑻ュ彂鐢熸暟鎹涪澶� / 娓呯┖锛岄渶瑕佷粠鏁版嵁搴撶幇鏈夌紪鐮佺殑鏈�澶у�兼仮澶嶈鏁板櫒锛屽惁鍒欏彲鑳介噸鍙枫��</li>
+ *     <li>缂栫爜 = 闅忔満 16 浣嶆暟瀛楋紙鑼冨洿 0 ~ 10^16-1锛屽乏渚цˉ '0'锛夛紱</li>
+ *     <li>鍞竴鎬х敱 Redis 闆嗗悎 {@link #USED_SET_KEY} 鏌ラ噸淇濊瘉锛氶殢鏈虹敓鎴愬悗鍐欏叆闆嗗悎锛�
+ *         鍐欐垚鍔燂紙杩斿洖 1锛夎鏄庢病鐢ㄨ繃鎵嶉噰鐢紝鍚﹀垯閲嶈瘯锛�</li>
+ *     <li>鍚勭敓鎴愮偣锛氳 {@link #randomCode()} 涓� {@link #MAX_RETRY}銆�</li>
  * </ul>
+ *
+ * <p>娉ㄦ剰锛歊edis 闆嗗悎涓㈠け鍚庯紝鍘嗗彶缂栫爜鍙兘琚噸鏂伴殢鏈哄懡涓紱搴旂敤鍚姩鏃朵細灏嗗簱鍐呭凡鏈夌紪鐮�
+ * 閲嶆柊杞藉叆闆嗗悎锛堣 yudao-server 鐨勫惎鍔ㄥ厹搴曪級銆�
  */
 public class BizNoUtils {
 
     /**
-     * 鍏ㄧ郴缁熶笟鍔$紪鐮佺粺涓�浣跨敤鐨� Redis 鑷 KEY銆�
-     *
-     * <p>鎵�鏈夋ā鍧楋紙erp / crm / trade / aftersales / hrm / bpm / mes锛夊叡鐢ㄦ KEY锛�
-     * 浠ヤ繚璇併�屽叏绯荤粺鍞竴銆嶃��
+     * 宸蹭娇鐢ㄤ笟鍔$紪鐮佺殑 Redis 闆嗗悎 KEY锛岀敤浜庨殢鏈虹紪鐮佹煡閲嶏紝淇濊瘉鍏ㄧ郴缁熷敮涓�銆�
      */
-    public static final String GLOBAL_SEQ_KEY = "biz:seq_no:global";
+    public static final String USED_SET_KEY = "biz:code:used";
 
     /**
      * 涓氬姟缂栫爜鐨勬�婚暱搴︼細16 浣�
@@ -31,13 +32,24 @@
     public static final int CODE_LENGTH = 16;
 
     /**
-     * 灏嗚嚜澧炲簭鍒楀彿鏍煎紡鍖栦负 16 浣嶇函鏁板瓧缂栫爜锛堝乏渚цˉ '0'锛�
-     *
-     * @param seq 鑷搴忓垪鍙�
-     * @return 16 浣嶇函鏁板瓧缂栫爜
+     * 闅忔満缂栫爜鐨勭┖闂翠笂闄愶紙涓嶅惈锛夛細10^16
      */
-    public static String format(Long seq) {
-        return String.format("%0" + CODE_LENGTH + "d", seq);
+    private static final long CODE_SPACE = 10_000_000_000_000_000L;
+
+    /**
+     * 鐢熸垚闅忔満缂栫爜鏃剁殑鏈�澶ч噸璇曟鏁帮紙鍛戒腑宸茬敤缂栫爜鏃堕噸璇曪級
+     */
+    public static final int MAX_RETRY = 10;
+
+    /**
+     * 鐢熸垚涓�涓殢鏈� 16 浣嶇函鏁板瓧缂栫爜锛堝乏渚цˉ '0'锛夛紝**涓嶅仛鏌ラ噸**銆�
+     *
+     * <p>璋冪敤鏂归渶鑷鐢� {@link #USED_SET_KEY} 鏌ラ噸锛屽懡涓垯閲嶈瘯銆�
+     *
+     * @return 闅忔満 16 浣嶇函鏁板瓧缂栫爜
+     */
+    public static String randomCode() {
+        return String.format("%0" + CODE_LENGTH + "d", ThreadLocalRandom.current().nextLong(CODE_SPACE));
     }
 
 }

--
Gitblit v1.9.3