fix: 修复检测更新 API 正确处理补丁包

- 当最新版本是补丁类型且客户端版本是基础版本时,返回补丁包地址
- 当最新版本是补丁类型但客户端不是基础版本时,返回完整包地址
- 添加 full_package_url/full_package_size/full_package_hash 字段作为备选
- 移除冗余的补丁查询逻辑

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-03 03:21:16 +08:00
parent beae161078
commit 0d60037e4e
+57 -21
View File
@@ -216,18 +216,57 @@ func handleAppCheckUpdate(c *gin.Context) {
}
}
// 确定下载地址:优先使用完整包地址,其次自定义地址
downloadURL := latestVersion.FilePath
downloadSize := latestVersion.FileSize
downloadHash := latestVersion.FileHash
// 确定下载地址
var downloadURL string
var downloadSize int64
var downloadHash string
var fullPackageURL string
var fullPackageSize int64
var fullPackageHash string
var isPatchUpdate bool
// 使用完整包地址(如果有)
if latestVersion.UpdateType == "patch" && latestVersion.BaseVersionID != nil {
// 最新版本是补丁类型
// 检查客户端版本是否是基础版本
if clientVersionRecord.ID == *latestVersion.BaseVersionID {
// 客户端是基础版本,可以下载补丁包
downloadURL = latestVersion.FilePath
downloadSize = latestVersion.FileSize
downloadHash = latestVersion.FileHash
isPatchUpdate = true
} else {
// 客户端不是基础版本,需要下载完整包
if latestVersion.FullPackagePath != "" {
downloadURL = latestVersion.FullPackagePath
downloadSize = latestVersion.FullPackageSize
downloadHash = latestVersion.FullPackageHash
} else {
// 没有完整包,使用补丁包(可能合并失败)
downloadURL = latestVersion.FilePath
downloadSize = latestVersion.FileSize
downloadHash = latestVersion.FileHash
}
// 自定义地址优先级最高
}
// 保存完整包地址作为备选
if latestVersion.FullPackagePath != "" {
fullPackageURL = latestVersion.FullPackagePath
fullPackageSize = latestVersion.FullPackageSize
fullPackageHash = latestVersion.FullPackageHash
}
} else {
// 全量版本,直接使用文件路径
downloadURL = latestVersion.FilePath
downloadSize = latestVersion.FileSize
downloadHash = latestVersion.FileHash
// 全量版本的完整包就是自己
if latestVersion.FullPackagePath != "" {
fullPackageURL = latestVersion.FullPackagePath
fullPackageSize = latestVersion.FullPackageSize
fullPackageHash = latestVersion.FullPackageHash
}
}
// 自定义地址优先级最高(覆盖下载地址)
if latestVersion.CustomDownloadURL != "" {
downloadURL = latestVersion.CustomDownloadURL
}
@@ -249,22 +288,19 @@ func handleAppCheckUpdate(c *gin.Context) {
"files": files,
}
// 检查是否有适合客户端版本的增量更新
// 查找以客户端版本为基础版本的 patch 更新
var patchVersion model.Version
err := database.DB.Where("application_id = ? AND update_type = ? AND base_version_id = ? AND publish_status = ?",
app.ID, "patch", clientVersionRecord.ID, "published").
Order("id DESC").
Preload("Files").
First(&patchVersion).Error
if err == nil {
// 找到了增量更新
// 如果是补丁更新,添加补丁信息
if isPatchUpdate {
result["is_patch"] = true
result["base_version"] = clientVersion
result["patch_url"] = patchVersion.FilePath
result["patch_size"] = patchVersion.FileSize
result["patch_hash"] = patchVersion.FileHash
result["patch_url"] = downloadURL
result["patch_size"] = downloadSize
result["patch_hash"] = downloadHash
}
// 如果有完整包,添加完整包信息作为备选
if fullPackageURL != "" {
result["full_package_url"] = fullPackageURL
result["full_package_size"] = fullPackageSize
result["full_package_hash"] = fullPackageHash
}
response.Success(c, result)