| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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} éå®è£
å
ï¼openDocument å¤±è´¥ï¼æç¤ºç¨æ·æå¨æ¥ç`); |
| | | 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 }; |
| | | } |