Files
Scoreboard/docs/报名名单导入规范.md
AskaEth ee19b92182 feat(export): 新增「导入格式」报名名单导出(汇总 / 分小项),与导入模板逐列一致、可直接重导;版本 dev_0.5.14
主人反馈:导出页「报名名单」卡片导出的表格与导入模板对不上,没法拿回去重导。

核对属实(旧导出是给人看的报表):列序与 importColumns 不同、缺「种子 / 队员名单 / 队伍」
三列、姓名列被拼成「姓名(号码布)」、队名拼在单位名后面、状态列写「已退赛」而
normalizeImportStatus 不认 —— 整体错位 + 状态列报错,重导必炸。

- 新增 GET /api/export/entries-import.xlsx?format=flat|sheets&lang=zh|en&<四个筛选>
  · flat(缺省)= 所有行汇总在一张工作表;表名不含 @(导入侧见到带 @ 的表名就整份按
    分工作表模板解析,汇总表定不出「小项@组别」会被拒)
  · sheets = 按「小项@组别」分工作表,表名走 entrySheetName(与模板、导入解析三处同源,
    31 字符截断与撞名去重都跟着一起走)
  · 权限与筛选参数与 /api/export/entries.xlsx 完全一致(访客可读);空结果回 200 + 只有表头
  · 列序不写常量:按 importColumns 逐列取值,表头走 entryTemplateHeader(lang),
    加列/改序时测试当场红(TestEntryImportRecordCoversImportColumns)
- 取值口径(重导的关键):团体行的「姓名」留空、队员写「队员名单」列(中文逗号分隔;
  以库里 token 为底,再补上 entry_athletes 里后加的队员号码布,只增不减)、
  队伍独立成列、状态写导入器认的四个中文说法(正常参赛/退赛/取消资格/未出场)、
  联队照旧写 A+B、未分批留空、证件号/性别/年龄来自运动员档案(团体行空)
- 新增 internal/export/entries_import.go(读库层,与报表导出同源 SQL、取值口径刻意不同)
  与 internal/httpapi/entries_import_export.go(工作簿组装 + handler)
- 原有报表导出(/api/export/entries.xlsx 与 internal/export/entries.go)一个字没动;
  导出页新增两个按钮与中文/英文表头选择(只影响这两个导入格式)

测试:往返测试把导出件直接喂回报名导入解析器,flat 与 sheets 各断言四条(解析零错误 /
行数与 13 列逐项一致 / 团体行没被变成个人报名 / 两种格式都跑);另做变异验证 —— 状态改回
「已退赛」、给团体行填姓名,守卫当场变红。四套自检 ×2 全绿(finalcheck_0514.log:
前端 996 例 / Console 96 例 / 服务端 16 包,EXIT=0)。

无数据库迁移;已有成绩、名次与榜单不变。
文档:使用手册 §11.1(并订正「不要拿导出件重导」的旧话)、报名名单导入规范 新增第九节、
升级说明 新增 dev_0.5.14、常见问题 新增 Q104。
2026-09-17 04:03:52 +08:00

555 lines
62 KiB
Markdown
Raw Permalink 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.
# 报名名单导入规范
> 这份文件说明**报名名单应该做成什么样子、每一列怎么填**,用于把各单位报上来的名单一次性导入积分榜系统。
> 给负责收表、填表的同志看即可,不需要懂系统内部。
>
> 配套模板可在系统里直接下载:**基础数据 → 报名导入 →「中文表头」/「英文表头」**(两个文件列数与列顺序完全一样,只有表头语言不同,按手上表格的样子选)。
> 小项与组别很多时,同一处还有**「分工作表 · 中文表头 / 分工作表 · 英文表头」**:一个小项组别再抄串——**一个小项 × 一个组别一张工作表**,表名写成「小项名称@组别名称」,详见第八节。
---
## 一、先看懂三件事
1. **用什么软件做表**:Excel 或 WPS 都行,做完存成 `.xlsx` 或 `.csv` 都可以(推荐 `.csv`,系统兼容性最好,不用管编码)。
2. **表格长什么样**:**第一行是表头**(固定的 13 个列名,**中文、英文两套任选其一**,见第二节),**从第二行开始每人一行**。不要合并单元格,不要在表头上方再加标题行、说明行。
3. **编码不能自己编**:表里的「小项编码」「单位编码」「组别名称」必须是系统里已经配好的,**照抄系统里的写法**。系统里没有的编码,这一行会被跳过并报错。
---
## 二、表头(第一行的列名)
一共 13 列。系统**同时认两套表头**——英文一套、中文一套,**两套都能导入**,也可以**中英混着写**(每一列各自认名字,例如英文 `event_code` 配中文「姓名」)。**英文是规范列名**:老的英文模板一个字都不用改,照常导入;中文只是给习惯看中文的人用的同义写法。
> **第 13 列「队伍」是新加的(2026 年 9 月)**:**同一个单位在同一个组别派两支队**(羽毛球双打的一队 / 二队那种)时才需要填它;**绝大多数表格整列留空就行**,填法见第三节的「队伍」。
> **老表格不用改**:表头里没有这一列、整列不写、格子留空,三种情况都合法,系统按「不区分队伍」处理——**原来的 12 列一列都不会错位**(新的一列加在**最后**)。
下载模板时按手上表格的样子选:
- 「**中文表头**」→ 文件 `entries-template-zh.csv`
- 「**英文表头**」→ 文件 `entries-template-en.csv`
- 「**分工作表 · 中文表头**」/「**分工作表 · 英文表头**」→ 文件 `entries-template-zh.xlsx` / `entries-template-en.xlsx`
(一个小项组别一张工作表,见第八节;表头语言与上面两个按钮同一套口径)
单表模板的两个文件**列数与列顺序完全一样,只有表头语言不同**,示例行也一样。列的**先后顺序可以随便调**,多出来的列系统会忽略。
| 英文表头(规范列名) | 中文表头(同义写法) | 这一列是 |
|---|---|---|
| `event_code` | 项目编码(也认「小项编码」) | 小项编码 |
| `category` | 组别(也认「组别名称」) | 组别名称 |
| `team_code` | 单位编码(也认「参赛单位编码」) | 参赛单位编码 |
| `athlete_name` | 姓名(也认「运动员姓名」) | 运动员姓名;团体项目这一列留空 |
| `id_card` | 证件号(也认「身份证号」) | 证件号,可缺省 |
| `gender` | 性别 | 可缺省 |
| `age` | 年龄 | 可缺省 |
| `bib` | 号码布 | 号码布 |
| `seed` | 种子(也认「道次」) | 道次 / 种子 |
| `heat` | 批次(也认「批次号」) | 批次,可缺省 |
| `status` | 状态(也认「报名状态」) | 报名状态 |
| `member_names` | 队员名单 | 团体项目的队员名单;**写号码布才会关联到人**(写姓名只当文字) |
| `squad` | 队伍(也认「队名」「队伍名」) | **队名,可缺省**;同一个单位在同一组别派两支队时用它区分(留空 = 不区分队伍) |
> **第 13 列 `squad`(队伍)永远排在最后**:它是 2026 年 9 月新增的,加在表尾是为了让**手里那些原来 12 列的老表格一列都不会错位**(表格少的正是最后这一列)。整列不写、整列留空、表头没有它,三种情况都合法。
> **同一列只能写一次**:一份表里同时出现 `event_code` 和「项目编码」(或者干脆把同一列写了两遍),会被整份拦下并提示「报名表表头重复」,删掉多余的那一列再导入即可——系统不会替你猜该信哪一列,免得静默丢掉另一列的数据。
>
> 表头识别对**大小写、首尾空格、全角字母 / 全角空格、文件开头的 BOM** 都容错:`Event_Code`、「项目编码 」、「EVENT_CODE」都认。
下面是逐列要填什么(列名用英文规范名,括号里是中文表头的同义写法):
| 列名 | 是否必须 | 填什么 | 示例 |
|---|---|---|---|
| `event_code`(项目编码) | **必须** | 小项编码,抄系统里配好的 | `M100` |
| `category`(组别) | **必须** | 组别**名称**(中文,要跟系统里一字不差) | `男子30岁以下` |
| `team_code`(单位编码) | **必须** | 参赛单位编码,抄系统里配好的。**两个单位联合参赛(联队)就写 `A+B`**,见第三节 | `F1`;联队写 `F1+F2` |
| `athlete_name`(姓名) | **必须** | 运动员姓名。**团体项目这一列留空** | `张伟` |
| `id_card`(证件号) | 可选 | 证件号(身份证号)。**系统的第一认人依据**;一个证件号只能属于一个人 | `110101199001011234` |
| `gender`(性别) | 可选 | 性别,只写「男」或「女」 | `男` |
| `age`(年龄) | 可选 | 年龄,0–120 的整数 | `26` |
| `bib`(号码布) | 可选 | 号码布;证件号为空时按它认人(同一个号码布不能给两个人) | `101` |
| `seed`(种子) | 可选 | 道次 / 种子,随便写或留空 | `种子1` |
| `heat`(批次) | 可选 | 批次号:1–999 的整数;**留空 = 未分批**(不参与算分,见下) | `1` |
| `status`(状态) | 可选 | 报名状态:4 个英文词(大小写都行)或等价的中文别名(见下) | `registered` |
| `member_names`(队员名单) | 可选 | 团体项目的队员名单,多人用 `/` 隔开。**写号码布 = 关联到那个人(能拿个人分)**;只写姓名 = 只当文字 | `101/102`(号码布);`张三/李四`(仅文字) |
| `squad`(队伍) | 可选 | **队名**(自由写,例如 `一队`);**留空 = 不区分队伍**。**同一个单位在同一个组别派两支队就靠它区分**,见第三节 | `一队` |
> 「必须」指的是**这一列的表头要有**。至于每格里能不能留空,看下面第三节逐列的说明。
**表头大小写不敏感**:写 `Event_Code` 或 `event_code` 都认;换成中文表头(`项目编码`)也认,两套混着写同样可以。
---
## 三、逐列怎么填(重点)
> 下面每一列的小标题写的是**英文规范名**;用中文表头时列名换成第二节对照表里的中文写法(`event_code` = 项目编码、`category` = 组别、`team_code` = 单位编码、`athlete_name` = 姓名、`id_card` = 证件号、`gender` = 性别、`age` = 年龄、`bib` = 号码布、`seed` = 种子、`heat` = 批次、`status` = 状态、`member_names` = 队员名单),**填法完全相同**。
### `event_code` 小项编码 —— 必须填
在系统「基础数据 → 大项 / 小项」里给每个小项配的**编码**,比如 `M100`(男子100米)、`BB`(多人抓杆蛇形跑)。
填了系统里没有的编码,这一行会被跳过,提示「小项 XXX 不存在」。
### `category` 组别名称 —— 必须填
填**组别的名字**,不是编码。比如「男子30岁以下」「男子31岁以上」「女子组」「基层组」「领导组」。
- 必须和系统里该小项的组别名称**完全一致**(含标点),否则提示「组别 XXX 不存在」。
- 这一格**留空**也可以:系统会自动放到该小项排序最靠前的那个组别。一个单位一个项目只报一个组时,留空能省事;报了多个组别的项目,必须写明。
### `team_code` 单位编码 —— 必须填
在系统「基础数据 → 参赛单位」里给每个大单位配的**编码**,比如 `F1`、`F2`。系统里没有的会提示「单位 XXX 不存在」。
被「彻底删除」的单位,导入时若再次用到它的编码,它会**重新出现(复活)**,这一行照常导入——单位编码是唯一的,系统按编码复用原来那条记录,它以前的报名、成绩与积分都还在。
**两个单位联合参赛(联队)怎么写**
同一小项组别里,两个单位合起来出一支队参赛时,**这一格写两个编码、中间用 `+` 连起来**:
```
F1+F2
```
- **加号左边那个是「主单位」**:名次与榜单的归属主体就是它。`F1+F2` 与 `F2+F1` 是**两条不同的报名**(主单位不同),同一组别里只写一条即可;
- **全角 `+` 与两侧空格都认**:`F1+F2`、`F1 + F2` 与 `F1+F2` 是同一个意思(中文输入法下打出来的常是全角);
- **默认均分**:两个单位各占一半(50% / 50%)。团体第 1 名 15 分 → 两个单位**各 7.5 分**;奖牌**两边各记一枚整枚**(联队的金牌,F1、F2 各记 1 枚);
- ⚠️ **想改成非均分(例如 2:1)不能在表里写**:导入表只表达「是哪几个单位」。份额要等导入完到「成绩录入」页**点那一行的「单位」格**,在「成员单位与份额」弹窗里改(见[使用手册 · 4.11](./使用手册.md#411-联队两个单位合并参赛));
- **一个联队最多 5 个单位**;成员单位一个都不能写错——写错的那一行会被拦下,其余行照常导入;
- **加号两边都必须有编码**,而且同一个单位不能写两遍。
**怎么写会被拦下(逐行报错,其余行照常导入)**
| 写成 | 报错 |
|---|---|
| `F1+` / `+F2` / `F1++F2` | `第 N 行:单位编码 F1+ 里有一段是空的:联队要写成两个单位编码用 + 连起来(例如 A+B)` |
| `F1+F1` | `第 N 行:单位编码 F1+F1 里同一个单位出现了两次:联队的每个单位只能写一次` |
| `F1+F2+F3+F4+F5+F6` | `第 N 行:单位编码 F1+F2+F3+F4+F5+F6 里写了 6 个单位:一个联队最多 5 个单位` |
| `F1+ZZ`(`ZZ` 不存在) | `第 N 行:单位 ZZ 不存在(来自联队编码 F1+ZZ)` |
| `ZZ`(单个单位,写法没变) | `第 N 行:单位 ZZ 不存在` |
> 报错都写在**行号**上,并把你那一格**原样打出来**——照那句话改那一行即可,不用重传整张表。
**导入之后长什么样**
- 联队仍是一条报名,但**分与奖牌都按份额记给各成员单位**:单位总分榜、单位奖牌榜上 A、B 各有一份;
- 大屏和导出件里写的是**联队的名字**:`第一分公司+第二分公司联队`,报名名单导出的「单位编码」列也回写成 `F1+F2`(**这一列本身可以直接重导**,不用手工改回单个单位;但那两份「报名名单」导出的口径不同——**报表件整份不能导回,要重导用卡片里的两个「导入格式」按钮**,见第九节);
- 用成员单位筛「报名名单」导出时,**也能看到这条联队报名**(否则 B 导出自己的名单会以为没派人上场)。
### `athlete_name` 运动员姓名
- **个人项目**:填姓名,必填。
- **团体项目**:**这一列留空**,表示"这是某个单位的一条团体报名",队员写在 `member_names` 里。
- 姓名为空的行,系统只建一条单位报名,不会去建运动员档案。
> ⚠️ **这一格「填了 / 没填」就是系统区分「个人报名」和「团体报名」的唯一判据**——最容易踩的坑:把团体报名的队员姓名填在了这一列。填了就按**个人报名**处理,那一行的「队伍」「队员名单」都**不会生效**(只会得到一条提示)。**团体报名请把这一列留空**,队员写进[「队员名单」](#member_names-队员名单)。
#### 个人报名 vs 团体报名:同一条表里怎么填
同一份表里两种报名**可以混着写**(一人一行),差别只在下面这几格:
| 列 | **个人报名**(一个人一条) | **团体报名**(一个单位一支队一条) |
| --- | --- | --- |
| `athlete_name` 姓名 | **必填**(这一段报名的归属人) | **留空**(填了就变成个人报名) |
| `id_card` 证件号 / `bib` 号码布 | **至少填一个**(认人用;证件号优先) | 可以不填(这一行没有"人") |
| `member_names` 队员名单 | **留空**(个人报名没有队员) | 写队员的**号码布**(`A001/A002`);写姓名只当文字、不关联人 |
| `squad` 队伍 | **留空**(个人报名没有队) | 同一个单位派两支队时写队名(一支队留空) |
| `team_code` 单位编码 | 这个人所属单位 | 这支队的单位(联队写 `A+B`) |
> **一句话**:**姓名列填了 = 个人报名,姓名列留空 = 团体报名**。现场最常错的是「想报一支队,却把队里最出名的那个人填进了姓名列」——那样只会落成他的个人报名,队名与队员名单被忽略(导入结果里会给提示,见第六节)。
### `id_card` 证件号 / `bib` 号码布 —— 有姓名就至少填一个
只要有姓名,**证件号与号码布至少要填一个**,否则无法确认是哪一个人,这一行会被跳过,提示「填写了 athlete_name 就必须填 id_card 或 bib」。
- **证件号是系统认人的第一依据**:先按证件号找人;证件号为空、或库里的档案还没登记证件号时,再按号码布找;两者都没找到,才按「姓名 + 单位」找(完整顺序见本节的「系统怎么认人」)。
- **一个证件号在系统里只能属于一个人**。表里给的证件号如果已经登记在别人名下,系统会按这个证件号去认那个人,姓名 / 单位对不上就进「冲突」列表让你逐条决定——不会把证件号抢过来,也不会静默改档。**证件号填错是最容易认错人的地方,请照抄身份证,不要凭记忆写。**
- **没有身份证的人只填号码布也行**(外聘人员、临时工常见):此时系统按号码布认人,下次导入也要带同样的号码布。
- **同一个证件号在同一份表里重复出现不报错**(同一个人报多个组别时本来就会重复):系统当作同一个人,每个组别各落一条报名,并在导入结果里给一条提示「证件号 XXXX 在本表中出现 N 次(同一人报名多个组别)」。**但同一小项同一个组别里出现两次就是真重复**,会进「冲突」列表,由你决定保留已有还是改用表里这条。
- **号码布不是唯一标识**,但两个人不能共用一个号码布:把同一个号码布给了两个不同的人,这一行会报错并跳过。(同一个人报多个组别时号码布可以重复。)
- 号码布会同时写进人员档案和报名记录。
### `gender` 性别
只认「男」「女」两个字。留空没问题;写「男性」「女 」等其它写法会被**当成没填**(不报错,但也不记录)。
### `age` 年龄
0–120 的整数,可以留空。填了「二十六」「26岁」这种会被跳过,提示「age 需要是 0-120 的整数」。
### `seed` 道次 / 种子
自由填写,可以留空。系统只做记录,不参与算分、不影响名次。
### `heat` 批次 —— 可以留空
给同一组别的人**分批**用的号:填 **1–999 的正整数**,留空表示「未分批」。现场分批比赛(例如 100 米跑道只有 8 条、一组 30 人要分 4 场跑)时,填上批次,录入员就能在「成绩录入」页按批筛选,只在自己这一批里找人录成绩。
- **批次不参与算分**:名次与积分仍然按「小项 + 组别」整体计算,分批与否不会改变任何分数与名次;批次只是录入 / 展示分组;
- 同一小项、同一组别里,批次号相同的人就是同一批;批次号不要求连续,也不要求从 1 开始;
- 格子**留空**就是未分批,不报错;
- 填了不是整数、或超出 1–999(例如 `第1批`、`0`、`1000`),这一行会被跳过并提示「heat 需要是 1-999 的整数(留空表示未分批)」,其余行照常导入;
- 重新上传同一份表会把这一列**整条覆盖**:表里留空就会把这行原来的批次清掉(见第七节第 2 条)。
> 不想在报名表里写批次也行:导入后到「成绩录入」页勾选若干行点「设为第 N 批」,或用「一键均分」按人数自动分批(见[使用手册 · 4.1](./使用手册.md#41-选择项目与批次))。
### `status` 报名状态 —— 英文词或中文别名都认
**大小写不敏感**(`registered`、`Registered`、`DNS` 都认),也可以直接写中文:
| 英文写法 | 等价的中文别名 | 含义 |
|---|---|---|
| `registered` | `正常` / `正常参赛` / `参赛` | 正常参赛 |
| `scratched` | `退赛` / `弃赛` / `请假` | 退赛 / 弃赛 |
| `dq` | `取消资格` / `犯规` | 取消资格 |
| `dns` | `未出场` / `未到` / `缺席` | 未出场 |
留空 = `registered`(正常参赛),拿不准就留空,特殊情况再填。
真正**认不出**的写法(例如「已报到」「未参赛」):这一行会被跳过,并给出中文行级提示,其余行照常导入。
> 第 12 行:status「已报到」无法识别,只能填 registered / scratched / dq / dns(或留空)
### `member_names` 队员名单
团体项目用这一列写队员,**多人之间用 `/`、`,`(英文逗号)或 `,`(中文逗号)分开,三种都认、可以混用**:
```
A001/A002 ← 推荐:写号码布,队员会被关联到人
A001,A002
A001,A002
张三/李四/王五 ← 只写姓名:名单照常显示,但拿不到个人分
```
- ⚠️ **空格不是分隔符**:`A001 A002` 会被当成**一段**(认不出人);
- ⚠️ **每一段要单独是一个号码布**:`张三(A001)` 这种「姓名 + 号码布写在同一段」**认不出人**——那是**导出件**的显示格式,不是导入接受的写法(要名字也看得见,写号码布就行);
- 团体项目**可以只报单位、不写队员**(这一列留空即可),队员名单以后还能补。
- 系统界面里会把这条名单显示成「张三、李四、王五」。
**想让队员真正「上场」——这一列要写号码布**
这一列有**两种内容**,系统按段(用 `/`、`,`、`,` 分开的每一段)分别处理:
| 这一段写的是 | 系统怎么处理 |
| --- | --- |
| **某个运动员的号码布**(例如 `101`、`A001`) | **认成那个人**:把这条团体报名与他**关联**起来(这一格也原样保留成文字)。**关联上的队员才能拿个人分、上个人积分榜、拿个人奖牌**(该项目配了「个人通道」时) |
| **只有姓名**(例如 `张三`) | **只当文字**:名单照常显示,**不会关联到人**(姓名可能重名,认错的分已经上了榜——所以系统**故意不按姓名认人**),也**不报错** |
```
101/102 ← 推荐写法:号码布,两个队员都能拿到个人分
张三/李四 ← 只当文字:名单会显示,但这两个人没有身份(拿不到个人分)
101/李四 ← 混着写也行:101 关联到人,李四只当文字
```
几条要记住的:
- ⚠️ **号码布要单独成一段**:`张三(101)` 这种「姓名和号码布写在同一段」的写法**认不出人**(系统只拿整段去比对号码布),要写成 `张三/101`,或者干脆只写 `101`。**推荐只写号码布**;
- **号码布是运动员的唯一标识,不看单位**:号码布认到的是**别的单位**的人时,**照常关联**,并在导入结果里给一条提示让你核对号码布是不是写错了(不是冲突、不拦截);
- **认不出人的段不报错**:没录档案的临时队员、写错的名字,都只当文字留在名单里(这条报名仍然只有单位、没有队员身份);
- **同一格里同一个号码布写两次**:只关联一次,并给一条提示(同一条报名里一个人只占一个位置);
- **个人行(填了姓名的那几行)这一列只当文字**:个人报名自己就是那个人的身份,不存在「队员」。这一格里写了号码布也不关联,只会给一条提示(提示里会直接告诉你团体该怎么填,见第六节);
- **一条报名最多关联 30 个人**:超过的那一行会被**整行拦下**(多半是把号码布写错了位置);
- **老数据的人要补挂**:升级前已经报好的团体报名,如果当时只写了姓名(或连姓名都没写),**升级时会尽力按「号码布 → 姓名 + 单位」回填一次**;**回填不上的,要重新导入一份写着号码布的名单,或到录入页手动挂人**(见[使用手册 · 4.13](./使用手册.md))。
### `squad` 队伍 —— 可选(表的最后一列)
**这一列只在「同一个单位在同一个组别派了不止一支队」时才需要填**,比如羽毛球双打:一个单位报了一队、二队,两队可能各占一个名次。
```
一队
二队
青年队
```
- **队名随便写**(`一队` / `二队` / `青年队` / `A 组` 都行),就是给现场看的一个标签;
- **留空 = 不区分队伍**:一个单位在这个组别只有一支队(绝大多数情况)时,**整列留空、整列不写、表头里没有这一列**,三种都合法,与升级前的行为完全一样;
- **只对团体项目有效**:这一列只认「姓名那一格留空」的团体行。**个人行(填了姓名的行)如果也填了队名,这一格不会写进库里**,导入结果里会给你一条提示:`第 N 行填了队伍「一队」,但这一行有运动员姓名、按个人报名处理:队伍只对团体报名(不填姓名那几行)生效,这一格没有写进库里`;
- **同一个单位、同一个组别、同一个队名只能有一条**(要派两支队就写两个不同的队名)。撞上了会逐行拦下并说清是哪个单位、哪个队(见第六节);
- **队名只影响显示与查重,不影响成绩与算分**:两个队的成绩、名次、积分各算各的,最后都汇总到同一个单位的总分上;显示上写成「单位名 + 队名」,例如 `第一分公司二队`(队名留空时仍然只写 `第一分公司`)。**单位总分榜 / 单位奖牌榜 / 个人积分榜上不写队名**(分与牌本来就归到单位);
- 队名**改起来不用删掉重建**:到「成绩录入」页点那一行的「单位」格,在弹窗里改(见[使用手册 · 4.12](./使用手册.md))。⚠️ 改完记得**把报名表里的队名也改成一样**——以后再导一份还写着旧队名的表,会因为认不出来而**新增出旧队名那一条**。
### 系统怎么认人(证件号 → 号码布 → 姓名 + 单位)
有姓名的行,系统按下面的顺序认人。**证件号是唯一标识,号码布是它的替补,最后才靠「姓名 + 单位」兜底回填**:
| 情况 | 系统怎么处理 |
|---|---|
| 表里的**证件号**在系统里已有 | 认作**同一个人**;若表里的姓名 / 性别 / 年龄 / 单位 / 号码布与他的档案对不上,会进「冲突」列表等你逐条决定(保留哪一侧),该行本轮不写入 |
| 证件号为空,或系统里还没有人有这个证件号 | 再看**号码布**:号码布在系统里已有 → 认作同一个人(差异同样进「冲突」列表) |
| 证件号与号码布都没找到 | 按「**姓名 + 单位**」找:<br>· 找不到 → 新建人员档案;<br>· 恰好一人、两边给的证件号(或号码布)对得上或有一边没填 → 认定是同一人,表里给的证件号 / 号码布 / 年龄会**回填**到他的档案(不算冲突);<br>· 恰好一人、但他已有**另一个**证件号(或号码布)且与表里不同 → 按「**同名的另一个人**」**新建档案**,并在导入结果里单独列出(姓名 / 单位 / 原证件号或号码布 / 新证件号或号码布)提醒你核对,**不拦截、不报错**;<br>· 多人 → 分不清是谁,进「冲突」列表等逐条决定 |
> 「同名的另一个人」多半是证件号(或号码布)写错了。收到这条提醒时,先核对表里那个号是不是本人:是别人(真的同名),确认无误即可;是本人写错了,到「基础数据 → 运动员」把档案里的号改回来,并把多出来的那条新档案删掉。
---
## 四、六个完整例子
### 例 1:个人项目(七单位 × 若干人)
表头那一行照抄,下面每人一行。假设 `M100` 是按年龄分组的男子100米,`F1`/`F2` 是两个单位:
| event_code | category | team_code | athlete_name | id_card | gender | age | bib | seed | heat | status | member_names |
|---|---|---|---|---|---|---|---|---|---|---|---|
| M100 | 男子30岁以下 | F1 | 张伟 | 110101199001011234 | 男 | 26 | 101 | | 1 | registered | |
| M100 | 男子31岁以上 | F1 | 李强 | 110101198505054321 | 男 | 41 | 102 | | 1 | registered | |
| M100 | 女子组 | F2 | 王芳 | | 女 | | 202 | | 2 | registered | |
| W100 | 女子组 | F2 | 王芳 | 110101199203031234 | 女 | 34 | 202 | | 2 | registered | |
要点:**同一个人报多个项目,就写多行**(如上面的王芳报了两项);每行的 `event_code` 不同。
### 例 2:团体项目(七单位 × 两组)
`BB` 是「多人抓杆蛇形跑」,七家单位各出基层组和领导组两支队伍:
| event_code | category | team_code | athlete_name | id_card | gender | age | bib | seed | heat | status | member_names |
|---|---|---|---|---|---|---|---|---|---|---|---|
| BB | 基层组 | F1 | | | | | | | | registered | 张三/李四/王五/赵六 |
| BB | 基层组 | F2 | | | | | | | | registered | 钱七/孙八 |
| BB | 领导组 | F1 | | | | | | | | registered | 周九 |
| BB | 领导组 | F3 | | | | | | | | registered | |
要点:`athlete_name` 一列**全部留空**;不参赛的单位**不写行**(不写就是没报名);最后一行是不写队员的纯单位报名,也是允许的。
### 例 3:「个人 + 团体」项目
这类项目(比如团体引体向上)**按个人报名填**:每人一行、填姓名和单位。系统会自己算两份成绩——个人的名次分记在个人身上,团体分按各队成员的**平均成绩**排名后算给单位。**不需要**再单独写团体行。
### 例 4:两个单位联合参赛(联队)
本届运动会 6 项球类比赛里,**F2 与 F5 因参赛人数不足,合并出一个队参赛**。`BALL` 是篮球、`男子组`:
| event_code | category | team_code | athlete_name | id_card | gender | age | bib | seed | heat | status | member_names |
|---|---|---|---|---|---|---|---|---|---|---|---|
| BALL | 男子组 | F1 | | | | | | | | registered | 张三/李四 |
| BALL | 男子组 | F2+F5 | | | | | | | | registered | 王五/赵六/钱七 |
| BALL | 男子组 | F3 | | | | | | | | registered | 孙八 |
要点:
- **写一条 `F2+F5` 的报名就够了**,不要 F2、F5 各写一条(那会变成两队人上场);也不要新建一个叫「F2F5」的单位;
- `F2` 在**加号左边**,所以 **F2 是主单位**:这一条的名次与榜单以它为主体。写成 `F5+F2` 是另一条报名(主单位变成 F5),同一组别里只写一种;
- 默认**均分**:这条成绩拿到的分,F2 与 F5 **各一半**(团体第 1 名 15 分 → 各 7.5 分);奖牌**两边各记一枚整枚**(一块金牌,F2 榜上 1 枚、F5 榜上 1 枚);
- 要改成 **2:1** 这类非均分:**不能在这张表里写**,导入后到「成绩录入」页点那一行的「单位」格改(见[使用手册 · 4.11](./使用手册.md#411-联队两个单位合并参赛));
- 大屏与导出件里写的是 `第二分公司+第五分公司联队`,报名名单导出的「单位编码」列回写成 `F2+F5`(**这一列本身可以直接重导**;报表件整份不能导回,要重导用报名名单卡片里的两个「导入格式」按钮,见第九节)。
### 例 5:同一个单位派两个队(团体项目多队)
羽毛球双打,**F1 派出「一队」和「二队」两支队伍**,两队都可能拿名次。`BD` 是羽毛球双打、`男子组`:
| event_code | category | team_code | athlete_name | id_card | gender | age | bib | seed | heat | status | member_names | squad |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| BD | 男子组 | F1 | | | | | | | | registered | 张三/李四 | 一队 |
| BD | 男子组 | F1 | | | | | | | | registered | 王五/赵六 | 二队 |
| BD | 男子组 | F2 | | | | | | | | registered | 孙八/周九 | |
| BD | 男子组 | F3 | | | | | | | | registered | 吴十/郑十一 | |
要点:
- **同一个单位、同一个组别写两行**,靠**最后一列「队伍」**区分开:`一队`、`二队`。**一个单位两个队都进前三时,这个单位会拿 2 枚牌**(两支队各算各的名次);
- F2、F3 只有一支队,队伍列**留空**即可(也可以整列不填、或表头里干脆没有这一列);
- **列都写对了才有多队的效果**:两行的 `event_code` / `category` / `team_code` / `squad` 必须**都不一样的那一格正好是 squad**——如果两行队名也写成一样的(都写 `一队`),第二行会被拦下(「同一个单位同一个组别的同一个队只能报一条」);如果两行队名都留空,第二行也会被拦下(「一个单位在一个组别只能有一条不分队的报名」);
- 显示上写成 **`第一分公司一队` / `第一分公司二队`**(单位名后面直接跟队名,不加括号不加分隔符);**单位总分榜、单位奖牌榜、个人积分榜上只写 `第一分公司`**(两队的分数都已经算进这个单位的总分);
- 报了之后想改队名**不用删掉重建**:到「成绩录入」页点那一行的「单位」格,在弹窗里改(见[使用手册 · 4.12](./使用手册.md))。⚠️ **改完记得把这张表里的队名也改成一样**——以后再导一份还写着旧队名的表,会**新增出旧队名那一条报名**(导入是按「小项 + 组别 + 单位 + 队名」认人的)。
### 例 6:同一支队里的两个队员(队员名单写号码布)
`BD` 羽毛球双打、`男子组`,F1 的「一队」是张三(号码布 `101`)与李四(号码布 `102`);F2 那支队只报了单位、没写队员:
| event_code | category | team_code | athlete_name | id_card | gender | age | bib | seed | heat | status | member_names | squad |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| BD | 男子组 | F1 | | | | | | | | registered | 101/102 | 一队 |
| BD | 男子组 | F2 | | | | | | | | registered | | |
要点:
- **队员名单里写号码布,系统才认得出队里坐着谁**:`101/102` → 这条报名关联到张三、李四两个人。**该项目配了「个人通道」时,两个人各拿一份完整的个人分、各一枚个人奖牌,都上个人积分榜**(是「每人各一份」,不是两个人分同一份);
- **单位总分与单位奖牌不受影响**:上不上的开关在「计分通道」里(`计入单位总分` / 个人奖牌是否并入单位榜)。**双打现场通常都设成「不计入」**——个人分给到人,单位那本账不变;
- **只写姓名(`张三/李四`)也合法**:名单照常显示,但**这两个人没有身份**——拿不到个人分、上不了个人榜,也**不报错**。要让他们上榜,把这一格改成他们的**号码布**(`101/102`),或到录入页手动挂人(见[使用手册 · 4.13](./使用手册.md));
- ⚠️ **号码布要单独成段**:写成 `张三(101)/李四(102)` **认不出人**(系统拿整段去比号码布)。要「名字 + 号码布」都看得见,就先写号码布(`101/102`)——导出件与录入页会自己显示成 `张三(101)、李四(102)`;
- **号码布写错成别的单位的人**:照号码布关联,并给一条提示让你核对(号码布是唯一标识,系统不按单位猜);
- **F2 那一行留空**:只报单位、没有队员身份,这是合法的,也是升级前所有团体报名的样子。
---
## 五、导入前请先检查(自检清单)
- [ ] 第一行是那 13 个列名(**英文一套、中文一套都行**,也可以中英混着写,见第二节),没有被合并单元格、**同一列没有写两遍**
- [ ] 表头上方没有多余的标题行或空行
- [ ] `event_code`、`team_code` 都是从系统里抄的编码,没有空格
- [ ] `category` 与系统里的组别名一字不差
- [ ] 个人行都有姓名,且都有证件号或号码布
- [ ] **团体报名的那几行「姓名」列是空的**(填了姓名就会被当成个人报名,那一行的「队伍」「队员名单」都不生效——见第三节的对照表)
- [ ] 「队员名单」列里写的是**单独的号码布**(多人用 `/`、`,`、`,` 分开,**不要用空格**;`张三(A001)` 这种整段认不出人)
- [ ] 证件号优先填、填准(**它是系统认人的第一依据**,填错最容易认错人)
- [ ] 一份表里**没有把同一个号码布给两个不同的人**(同一个人报多个组别时可以重复)
- [ ] 同一小项同一个组别里没有把同一个人写两遍(真重复会进「冲突」列表等决策)
- [ ] 每个证件号在系统里只属于一个人,别和别人的档案重号
- [ ] `status` 只用那 4 个英文词(大小写都行)或第三节列的中文别名,不写别的词;拿不准就留空
- [ ] `heat` 要么留空,要么是 1–999 的整数(不参与算分,只是录入分组)
- [ ] **联队**(两个单位联合参赛)写的是 `F1+F2` 这种形状:加号两边都有编码、**同一个单位没写两遍**、成员不超过 5 个;**加号左边那个是主单位**(见第三节)
- [ ] **「队伍」列**(最后一列)只在**同一个单位派了不止一支队**时才填:两队写了**两个不一样的队名**(都写一样或都留空会被拦下);只有一支队的单位留空即可;**个人行(有姓名的行)没有填队名**(填了也不会写进库里,只给一条提示)
- [ ] **要让队员拿到个人分**:`member_names`(队员名单)里写的是**单独的号码布**(`101/102`),不是姓名、也不是 `张三(101)` 这种混写;号码布抄对(写错会关联到别人,系统会提示但不会拦)
- [ ] 全表没有因为"怕麻烦"把某些列删掉——**表头 8 个必须列一个都不能少**(哪怕整列是空的)
- [ ] 用的是**分工作表模板**时:每张工作表的名字都是「小项名称@组别名称」、没有多余的工作表;「项目编码 / 组别」两列要么整列留空、要么与表名一字不差(见第八节)
---
## 六、常见报错怎么办
| 提示 | 原因 | 怎么办 |
|---|---|---|
| 第 N 行:event_code / team_code 必填 | 这两格至少有一格是空的 | 每行都必须有小项编码和单位编码 |
| 报名表缺少列 xxx(yyy) | 表头少了这一列,或者列名有错别字 / 上面多了一行标题行。括号里的中文与前面的英文是**同一列**的两种写法(例:`报名表缺少列 athlete_name(姓名)`) | 对照第二节的对照表逐字核对(中英两套都认,混着写也行);最稳的是重新下载模板,把数据粘进去 |
| 报名表表头重复:第 1 行里同一列出现了两种写法 | 同一列在表头里写了两次(例如既有 `event_code` 又有「项目编码」)——两列都可能带着数据,系统不知道该信哪一列 | 删掉多余的那一列(同一列只留一种写法),再重新上传 |
| 中文变成乱码 | 编码问题,**现在已修好**:Excel 另存的 GB18030 / GBK / UTF-8(带 BOM) / UTF-16(带 BOM) 都认 | **直接传原文件即可,不用转码**。唯一例外见下面两条 |
| 报名表编码无法识别:文件里混有无法解码的字节 | 这个文件**本身坏了**(复制粘贴、转换工具、半路截断都会这样):坏字节会被静默解成 `�`,导进去就是一串乱码人名,比报错更危险,所以系统直接拦下 | 用 Excel 打开**原文件**,另存为「CSV UTF-8」后再上传;如果另存后仍报同一句,说明原文件已经损坏,请找原始数据重新导出一份 |
| 文件像 UTF-16 但缺 BOM | 用记事本「另存为 Unicode」会产出**不带 BOM** 的 UTF-16;这种文件以前会被误报成「缺少列 event_code」,指向完全错误的方向 | 多数情况系统能自动认出字节序并正确导入;仍报此提示时,用 Excel 另存为「CSV UTF-8」 |
| 无法解析 CSV:表格里多半有没配对的双引号 | 格子里**手工**写了双引号,或只有一个引号没配对 | 让 Excel 重新另存一次(引号由 Excel 按规则加,别手工写);确实需要引号的,写成 `""` 转义 |
| 第 N 行:小项 XXX 不存在 | `event_code` 写错,或该小项还没在系统里配 | 到「基础数据 → 大项 / 小项」核对编码;没配的先配 |
| 第 N 行:单位 XX 不存在 | `team_code` 写错,或该单位还没配 | 到「基础数据 → 参赛单位」核对 |
| 第 N 行:单位 ZZ 不存在(来自联队编码 F1+ZZ) | 这一格写的是**联队** `F1+ZZ`,其中 `ZZ` 没配 | 核对加号右边那个编码(括号里把**整格**原样打出来了,一眼看出是哪一段没对上);不改联队写法的话,就照单单位的办法核对编码 |
| 第 N 行:单位编码 F1+ 里有一段是空的:联队要写成两个单位编码用 + 连起来(例如 A+B) | **加号有一边是空的**(`F1+`、`+F2`、`F1++F2` 都是这一条)。多半是填一半或多了个加号 | 补上缺的那个编码,或删掉多余的加号;联队至少两个单位 |
| 第 N 行:单位编码 F1+F1 里同一个单位出现了两次:联队的每个单位只能写一次 | 同一个单位在联队里写了两遍(`F1+F1`) | 一个单位只写一次;两个单位联合参赛就是 `F1+F2` |
| 第 N 行:单位编码 … 里写了 6 个单位:一个联队最多 5 个单位 | 加号太多、成员超过 5 个 | **一个联队最多 5 个单位**;现场最多见过三个单位合并,超过 5 个多半是这一格填错了东西(例如整格都是加号) |
| 第 N 行:单位 A 在本组别已经有一条队伍「一队」的报名:「同一个单位同一个组别的同一个队」只能报一条;要派两个队请换一个队伍名(例如 二队) | 同一个单位、同一个组别、**同一个队名**写了两遍(两支队要写两个不同的队名) | 把其中一行的「队伍」列改成另一个队名(`一队` / `二队`);如果本来就是同一支队、只是想把队员名单补全,改完重导**不会新增**(同一单位同一队名是更新) |
| 第 N 行:单位 A 在本组别已经有一条不分队的团体报名:队伍列留空就是不区分队伍,一个单位在一个组别只能有一条;要派两个队请在队伍列分别写清(例如 一队 / 二队) | **两行的队伍列都留空**(等于都说「这个单位在这个组别只有一支队」),或者库里以前报过一条不分队的、这行又留空 | 要派两支队就在两行的「队伍」列分别写 `一队` / `二队`;确实只有一支队,就把多余的那一行删掉 |
| 第 N 行:单位 A 在本组别已经有这个人的报名:同一个人在同一组别只能报一条,请把重复行合并后再导入 | **个人行**(填了姓名的行)在同一个小项同一个组别里写了两次。个人报名按「人」唯一,队伍列不参与(也不影响)这件事 | 把两行合并成一行;同一个人要参加两个项目就写在**不同小项**里,不能靠队名分成两条 |
| 第 N 行:队员名单里认出了 31 名运动员,超过一条报名最多 30 人:请检查这一格是不是把号码布写错了位置 | 这一格里能对上号码布的段**超过 30 个**(多半是把别的内容写进去了) | 核对这一格:一条报名最多 30 个队员;只有一支队时这一格留空即可。**这一行整行未导入** |
| 第 N 行:队员名单里的号码布 101 写了两次,只关联一个人(同一条报名里一个人只占一个位置) | 同一格里同一个号码布写了两次 | 不算错误(照常导入、只关联一次);把这一格里重复的那个号码布删掉即可 |
| 第 N 行填了队伍「一队」,但这一行也填了运动员姓名,系统按个人报名处理:队伍只对团体报名生效,这一格没有写进库里。**要报团体(一支队)请把姓名列留空、把队员的号码布填到「队员名单」列**;**这一行确实是个人报名,把「队伍」这一格删掉即可** | **「姓名」列填了**(= 系统按个人报名处理)却还填了「队伍」。团体报名要**把姓名列留空** | 按提示二选一:**要报这支团体**,把这一行的姓名(以及证件号 / 号码布)**删掉**、队员的号码布写进「队员名单」列,队名留在「队伍」列;**这一行本来就是个人报名**,把「队伍」这一格删掉。⚠️ **注意别把这一行整行删掉了再重报**——按上面改完重传即可(同一小项同组别同单位同队名会更新原报名) |
| 第 N 行的队员名单里有 2 个号码布认得出人,但这一行也填了运动员姓名,系统按个人报名处理:队员只对团体报名生效,这一格只作文字名单保留、没有关联到人。**要报团体请把姓名列留空、队员的号码布就填在「队员名单」列**;**这一行确实是个人报名,把「队员名单」这一格删掉即可** | **「姓名」列填了**(= 个人报名)却还在「队员名单」里写了号码布。个人报名自己就是那个人的身份,不存在「队员」 | 同样二选一:**要报团体**就把姓名列清空(队员的号码布留在原处就行);**这一行是个人报名**就把「队员名单」这一格删掉 |
| 第 N 行:队员名单里的号码布 205 是单位 F3 的 李四,本行报名挂在单位 F1 名下 —— 号码布是运动员的唯一标识,已按它关联为队员,请核对号码布是否写错 | 号码布认到的是**别的单位**的人。号码布是唯一标识,系统**照它认、不看单位** | 先核对号码布有没有抄错:抄错了改成正确的号码布;**确实就是借调/跨单位的人**,这条提示可以忽略(关联已经生效) |
| **(没有报错,但名单里的人上不了个人榜)** | 队员名单里写的是**姓名**(例如 `张三/李四`),或号码布写成了 `张三(101)` 这种「姓名 + 号码布写在同一段」的形式 —— 系统拿**整段**去比号码布,认不出人 | 这是**正常行为**(不报错):把这一段改成**单独的号码布**(`101/102`),队员才会被关联、才会拿到个人分。要「姓名 + 号码布」都显示,直接写号码布即可(导出件与录入页会显示成 `张三(101)`) |
| 第 N 行:组别 XXX 不存在 | 组别名和系统里不一致,或该小项还没有这个组别 | 到「基础数据 → 组别」核对名称(注意别多字少字) |
| 第 N 行:小项 XXX 没有组别 | 该小项一个组别都没配 | 先在「组别」里配好,再导入 |
| 第 N 行:填写了 athlete_name 就必须填 id_card 或 bib | 个人行缺两项标识 | 补证件号或号码布;确实都没有的,请先在「运动员」里登记 |
| 第 N 行:号码布 XX 在报名表内重复出现 | 同一份表里,**两个不同的人**用了同一个号码布 | 删掉重复行或改成各自的号码布。(同一个人报多个项目时号码布可以重复;不同的人不能共用。) |
| 第 N 行:证件号 X 已被另一个人占用(姓名 Y,号码布 Z) | 表里给的证件号已经登记在**另一个人**名下,而这一行又没法按证件号认到那个人(例如同时又给了别人的号码布) | 先核对证件号是不是抄错了:**不是这个人**的,把这一格留空即可(只填号码布也能导入);**是他的**,先到「基础数据 → 运动员」把另一条档案里的证件号清掉或改对,再重新上传这一步列出的行 |
| 第 N 行:status「xxx」无法识别 | `status` 填了系统不认的词(4 个标准词以外的英文,或第三节没列的中文) | 改成 `registered` / `scratched` / `dq` / `dns`(大小写都行)或第三节列的中文别名,也可以留空(= 正常参赛);改完重新上传 |
| 第 N 行:heat 需要是 1-999 的整数(留空表示未分批) | `heat` 填了非整数、0、负数或超过 999 的值(如 `第1批`、`一组`、`1000`) | 改成 1–999 的整数,或者整格留空(= 未分批);批次只影响录入分组,不参与算分 |
| 提示「冲突」,人员没有写入 | 按证件号(或号码布、「姓名 + 单位」唯一命中)的人在系统里已有记录,但姓名 / 证件号 / 性别 / 年龄 / 单位 / 号码布跟表里**对不上** | 在导入结果里逐条选「保留已有数据」或「使用新数据」,选完再提交 |
| 文件传不上去 | 超过 32MB | 拆分上传,或改用 xlsx |
| 工作表「XXX」没能定出是哪个小项、哪个组别 | 这是一份**分工作表模板**(有工作表名里带 `@`),但工作簿里混进了别的表(备注表、说明表),或者表名写得不合规 | 删掉多余的工作表,或把表名改成「小项名称@组别名称」(见第八节);只有一张表、数据都在里面时,把它存成 CSV 用单表模板导 |
| 本行项目编码 XXX 不是工作表名里那个小项 / 本行组别 XXX 与工作表名里的组别不一致 | 分工作表模板里范围由**工作表名**决定,而这一行的「项目编码 / 组别」两格又填了别的值 | 把那两格**清空**(留空即按工作表名走),或改成与工作表名一致的值 |
| 工作表「XXX」是隐藏表,按约定不参与导入 | 工作簿里有隐藏工作表 | 要在它里面导数据就先取消隐藏并改名成「小项名称@组别名称」,否则忽略这条提示即可 |
---
## 七、导入以后
1. 系统会显示**新增 / 更新 / 跳过**的数量:
- **新增**:这次新建的报名;
- **更新**:这个人本来就有这个项目的报名,用表里的信息覆盖了(**不会产生重复报名**);
- **跳过**:没能导入的行,会带着**行号**列出来,改好那几行重新上传即可。
- 另有一份**「按同名的另一个人新建了档案(证件号 / 号码布不同)」**清单,单独列出姓名 / 单位 / 原证件号或号码布 / 新证件号或号码布。它不是错误:这些行**已经导入成功**,只是提醒你核对证件号与号码布有没有写错(见第三节的「系统怎么认人」)。
- 同一证件号在本表里出现多次时,还会给一条**「证件号 XXXX 在本表中出现 N 次(同一人报名多个组别)」**的提示:这是正常的,只提醒你别把不同的人写成同一个证件号。
2. **重复上传同一份表是安全的**,不会把名单变成两份。改完再传一遍就行。
- ⚠️ 但要注意「更新」是**整条覆盖**:表里空着的格会把系统里原来的值清掉(队员名单、道次、号码布、**批次**都会被清空),`status` 空着会被重置成「正常参赛」。如果之前手工调整过某些人的状态或批次,**重传前请在表里把 `status`、`heat` 写清楚**。
3. 名单导入后,到「成绩录入」里录成绩、发布,积分榜就会自动更新。
4. **被「彻底删除」的人,导入时会以新人员建档**:管理员彻底删除某个人时,他的档案连同他名下的报名与成绩会一起从库里删掉;之后表里再出现同一个证件号(或同一个号码布、同一「姓名 + 单位」),系统匹配不到旧档案,会把他当作**新人员**重新建档——名单里多出一条「以前删过的人」通常就是这么来的。新档案是全新的,他以前的报名、成绩与积分不会回来,需要重新录。
5. **被「彻底删除」的单位则相反,导入时会「复活」**:管理员彻底删除某个单位,只是把它从单位列表里移除,它的报名与成绩一条都没删;表里再出现这个 `team_code`,系统按编码复用原来那条单位记录,清掉删除标记并让它重新出现在列表里,**原有的报名、成绩与积分都还在**,也不会新建第二个同名单位。
6. **别一口气连传几十次**:写操作限 **120 次/分钟/用户**,超了会返回「操作过于频繁,请稍后再试」。正常一次导入只算一次;真被限了就等一分钟再传,不要连点。
---
## 八、分工作表模板(一个小项组别一张表)
前面几节讲的都是**单表模板**:一份表装下全部报名,「项目编码」与「组别」两列每行都要抄一遍。
小项一多(几十个小项 × 几个组别),抄这两列又累又容易串行——所以系统还提供一种
**分工作表模板(xlsx)**:**一个小项 × 一个组别 = 一张工作表**,范围写在**表名**上,数据区只填人。
> 两种模板**都能导入**,谁也替代不了谁:单表 CSV 老填表人照旧用,分工作表模板给「一个小项组别再抄串了」的场合。
> 「基础数据 → 报名导入」里四个下载按钮分别对应:**中文表头 / 英文表头**(单表 CSV)、
> **分工作表 · 中文表头 / 分工作表 · 英文表头**(xlsx)。
### 8.1 工作表怎么命名
| 规则 | 说明 |
|---|---|
| 表名 = **小项名称** `@` **组别名称** | 例如小项「100 米跑」+ 组别「男子组 30岁以下」→ 工作表名 `100 米跑@男子组 30岁以下` |
| 用的是**名称**,不是编码 | 就是「基础数据 → 大项 / 小项」里的小项名、「组别」里的组别名,一字不差 |
| 一张表只能对一个组合 | 一个小项组别一张表;两列都不用填——**范围由表名说了算** |
| 表名里**不能有** `@` 以外的花样 | `:` `\` `/` `?` `*` `[` `]` 会被系统自动换成同形的全角字符(Excel 不允许工作表名里有它们) |
**小项名称与组别名称里禁止使用 `@`(全角 `@` 也不行)。** 理由是它就是表名里的分隔符:
名字里再出现一个 `@`,系统就分不清哪个 `@` 是分隔符、哪一个是名字的一部分。
- 界面(新建 / 编辑小项、编辑组别)会当场拦下并说明原因;
- 规则包里的小项名同样拦;服务端接口也拦(改接口、导 Excel 都绕不过去);
- **已经存在**的历史名字里若带 `@`:不影响任何报名、成绩与积分,但**分工作表模板会生成不出来**——
下载时会明确告诉你「哪一个小项 / 组别带 @,请先改名」,改名后再下载即可(改名不丢数据)。
### 8.2 数据怎么填
- 每张工作表**第 1 行就是表头**(与单表模板同样的 13 列、中英两套都认),**从第 2 行开始填人**;
- **「项目编码」「组别」两列可以整列留空**——表名已经说明了是哪个小项、哪个组别;
一旦填了,就**必须与表名一致**,不一致的那一行会报错并跳过(系统不猜、也不会挑一个用);
- 其余列与单表模板完全一样(第三节逐列说明照样适用);
- **下载下来的模板自带「联队怎么写」的说明**:分工作表模板里,「单位编码」**表头那一格有单元格批注**(鼠标停上去弹出,右边带一个小红三角),**该列每一格还有输入提示**(点中格子就弹出来);中文表头、英文表头各一份,内容就是 `A+B` 这套写法(加号左边是主单位、积分平均分、奖牌两边各记一枚)。**说明只挂在批注与输入提示上,不占任何一格数据、也不改表头与列序**——填好的表原样传回来照样导入;
- **只填了表头、没填人的那张表**会被跳过并给一条提示(= 这个组别没人报名),其余表照常导入;
- 不要在工作簿里加「说明」之类的工作表:**只要工作簿里有一张表名带 `@`**,整份文件就按分工作表模板处理,
其它表名(例如 `Sheet1`、`备注`)必须也是「小项名称@组别名称」的形状,否则**整份拒绝**并点名是哪张表——
静默跳过意味着你填在第 3 张表里的几十行数据无声消失,结果面板上却还显示「导入成功」。
### 8.3 表名太长、或者两个组合撞名了怎么办
Excel 对工作表名有硬限制:**最长 31 个字符**,同一份工作簿里**不能重名**。系统的处理是确定的,不用你操心:
- **太长**:小项名与组别名各保留开头的一段(小项名优先保留,组别名至少留 8 个字符),拼起来不超过 31 字符。
截断后的表名仍是原名的一段开头(保留头部、去掉尾巴),人一眼能认出是哪一项:小项名
`第三届全国职工运动会田径比赛男子甲组100米跑决赛` + 组别名 `30岁以下公开组`,算出来是
`第三届全国职工运动会田径比赛男子甲组100米@30岁以下公开组`(小项名留下 22 个字符,组别名留下 8 个);
- **撞名**:截断后如果两张表名字一样,后一张会自动加 `(2)`、`(3)` 后缀(Excel 里重名会让后一张把前一张**覆盖掉**,数据无声消失,所以这一步必须做);
- 下载下来的模板里这些名字**是最终名字**,照原样填、原样传回来即可;**不要手工改工作表名**,改了就对不上号了。
> 小项或组别**改过名字**(或改了截断规则之后重新下载)时:旧模板里的表名对不上新名字,导入会报
> 「工作表『XXX』没能定出是哪个小项、哪个组别」。这时**重新下载一份模板**、把数据粘过去最稳。
### 8.4 与单表模板的关系
| | 单表模板(CSV / XLSX) | 分工作表模板(XLSX) |
|---|---|---|
| 文件形态 | 一张表装全部报名 | 一个小项组别一张工作表 |
| 范围从哪来 | 每行的「项目编码 / 组别」两列 | **工作表名**(「项目编码 / 组别」可留空) |
| 表名限制 | 随便(`Sheet1`、`报名表` 都行) | 必须「小项名称@组别名称」 |
| 多张工作表的文件 | 只读第一张,其余在导入结果里提示「没有读」 | 每张表各导各的 |
| 适合 | 零散补报、小规模、沿用老表格 | 小项组别多、按项目分工填表 |
两种模板**解析口径完全一致**:表头、认人顺序、冲突处理、行级报错都共用同一套代码,
只有「范围从哪来」这一点不同。
---
## 九、导出的名单怎么导回去
系统里一共能导出**三份**报名名单,**只有标着「导入格式」的那两份是给导入器看的**(三份都在「导出 → 结果」页签的**报名名单卡片**里,四个筛选完全一样):
| 卡片上的按钮 | 导出来是什么 | 文件名 | 对应哪种模板 |
|---|---|---|---|
| 导出报名名单 | 给人看的**报表**:另含小项名称、单位名称与备注,姓名列拼了队员,状态写「已退赛」 | `报名名单.xlsx` | **不能导回**(导入器不认它) |
| 导出(汇总·导入格式) | 13 列,所有行**汇总在一张工作表** | `报名名单(导入格式).xlsx` | **单表模板**(第二、三节) |
| 导出(分小项·导入格式) | 13 列,按「小项名称@组别名称」**分成多张工作表** | `报名名单(导入格式·分小项).xlsx` | **分工作表模板**(第八节) |
- 两个「导入格式」导出的 **13 列与第二节的模板逐列一致,顺序也一致**:项目编码 / 组别 / 单位编码 / 姓名 / 证件号 / 性别 / 年龄 / 号码布 / 种子 / 批次 / 状态 / 队员名单 / 队伍。**没有小项名称、单位名称与备注列**——重导用不着它们(「项目编码 + 组别」已经足够定位);
- 卡片上的**「表头语言」两个按钮(中文表头 / 英文表头)只影响这两个导出**,与第二节的两套表头同一口径(选英文走规范列名 `event_code` / `category` / `team_code` / `athlete_name` / `id_card` / `gender` / `age` / `bib` / `seed` / `heat` / `status` / `member_names` / `squad`;两条路都能导回来);
- 筛选(小项 / 组别 / 单位 / 批次)与报表**完全一样**,都可留空(留空 = 不筛这一维度);**访客也能导**;
- 导出的文件**原样传回「基础数据 → 报名导入」就能导回去**:**不要改表头、不要插列删列、不要把列名换成别的写法**;要改内容就在格子里改;
- 分小项那种格式的**工作表名仍然是「小项名称@组别名称」**,与模板一字不差(8.1、8.3 的规矩照样适用)——**不要手工改工作表名**,改了就对不上号。本来没人报名的组合不会出一张空表;
- 两种格式都把**团体报名的姓名列留空**、队员写进「队员名单」列(「姓名」列填了就是个人报名,见第三节)——这正是它与报表件最关键的区别;
- 「状态」列写的是导入器认的**四个中文说法**:`正常参赛` / `退赛` / `取消资格` / `未出场`。报表件写的是「已退赛」,**那个导入器不认**(会报「status 无法识别」),所以报表件不能重导;
- 「单位编码」列照旧:联队写 `A+B`(加号左边是主单位);按成员单位筛也能筛出这条报名。
### 9.1 往返验证过的(现场也可以自己验一遍)
把这两种导出件**原样喂回导入接口**各跑一遍,结论是:**零错误、行数一致、13 列逐项一致、团体行没有被变成个人报名**(队员与那支队的关联还在)。现场自验的办法:导出 → **一个字都不改** → 在「基础数据 → 报名导入」原样上传 → 结果应当是「新增 0 / 更新 N / 错误 0」,名单看不出变化。
> ⚠️ 但它**不是"完全无损"的往返**:重导前先看下面三条限制。
### 9.2 三条要知道的限制
1. **「号码布」列可能撞冲突面板**:导出件里写的是**报名上登记的号码布**;导入时对**个人行**会拿它跟**运动员档案里的号码布**比对,两边都非空且不一样,这一行就进「冲突」列表,等你在导入结果里逐条选「保留已有数据 / 使用新数据」(见第六、七节)。库里这两者通常是**一致**的(一致时是静默幂等,什么都不用做);不一致时重导**不是**静默幂等,会走这套既有的冲突流程;
2. **联队的份额权重不会被带回来**:13 列里联队只能写成 `A+B`,重导回去是**平均分(各 50%)**。当初设成 `2:1` 这种非均分的联队,重导之后会变成均分——**表格格式本身表达不了这件事**,要保权重只能在界面上改(到「成绩录入」点那一行的「单位」格);
3. **「队员名单」只增不减**:导出时会**以库里存的名单为底,再把界面上后来补进这支队的队员号码布补上**(否则那些人在重导后就没了)。所以重导后这支队的队员**不会少**,但个别名单的**顺序或写法**可能与最初上传的那张表不完全一样——以系统里现在的名单为准,是正常的。
---
## 十、给填写人的最短提示(一页版)
> 1. 用系统里下载的模板(**中文表头 / 英文表头都能用**,见第二节),**第一行不要动**、同一列不要写两遍;
> 2. **一个人一行**;一个人报几项就写几行;
> 3. `event_code`(小项)、`team_code`(单位)、`category`(组别)照抄系统里配好的,不自己编;
> 4. 每人要有**证件号或号码布**,至少一个;**证件号是系统认人的第一依据**(有就优先填、填准、别和人重号);没有证件号时号码布顶替它认人,**号码布也不能给两个人**;
> 5. 团体项目:姓名列留空,队员写进 `member_names`,多人用 `/` 隔开——**写号码布(`101/102`)才会关联到人、才拿得到个人分**,只写姓名就只是文字名单;
> 6. 拿不准的列**留空**,不要写「无」「/」「—」这类符号;
> 7. 表里**不要合并单元格**、不要加标题行、不要插图;
> 8. 填完先对着第五节的清单自查一遍,再发给收表人;
> 9. **批次(`heat`)**可以不填;要分批比赛就填 1–999 的整数,它只影响录入时怎么分组找人,**不影响成绩与名次**;
> 10. **两个单位联合参赛(联队)**:`team_code` 那一格写 `F1+F2`(加号左边是主单位,默认均分,最多 5 个单位),**不要**新建一个「联队单位」、也不要两个单位各写一行;非均分(例如 2:1)要在导入后到「成绩录入」页点那一行的「单位」格改;
> 11. **同一个单位派两支队**(羽毛球双打的一队 / 二队那种):在**最后一列「队伍」**里分别写队名(`一队` / `二队`);**只有一支队的单位这一列留空**,整列不写也行。**个人项目不用管这一列**;
> 12. **存成什么格式**:Excel →「另存为」→「**CSV UTF-8 (逗号分隔) (*.csv)**」最稳;中文 Excel 默认的「CSV (逗号分隔)」也能用。**别用「Unicode 文本」(UTF-16)**,**别手工改名或把两个文件拼起来**,也别在格子里手写双引号(让 Excel 自己加)。
>
> 一句话:**下载模板 → 只往下面粘数据 → 另存为 CSV UTF-8 → 上传**。中间任何一个"顺手改一下"都可能让整份表被拦下。