diff --git a/backend/internal/router/admin/versions.go b/backend/internal/router/admin/versions.go index eee3cfd..083fe45 100644 --- a/backend/internal/router/admin/versions.go +++ b/backend/internal/router/admin/versions.go @@ -800,6 +800,15 @@ func handleBatchDeleteVersions(c *gin.Context) { return } + // 恢复被删除版本取代的旧版本为 published + database.DB.Model(&model.Version{}). + Where("superseded_by IN ?", req.IDs). + Updates(map[string]interface{}{ + "publish_status": "published", + "superseded_by": nil, + "deprecated_at": nil, + }) + response.Success(c, nil) } @@ -1152,6 +1161,35 @@ func handleRollbackVersion(c *gin.Context) { return } + // 检查取代它的版本是否还存在,如果不存在则直接恢复 + if version.SupersededBy != nil { + var superseder model.Version + if err := database.DB.First(&superseder, *version.SupersededBy).Error; err != nil { + // 取代版本已被删除,直接恢复为 published + version.PublishStatus = "published" + version.SupersededBy = nil + version.DeprecatedAt = nil + database.DB.Save(&version) + + userIDPtr := &userID + versionIDPtr := &version.ID + service.CreateLog(service.LogParams{ + UserID: userIDPtr, + LogType: "version", + Action: "rollback", + Resource: "version", + ResourceID: versionIDPtr, + Details: fmt.Sprintf("回滚版本(取代版本已删除): %s (应用ID: %d)", version.Version, version.ApplicationID), + }) + + response.Success(c, gin.H{ + "id": version.ID, + "publish_status": version.PublishStatus, + }) + return + } + } + now := time.Now() version.PublishStatus = "published" version.SupersededBy = nil