package dto import "git.yeij.top/AskaEth/Scoreboard/server/internal/domain" // StandingRow 是 GET /api/standings 与 snapshot.standings 的线上结构。 // // 字段名与 web/src/shared/types.ts 的 StandingRow 对齐:大屏与管理端共用一份解析逻辑, // 不能再把 domain.StandingsRow 的 points/code/medals 直接下发。 // // 两个榜共用这一行:rank 是总积分榜名次(总分优先),medalRank 是单位奖牌榜名次 // (金 → 银 → 铜 → 单位编码,与总分无关)。金牌多但总分低的单位,medalRank 会比 rank 靠前。 type StandingRow struct { TeamID int64 `json:"teamId"` TeamCode string `json:"teamCode"` TeamName string `json:"teamName"` ShortName *string `json:"shortName"` Color *string `json:"color"` LogoPath *string `json:"logoPath"` Rank int `json:"rank"` MedalRank int `json:"medalRank"` Gold int `json:"gold"` Silver int `json:"silver"` Bronze int `json:"bronze"` MedalTotal int `json:"medalTotal"` TotalPoints float64 `json:"totalPoints"` RankChange *int `json:"rankChange"` } // StandingRows 把 domain 榜单转换成线上结构。 // // rows 是总积分榜(顺序与 Rank 都按总分),medal 是同一份输入算出的单位奖牌榜 // (顺序与名次按金→银→铜)。两个榜的行集合相同,这里用团队 id 把奖牌榜名次并进每一行, // 于是 REST / WS 快照 / xlsx 导出三处拿到的奖牌榜口径完全一致(同一个 domain.BuildMedalStandings)。 // // teams 用于补齐颜色/logo 等 domain 榜单没带的展示字段;rankChange 快照没有对比基准,与 REST 一致下发 null。 func StandingRows(rows []domain.StandingsRow, medal []domain.MedalRow, teams []domain.Team) []StandingRow { byID := make(map[int64]domain.Team, len(teams)) for _, t := range teams { byID[t.ID] = t } medalRanks := make(map[int64]int, len(medal)) for _, m := range medal { medalRanks[m.TeamID] = m.Rank } out := make([]StandingRow, 0, len(rows)) for _, r := range rows { t := byID[r.TeamID] row := StandingRow{ TeamID: r.TeamID, TeamCode: r.Code, TeamName: r.Name, ShortName: nilIfEmpty(r.ShortName), Rank: r.Rank, MedalRank: medalRanks[r.TeamID], Gold: r.Gold, Silver: r.Silver, Bronze: r.Bronze, MedalTotal: r.Medals, TotalPoints: r.Points, RankChange: nil, } if t.ID != 0 { row.Color = nilIfEmpty(t.Color) row.LogoPath = nilIfEmpty(t.LogoPath) if row.TeamCode == "" { row.TeamCode = t.Code } if row.TeamName == "" { row.TeamName = t.Name } if row.ShortName == nil { row.ShortName = nilIfEmpty(t.ShortName) } } out = append(out, row) } return out }