145 lines
4.9 KiB
Markdown
145 lines
4.9 KiB
Markdown
# 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 |
|