fix: check-update只从已发布版本中选取最新版本, 用所有版本匹配客户端版本号

This commit is contained in:
Trae AI
2026-06-21 17:45:46 +08:00
parent d1251a9356
commit 2ae80d8114
+26 -15
View File
@@ -62,18 +62,29 @@ func handleAppCheckUpdate(c *gin.Context) {
return
}
// 查询该应用的所有版本(包括已失效的),按ID降序(创建顺序
var allVersions []model.Version
if err := database.DB.Where("application_id = ?", app.ID).
// 查询该应用的所有已发布版本,按ID降序(用于获取最新版本和下载地址
var publishedVersions []model.Version
if err := database.DB.Where("application_id = ? AND publish_status = ?", app.ID, "published").
Order("id DESC").
Preload("Files").
Find(&allVersions).Error; err != nil {
Find(&publishedVersions).Error; err != nil {
response.Error(c, 500, "获取版本列表失败")
return
}
// 没有任何版本
if len(allVersions) == 0 {
// 同时查询所有版本(包括已失效的),用于匹配客户端版本
var allVersions []model.Version
if clientVersion != "" {
if err := database.DB.Where("application_id = ?", app.ID).
Order("id DESC").
Find(&allVersions).Error; err != nil {
response.Error(c, 500, "获取版本列表失败")
return
}
}
// 没有任何已发布版本
if len(publishedVersions) == 0 {
response.Success(c, gin.H{
"has_update": false,
"current_version": clientVersion,
@@ -95,9 +106,9 @@ func handleAppCheckUpdate(c *gin.Context) {
return v
}
// 如果没有传入版本号,直接返回最新版本(安装器模式,优先全量包)
// 如果没有传入版本号,直接返回最新已发布版本(安装器模式,优先全量包)
if clientVersion == "" {
latestVersion := &allVersions[0]
latestVersion := &publishedVersions[0]
// 确定下载地址:无版本号时 download_url 优先指向全量包
downloadURL := latestVersion.FullPackagePath
@@ -165,10 +176,10 @@ func handleAppCheckUpdate(c *gin.Context) {
return
}
// 判断客户端版本状态:检查是否有更高ID的强制更新版本
// 判断客户端版本状态:检查是否有更高ID的强制更新版本(只看已发布版本)
isSuperseded := false
for i := range allVersions {
v := &allVersions[i]
for i := range publishedVersions {
v := &publishedVersions[i]
// 存在ID更高(创建时间更晚)的强制更新版本
if v.ID > clientVersionRecord.ID && v.UpdateStrategy == "forced" {
isSuperseded = true
@@ -183,8 +194,8 @@ func handleAppCheckUpdate(c *gin.Context) {
if isSuperseded {
// 找到ID最高的强制更新版本
for i := range allVersions {
v := &allVersions[i]
for i := range publishedVersions {
v := &publishedVersions[i]
if v.ID > clientVersionRecord.ID && v.UpdateStrategy == "forced" {
if latestVersion == nil || v.ID > latestVersion.ID {
latestVersion = v
@@ -194,8 +205,8 @@ func handleAppCheckUpdate(c *gin.Context) {
updateStrategy = "forced"
} else {
// 没有强制更新,检查是否有更高ID的版本(普通更新)
// 最新版本就是ID最高的版本(已经是按ID降序排列,第一个就是最新)
latestVersion = &allVersions[0]
// 最新已发布版本就是ID最高的版本(已经是按ID降序排列,第一个就是最新)
latestVersion = &publishedVersions[0]
// 只有当最新版本ID大于客户端版本ID时才需要更新
if latestVersion.ID > clientVersionRecord.ID {