From f4e8dfd7f8f11966f4b5dc8c6661cbc3feccc4cf Mon Sep 17 00:00:00 2001
From: hejianhao <15708179461@qq.com>
Date: 星期二, 01 九月 2026 16:17:29 +0800
Subject: [PATCH] fix0901: 继续修复扫描问题
---
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/system/service/AppVersionSettingsAppService.java | 88 +++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 86 insertions(+), 2 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..920ed6c 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
@@ -42,7 +42,7 @@
return toDetailVO(requireItem(id));
}
- @Transactional
+ @Transactional(rollbackFor = Exception.class)
public AppVersionDetailVO create(AppVersionCreateRequest request) {
AppVersionConfig latest = latest();
String androidFileUrl = normalizeOptionalText(request.getAndroidFileUrl());
@@ -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,86 @@
return vo;
}
+ public AppVersionCheckVO checkUpdateNew(String platform) {
+
+ String normalizedPlatform = normalizePlatform(platform);
+ AppVersionConfig latest = latest();
+ AppVersionCheckVO vo = new AppVersionCheckVO();
+ if (latest == null) {
+ vo.setHasUpdate(Boolean.FALSE);
+ return vo;
+ }
+
+ String downloadUrl = AppVersionConfig.PLATFORM_ANDROID.equals(normalizedPlatform)
+ ? normalizeOptionalText(latest.getAndroidFileUrl())
+ : normalizeOptionalText(latest.getIosFileUrl());
+ boolean hasUpdate = downloadUrl != null;
+ vo.setHasUpdate(hasUpdate);
+ if (!hasUpdate) {
+ return vo;
+ }
+ vo.setLatestVersionNo(latest.getVersionNo());
+ vo.setLatestVersionCode(defaultNumber(latest.getVersionCode()));
+ vo.setForceUpdate(integerToBoolean(latest.getForceUpdate()));
+ vo.setUpdateNotice(latest.getUpdateNotice());
+ vo.setDownloadUrl(downloadUrl);
+ 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