diff --git a/backend/internal/router/admin/versions.go b/backend/internal/router/admin/versions.go index 7083ce9..92c5801 100644 --- a/backend/internal/router/admin/versions.go +++ b/backend/internal/router/admin/versions.go @@ -272,6 +272,7 @@ type CreateVersionRequest struct { CustomDownloadURL string `json:"custom_download_url"` Description string `json:"description"` Changelog string `json:"changelog"` + BaseVersionID *uint `json:"base_version_id"` } func handleCreateVersionGlobal(c *gin.Context) { @@ -360,36 +361,47 @@ func handleCreateVersionGlobal(c *gin.Context) { } } else if version.UpdateType == "patch" { // 补丁包:需要找到基础全量包并合并 - var lastFullVersion model.Version - if err := database.DB.Where("application_id = ? AND update_type = ?", req.ApplicationID, "full"). - Order("id DESC").First(&lastFullVersion).Error; err == nil { - version.BaseVersionID = &lastFullVersion.ID + var baseVersion model.Version - // 获取基础版本的全量包路径,如果没有则使用 FilePath - baseFullPackagePath := lastFullVersion.FullPackagePath - if baseFullPackagePath == "" { - baseFullPackagePath = lastFullVersion.FilePath - } - - // 合并生成新的全量包 - fullPkgPath, fullPkgSize, fullPkgHash, err := MergePatchWithFullPackage( - baseFullPackagePath, - req.FilePath, - req.ApplicationID, - ) - if err != nil { - log.Printf("[ERROR] Failed to merge patch with full package: %v\n", err) - response.Error(c, 500, "合并补丁包失败: "+err.Error()) + // 优先使用传入的 base_version_id + if req.BaseVersionID != nil { + if err := database.DB.Where("id = ? AND application_id = ? AND update_type = ?", + *req.BaseVersionID, req.ApplicationID, "full").First(&baseVersion).Error; err != nil { + response.Error(c, 400, "指定的基础版本不存在或不是全量版本") return } - - version.FullPackagePath = fullPkgPath - version.FullPackageSize = fullPkgSize - version.FullPackageHash = fullPkgHash } else { - response.Error(c, 400, "找不到基础全量包,无法创建补丁版本") + // 未指定基础版本,使用最新的全量版本 + if err := database.DB.Where("application_id = ? AND update_type = ?", req.ApplicationID, "full"). + Order("id DESC").First(&baseVersion).Error; err != nil { + response.Error(c, 400, "找不到基础全量包,无法创建补丁版本") + return + } + } + + version.BaseVersionID = &baseVersion.ID + + // 获取基础版本的全量包路径,如果没有则使用 FilePath + baseFullPackagePath := baseVersion.FullPackagePath + if baseFullPackagePath == "" { + baseFullPackagePath = baseVersion.FilePath + } + + // 合并生成新的全量包 + fullPkgPath, fullPkgSize, fullPkgHash, err := MergePatchWithFullPackage( + baseFullPackagePath, + req.FilePath, + req.ApplicationID, + ) + if err != nil { + log.Printf("[ERROR] Failed to merge patch with full package: %v\n", err) + response.Error(c, 500, "合并补丁包失败: "+err.Error()) return } + + version.FullPackagePath = fullPkgPath + version.FullPackageSize = fullPkgSize + version.FullPackageHash = fullPkgHash } if err := database.DB.Create(&version).Error; err != nil { @@ -425,6 +437,7 @@ type UpdateVersionRequest struct { CustomDownloadURL string `json:"custom_download_url"` Description string `json:"description"` Changelog string `json:"changelog"` + BaseVersionID *uint `json:"base_version_id"` } func handleUpdateVersionGlobal(c *gin.Context) { diff --git a/frontend/src/pages/admin/versions/create.vue b/frontend/src/pages/admin/versions/create.vue index af36cc7..6d601a4 100644 --- a/frontend/src/pages/admin/versions/create.vue +++ b/frontend/src/pages/admin/versions/create.vue @@ -1,6 +1,6 @@