From eedf75ae97d84a90236e3a365a78266a21377873 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期四, 09 四月 2026 13:02:07 +0800
Subject: [PATCH] fix: 版本管理80%

---
 src/pages/index.vue         |    9 
 src/pages/login.vue         |   45 ++++
 src/pages/works.vue         |    8 
 src/api/viewIndex.js        |    9 
 src/utils/versionUpgrade.js |  220 ++++++++++++++++++++++
 src/config.js               |    4 
 src/manifest.json           |  276 +++++++++++++-------------
 7 files changed, 431 insertions(+), 140 deletions(-)

diff --git a/src/api/viewIndex.js b/src/api/viewIndex.js
index 8b5d144..7801618 100644
--- a/src/api/viewIndex.js
+++ b/src/api/viewIndex.js
@@ -100,6 +100,15 @@
     method: "get",
   });
 };
+
+// 鐗堟湰鍗囩骇锛氭煡璇㈢増鏈垪琛紙鍙栫涓�鏉℃渶鏂版暟鎹級
+export const getAllVersion = (params) => {
+  return request({
+    url: "/app/getAllVersion",
+    method: "get",
+    params,
+  });
+};
 // 璐ㄦ鍒嗘瀽锛堝彲浼� dateType: 1鍛� 2鏈� 3瀛e害锛�
 export const qualityStatistics = (params) => {
   return request({
diff --git a/src/config.js b/src/config.js
index b87a0a7..13bce09 100644
--- a/src/config.js
+++ b/src/config.js
@@ -6,8 +6,8 @@
    appInfo: {
      // 搴旂敤鍚嶇О
      name: "ruoyi-app-vue3",
-     // 搴旂敤鐗堟湰
-     version: "1.1.0",
+    // 搴旂敤鐗堟湰锛堜笌 manifest.json 鐨� versionName 淇濇寔涓�鑷达級
+    version: "1.0.0",
      // 搴旂敤logo
      logo: "/static/YGCY.png",
      // 瀹樻柟缃戠珯
diff --git a/src/manifest.json b/src/manifest.json
index 6324e7b..6c55649 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -1,143 +1,143 @@
 {
-    "name" : "淇℃伅绠$悊",
-    "appid" : "__UNI__1F1A548",
-    "description" : "",
-    "versionName" : "1.0.0",
-    "versionCode" : "100",
-    "transformPx" : false,
-    /* 5+App鐗规湁鐩稿叧 */
-    "app-plus" : {
-        "compatible" : {
-            "usingComponents" : true,
-            "ignoreVersion" : true
-        },
-        "usingComponents" : true,
-        "nvueStyleCompiler" : "uni-app",
-        "compilerVersion" : 3,
-        "splashscreen" : {
-            "alwaysShowBeforeRender" : true,
-            "waiting" : true,
-            "autoclose" : true,
-            "delay" : 0
-        },
-        /* 妯″潡閰嶇疆 */
-        "modules" : {
-            "Camera" : {},
-            "Barcode" : {},
-            "Push" : {},
-            "Maps" : {}
-        },
-        /* 搴旂敤鍙戝竷淇℃伅 */
-        "distribute" : {
-            /* android鎵撳寘閰嶇疆 */
-            "android" : {
-                "permissions" : [
-                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
-                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
-                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\"/>",
-                    "<uses-feature android:name=\"android.hardware.location\"/>",
-                    "<uses-feature android:name=\"android.hardware.location.gps\"/>",
-                    "<uses-feature android:name=\"android.hardware.location.network\"/>"
-                ]
-            },
-            /* ios鎵撳寘閰嶇疆 */
-            "ios" : {
-                "dSYMs" : false,
-                "plist" : {
-                    "NSLocationWhenInUseUsageDescription" : "闇�瑕佽幏鍙栨偍鐨勪綅缃俊鎭潵璁板綍瀹㈡埛鎷滆鍦扮偣",
-                    "NSLocationAlwaysAndWhenInUseUsageDescription" : "闇�瑕佽幏鍙栨偍鐨勪綅缃俊鎭潵璁板綍瀹㈡埛鎷滆鍦扮偣"
-                }
-            },
-            /* SDK閰嶇疆 */
-            "sdkConfigs" : {
-                "push" : {
-                    "unipush" : {
-                        "icons" : {
-                            "small" : {
-                                "ldpi" : "D:/xindao/wenjian/img/logo/app.png"
-                            }
-                        },
-                        "offline" : false
-                    }
-                },
-                "maps" : {
-                    "amap" : {
-                        "name" : "amap_18330707920ae9zOwCD",
-                        "appkey_ios" : "c2b4e3889ab4cb9468e9c8ae4f3ab53f",
-                        "appkey_android" : "c2b4e3889ab4cb9468e9c8ae4f3ab53f"
-                    }
-                }
-            },
-            "icons" : {
-                "android" : {
-                    "hdpi" : "unpackage/res/icons/72x72.png",
-                    "xhdpi" : "unpackage/res/icons/96x96.png",
-                    "xxhdpi" : "unpackage/res/icons/144x144.png",
-                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
-                },
-                "ios" : {
-                    "appstore" : "unpackage/res/icons/1024x1024.png",
-                    "ipad" : {
-                        "app" : "unpackage/res/icons/76x76.png",
-                        "app@2x" : "unpackage/res/icons/152x152.png",
-                        "notification" : "unpackage/res/icons/20x20.png",
-                        "notification@2x" : "unpackage/res/icons/40x40.png",
-                        "proapp@2x" : "unpackage/res/icons/167x167.png",
-                        "settings" : "unpackage/res/icons/29x29.png",
-                        "settings@2x" : "unpackage/res/icons/58x58.png",
-                        "spotlight" : "unpackage/res/icons/40x40.png",
-                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
-                    },
-                    "iphone" : {
-                        "app@2x" : "unpackage/res/icons/120x120.png",
-                        "app@3x" : "unpackage/res/icons/180x180.png",
-                        "notification@2x" : "unpackage/res/icons/40x40.png",
-                        "notification@3x" : "unpackage/res/icons/60x60.png",
-                        "settings@2x" : "unpackage/res/icons/58x58.png",
-                        "settings@3x" : "unpackage/res/icons/87x87.png",
-                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
-                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
-                    }
-                }
-            }
+  "name": "淇℃伅绠$悊",
+  "appid": "__UNI__1F1A548",
+  "description": "",
+  "versionName": "1.0.0",
+  "versionCode": 100,
+  "transformPx": false,
+  /* 5+App鐗规湁鐩稿叧 */
+  "app-plus": {
+    "compatible": {
+      "usingComponents": true,
+      "ignoreVersion": true
+    },
+    "usingComponents": true,
+    "nvueStyleCompiler": "uni-app",
+    "compilerVersion": 3,
+    "splashscreen": {
+      "alwaysShowBeforeRender": true,
+      "waiting": true,
+      "autoclose": true,
+      "delay": 0
+    },
+    /* 妯″潡閰嶇疆 */
+    "modules": {
+      "Camera": {},
+      "Barcode": {},
+      "Push": {},
+      "Maps": {}
+    },
+    /* 搴旂敤鍙戝竷淇℃伅 */
+    "distribute": {
+      /* android鎵撳寘閰嶇疆 */
+      "android": {
+        "permissions": [
+          "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+          "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+          "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+          "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+          "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+          "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+          "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+          "<uses-feature android:name=\"android.hardware.camera\"/>",
+          "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\"/>",
+          "<uses-feature android:name=\"android.hardware.location\"/>",
+          "<uses-feature android:name=\"android.hardware.location.gps\"/>",
+          "<uses-feature android:name=\"android.hardware.location.network\"/>"
+        ]
+      },
+      /* ios鎵撳寘閰嶇疆 */
+      "ios": {
+        "dSYMs": false,
+        "plist": {
+          "NSLocationWhenInUseUsageDescription": "闇�瑕佽幏鍙栨偍鐨勪綅缃俊鎭潵璁板綍瀹㈡埛鎷滆鍦扮偣",
+          "NSLocationAlwaysAndWhenInUseUsageDescription": "闇�瑕佽幏鍙栨偍鐨勪綅缃俊鎭潵璁板綍瀹㈡埛鎷滆鍦扮偣"
         }
-    },
-    /* 蹇簲鐢ㄧ壒鏈夌浉鍏� */
-    "quickapp" : {},
-    /* 灏忕▼搴忕壒鏈夌浉鍏� */
-    "mp-weixin" : {
-        "appid" : "",
-        "setting" : {
-            "urlCheck" : false
+      },
+      /* SDK閰嶇疆 */
+      "sdkConfigs": {
+        "push": {
+          "unipush": {
+            "icons": {
+              "small": {
+                "ldpi": "D:/xindao/wenjian/img/logo/app.png"
+              }
+            },
+            "offline": false
+          }
         },
-        "usingComponents" : true
+        "maps": {
+          "amap": {
+            "name": "amap_18330707920ae9zOwCD",
+            "appkey_ios": "c2b4e3889ab4cb9468e9c8ae4f3ab53f",
+            "appkey_android": "c2b4e3889ab4cb9468e9c8ae4f3ab53f"
+          }
+        }
+      },
+      "icons": {
+        "android": {
+          "hdpi": "unpackage/res/icons/72x72.png",
+          "xhdpi": "unpackage/res/icons/96x96.png",
+          "xxhdpi": "unpackage/res/icons/144x144.png",
+          "xxxhdpi": "unpackage/res/icons/192x192.png"
+        },
+        "ios": {
+          "appstore": "unpackage/res/icons/1024x1024.png",
+          "ipad": {
+            "app": "unpackage/res/icons/76x76.png",
+            "app@2x": "unpackage/res/icons/152x152.png",
+            "notification": "unpackage/res/icons/20x20.png",
+            "notification@2x": "unpackage/res/icons/40x40.png",
+            "proapp@2x": "unpackage/res/icons/167x167.png",
+            "settings": "unpackage/res/icons/29x29.png",
+            "settings@2x": "unpackage/res/icons/58x58.png",
+            "spotlight": "unpackage/res/icons/40x40.png",
+            "spotlight@2x": "unpackage/res/icons/80x80.png"
+          },
+          "iphone": {
+            "app@2x": "unpackage/res/icons/120x120.png",
+            "app@3x": "unpackage/res/icons/180x180.png",
+            "notification@2x": "unpackage/res/icons/40x40.png",
+            "notification@3x": "unpackage/res/icons/60x60.png",
+            "settings@2x": "unpackage/res/icons/58x58.png",
+            "settings@3x": "unpackage/res/icons/87x87.png",
+            "spotlight@2x": "unpackage/res/icons/80x80.png",
+            "spotlight@3x": "unpackage/res/icons/120x120.png"
+          }
+        }
+      }
+    }
+  },
+  /* 蹇簲鐢ㄧ壒鏈夌浉鍏� */
+  "quickapp": {},
+  /* 灏忕▼搴忕壒鏈夌浉鍏� */
+  "mp-weixin": {
+    "appid": "",
+    "setting": {
+      "urlCheck": false
     },
-    "mp-alipay" : {
-        "usingComponents" : true
-    },
-    "mp-baidu" : {
-        "usingComponents" : true
-    },
-    "mp-toutiao" : {
-        "usingComponents" : true
-    },
-    "uniStatistics" : {
-        "enable" : false
-    },
-    "vueVersion" : "3"
+    "usingComponents": true
+  },
+  "mp-alipay": {
+    "usingComponents": true
+  },
+  "mp-baidu": {
+    "usingComponents": true
+  },
+  "mp-toutiao": {
+    "usingComponents": true
+  },
+  "uniStatistics": {
+    "enable": false
+  },
+  "vueVersion": "3"
 }
diff --git a/src/pages/index.vue b/src/pages/index.vue
index 510527d..9ad0a65 100644
--- a/src/pages/index.vue
+++ b/src/pages/index.vue
@@ -202,7 +202,9 @@
 
 <script setup>
 import { computed, onMounted, ref } from "vue";
+import { onShow } from "@dcloudio/uni-app";
 import { analysisCustomerContractAmounts, getBusiness } from "@/api/viewIndex";
+import { createVersionUpgradeChecker } from "@/utils/versionUpgrade";
 
 const imgNum1 = "/static/images/index/num1.png";
 const imgNum2 = "/static/images/index/num2.png";
@@ -240,6 +242,8 @@
 const contractSummary = ref({ sum: "0", chain: "0", yny: "0" });
 
 // 瀹㈡埛鍚堝悓閲戦鍒嗘瀽锛氭棤闇�绛涢�夐」锛堟寜鎺ュ彛榛樿杩斿洖灞曠ず锛�
+
+const { triggerVersionCheck } = createVersionUpgradeChecker({ logPrefix: "[version-index]" });
 
 function toggleOverview() {
   overviewExpanded.value = !overviewExpanded.value;
@@ -465,8 +469,13 @@
   } catch (e) {
     isCanvas2d.value = false;
   }
+  triggerVersionCheck("onMounted");
   loadHome();
 });
+
+onShow(() => {
+  triggerVersionCheck("onShow");
+});
 </script>
 
 <style scoped lang="scss">
diff --git a/src/pages/login.vue b/src/pages/login.vue
index 806e964..6d93dfb 100644
--- a/src/pages/login.vue
+++ b/src/pages/login.vue
@@ -37,6 +37,9 @@
       </up-checkbox>
     </view>
   </view>
+  <view class="version-wrap">
+    <text class="version-text">鐗堟湰鍙凤細{{ versionName }}</text>
+  </view>
 </template>
 
 <script setup>
@@ -59,9 +62,11 @@
   import { wxLogin } from "@/api/oauth";
   import { setToken } from "@/utils/auth";
   import View from "@/pages/procurementManagement/procurementLedger/view.vue";
+  import config from "@/config";
   const userStore = useUserStore();
   const useWxLogin = ref(false); // 鏄惁浣跨敤寰俊鐧诲綍
   const rememberPassword = ref(false); // 璁颁綇瀵嗙爜
+  const versionName = ref(config?.appInfo?.version || "1.0.0");
   const loginForm = ref({
     userName: "",
     password: "",
@@ -243,6 +248,35 @@
   }
   // 椤甸潰鍔犺浇鏃舵鏌ユ槸鍚︽湁淇濆瓨鐨勫瘑鐮�
   onMounted(() => {
+    console.log("[login-version] 寮�濮嬭幏鍙栫櫥褰曢〉鐗堟湰锛岄粯璁ゅ��:", versionName.value);
+    // #ifdef MP-WEIXIN
+    try {
+      const accountInfo = uni.getAccountInfoSync();
+      if (accountInfo?.miniProgram?.version) {
+        versionName.value = accountInfo.miniProgram.version;
+        console.log("[login-version] 褰撳墠鐜=MP-WEIXIN锛岀増鏈�=", versionName.value);
+      }
+    } catch (e) {
+      // 鑾峰彇澶辫触鏃朵娇鐢ㄩ粯璁ゅ��
+      console.log("[login-version] MP-WEIXIN 鑾峰彇鐗堟湰澶辫触:", e);
+    }
+    // #endif
+
+    // #ifdef APP-PLUS
+    try {
+      // @ts-ignore
+      if (plus?.runtime?.version) {
+        // @ts-ignore
+        versionName.value = plus.runtime.version;
+        console.log("[login-version] 褰撳墠鐜=APP-PLUS锛岀増鏈�=", versionName.value);
+      }
+    } catch (e) {
+      // 鑾峰彇澶辫触鏃朵娇鐢ㄩ粯璁ゅ��
+      console.log("[login-version] APP-PLUS 鑾峰彇鐗堟湰澶辫触:", e);
+    }
+    // #endif
+    console.log("[login-version] 鏈�缁堢増鏈彿:", versionName.value);
+
     loadPassword();
     getUserLoginFacotryList();
   });
@@ -346,4 +380,15 @@
       }
     }
   }
+
+  .version-wrap {
+    width: 100%;
+    text-align: center;
+    margin-top: 20px;
+  }
+
+  .version-text {
+    font-size: 12px;
+    color: #999;
+  }
 </style>
diff --git a/src/pages/works.vue b/src/pages/works.vue
index 89c8d26..8289a4f 100644
--- a/src/pages/works.vue
+++ b/src/pages/works.vue
@@ -269,12 +269,15 @@
 
 <script setup>
   import { ref, onMounted, nextTick, reactive, computed } from "vue";
+  import { onShow } from "@dcloudio/uni-app";
   import { userLoginFacotryList } from "@/api/login";
   import { getProductWorkOrderById } from "@/api/productionManagement/productionReporting";
+  import { createVersionUpgradeChecker } from "@/utils/versionUpgrade";
   import modal from "@/plugins/modal";
   import useUserStore from "@/store/modules/user";
 
   const userStore = useUserStore();
+  const { triggerVersionCheck } = createVersionUpgradeChecker({ logPrefix: "[version-works]" });
   const show = ref(false);
   const factoryList = ref([]);
   const factoryListTem = ref([]);
@@ -1131,6 +1134,7 @@
   const hasEquipmentItems = computed(() => equipmentItems.length > 0);
 
   onMounted(() => {
+    triggerVersionCheck("onMounted");
     // 姣忔杩涘叆棣栭〉閮藉己鍒跺埛鏂扮敤鎴蜂俊鎭拰璺敱鏉冮檺锛屼笉鍋氭湰鍦扮紦瀛樺垽鏂�
     userStore.getInfo().then(() => {
       userStore
@@ -1146,6 +1150,10 @@
     // 鍚姩閫氱煡鐘舵�佸畾鏃跺櫒
     startStatusTimer();
   });
+
+  onShow(() => {
+    triggerVersionCheck("onShow");
+  });
 </script>
 
 
diff --git a/src/utils/versionUpgrade.js b/src/utils/versionUpgrade.js
new file mode 100644
index 0000000..f39a40f
--- /dev/null
+++ b/src/utils/versionUpgrade.js
@@ -0,0 +1,220 @@
+import config from "@/config";
+import { getAllVersion } from "@/api/viewIndex";
+
+function compareVersion(v1, v2) {
+  const s1 = String(v1 || "").replace(/[^\d.]/g, "").split(".").map((n) => Number(n) || 0);
+  const s2 = String(v2 || "").replace(/[^\d.]/g, "").split(".").map((n) => Number(n) || 0);
+  const len = Math.max(s1.length, s2.length);
+  for (let i = 0; i < len; i += 1) {
+    const n1 = s1[i] || 0;
+    const n2 = s2[i] || 0;
+    if (n1 > n2) return 1;
+    if (n1 < n2) return -1;
+  }
+  return 0;
+}
+
+function formatFileSize(fileSize) {
+  const size = Number(fileSize);
+  if (!Number.isFinite(size) || size <= 0) return "";
+  if (size >= 1024 * 1024 * 1024) return `${(size / (1024 * 1024 * 1024)).toFixed(2)}GB`;
+  if (size >= 1024 * 1024) return `${(size / (1024 * 1024)).toFixed(2)}MB`;
+  if (size >= 1024) return `${(size / 1024).toFixed(2)}KB`;
+  return `${size}B`;
+}
+
+function getCurrentVersion(logPrefix) {
+  let currentVersion = config?.appInfo?.version || "1.0.0";
+  console.log(`${logPrefix} 寮�濮嬭幏鍙栧綋鍓嶇増鏈紝榛樿鍊�:`, currentVersion);
+  // #ifdef MP-WEIXIN
+  try {
+    const accountInfo = uni.getAccountInfoSync();
+    if (accountInfo?.miniProgram?.version) {
+      currentVersion = accountInfo.miniProgram.version;
+      console.log(`${logPrefix} 褰撳墠鐜=MP-WEIXIN锛岀増鏈�=`, currentVersion);
+      return currentVersion;
+    }
+  } catch (e) {
+    console.log(`${logPrefix} MP-WEIXIN 鑾峰彇鐗堟湰澶辫触:`, e);
+  }
+  // #endif
+  // #ifdef APP-PLUS
+  try {
+    // @ts-ignore
+    if (plus?.runtime?.version) {
+      // @ts-ignore
+      currentVersion = plus.runtime.version;
+      console.log(`${logPrefix} 褰撳墠鐜=APP-PLUS锛岀増鏈�=`, currentVersion);
+      return currentVersion;
+    }
+  } catch (e) {
+    console.log(`${logPrefix} APP-PLUS 鑾峰彇鐗堟湰澶辫触:`, e);
+  }
+  // #endif
+  console.log(`${logPrefix} 鏈鍙栧埌杩愯鏃剁増鏈紝浣跨敤閰嶇疆鐗堟湰:`, currentVersion);
+  return currentVersion;
+}
+
+function installPackage(tempFilePath, logPrefix) {
+  console.log(`${logPrefix} 寮�濮嬪畨瑁呮洿鏂板寘锛屼复鏃惰矾寰�:`, tempFilePath);
+  // #ifdef APP-PLUS
+  // @ts-ignore
+  plus.runtime.install(
+    tempFilePath,
+    {},
+    () => {
+      console.log(`${logPrefix} 瀹夎鎴愬姛锛岀瓑寰呯敤鎴风‘璁ゆ槸鍚﹂噸鍚痐);
+      uni.showModal({
+        title: "鏇存柊瀹屾垚",
+        content: "瀹夎鍖呬笅杞芥垚鍔燂紝鏄惁绔嬪嵆閲嶅惎搴旂敤鐢熸晥锛�",
+        success: (res) => {
+          if (res.confirm) {
+            // @ts-ignore
+            plus.runtime.restart();
+          }
+        },
+      });
+    },
+    (err) => {
+      console.log(`${logPrefix} 瀹夎澶辫触:`, err);
+      uni.showToast({ title: err?.message || "瀹夎鏇存柊鍖呭け璐�", icon: "none" });
+    }
+  );
+  // #endif
+}
+
+function downloadVersionPackage(url, logPrefix) {
+  console.log(`${logPrefix} 寮�濮嬩笅杞芥洿鏂板寘:`, url);
+  uni.showLoading({ title: "鏇存柊鍖呬笅杞戒腑..." });
+  uni.downloadFile({
+    url,
+    success: (res) => {
+      console.log(`${logPrefix} 涓嬭浇缁撴灉:`, res);
+      uni.hideLoading();
+      if (res.statusCode !== 200 || !res.tempFilePath) {
+        console.log(`${logPrefix} 涓嬭浇澶辫触锛岀姸鎬佺爜鎴栦复鏃惰矾寰勫紓甯竊);
+        uni.showToast({ title: "涓嬭浇澶辫触锛岃绋嶅悗閲嶈瘯", icon: "none" });
+        return;
+      }
+      const lowerUrl = String(url || "").toLowerCase();
+      const isInstallPkg = lowerUrl.endsWith(".wgt") || lowerUrl.endsWith(".wgtu") || lowerUrl.endsWith(".apk");
+      console.log(`${logPrefix} 鏂囦欢绫诲瀷鍒ゆ柇:`, { lowerUrl, isInstallPkg });
+      if (isInstallPkg) {
+        installPackage(res.tempFilePath, logPrefix);
+        return;
+      }
+      uni.openDocument({
+        filePath: res.tempFilePath,
+        showMenu: true,
+        fail: () => {
+          console.log(`${logPrefix} 闈炲畨瑁呭寘锛宱penDocument 澶辫触锛屾彁绀虹敤鎴锋墜鍔ㄦ煡鐪媊);
+          uni.showToast({ title: "涓嬭浇鎴愬姛锛岃鍦ㄦ枃浠剁鐞嗕腑鏌ョ湅", icon: "none" });
+        },
+      });
+    },
+    fail: (err) => {
+      console.log(`${logPrefix} 涓嬭浇璇锋眰澶辫触:`, err);
+      uni.hideLoading();
+      uni.showToast({ title: "涓嬭浇澶辫触锛岃妫�鏌ョ綉缁�", icon: "none" });
+    },
+  });
+}
+
+async function checkAppVersionUpgrade(logPrefix, currentVersion) {
+  try {
+    console.log(`${logPrefix} 寮�濮嬫鏌ョ増鏈崌绾);
+    const params = {
+      records: "",
+      total: 1,
+      size: 1,
+      current: 1,
+      orders: "",
+      optimizeCountSql: true,
+      searchCount: true,
+      optimizeJoinOfCountSql: true,
+      maxLimit: 1,
+      countId: "",
+      id: 1,
+      name: "",
+      version: "",
+      createTime: "2026-04-09 10:10:33",
+      updateTime: "2026-04-09 10:10:33",
+      createUser: 1,
+      updateUser: 1,
+      tenantId: 1,
+    };
+    console.log(`${logPrefix} 鏌ヨ鍙傛暟:`, params);
+    const res = await getAllVersion(params);
+    console.log(`${logPrefix} 鎺ュ彛杩斿洖:`, res);
+    const first = Array.isArray(res?.rows)
+      ? res.rows[0]
+      : Array.isArray(res?.data?.records)
+        ? res.data.records[0]
+        : Array.isArray(res?.data)
+          ? res.data[0]
+          : res?.data;
+    if (!first) {
+      console.log(`${logPrefix} 鏈幏鍙栧埌绗竴鏉$増鏈暟鎹紝缁撴潫妫�鏌);
+      return;
+    }
+    console.log(`${logPrefix} 绗竴鏉$増鏈暟鎹�:`, first);
+    const latestVersion = String(first?.version || "");
+    if (!latestVersion) {
+      console.log(`${logPrefix} 绗竴鏉℃暟鎹棤鐗堟湰鍙凤紝缁撴潫妫�鏌);
+      return;
+    }
+    const compareResult = compareVersion(latestVersion, currentVersion);
+    console.log(`${logPrefix} 鐗堟湰姣旇緝:`, { currentVersion, latestVersion, compareResult });
+    if (compareResult <= 0) {
+      console.log(`${logPrefix} 褰撳墠宸叉槸鏈�鏂扮増鏈紝鏃犻渶鏇存柊`);
+      return;
+    }
+    const firstFile = Array.isArray(first?.commonFileList) ? first.commonFileList[0] : null;
+    const downloadUrl = firstFile?.url || "";
+    const fileSizeText = formatFileSize(firstFile?.fileSize);
+    console.log(`${logPrefix} 鏇存柊闄勪欢淇℃伅:`, {
+      downloadUrl,
+      fileSize: firstFile?.fileSize,
+      fileSizeText,
+      firstFile,
+    });
+    const desc = fileSizeText ? `锛屾洿鏂板寘澶у皬绾� ${fileSizeText}` : "";
+    uni.showModal({
+      title: "鍙戠幇鏂扮増鏈�",
+      content: `褰撳墠鐗堟湰 ${currentVersion}锛屾渶鏂扮増鏈� ${latestVersion}${desc}锛屾槸鍚︾珛鍗充笅杞斤紵`,
+      confirmText: "绔嬪嵆涓嬭浇",
+      success: (modalRes) => {
+        console.log(`${logPrefix} 鏇存柊寮圭獥鎿嶄綔:`, modalRes);
+        if (!modalRes.confirm) return;
+        if (!downloadUrl) {
+          console.log(`${logPrefix} 鐢ㄦ埛纭鏇存柊锛屼絾闄勪欢鍦板潃涓虹┖`);
+          uni.showToast({ title: "鏈壘鍒版洿鏂伴檮浠跺湴鍧�", icon: "none" });
+          return;
+        }
+        downloadVersionPackage(downloadUrl, logPrefix);
+      },
+    });
+  } catch (e) {
+    console.log(`${logPrefix} 鐗堟湰妫�鏌ュけ璐�:`, e);
+  }
+}
+
+export function createVersionUpgradeChecker(options = {}) {
+  const throttleMs = Number(options.throttleMs) > 0 ? Number(options.throttleMs) : 3000;
+  const logPrefix = options.logPrefix || "[version]";
+  let lastVersionCheckAt = 0;
+
+  const triggerVersionCheck = (from = "unknown") => {
+    const now = Date.now();
+    if (now - lastVersionCheckAt < throttleMs) {
+      console.log(`${logPrefix} 璺宠繃閲嶅妫�鏌ワ紝鏉ユ簮=${from}`);
+      return;
+    }
+    lastVersionCheckAt = now;
+    console.log(`${logPrefix} 瑙﹀彂鐗堟湰妫�鏌ワ紝鏉ユ簮=${from}`);
+    const currentVersion = getCurrentVersion(logPrefix);
+    checkAppVersionUpgrade(logPrefix, currentVersion);
+  };
+
+  return { triggerVersionCheck };
+}

--
Gitblit v1.9.3