From 48ec0f97f753f81e4a2911931451a6405495b9c5 Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 8 May 2026 22:54:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=8A=B6=E6=80=81=E5=88=97=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E6=98=AF=E5=90=A6=E6=9C=89=E6=9B=B4=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E5=BC=BA=E5=88=B6=E7=89=88=E6=9C=AC=E5=88=A4=E6=96=AD=E7=94=9F?= =?UTF-8?q?=E6=95=88/=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/router/admin/versions.go | 57 ++++++++++++------- .../admin/versions/components/columns.ts | 12 ++-- 2 files changed, 43 insertions(+), 26 deletions(-) diff --git a/backend/internal/router/admin/versions.go b/backend/internal/router/admin/versions.go index 6e8f33e..531c840 100644 --- a/backend/internal/router/admin/versions.go +++ b/backend/internal/router/admin/versions.go @@ -127,15 +127,21 @@ func handleGetAllVersions(c *gin.Context) { log.Printf("[DEBUG] Version %d: ID=%d, ApplicationID=%d, Version=%s\n", i, v.ID, v.ApplicationID, v.Version) } - latestVersionIDs := make(map[uint]uint) - var latestIDs []uint - database.DB.Model(&model.Version{}). - Where("application_id IN ?", appIDs). - Select("MAX(id)"). - Group("application_id"). - Pluck("MAX(id)", &latestIDs) - for _, id := range latestIDs { - latestVersionIDs[id] = id + versionIDs := make([]uint, len(versions)) + versionAppIDMap := make(map[uint]uint) + for i, v := range versions { + versionIDs[i] = v.ID + versionAppIDMap[v.ID] = v.ApplicationID + } + + var allVersionsForApps []model.Version + database.DB.Where("application_id IN ?", appIDs).Select("id, application_id, update_strategy").Find(&allVersionsForApps) + + appForcedVersionIDs := make(map[uint][]uint) + for _, v := range allVersionsForApps { + if v.UpdateStrategy == "forced" { + appForcedVersionIDs[v.ApplicationID] = append(appForcedVersionIDs[v.ApplicationID], v.ID) + } } type VersionWithAppName struct { @@ -147,11 +153,23 @@ func handleGetAllVersions(c *gin.Context) { for i, v := range versions { appName := appNameMap[v.ApplicationID] log.Printf("[DEBUG] Mapping version %d: ApplicationID=%d -> AppName=%s\n", i, v.ApplicationID, appName) - if _, isLatest := latestVersionIDs[v.ID]; isLatest { - v.Status = "active" - } else { - v.Status = "superseded" + + isSuperseded := false + if forcedIDs, ok := appForcedVersionIDs[v.ApplicationID]; ok { + for _, forcedID := range forcedIDs { + if forcedID > v.ID { + isSuperseded = true + break + } + } } + + if isSuperseded { + v.Status = "superseded" + } else { + v.Status = "active" + } + result[i] = VersionWithAppName{ Version: v, ApplicationName: appName, @@ -187,14 +205,13 @@ func handleGetVersionByID(c *gin.Context) { return } - var latestID uint + computedStatus := "active" + var forcedCount int64 database.DB.Model(&model.Version{}). - Where("application_id = ?", version.ApplicationID). - Select("MAX(id)"). - Scan(&latestID) - computedStatus := "superseded" - if version.ID == latestID { - computedStatus = "active" + Where("application_id = ? AND id > ? AND update_strategy = ?", version.ApplicationID, version.ID, "forced"). + Count(&forcedCount) + if forcedCount > 0 { + computedStatus = "superseded" } response.Success(c, gin.H{ diff --git a/frontend/src/pages/admin/versions/components/columns.ts b/frontend/src/pages/admin/versions/components/columns.ts index 6530110..228f64b 100644 --- a/frontend/src/pages/admin/versions/components/columns.ts +++ b/frontend/src/pages/admin/versions/components/columns.ts @@ -90,16 +90,16 @@ export function getColumns(options: ColumnOptions, t: (key: string) => string): accessorKey: 'status', header: () => t('admin.versions.columns.status'), cell: ({ row }) => { - const strategy = row.original.update_strategy + const status = row.original.status const statusClasses: Record = { - optional: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400', - forced: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400', + active: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400', + superseded: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400', } const statusLabels: Record = { - optional: t('admin.versions.strategies.optional'), - forced: t('admin.versions.strategies.forced'), + active: t('admin.versions.status.active'), + superseded: t('admin.versions.status.superseded'), } - return h(Badge, { class: statusClasses[strategy] || statusClasses.optional }, () => statusLabels[strategy] || strategy) + return h(Badge, { class: statusClasses[status] || statusClasses.superseded }, () => statusLabels[status] || status) }, }, {