From 472d65eeb23e7971aec7044c1f26ae4e286a5c1b Mon Sep 17 00:00:00 2001 From: Trae AI Date: Thu, 18 Jun 2026 17:03:41 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=89=88=E6=9C=AC=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E6=97=B6UpdateType=E5=8F=98=E5=8C=96=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=85=A8=E9=87=8F=E5=8C=85=EF=BC=8C=E7=A6=81?= =?UTF-8?q?=E6=AD=A2=E9=80=89=E6=8B=A9=E8=87=AA=E8=BA=AB=E4=BD=9C=E4=B8=BA?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/router/admin/versions.go | 81 +++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/backend/internal/router/admin/versions.go b/backend/internal/router/admin/versions.go index 81f173b..121c4df 100644 --- a/backend/internal/router/admin/versions.go +++ b/backend/internal/router/admin/versions.go @@ -542,6 +542,87 @@ func handleUpdateVersionGlobal(c *gin.Context) { updates["changelog"] = req.Changelog } + // 验证 BaseVersionID 不能是自身 + if req.BaseVersionID != nil && *req.BaseVersionID == version.ID { + response.Error(c, 400, "基础版本不能选择自身") + return + } + + // 处理 UpdateType 变化时的全量包更新 + newUpdateType := req.UpdateType + if newUpdateType == "" { + newUpdateType = version.UpdateType + } + + // 如果 UpdateType 从 full 改为 patch,需要重新生成全量包 + if version.UpdateType == "full" && newUpdateType == "patch" { + // 需要有 BaseVersionID + baseVersionID := req.BaseVersionID + if baseVersionID == nil { + baseVersionID = version.BaseVersionID + } + if baseVersionID == nil { + response.Error(c, 400, "补丁包必须指定基础版本") + return + } + + var baseVersion model.Version + if err := database.DB.First(&baseVersion, *baseVersionID).Error; err != nil { + response.Error(c, 400, "基础版本不存在") + return + } + + baseFullPackagePath := baseVersion.FullPackagePath + if baseFullPackagePath == "" { + baseFullPackagePath = baseVersion.FilePath + } + + // 使用当前 FilePath 作为补丁包 + patchPath := req.FilePath + if patchPath == "" { + patchPath = version.FilePath + } + + fullPkgPath, fullPkgSize, fullPkgHash, err := MergePatchWithFullPackage( + baseFullPackagePath, + patchPath, + version.ApplicationID, + ) + if err != nil { + log.Printf("[ERROR] Failed to merge patch with full package: %v\n", err) + response.Error(c, 500, "合并补丁包失败: "+err.Error()) + return + } + + updates["base_version_id"] = baseVersionID + updates["full_package_path"] = fullPkgPath + updates["full_package_size"] = fullPkgSize + updates["full_package_hash"] = fullPkgHash + log.Printf("[INFO] Regenerated full package for patch type change: %s, size: %d\n", fullPkgPath, fullPkgSize) + } + + // 如果 UpdateType 从 patch 改为 full,全量包就是 FilePath 本身 + if version.UpdateType == "patch" && newUpdateType == "full" { + filePath := req.FilePath + if filePath == "" { + filePath = version.FilePath + } + fileSize := req.FileSize + if fileSize == 0 { + fileSize = version.FileSize + } + fileHash := req.FileHash + if fileHash == "" { + fileHash = version.FileHash + } + + updates["full_package_path"] = filePath + updates["full_package_size"] = fileSize + updates["full_package_hash"] = fileHash + updates["base_version_id"] = nil + log.Printf("[INFO] Set full package to file itself for full type change: %s\n", filePath) + } + log.Printf("[DEBUG] Updates map: %+v\n", updates) // 如果文件被更新,删除旧文件