package domain // TeamPoints 一个单位的分项汇总;系数只在汇总时折算,历史流水保持原始分。 type TeamPoints struct { Total float64 // 单位总分 TeamOnly float64 // 仅记单位的流水 Individual float64 // 记到个人的流水(原始分,未乘系数) } // SumByTeam 汇总各单位得分:总分 = 仅记单位的流水 + 系数 × 记到个人的流水。 // weight <= 0 时按 1 处理,避免零值把个人分抹掉。 // count_to_team = 0 的流水(如「个人+团体」项目的个人通道)只记在个人头上,不计入单位总分。 func SumByTeam(entries []LedgerEntry, weight float64) map[int64]TeamPoints { if weight <= 0 { weight = 1 } out := make(map[int64]TeamPoints) for _, e := range entries { if e.Voided || !e.CountToTeam { continue } p := out[e.TeamID] if e.AthleteID == 0 { p.TeamOnly += e.Points } else { p.Individual += e.Points } p.Total = p.TeamOnly + weight*p.Individual out[e.TeamID] = p } return out } // SumByAthlete 汇总每个运动员的个人总分(原始分,不折算系数)。 // 不计入单位总分的流水(count_to_team = 0)照样算在个人头上,个人榜不受影响。 func SumByAthlete(entries []LedgerEntry) map[int64]float64 { out := make(map[int64]float64) for _, e := range entries { if e.Voided || e.AthleteID == 0 { continue } out[e.AthleteID] += e.Points } return out }