From 0c76f764b00b724c60f42fa647dd02decb9c0ca2 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期四, 14 五月 2026 16:41:04 +0800
Subject: [PATCH] fix:版本更新修改

---
 tcm-training-admin-backend/src/main/java/com/tcm/training/admin/system/service/AppVersionSettingsAppService.java |   60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 59 insertions(+), 1 deletions(-)

diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/system/service/AppVersionSettingsAppService.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/system/service/AppVersionSettingsAppService.java
index 1102310..ce43d2c 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/system/service/AppVersionSettingsAppService.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/system/service/AppVersionSettingsAppService.java
@@ -65,6 +65,10 @@
     }
 
     public AppVersionCheckVO checkUpdate(String platform, Integer currentVersionCode) {
+        return checkUpdate(platform, currentVersionCode, null);
+    }
+
+    public AppVersionCheckVO checkUpdate(String platform, Integer currentVersionCode, String currentVersionNo) {
         if (currentVersionCode == null) {
             throw new IllegalArgumentException("当前版本号不能为空");
         }
@@ -82,7 +86,7 @@
         String downloadUrl = AppVersionConfig.PLATFORM_ANDROID.equals(normalizedPlatform)
                 ? normalizeOptionalText(latest.getAndroidFileUrl())
                 : normalizeOptionalText(latest.getIosFileUrl());
-        boolean hasUpdate = downloadUrl != null && defaultNumber(latest.getVersionCode()) > currentVersionCode;
+        boolean hasUpdate = downloadUrl != null && isNewerVersion(latest, currentVersionCode, currentVersionNo);
         vo.setHasUpdate(hasUpdate);
         if (!hasUpdate) {
             return vo;
@@ -95,6 +99,60 @@
         return vo;
     }
 
+    /**
+     * 判断后台最新版本是否高于当前 APP,兼容原生 versionCode 与展示 versionNo 不一致的历史包。
+     */
+    private boolean isNewerVersion(AppVersionConfig latest, Integer currentVersionCode, String currentVersionNo) {
+        if (defaultNumber(latest.getVersionCode()) > currentVersionCode) {
+            return true;
+        }
+        return compareVersionNo(latest.getVersionNo(), currentVersionNo) > 0;
+    }
+
+    /**
+     * 比较数字点号版本号,无法解析的版本号不参与兜底判断。
+     */
+    private int compareVersionNo(String latestVersionNo, String currentVersionNo) {
+        String latest = normalizeOptionalText(latestVersionNo);
+        String current = normalizeOptionalText(currentVersionNo);
+        if (latest == null || current == null) {
+            return 0;
+        }
+        String[] latestParts = latest.split("\\.");
+        String[] currentParts = current.split("\\.");
+        int maxLength = Math.max(latestParts.length, currentParts.length);
+        for (int i = 0; i < maxLength; i++) {
+            Integer latestNumber = parseVersionNumber(latestParts, i);
+            Integer currentNumber = parseVersionNumber(currentParts, i);
+            if (latestNumber == null || currentNumber == null) {
+                return 0;
+            }
+            int compareResult = latestNumber.compareTo(currentNumber);
+            if (compareResult != 0) {
+                return compareResult;
+            }
+        }
+        return 0;
+    }
+
+    /**
+     * 解析指定版本号片段,缺失片段按 0 处理。
+     */
+    private Integer parseVersionNumber(String[] parts, int index) {
+        if (index >= parts.length) {
+            return 0;
+        }
+        String value = parts[index] == null ? "" : parts[index].trim();
+        if (!value.matches("\\d+")) {
+            return null;
+        }
+        try {
+            return Integer.valueOf(value);
+        } catch (NumberFormatException ex) {
+            return null;
+        }
+    }
+
     private AppVersionConfig latest() {
         return appVersionConfigMapper.selectOne(new LambdaQueryWrapper<AppVersionConfig>()
                 .eq(AppVersionConfig::getDeleted, 0)

--
Gitblit v1.7.1