From 6afb492942b17ebdb80f8e57af1b0df7ba5ee821 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期四, 09 四月 2026 15:29:50 +0800
Subject: [PATCH] fix: 版本更新修改

---
 src/pages/index.vue                     |    2 
 src/pages/login.vue                     |   23 +++
 src/pages/works.vue                     |    3 
 src/components/el-progress.vue          |   56 +++++++++
 src/components/DownloadProgressMask.vue |   83 +++++++++++++
 src/pages/message.vue                   |    3 
 src/pages/mine.vue                      |   20 +++
 src/utils/versionUpgrade.js             |   95 ++++++++++++---
 src/config.js                           |   47 ++++---
 src/App.vue                             |    1 
 10 files changed, 288 insertions(+), 45 deletions(-)

diff --git a/src/App.vue b/src/App.vue
index 124164b..a238560 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -10,6 +10,7 @@
   import { confirmMessage } from "@/api/login.js";
 
   const showSplash = ref(true);
+
   onMounted(() => {
     setTimeout(() => {
       showSplash.value = false;
diff --git a/src/components/DownloadProgressMask.vue b/src/components/DownloadProgressMask.vue
new file mode 100644
index 0000000..05a5874
--- /dev/null
+++ b/src/components/DownloadProgressMask.vue
@@ -0,0 +1,83 @@
+<template>
+  <view v-if="state.show" class="dpm-mask" @touchmove.stop.prevent @tap.stop>
+    <view class="dpm-card" @tap.stop>
+      <view class="dpm-title">{{ state.title }}</view>
+      <ElProgress :percentage="state.progress" :stroke-width="12" :show-text="true" color="#0D867F" />
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { reactive, onUnmounted } from "vue";
+import bus from "@/plugins/bus";
+import ElProgress from "@/components/el-progress.vue";
+
+const state = reactive({
+  show: false,
+  progress: 0,
+  title: "鏇存柊鍖呬笅杞戒腑...",
+});
+
+const handle = (payload = {}) => {
+  if (!payload || typeof payload !== "object") return;
+  if (payload.show === false) {
+    state.show = false;
+    state.progress = 0;
+    state.title = "鏇存柊鍖呬笅杞戒腑...";
+    // 涓嬭浇缁撴潫锛氭仮澶� tabBar锛岄伩鍏嶅簳閮ㄤ笉鍙偣
+    try { uni.showTabBar({ animation: false }); } catch (e) {}
+    return;
+  }
+  if (payload.show === true) state.show = true;
+  if (typeof payload.progress === "number" && Number.isFinite(payload.progress)) {
+    state.progress = Math.max(0, Math.min(100, Math.floor(payload.progress)));
+  }
+  if (payload.title) state.title = String(payload.title);
+
+  // 涓嬭浇杩涜涓細闅愯棌鍘熺敓 tabBar锛堝師鐢熷眰绾ч珮浜庨〉闈㈤伄缃╋紝鍚﹀垯浠嶅彲鐐瑰嚮锛�
+  if (state.show) {
+    try { uni.hideTabBar({ animation: false }); } catch (e) {}
+  }
+};
+
+// 浜嬩欢鐩戝惉蹇呴』灏芥棭娉ㄥ唽锛坰etup 闃舵灏辨敞鍐岋級锛岄伩鍏嶄笅杞藉紑濮嬫椂杩樻湭 mounted 瀵艰嚧閿欒繃棣栨 show 浜嬩欢
+// bus.ts 鍚屽悕浜嬩欢鍙兘缁戝畾涓�娆★細鍏� off 鍐� on锛岀‘淇濆缁堟湁鏁�
+try { bus.$off("versionUpgrade:downloadProgress"); } catch (e) {}
+try { bus.$on("versionUpgrade:downloadProgress", handle); } catch (e) {}
+
+onUnmounted(() => {
+  try { bus.$off("versionUpgrade:downloadProgress"); } catch (e) {}
+});
+</script>
+
+<style scoped lang="scss">
+.dpm-mask {
+  position: fixed;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 9999;
+  background: rgba(0, 0, 0, 0.45);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.dpm-card {
+  width: 620rpx;
+  padding: 28rpx 28rpx 22rpx;
+  background: #ffffff;
+  border-radius: 20rpx;
+  box-shadow: 0 12rpx 36rpx rgba(0, 0, 0, 0.18);
+}
+
+.dpm-title {
+  text-align: center;
+  font-size: 32rpx;
+  font-weight: 600;
+  color: rgba(0, 0, 0, 0.85);
+  margin-bottom: 18rpx;
+}
+</style>
+
diff --git a/src/components/el-progress.vue b/src/components/el-progress.vue
new file mode 100644
index 0000000..efab143
--- /dev/null
+++ b/src/components/el-progress.vue
@@ -0,0 +1,56 @@
+<template>
+  <view class="el-progress">
+    <view class="el-progress-bar">
+      <view class="el-progress-bar__outer" :style="{ height: `${strokeWidth}px` }">
+        <view class="el-progress-bar__inner" :style="innerStyle" />
+      </view>
+    </view>
+    <view v-if="showText" class="el-progress__text">{{ text }}</view>
+  </view>
+</template>
+
+<script setup>
+import { computed } from "vue";
+
+const props = defineProps({
+  percentage: { type: Number, default: 0 },
+  strokeWidth: { type: Number, default: 10 },
+  showText: { type: Boolean, default: true },
+  color: { type: String, default: "#409EFF" },
+});
+
+const safePercent = computed(() => {
+  const n = Number(props.percentage);
+  if (!Number.isFinite(n)) return 0;
+  return Math.max(0, Math.min(100, Math.floor(n)));
+});
+
+const innerStyle = computed(() => ({
+  width: `${safePercent.value}%`,
+  backgroundColor: props.color,
+}));
+
+const text = computed(() => `${safePercent.value}%`);
+</script>
+
+<style scoped>
+.el-progress {
+  width: 100%;
+}
+.el-progress-bar__outer {
+  background-color: rgba(0, 0, 0, 0.08);
+  border-radius: 100px;
+  overflow: hidden;
+}
+.el-progress-bar__inner {
+  height: 100%;
+  border-radius: 100px;
+  transition: width 0.15s ease;
+}
+.el-progress__text {
+  margin-top: 10rpx;
+  text-align: center;
+  font-size: 26rpx;
+  color: rgba(0, 0, 0, 0.55);
+}
+</style>
diff --git a/src/config.js b/src/config.js
index 37aa278..6fb4717 100644
--- a/src/config.js
+++ b/src/config.js
@@ -1,28 +1,29 @@
 // 搴旂敤鍏ㄥ眬閰嶇疆
 const config = {
-  baseUrl: 'http://1.15.17.182:9003',
-  fileUrl: 'http://1.15.17.182:9003',
-   // 搴旂敤淇℃伅
-   appInfo: {
-     // 搴旂敤鍚嶇О
-     name: "ruoyi-app-vue3",
+  baseUrl: "http://1.15.17.182:9003",
+  fileUrl: "http://1.15.17.182:9002",
+  // 搴旂敤淇℃伅
+  appInfo: {
+    // 搴旂敤鍚嶇О
+    name: "ruoyi-app-vue3",
     // 搴旂敤鐗堟湰锛堜笌 manifest.json 鐨� versionName 淇濇寔涓�鑷达級
     version: "1.0.0",
-     // 搴旂敤logo
-     logo: "/static/app-logo.png",
-     // 瀹樻柟缃戠珯
-     site_url: "http://ruoyi.vip",
-     // 鏀跨瓥鍗忚
-     agreements: [{
-         title: "闅愮鏀跨瓥",
-         url: "https://ruoyi.vip/protocol.html"
-       },
-       {
-         title: "鐢ㄦ埛鏈嶅姟鍗忚",
-         url: "https://ruoyi.vip/protocol.html"
-       }
-     ]
-   }
- }
+    // 搴旂敤logo
+    logo: "/static/app-logo.png",
+    // 瀹樻柟缃戠珯
+    site_url: "http://ruoyi.vip",
+    // 鏀跨瓥鍗忚
+    agreements: [
+      {
+        title: "闅愮鏀跨瓥",
+        url: "https://ruoyi.vip/protocol.html",
+      },
+      {
+        title: "鐢ㄦ埛鏈嶅姟鍗忚",
+        url: "https://ruoyi.vip/protocol.html",
+      },
+    ],
+  },
+};
 
- export default config
\ No newline at end of file
+export default config;
diff --git a/src/pages/index.vue b/src/pages/index.vue
index 9ad0a65..3998a68 100644
--- a/src/pages/index.vue
+++ b/src/pages/index.vue
@@ -197,6 +197,7 @@
       <view class="bottom-space" />
     </scroll-view>
 
+    <DownloadProgressMask />
   </view>
 </template>
 
@@ -205,6 +206,7 @@
 import { onShow } from "@dcloudio/uni-app";
 import { analysisCustomerContractAmounts, getBusiness } from "@/api/viewIndex";
 import { createVersionUpgradeChecker } from "@/utils/versionUpgrade";
+import DownloadProgressMask from "@/components/DownloadProgressMask.vue";
 
 const imgNum1 = "/static/images/index/num1.png";
 const imgNum2 = "/static/images/index/num2.png";
diff --git a/src/pages/login.vue b/src/pages/login.vue
index 29bc9bb..ee49113 100644
--- a/src/pages/login.vue
+++ b/src/pages/login.vue
@@ -264,18 +264,33 @@
 
     // #ifdef APP-PLUS
     try {
+      // #ifdef APP-PLUS
       // @ts-ignore
-      if (plus?.runtime?.version) {
+      if (plus?.runtime?.getProperty) {
         // @ts-ignore
-        versionName.value = plus.runtime.version;
-        console.log("[login-version] 褰撳墠鐜=APP-PLUS锛岀増鏈�=", versionName.value);
+        const appid = plus.runtime.appid;
+        // @ts-ignore
+        plus.runtime.getProperty(appid, (info) => {
+          const v = info?.version || info?.versionName || "";
+          if (v) {
+            versionName.value = String(v);
+            console.log("[login-version] 褰撳墠鐜=APP-PLUS锛岀増鏈�=", versionName.value);
+          } else {
+            console.log("[login-version] APP-PLUS 鑾峰彇鍒扮殑鐗堟湰瀛楁涓虹┖锛屼娇鐢ㄩ粯璁ゅ��:", versionName.value);
+          }
+          console.log("[login-version] 鏈�缁堢増鏈彿:", versionName.value);
+        });
+      } else {
+        console.log("[login-version] APP-PLUS 鐜涓嬬己灏� getProperty锛屼娇鐢ㄩ粯璁ゅ��:", versionName.value);
+        console.log("[login-version] 鏈�缁堢増鏈彿:", versionName.value);
       }
+      // #endif
     } catch (e) {
       // 鑾峰彇澶辫触鏃朵娇鐢ㄩ粯璁ゅ��
       console.log("[login-version] APP-PLUS 鑾峰彇鐗堟湰澶辫触:", e);
+      console.log("[login-version] 鏈�缁堢増鏈彿:", versionName.value);
     }
     // #endif
-    console.log("[login-version] 鏈�缁堢増鏈彿:", versionName.value);
 
     loadPassword();
     getUserLoginFacotryList();
diff --git a/src/pages/message.vue b/src/pages/message.vue
index 22947bc..d035392 100644
--- a/src/pages/message.vue
+++ b/src/pages/message.vue
@@ -60,6 +60,8 @@
         <text class="loading-more-text">鍔犺浇鏇村...</text>
       </view>
     </scroll-view>
+
+    <DownloadProgressMask />
   </view>
 </template>
 
@@ -68,6 +70,7 @@
   import { onShow } from "@dcloudio/uni-app";
   import { listNotice, confirmMessage, getNoticeCount } from "@/api/login.js";
   import useUserStore from "@/store/modules/user";
+  import DownloadProgressMask from "@/components/DownloadProgressMask.vue";
 
   // 鏍囩椤垫暟鎹�
   const tabList = [
diff --git a/src/pages/mine.vue b/src/pages/mine.vue
index 0961130..9be7b96 100644
--- a/src/pages/mine.vue
+++ b/src/pages/mine.vue
@@ -73,6 +73,12 @@
         <view class="card-illu faq"></view>
       </view>
     </view> -->
+
+    <view class="version-wrap">
+      <text class="version-text">鐗堟湰鍙凤細{{ version }}</text>
+    </view>
+
+    <DownloadProgressMask />
   </view>
 </template>
 
@@ -81,6 +87,7 @@
 import config from '@/config.js'
 import { getUserProfile } from "@/api/system/user";
 import useUserStore from '@/store/modules/user'
+import DownloadProgressMask from "@/components/DownloadProgressMask.vue";
 const userStore = useUserStore()
 const name = userStore.name;
 const roleName = userStore.roleName;
@@ -169,6 +176,19 @@
 	/* #endif */
 }
 
+/* 鐗堟湰鍙� */
+.version-wrap {
+  width: 100%;
+  text-align: center;
+  margin-top: 18px;
+  padding-bottom: 14px;
+}
+
+.version-text {
+  font-size: 12px;
+  color: #999;
+}
+
 /* 椤堕儴涓汉淇℃伅鍗� */
 .profile-card {
   display: flex;
diff --git a/src/pages/works.vue b/src/pages/works.vue
index be29a24..8d37e74 100644
--- a/src/pages/works.vue
+++ b/src/pages/works.vue
@@ -264,6 +264,8 @@
         </up-grid>
       </view>
     </view>
+
+    <DownloadProgressMask />
   </view>
 </template>
 
@@ -273,6 +275,7 @@
   import { userLoginFacotryList } from "@/api/login";
   import { getProductWorkOrderById } from "@/api/productionManagement/productionReporting";
   import { createVersionUpgradeChecker } from "@/utils/versionUpgrade";
+  import DownloadProgressMask from "@/components/DownloadProgressMask.vue";
   import modal from "@/plugins/modal";
   import useUserStore from "@/store/modules/user";
 
diff --git a/src/utils/versionUpgrade.js b/src/utils/versionUpgrade.js
index f39a40f..e0c818a 100644
--- a/src/utils/versionUpgrade.js
+++ b/src/utils/versionUpgrade.js
@@ -1,5 +1,6 @@
 import config from "@/config";
 import { getAllVersion } from "@/api/viewIndex";
+import bus from "@/plugins/bus";
 
 function compareVersion(v1, v2) {
   const s1 = String(v1 || "").replace(/[^\d.]/g, "").split(".").map((n) => Number(n) || 0);
@@ -23,7 +24,7 @@
   return `${size}B`;
 }
 
-function getCurrentVersion(logPrefix) {
+async function getCurrentVersion(logPrefix) {
   let currentVersion = config?.appInfo?.version || "1.0.0";
   console.log(`${logPrefix} 寮�濮嬭幏鍙栧綋鍓嶇増鏈紝榛樿鍊�:`, currentVersion);
   // #ifdef MP-WEIXIN
@@ -40,12 +41,23 @@
   // #endif
   // #ifdef APP-PLUS
   try {
+    // APP-PLUS 涓嬶紝plus.runtime.version 涓嶆槸涓氬姟鐗堟湰鍙凤紙缁忓父鏄繍琛屾椂/SDK鐗堟湰锛夛紝
+    // 杩欓噷鏀圭敤 getProperty 鍙栫郴缁熷眰闈㈢殑 app version銆�
     // @ts-ignore
-    if (plus?.runtime?.version) {
+    if (plus?.runtime?.getProperty) {
       // @ts-ignore
-      currentVersion = plus.runtime.version;
-      console.log(`${logPrefix} 褰撳墠鐜=APP-PLUS锛岀増鏈�=`, currentVersion);
-      return currentVersion;
+      const appid = plus.runtime.appid;
+      const appInfo = await new Promise((resolve) => {
+        // @ts-ignore
+        plus.runtime.getProperty(appid, (info) => resolve(info || {}));
+      });
+      const v = appInfo?.version || appInfo?.versionName || appInfo?.appVersion || "";
+      if (v) {
+        currentVersion = String(v);
+        console.log(`${logPrefix} 褰撳墠鐜=APP-PLUS锛岀増鏈�=`, currentVersion);
+        return currentVersion;
+      }
+      console.log(`${logPrefix} APP-PLUS 鑾峰彇鍒扮殑鐗堟湰瀛楁涓虹┖锛屽皢浣跨敤閰嶇疆鐗堟湰:`, currentVersion);
     }
   } catch (e) {
     console.log(`${logPrefix} APP-PLUS 鑾峰彇鐗堟湰澶辫触:`, e);
@@ -83,20 +95,46 @@
   // #endif
 }
 
-function downloadVersionPackage(url, logPrefix) {
-  console.log(`${logPrefix} 寮�濮嬩笅杞芥洿鏂板寘:`, url);
-  uni.showLoading({ title: "鏇存柊鍖呬笅杞戒腑..." });
-  uni.downloadFile({
-    url,
+function buildFullDownloadUrl(rawUrl) {
+  const u = String(rawUrl || "").trim();
+  if (!u) return "";
+  // 宸茬粡鏄粷瀵瑰湴鍧�锛岀洿鎺ヨ繑鍥�
+  if (/^https?:\/\//i.test(u)) return u;
+  const base = String(config?.fileUrl || config?.baseUrl || "").replace(/\/+$/, "");
+  const path = u.startsWith("/") ? u : `/${u}`;
+  return `${base}${path}`;
+}
+
+function emitDownloadProgress(payload, logPrefix) {
+  try {
+    bus.$emit("versionUpgrade:downloadProgress", payload);
+  } catch (e) {
+    console.log(`${logPrefix} downloadProgress 浜嬩欢娲惧彂澶辫触:`, e);
+  }
+}
+
+function downloadVersionPackage(url, logPrefix, fileSize) {
+  const fullUrl = buildFullDownloadUrl(url);
+  console.log(`${logPrefix} 寮�濮嬩笅杞芥洿鏂板寘:`, { rawUrl: url, fullUrl });
+  if (!fullUrl) {
+    uni.showToast({ title: "鏇存柊闄勪欢鍦板潃鏃犳晥", icon: "none" });
+    return;
+  }
+  const totalSize = Number(fileSize);
+  const hasTotalSize = Number.isFinite(totalSize) && totalSize > 0;
+  console.log(`${logPrefix} 涓嬭浇澶у皬淇℃伅:`, { fileSize, totalSize, hasTotalSize });
+  emitDownloadProgress({ show: true, progress: 0, title: "鏇存柊鍖呬笅杞戒腑..." }, logPrefix);
+  const task = uni.downloadFile({
+    url: fullUrl,
     success: (res) => {
       console.log(`${logPrefix} 涓嬭浇缁撴灉:`, res);
-      uni.hideLoading();
+      emitDownloadProgress({ show: false }, logPrefix);
       if (res.statusCode !== 200 || !res.tempFilePath) {
         console.log(`${logPrefix} 涓嬭浇澶辫触锛岀姸鎬佺爜鎴栦复鏃惰矾寰勫紓甯竊);
         uni.showToast({ title: "涓嬭浇澶辫触锛岃绋嶅悗閲嶈瘯", icon: "none" });
         return;
       }
-      const lowerUrl = String(url || "").toLowerCase();
+      const lowerUrl = String(fullUrl || "").toLowerCase();
       const isInstallPkg = lowerUrl.endsWith(".wgt") || lowerUrl.endsWith(".wgtu") || lowerUrl.endsWith(".apk");
       console.log(`${logPrefix} 鏂囦欢绫诲瀷鍒ゆ柇:`, { lowerUrl, isInstallPkg });
       if (isInstallPkg) {
@@ -114,10 +152,31 @@
     },
     fail: (err) => {
       console.log(`${logPrefix} 涓嬭浇璇锋眰澶辫触:`, err);
-      uni.hideLoading();
+      emitDownloadProgress({ show: false }, logPrefix);
       uni.showToast({ title: "涓嬭浇澶辫触锛岃妫�鏌ョ綉缁�", icon: "none" });
     },
   });
+
+  // 涓嬭浇杩涘害锛氶儴鍒嗙锛圓PP/灏忕▼搴忥級鏀寔 onProgressUpdate
+  try {
+    if (task && typeof task.onProgressUpdate === "function") {
+      task.onProgressUpdate((p) => {
+        const downloadedSize = Number(p?.totalBytesWritten ?? p?.writtenBytes ?? p?.downloadedSize);
+        const expectedSize = Number(p?.totalBytesExpectedToWrite ?? p?.totalBytesExpected ?? p?.totalSize);
+        const denom = hasTotalSize ? totalSize : (Number.isFinite(expectedSize) && expectedSize > 0 ? expectedSize : 0);
+
+        let progress = Number(p?.progress);
+        if (!(Number.isFinite(progress) && progress >= 0 && progress <= 100) && denom > 0 && Number.isFinite(downloadedSize) && downloadedSize >= 0) {
+          progress = (downloadedSize / denom) * 100;
+        }
+        if (!Number.isFinite(progress)) return;
+
+        emitDownloadProgress({ show: true, progress, title: "鏇存柊鍖呬笅杞戒腑..." }, logPrefix);
+      });
+    }
+  } catch (e) {
+    console.log(`${logPrefix} onProgressUpdate 缁戝畾澶辫触:`, e);
+  }
 }
 
 async function checkAppVersionUpgrade(logPrefix, currentVersion) {
@@ -170,7 +229,7 @@
       return;
     }
     const firstFile = Array.isArray(first?.commonFileList) ? first.commonFileList[0] : null;
-    const downloadUrl = firstFile?.url || "";
+    const downloadUrl = firstFile?.url || firstFile?.downloadUrl || "";
     const fileSizeText = formatFileSize(firstFile?.fileSize);
     console.log(`${logPrefix} 鏇存柊闄勪欢淇℃伅:`, {
       downloadUrl,
@@ -191,7 +250,7 @@
           uni.showToast({ title: "鏈壘鍒版洿鏂伴檮浠跺湴鍧�", icon: "none" });
           return;
         }
-        downloadVersionPackage(downloadUrl, logPrefix);
+        downloadVersionPackage(downloadUrl, logPrefix, firstFile?.fileSize);
       },
     });
   } catch (e) {
@@ -204,7 +263,7 @@
   const logPrefix = options.logPrefix || "[version]";
   let lastVersionCheckAt = 0;
 
-  const triggerVersionCheck = (from = "unknown") => {
+  const triggerVersionCheck = async (from = "unknown") => {
     const now = Date.now();
     if (now - lastVersionCheckAt < throttleMs) {
       console.log(`${logPrefix} 璺宠繃閲嶅妫�鏌ワ紝鏉ユ簮=${from}`);
@@ -212,8 +271,8 @@
     }
     lastVersionCheckAt = now;
     console.log(`${logPrefix} 瑙﹀彂鐗堟湰妫�鏌ワ紝鏉ユ簮=${from}`);
-    const currentVersion = getCurrentVersion(logPrefix);
-    checkAppVersionUpgrade(logPrefix, currentVersion);
+    const currentVersion = await getCurrentVersion(logPrefix);
+    await checkAppVersionUpgrade(logPrefix, currentVersion);
   };
 
   return { triggerVersionCheck };

--
Gitblit v1.9.3