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 };
|
}
|