fix: 状态列根据是否有更新的强制版本判断生效/失效

This commit is contained in:
2026-05-08 22:54:38 +08:00
parent 599975667a
commit 48ec0f97f7
2 changed files with 43 additions and 26 deletions
+37 -20
View File
@@ -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{
@@ -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<string, string> = {
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<string, string> = {
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)
},
},
{