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-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java |   55 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 50 insertions(+), 5 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java
index 864066c..a3fa297 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java
@@ -28,7 +28,8 @@
 /**
  * 浜岀淮鐮佹爣绛惧浘鐗囧伐鍏风被
  * <p>
- * 鐢熸垚"浜岀淮鐮� + 鍙充晶鍙鏂囨湰"鐨勫悎鎴愬浘鐗囷細浜岀淮鐮佸彧缂栫爜绾爜鍊硷紝鏂囨湰鍙犲姞鍏抽敭淇℃伅锛�
+ * 鐢熸垚"浜岀淮鐮� + 鍙充晶鍙鏂囨湰"鐨勫悎鎴愬浘鐗囷細浜岀淮鐮佺紪鐮佸唴瀹圭敱璋冪敤鏂逛紶鍏ワ紙閰嶇疆浜嗘函婧愬湴鍧�鏃朵负
+ * 甯� code 鍙傛暟鐨勬函婧� URL锛屾湭閰嶇疆鏃朵负绾爜鍊硷級锛屽彸渚у彔鍔犲叧閿俊鎭枃鏈紝
  * 鍗充娇鏁版嵁搴撲涪澶变篃鑳戒粠鎵撳嵃鍥剧墖杩樺師鍏抽敭淇℃伅銆�
  */
 @Slf4j
@@ -55,11 +56,21 @@
     /** 瀛楁闂磋窛 */
     private static final int FIELD_GAP = 6;
 
-    /** 涓枃瀛椾綋鍊欓�夛紙鎸変紭鍏堢骇锛夛紝閬垮厤 Linux headless 涓嬫枃瀛楀彉鏂规 */
+    /**
+     * 涓枃瀛椾綋鍊欓�夛紙鎸変紭鍏堢骇锛夈��
+     * <p>
+     * 鍙厑璁告敹褰曞彲娓叉煋涓枃鐨勫瓧浣擄細绾媺涓佸瓧浣擄紙濡� Arial锛変竴鏃﹀叆閫夛紝涓枃浼氬叏閮ㄦ覆鏌撴垚鏂规锛�
+     * 涓斿鍑鸿繃绋嬩笉鎶ラ敊锛屽睘浜庢渶闅愯斀鐨勪竴绫讳簨鏁呫��
+     */
     private static final String[] FONT_CANDIDATES = {
-            "Noto Sans CJK SC", "WenQuanYi Zen Hei", "Microsoft YaHei", "SimSun", "Arial"
+            "Noto Sans CJK SC", "Source Han Sans SC", "WenQuanYi Zen Hei", "PingFang SC",
+            "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", "SimSun"
     };
 
+    /** 涓枃瀛楀舰鎺㈤拡瀛楃锛堢敤浜庢帰娴嬪瓧浣撴槸鍚﹀叿澶囦腑鏂囧瓧褰級 */
+    private static final char CJK_PROBE = '琚�';
+
+    /** 瑙f瀽鍑虹殑涓枃瀛椾綋鏃忓悕锛涗负 null 琛ㄧず褰撳墠鐜娌℃湁浠讳綍鍙覆鏌撲腑鏂囩殑瀛椾綋 */
     private static final String FONT_NAME = resolveFontName();
 
     /**
@@ -70,6 +81,8 @@
      * @return 鍚堟垚鍥剧墖
      */
     public static BufferedImage createQrLabel(String code, LinkedHashMap<String, String> keyValues) {
+        // 鏃犱腑鏂囧瓧浣撴椂鐩存帴澶辫触锛岄伩鍏嶅鍑轰腑鏂囦负鏂规鐨勬爣绛�
+        assertCjkFontAvailable();
         QrConfig config = new QrConfig();
         config.setErrorCorrection(ErrorCorrectionLevel.H); // 鎵撳嵃鏍囩鏄撶(鎹燂紝鐢ㄩ珮瀹归敊
         config.setMargin(1); // 淇濊瘉闈欏尯锛屾壂鐮佺巼
@@ -134,14 +147,46 @@
 
     // ==================== 绉佹湁鏂规硶 ====================
 
+    /**
+     * 瑙f瀽褰撳墠鐜鍙敤鐨勪腑鏂囧瓧浣撴棌鍚嶃��
+     * <p>
+     * 涓嶈兘鎸夊瓧浣撴棌鍚嶅仛绮剧‘鍖归厤锛氬悓涓�瀛椾綋鍦ㄤ笉鍚岀郴缁熶笂鐨勬棌鍚嶅彲鑳戒笉鍚岋紙渚嬪 Windows 涓婂疄闄呮敞鍐屼负
+     * {@code Microsoft YaHei UI} 鑰岄潪 {@code Microsoft YaHei}锛夛紝绮剧‘鍖归厤钀界┖鍚庝細涓�璺��鍒扮函鎷変竵瀛椾綋锛�
+     * 涓枃鍗虫覆鏌撲负鏂规銆傚洜姝よ繖閲岀粺涓�鐢� {@link Font#canDisplay(char)} 鎺㈡祴涓枃瀛楀舰銆�
+     *
+     * @return 鍙覆鏌撲腑鏂囩殑瀛椾綋鏃忓悕锛涙棤鍙敤瀛椾綋鏃惰繑鍥� {@code null}
+     */
     private static String resolveFontName() {
         Set<String> families = Set.of(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());
         for (String candidate : FONT_CANDIDATES) {
-            if (families.contains(candidate)) {
+            if (families.contains(candidate) && canDisplayCjk(candidate)) {
                 return candidate;
             }
         }
-        return Font.SANS_SERIF;
+        // 閫昏緫瀛椾綋鐢� JDK 璐熻矗瀛楀舰鍥為��锛屽鏁扮幆澧冨彲娓叉煋涓枃
+        if (canDisplayCjk(Font.SANS_SERIF)) {
+            return Font.SANS_SERIF;
+        }
+        return null;
+    }
+
+    /**
+     * 鎺㈡祴鎸囧畾瀛椾綋鏃忚兘鍚︽覆鏌撲腑鏂�
+     */
+    private static boolean canDisplayCjk(String family) {
+        return new Font(family, Font.PLAIN, FONT_SIZE).canDisplay(CJK_PROBE);
+    }
+
+    /**
+     * 鏍¢獙褰撳墠鐜瀛樺湪鍙覆鏌撲腑鏂囩殑瀛椾綋锛屽惁鍒欐姏鍑哄紓甯搞��
+     * <p>
+     * 渚涘惎鍔ㄦ湡璋冪敤锛氬畞鍙湪鍚姩鏃跺け璐ワ紝涔熶笉鑳芥妸涓枃娓叉煋鎴愭柟妗嗙殑鏍囩浜や粯鍗板埛銆�
+     */
+    public static void assertCjkFontAvailable() {
+        if (FONT_NAME == null) {
+            throw new IllegalStateException("褰撳墠鐜娌℃湁浠讳綍鍙覆鏌撲腑鏂囩殑瀛椾綋锛屼簩缁寸爜鏍囩鐨勪腑鏂囧皢鏄剧ず涓烘柟妗嗭紝"
+                    + "鎷掔粷鐢熸垚鏍囩銆傝鍦ㄦ湇鍔″櫒瀹夎涓枃瀛椾綋锛堝 fonts-noto-cjk锛夊悗閲嶅惎銆�");
+        }
     }
 
     private static int measureTextHeight(LinkedHashMap<String, String> keyValues, Font labelFont, Font valueFont) {

--
Gitblit v1.9.3