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
+61 -25
View File
@@ -216,18 +216,57 @@ func handleAppCheckUpdate(c *gin.Context) {
} }
} }
// 确定下载地址:优先使用完整包地址,其次自定义地址 // 确定下载地址
downloadURL := latestVersion.FilePath var downloadURL string
downloadSize := latestVersion.FileSize var downloadSize int64
downloadHash := latestVersion.FileHash var downloadHash string
var fullPackageURL string
var fullPackageSize int64
var fullPackageHash string
var isPatchUpdate bool
// 使用完整包地址(如果有) if latestVersion.UpdateType == "patch" && latestVersion.BaseVersionID != nil {
if latestVersion.FullPackagePath != "" { // 最新版本是补丁类型
downloadURL = latestVersion.FullPackagePath // 检查客户端版本是否是基础版本
downloadSize = latestVersion.FullPackageSize if clientVersionRecord.ID == *latestVersion.BaseVersionID {
downloadHash = latestVersion.FullPackageHash // 客户端是基础版本,可以下载补丁包
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 != "" { if latestVersion.CustomDownloadURL != "" {
downloadURL = latestVersion.CustomDownloadURL downloadURL = latestVersion.CustomDownloadURL
} }
@@ -249,22 +288,19 @@ func handleAppCheckUpdate(c *gin.Context) {
"files": files, "files": files,
} }
// 检查是否有适合客户端版本的增量更新 // 如果是补丁更新,添加补丁信息
// 查找以客户端版本为基础版本的 patch 更新 if isPatchUpdate {
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 {
// 找到了增量更新
result["is_patch"] = true result["is_patch"] = true
result["base_version"] = clientVersion result["patch_url"] = downloadURL
result["patch_url"] = patchVersion.FilePath result["patch_size"] = downloadSize
result["patch_size"] = patchVersion.FileSize result["patch_hash"] = downloadHash
result["patch_hash"] = patchVersion.FileHash }
// 如果有完整包,添加完整包信息作为备选
if fullPackageURL != "" {
result["full_package_url"] = fullPackageURL
result["full_package_size"] = fullPackageSize
result["full_package_hash"] = fullPackageHash
} }
response.Success(c, result) response.Success(c, result)