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/config/MesQrCodeConfig.java |  122 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 121 insertions(+), 1 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/config/MesQrCodeConfig.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/config/MesQrCodeConfig.java
index d4da7f7..e18c9f5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/config/MesQrCodeConfig.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/config/MesQrCodeConfig.java
@@ -1,22 +1,142 @@
 package cn.iocoder.yudao.module.mes.framework.config;
 
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.module.mes.framework.qrcode.MesProQrLabelBuilder;
+import cn.iocoder.yudao.module.mes.framework.qrcode.QrCodeImageUtils;
 import jakarta.annotation.PostConstruct;
 import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+
+import java.net.URI;
+import java.util.Arrays;
 
 /**
- * MES 浜岀淮鐮佺浉鍏抽厤缃細鍚姩鏃跺皢 traceBaseUrl 娉ㄥ叆浜岀淮鐮佹爣绛炬瀯寤哄櫒锛岄伩鍏嶄镜鍏� Controller 璋冪敤鐐�
+ * MES 浜岀淮鐮佺浉鍏抽厤缃細鍚姩鏃舵牎楠屽苟鎶婇厤缃敞鍏ヤ簩缁寸爜鏍囩鏋勫缓鍣紝閬垮厤渚靛叆 Controller 璋冪敤鐐广��
+ * <p>
+ * 绉嶅瓙鏍囩灞炰簬鍙楀浗鏍囩害鏉熺殑鍚堣鐗╂枡锛屼竴鏃﹀嵃鍑哄嵆鏃犳硶鍙洖锛屽洜姝よ繖閲岄噰鍙栥�屽惎鍔ㄥ嵆鏍¢獙銆佷笉鍚堟硶鍗虫嫆缁濆惎鍔ㄣ��
+ * 鐨勭瓥鐣ワ紝鑰屼笉鏄瓑鍒板鍑烘椂鎵嶅け璐ユ垨闈欓粯闄嶇骇锛�
+ * <ul>
+ *     <li>杩芥函缃戝潃蹇呴』涓哄叕浼楀彲璁块棶鍦板潃锛岀姝㈠唴缃� IP / 鏈満鍦板潃 / 鏈浛鎹㈢殑鍗犱綅绗︼紱</li>
+ *     <li>鐢熶骇缁忚惀鑰呭悕绉板繀濉紙鏍囩鍥涜绱犱箣涓�锛岀己澶卞嵆涓轰笉鍚堣鏍囩锛夛紱</li>
+ *     <li>褰撳墠鐜蹇呴』瀛樺湪鍙覆鏌撲腑鏂囩殑瀛椾綋锛堝惁鍒欐爣绛句腑鏂囦細鍙樻垚鏂规锛夈��</li>
+ * </ul>
  */
+@Slf4j
 @Configuration(proxyBeanMethods = false)
 public class MesQrCodeConfig {
+
+    /**
+     * 鏈湴鐜 profile 鍚嶏細璇� profile 涓嬫斁瀹芥牎楠岋紝渚夸簬鏈湴寮�鍙戣皟璇�
+     */
+    private static final String PROFILE_LOCAL = "local";
 
     @Resource
     private MesProperties mesProperties;
 
+    @Resource
+    private Environment environment;
+
     @PostConstruct
     public void init() {
+        // 1. 娉ㄥ叆閰嶇疆锛堝瓧浣撴牎楠岀嫭绔嬩簬涓氬姟閰嶇疆锛屾湰鍦扮幆澧冨悓鏍峰繀椤婚�氳繃锛屽惁鍒欐爣绛句腑鏂囦笉鍙锛�
         MesProQrLabelBuilder.setTraceBaseUrl(mesProperties.getTraceBaseUrl());
+        MesProQrLabelBuilder.setOperatorName(mesProperties.getOperatorName());
+        MesProQrLabelBuilder.setImporterName(mesProperties.getImporterName());
+        MesProQrLabelBuilder.setImported(mesProperties.isImported());
+        MesProQrLabelBuilder.setAllowPlainQrCode(mesProperties.isAllowPlainQrCode());
+        QrCodeImageUtils.assertCjkFontAvailable();
+
+        // 2. 闈炴湰鍦扮幆澧冩墽琛屼弗鏍兼牎楠�
+        if (isLocalProfile()) {
+            log.info("[init] 褰撳墠涓烘湰鍦扮幆澧冿紙{}锛夛紝璺宠繃鏍囩鍚堣閰嶇疆鐨勪弗鏍兼牎楠岋紱traceBaseUrl={}",
+                    PROFILE_LOCAL, mesProperties.getTraceBaseUrl());
+            return;
+        }
+        validateTraceBaseUrl();
+        validateOperatorName();
+        log.info("[init] 浜岀淮鐮佹爣绛鹃厤缃牎楠岄�氳繃锛泃raceBaseUrl={}锛岀敓浜х粡钀ヨ��={}",
+                mesProperties.getTraceBaseUrl(), MesProQrLabelBuilder.resolveOperatorName());
+    }
+
+    private boolean isLocalProfile() {
+        return Arrays.asList(environment.getActiveProfiles()).contains(PROFILE_LOCAL);
+    }
+
+    /**
+     * 鏍¢獙杩芥函缃戝潃锛氬繀椤讳负鍏紬鎵爜鍙闂殑鍦板潃
+     */
+    private void validateTraceBaseUrl() {
+        String url = StrUtil.trim(mesProperties.getTraceBaseUrl());
+        if (StrUtil.isEmpty(url)) {
+            throw new IllegalStateException("mes.trace-base-url 鏈厤缃�備簩缁寸爜鏍囩蹇呴』鍖呭惈杩芥函缃戝潃锛�"
+                    + "璇峰湪閰嶇疆涓~鍐欏叕浼楁壂鐮佸彲璁块棶鐨� H5 婧簮椤靛湴鍧�銆�");
+        }
+        if (StrUtil.containsAnyIgnoreCase(url, "your-domain", "example.com", "localhost")) {
+            throw new IllegalStateException("mes.trace-base-url 浠嶄负鍗犱綅绗︽垨鏈満鍦板潃锛�" + url
+                    + "锛屽嵃鍑虹殑鏍囩娑堣垂鑰呭皢鏃犳硶璁块棶锛岃濉啓鐪熷疄鐨勫缃戝湴鍧�銆�");
+        }
+        String host = extractHost(url);
+        if (StrUtil.isEmpty(host)) {
+            throw new IllegalStateException("mes.trace-base-url 鏍煎紡闈炴硶锛屾棤娉曡В鏋愪富鏈哄悕锛�" + url);
+        }
+        if (isPrivateHost(host)) {
+            throw new IllegalStateException("mes.trace-base-url 鎸囧悜鍐呯綉鍦板潃锛�" + host + "锛夛細" + url
+                    + "锛屽叕浼楁壂鐮佹棤娉曡闂紝璇峰~鍐欏缃戝彲璁块棶鐨勫湴鍧�銆�");
+        }
+    }
+
+    /**
+     * 鏍¢獙鐢熶骇缁忚惀鑰呭悕绉帮細鏍囩鍥涜绱犱箣涓�锛岀己澶卞嵆涓轰笉鍚堣鏍囩
+     * <p>
+     * 姝ゅ浠呭憡璀︿笉闃绘柇鍚姩锛氱敓浜х粡钀ヨ�呭悕绉版寜涓讳綋鍖哄垎锛岄儴鍒嗙幆澧冨彲鑳藉皻鏈厤缃紝
+     * 寮哄埗鍚姩澶辫触浼氬奖鍝嶆棤鍏冲姛鑳姐�傜湡姝g殑鎷︽埅鐐瑰湪鏍囩鏋勫缓澶勶紙缂哄け鏃舵嫆缁濆鍑猴級锛�
+     * 鍥犳涓嶄細鍑虹幇"閰嶇疆缂哄け鍗村嵃鍑轰笉鍚堣鏍囩"鐨勬儏鍐点��
+     */
+    private void validateOperatorName() {
+        if (StrUtil.isBlank(MesProQrLabelBuilder.resolveOperatorName())) {
+            log.warn("[init] mes.operator-name锛堢敓浜х粡钀ヨ�呭悕绉帮級鏈厤缃�傝瀛楁涓虹瀛愭爣绛惧洓瑕佺礌涔嬩竴锛�"
+                    + "缂哄け鏃跺皢鏃犳硶瀵煎嚭浜岀淮鐮佹爣绛撅紝璇峰敖蹇湪閰嶇疆涓ˉ鍏呫��");
+        }
+    }
+
+    /**
+     * 浠� URL 涓彁鍙栦富鏈哄悕
+     */
+    private String extractHost(String url) {
+        try {
+            URI uri = URI.create(url);
+            return uri.getHost();
+        } catch (IllegalArgumentException ex) {
+            return null;
+        }
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁涓烘湰鏈� / 鍐呯綉 / 閾捐矾鏈湴鍦板潃
+     */
+    private boolean isPrivateHost(String host) {
+        if ("localhost".equalsIgnoreCase(host) || host.endsWith(".local")) {
+            return true;
+        }
+        String[] parts = host.split("\\.");
+        if (parts.length != 4) {
+            return false; // 鍩熷悕褰㈠紡锛屼氦鐢� DNS 瑙f瀽锛屼笉鍦ㄦ澶勬嫤鎴�
+        }
+        int a, b;
+        try {
+            a = Integer.parseInt(parts[0]);
+            b = Integer.parseInt(parts[1]);
+        } catch (NumberFormatException ex) {
+            return false;
+        }
+        // 127.0.0.0/8 鏈満銆�10.0.0.0/8銆�172.16.0.0/12銆�192.168.0.0/16 绉佺綉銆�169.254.0.0/16 閾捐矾鏈湴
+        return a == 127
+                || a == 10
+                || (a == 172 && b >= 16 && b <= 31)
+                || (a == 192 && b == 168)
+                || (a == 169 && b == 254);
     }
 
 }

--
Gitblit v1.9.3