Files
Scoreboard/devdocs/02-积分与排名规则.md
T

145 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 02 · 积分与排名规则 ★
> 所属:运动会积分榜系统 · 开发文档集
> 版本:v0.1(讨论稿) · 2026-09-09
> 上游:[README](./README.md) · 相关:[04-数据模型](./04-数据模型.md)、[09-测试策略](./09-测试策略.md)
> **本篇是系统的心脏**:规则一变,数据模型与积分引擎都要跟着改,所以必须先定稿。
---
## 1. 总分构成
```
单位总分 = Σ 成绩积分 + Σ 破纪录加分 + Σ 人工调整
```
对应积分流水表 `score_ledger` 的三种来源类型:`result` / `record_bonus` / `adjustment`。
---
## 2. 成绩积分
```
成绩积分 = 名次积分表[名次] × 小项权重(multiplier)
```
- 名次积分表由「积分模板」定义,可被大项引用,也可被单个小项覆盖。
- 未取得名次(未完赛、未录取、弃权、DQ)→ 0 分。
- 小项权重 `multiplier`:普通项目 1,团体/接力/球类项目 2(见 D2)。
### 2.1 默认名次积分表
| 名次 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 积分 | 9 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
### 2.2 并列名次(三种口径,系统可配置)
| 模式 | 例:两人并列第 2(积分表 9/7/6/5) | 说明 |
| --- | --- | --- |
| `skip` 顺延 ✅默认 | 两人各 7 分,无第 3 名,下一名是第 4 名得 5 分 | 国内运动会最常见 |
| `average` 平均 | 两人各 (7+6)/2 = 6.5 分,下一名第 4 名得 5 分 | 部分规程采用 |
| `higher` 就高 | 两人各 7 分,下一名第 3 名得 6 分 | 少见 |
### 2.3 特殊情形
| 情形 | 处理 |
| --- | --- |
| 报名不足 8 人 | 按实际名次取分,空缺名次分值作废 |
| 弃权 / DNS / DSQ | 0 分,且不占名次(名次顺延) |
| 团体项目积分归属 | 计入所属单位总分;个人积分榜**不计入**成员个人(待 D3 确认是否要给成员各记一份) |
| 一人多项参赛 | 各项独立计分,个人总分累加 |
| 积分手工覆盖 | 允许,但必须填理由并记入审计 |
---
## 3. 破纪录加分
| 项 | 规则 |
| --- | --- |
| 加分档位 | 赛会纪录 +2 / 市级 +5 / 省级 +8 |
| 同时破多级 | **取最高档,不累加**(可配置为累加,见 `record_bonus_mode`) |
| 是否随权重翻倍 | **不翻倍**:破纪录加分与成绩积分相互独立 |
| 确认流程 | 系统自动提示「疑似破纪录」→ 裁判长确认 → 生成加分流水 → 更新纪录库 |
| 撤销 | 支持作废该条破纪录记录,加分流水一并作废 |
---
## 4. 人工调整(扣分 / 补分)
- 字段:单位、分值(可正可负)、类别(处罚 / 补分 / 更正)、理由(必填)、操作人。
- 支持作废(不物理删除),作废后总分自动重算。
- 典型场景:违反纪律扣分、跨单位联队积分拆分、漏录补分。
---
## 5. 排名规则
### 5.1 总积分榜排序键
```
总分 DESC → 金牌数 DESC → 银牌数 DESC → 铜牌数 DESC → 单位编码 ASC
```
### 5.2 奖牌判定
- 名次 = 1 → 金,= 2 → 银,= 3 → 铜。
- 并列第 1 → 两人各记 1 金,无银牌(与名次顺延口径一致)。
- 团体/球类项目是否计入奖牌榜 → 见 D3(建议计入)。
### 5.3 并列展示
- 名次相同则显示同一名次(如两个「2」),不强行拆开。
- 同分不同名次时按 tie-break 拆开,并在界面标注 tie-break 依据(便于解释给参赛单位)。
---
## 6. 积分流水原则(实现红线)
1. 所有积分变化**只追加、不修改**;修改 = 作废旧流水 + 追加新流水。
2. 总分永远是 `SUM(未作废流水)`,**禁止**使用「总分字段 += 分数」这类原地累加。
3. 每条流水必须可溯源到:成绩 / 破纪录 / 人工调整。
4. 排名缓存(`standings_cache`)永远可由流水重建,缓存只是加速,不是真相。
---
## 7. 待确认(🔴)
| 编号 | 问题 | 建议默认 |
| --- | --- | --- |
| D2 | 积分表分值 / 是否双倍 / 破纪录加分档位 | 见第 2、3 节 |
| D3 | 并列奖牌、个人积分榜、团体成员是否各记个人分 | 见第 5 节 |
| — | 是否存在「同一小项每单位限报 2 人」这类报名限制 | 建议由报名导入时校验,不进积分引擎 |
---
## 附录 · 积分计算示例
**示例 1:男子100米,8 人参赛,无并列**
| 名次 | 单位 | 成绩 | 积分 |
| --- | --- | --- | --- |
| 1 | 第一分公司 | 11.58 | 9 |
| 2 | 机关本部 | 11.92 | 7 |
| 3 | 第二分公司 | 12.01 | 6 |
| … | … | … | … |
| 8 | 第六分公司 | 13.40 | 1 |
**示例 2:两人并列第 2(skip 模式)**
| 名次 | 单位 | 成绩 | 积分 |
| --- | --- | --- | --- |
| 1 | A | 11.58 | 9 |
| 2 | B | 11.92 | 7 |
| 2 | C | 11.92 | 7 |
| 4 | D | 12.01 | 5 |
| 5 | E | 12.10 | 4 |
**示例 3:4×100米接力(双倍)+ 破赛会纪录**
| 项 | 分值 |
| --- | --- |
| 第 1 名成绩分 | 9 × 2 = 18 |
| 破赛会纪录加分 | +2(不翻倍) |
| 该单位合计 | 20 |