From 4ca4444ad33a2a1a51f5c06e78ee9365dfb1eed6 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期四, 08 十月 2026 17:11:11 +0800
Subject: [PATCH] feat(mes): 种子二维码标签国标四要素合规改造

---
 yudao-server/src/main/java/cn/iocoder/yudao/server/framework/bizno/BizCodeSetInitializer.java |   87 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 87 insertions(+), 0 deletions(-)

diff --git a/yudao-server/src/main/java/cn/iocoder/yudao/server/framework/bizno/BizCodeSetInitializer.java b/yudao-server/src/main/java/cn/iocoder/yudao/server/framework/bizno/BizCodeSetInitializer.java
new file mode 100644
index 0000000..8f538f3
--- /dev/null
+++ b/yudao-server/src/main/java/cn/iocoder/yudao/server/framework/bizno/BizCodeSetInitializer.java
@@ -0,0 +1,87 @@
+package cn.iocoder.yudao.server.framework.bizno;
+
+import cn.iocoder.yudao.framework.common.util.number.BizNoUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 宸茬敤涓氬姟缂栫爜闆嗗悎鍏滃簳鍒濆鍖栥��
+ *
+ * <p>涓氬姟缂栫爜涓恒�岄殢鏈� 16 浣嶇函鏁板瓧銆嶏紝鍞竴鎬ч潬 Redis 闆嗗悎锛坽@link BizNoUtils#USED_SET_KEY}锛夋煡閲嶃��
+ * 鑻� Redis 涓㈠け璇ラ泦鍚堬紝宸茬敓鎴愮殑鍘嗗彶缂栫爜浼氳"蹇樿"锛屼箣鍚庡彲鑳借閲嶆柊闅忔満鍛戒腑鑰岄噸鍙枫��
+ *
+ * <p>鍥犳锛氬惎鍔ㄦ椂鑻ュ彂鐜拌闆嗗悎 **涓嶅瓨鍦�**锛屽垯浠庢暟鎹簱涓壂鎻忔墍鏈変笟鍔$紪鐮佸垪閲岀殑
+ * 銆�16 浣嶇函鏁板瓧銆嶇紪鐮侊紝閲嶆柊杞藉叆闆嗗悎锛屾仮澶嶉槻閲嶈兘鍔涖��
+ *
+ * <p>璇存槑锛�
+ * <ul>
+ *     <li>浠呭湪闆嗗悎缂哄け鏃舵壂鎻忥紙姝e父鍚姩鏃犻澶栧紑閿�锛夛紱</li>
+ *     <li>best-effort锛屽け璐ュ彧鍛婅銆佷笉褰卞搷鍚姩锛�</li>
+ *     <li>鏃х殑甯﹀瓧姣嶇紪鐮佷細琚拷鐣ャ��</li>
+ * </ul>
+ */
+@Component
+@Slf4j
+public class BizCodeSetInitializer implements ApplicationRunner {
+
+    /** 闆嗗悎鍒濆鍖栨爣璁帮紙闈� 16 浣嶏紝涓嶄細涓庣湡瀹炵紪鐮佸啿绐侊級锛岀敤浜庡湪搴撳唴鏃犵紪鐮佹椂涔熸爣璁颁负宸插垵濮嬪寲 */
+    private static final String INIT_MARKER = "__initialized__";
+
+    private final StringRedisTemplate stringRedisTemplate;
+    private final JdbcTemplate jdbcTemplate;
+
+    public BizCodeSetInitializer(StringRedisTemplate stringRedisTemplate, DataSource dataSource) {
+        this.stringRedisTemplate = stringRedisTemplate;
+        this.jdbcTemplate = new JdbcTemplate(dataSource);
+    }
+
+    @Override
+    public void run(ApplicationArguments args) {
+        if (Boolean.TRUE.equals(stringRedisTemplate.hasKey(BizNoUtils.USED_SET_KEY))) {
+            log.info("[run][宸茬敤缂栫爜闆嗗悎鍏滃簳] 闆嗗悎宸插瓨鍦紝璺宠繃搴撳唴鎵弿");
+            return;
+        }
+        long start = System.currentTimeMillis();
+        long total = 0L;
+        try {
+            String schema = jdbcTemplate.queryForObject("SELECT DATABASE()", String.class);
+            List<Map<String, Object>> columns = jdbcTemplate.queryForList(
+                    "SELECT table_name, column_name FROM information_schema.columns " +
+                            "WHERE table_schema = ? AND data_type IN ('varchar', 'char') " +
+                            "AND (column_name = 'no' OR column_name = 'code' OR column_name = 'temp_code' " +
+                            "     OR column_name LIKE '%\\_no' OR column_name LIKE '%\\_code')",
+                    schema);
+            for (Map<String, Object> column : columns) {
+                String table = String.valueOf(column.get("table_name"));
+                String col = String.valueOf(column.get("column_name"));
+                if (table.toLowerCase().startsWith("qrtz_") || table.toLowerCase().startsWith("act_")) {
+                    continue;
+                }
+                List<String> codes = jdbcTemplate.queryForList(
+                        "SELECT `" + col + "` FROM `" + table + "` WHERE `" + col + "` REGEXP '^[0-9]{"
+                                + BizNoUtils.CODE_LENGTH + "}$'",
+                        String.class);
+                if (!codes.isEmpty()) {
+                    stringRedisTemplate.opsForSet().add(BizNoUtils.USED_SET_KEY, codes.toArray(new String[0]));
+                    total += codes.size();
+                }
+            }
+            // 鏍囪涓哄凡鍒濆鍖栵紝閬垮厤涓嬫鍚姩閲嶅鎵弿
+            stringRedisTemplate.opsForSet().add(BizNoUtils.USED_SET_KEY, INIT_MARKER);
+            log.info("[run][宸茬敤缂栫爜闆嗗悎鍏滃簳] 闆嗗悎缂哄け锛屽凡杞藉叆搴撳唴 {} 涓紪鐮�", total);
+        } catch (Exception e) {
+            log.warn("[run][宸茬敤缂栫爜闆嗗悎鍏滃簳] 鍒濆鍖栧け璐ワ紙涓嶅奖鍝嶅惎鍔級锛岃鎺掓煡", e);
+        } finally {
+            log.info("[run][宸茬敤缂栫爜闆嗗悎鍏滃簳] 搴撳唴鎵弿鑰楁椂 {} ms", System.currentTimeMillis() - start);
+        }
+    }
+
+}

--
Gitblit v1.9.3