赛程中心
适用对象:负责赛程编排、比分录入与比赛审核的组委会成员。
最后更新:2026-06-07
主要功能
入口:/admin/schedule(侧栏「赛程中心」)
赛程中心是整个赛事数据的核心枢纽,维护联赛、晋级附加赛、1/4 决赛、半决赛、决赛与排位赛的赛程与比分。所有录入的赛果在保存后自动推导积分榜、对阵图等前台状态,/draw 页面的四个 Tab(联赛 / 晋级附加赛 / 淘汰赛 / 排位赛)均为服务端实时读库(无缓存、无延迟)。
页面结构
顶部 Tab 切换赛事阶段,每个阶段的表单可直接编辑比分与比赛状态:
| Tab | 覆盖场次 | 说明 |
|---|---|---|
| 联赛 | 16 队 × 3 轮 = 24 场 | 积分榜自动计算(胜 3 / 平 1 / 负 0) |
| 晋级附加赛 | 4 场(5vs12 / 6vs11 / 7vs10 / 8vs9) | 胜者进入 1/4 决赛,负者进入 9-12 名排位 |
| 淘汰赛 | 1/4(4 场) + 半决赛(2 场) + 决赛(1 场) + 季军赛(1 场) | 对阵由比分自动推导,无需手动排阵 |
| 排位赛 | 5-8 名(6 场) + 9-12 名(6 场,可按需开关) | 小组内循环,积分规则同联赛 |
自动生成对阵
在联赛阶段,您可一键自动生成对阵安排:
- 系统基于球队名单和回避分组自动编排联赛三轮对阵
- 自动遵守同校/AB 队回避规则(同一学校的球队不会在联赛阶段相遇)
- 生成后可手动调整对阵(如交换主客队、调整日期等)
淘汰赛自动推导
淘汰赛是整个赛程系统自动程度最高的板块。您只需录入每场比赛的比分,系统会逐级推导下一轮的对阵双方,无需任何手动排列。
推导链路(从上到下)
联赛 3 轮打完 → 积分榜排名确定
↓
附加赛录入比分 → 4 场胜者进入 1/4 决赛客队槽
↓
1/4 决赛录入比分 → QF1+QF2 胜者 → 左半区半决赛
QF3+QF4 胜者 → 右半区半决赛
↓
半决赛录入比分 → 两队胜者 → 决赛
两队负者 → 季军赛
抽签前的占位展示
联赛排名确定之前(抽签前),淘汰赛节点的对阵双方尚未确定,前台 /draw 会以来源徽章展示待产生状态:
| 阶段 | 占位内容 |
|---|---|
| 1/4 决赛 | L1 联赛第 1 名 × P8v9 附加赛胜者 8v9 …依此类推 |
| 半决赛 | S0 半决赛 0 胜者 × S1 半决赛 1 胜者 |
| 决赛 / 季军赛 | 同半决赛推导,logo 位置保留虚位 |
一旦对应阶段的结果录入,徽章会自动替换为真实的队名和队徽。
前台数据如何刷新
/draw 页面每次访问都在服务端实时查库(force-dynamic),不存在静态生成或 CDN 缓存。后台保存后,刷新 /draw 即可看到最新结果。
数据链路如下:
后台保存 → upsertMatch() 写 matches 表
↓
前台 /draw → getScheduleStateWithMatches()
→ 查 matches 表 → matchRecordsToPartialMap()
→ deriveTournamentState() 重新推导全部对阵
→ Bracket / StandingsBoard / Fixtures 渲染
比赛审核
裁判端提交比赛数据后,该场比赛会在赛程中心标记为**「未复核」**——前台淘汰赛对阵图上对应节点会显示金色 未复核 角标,提示观赛者当前比对结果尚未经组委会确认。
复核流程
- 裁判端提交比赛数据(比分 / 进球事件 / 红黄牌 / 门将数据 / 可重返换人记录)→
reviewStatus = "pending" - 进入「赛程中心」,找到标记为「待审核」的比赛
- 核对裁判提交的数据与实际情况是否一致
- 确认通过 →
reviewStatus = "approved",前台「未复核」角标消失 - 比赛结果确认后,积分引擎和保证金引擎自动触发重算
「未复核」角标的判定逻辑
角标只在同时满足以下条件时显示:
enteredByRefereeId非空(来自裁判端提交,非后台直录)reviewStatus = "pending"
后台管理员自己录入的比分(saveTournamentResultsAction 直录)不会产生角标,视为已发布。如果裁判端提交后管理员在后台覆盖了比分但未点审核,角标仍然保留——此时应以裁判端原始数据为准进行审核。
典型操作:审核一场比赛
- 等待裁判端提交比赛数据
- 进入「赛程中心」,找到标记为「待审核」的比赛
- 查看裁判录入的比分、进球事件、红黄牌
- 核对与实际情况是否一致
- 点击确认通过
- 前往
/draw确认积分榜和赛程表已更新
三种比分写入路径对比
| 路径 | 触发方 | enteredByRefereeId | reviewStatus | 前台角标 |
|---|---|---|---|---|
| 后台直录(赛程中心保存) | 管理员 | 无 | — | 无 |
| 裁判端提交 | 裁判员 | 有 | pending | 显示「未复核」 |
| 后台审核通过 | 管理员 | 保留 | approved | 消失 |
操作建议
- 每场结束后尽快录入比分;大规模调整前可先记录当前版本,便于回滚。
- 淘汰赛阶段建议按时间顺序操作:先录附加赛 → 保存 → 再录 1/4 决赛 → 保存 → 再录半决赛 → 保存 → 最后录决赛/季军赛。虽然系统允许一次性全填,但逐阶段保存可避免推导混淆。
- 若淘汰赛出现点球决胜,务必将
penH/penA字段填上(非淘汰赛/排位赛可忽略)。 - 裁判端提交的数据需要逐场审核;批量审核功能暂未提供,请逐场核对后点击通过。