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。
This commit is contained in:
AskaEth committed 2026-09-17 04:03:52 +08:00
1 parent 19e5630b39
commit ee19b92182
19 files changed
+2135 -34

No files matched your search

+22 -4
View File
@@ -410,7 +410,7 @@
**显示成什么样**
- **导出件**:一个队员写 **`姓名(号码布)`**(例如 `张三(101)`),多个用 `、` 连——报名名单的「姓名」列、分项成绩表 / 全部成绩单页 / 单位奖牌明细的「运动员 / 队」列都这样;**个人得分明细里每个队员各占一行**(双打就是两行,各一整份分);
- **导出件(指给人看的报表件)**:一个队员写 **`姓名(号码布)`**(例如 `张三(101)`),多个用 `、` 连——报名名单的「姓名」列、分项成绩表 / 全部成绩单页 / 单位奖牌明细的「运动员 / 队」列都这样;**个人得分明细里每个队员各占一行**(双打就是两行,各一整份分)。⚠️ 例外是「导入格式」那两份(见 11.1):它们按导入口径写——**团体行的「姓名」列留空**,队员在「队员名单」列(多个用中文逗号 `,` 分隔);
- **大屏**:分项成绩 / 实时赛况的运动员列、底栏「最新完成项目」的名字格都会带上队员名单(**只写姓名**,号码布太长会把整屏字号压小);
- ⚠️ **一条报名仍然只占一行**,不会因为挂了两个队员就变成两行(队里的两个人是**一条报名**里的两个身份);
- ⚠️ **队名(4.12)与队员是两件独立的事**:单位列照旧显示「单位名 + 队名」,队员只出现在运动员列 / 底栏。
@@ -932,15 +932,17 @@
| 全部(单页) | 所有单位、所有项目、所有成绩**平铺在一张表**里(一个工作簿只有一张表),适合筛选与二次统计 | `赛事成绩总表(单页).xlsx` |
| 分项成绩表 | 选择一个小项导出成绩与积分 | `分项成绩表.xlsx` |
| 单位积分明细 | 选择一个单位,逐项列出得分来源 | `单位积分明细.xlsx` |
| 报名名单 | **本页下方的「报名名单」卡片**:按小项 / 组别 / 单位 / 批次筛选后导出报名数据(不填 = 全部)。13 列:小项编码、小项名、组别、单位编码、单位名、姓名、证件号、**号码布**、**批次**、性别、年龄、状态、备注;号码布按文本导出,前导零不会丢 | `报名名单.xlsx` |
| 报名名单 | **本页下方的「报名名单」卡片**:按小项 / 组别 / 单位 / 批次筛选后导出报名数据(不填 = 全部)。13 列:小项编码、小项名、组别、单位编码、单位名、姓名、证件号、**号码布**、**批次**、性别、年龄、状态、备注;号码布按文本导出,前导零不会丢。**这是给人看的报表,不能拿去重新导入** | `报名名单.xlsx` |
| 报名名单(导入格式 · 汇总) | **同一张「报名名单」卡片下方的「导出(汇总·导入格式)」按钮**:13 列与报名导入模板**逐列一致**(项目编码 / 组别 / 单位编码 / 姓名 / 证件号 / 性别 / 年龄 / 号码布 / 种子 / 批次 / 状态 / 队员名单 / 队伍),所有行**汇总在一张工作表**里;筛选与上一行的「报名名单」完全相同,**导出的文件可以直接拿去重新导入** | `报名名单(导入格式).xlsx` |
| 报名名单(导入格式 · 分小项) | **同一张卡片下方的「导出(分小项·导入格式)」按钮**:同样这 13 列,按「小项名称@组别名称」**分成多张工作表**(重导时按**分工作表模板**那份口径解析,与导入规范第八节一致) | `报名名单(导入格式·分小项).xlsx` |
| 单位奖牌明细 | **在「积分榜 → 单位奖牌榜」页操作**:逐枚奖牌列出单位 / 大项 / 小项 / 组别 / 名次 / 奖牌 / 运动员、队,每个有奖牌的单位一张分表(末尾小计) | `单位奖牌明细.xlsx` |
| 个人积分总明细 | **在「积分榜 → 个人积分榜」页操作**:逐条列出单位 / 运动员 / 大项 / 小项 / 组别 / 名次 / 成绩 / 得分 / 来源,每个有得分的单位一张分表 | `个人积分总明细.xlsx` |
- 「分项成绩表」需先选择小项,「单位积分明细」需先选择单位;「报名名单」的四个筛选(小项 / 组别 / 单位 / 批次)**都可以留空**,留空就是不筛这一维度(全导);
- **队名(同一个单位派两个队时写的那个,见 4.12)写进「单位」列**:分项成绩表 / 全部 / 全部(单页)/ 报名名单 / 单位奖牌明细总表 / 单位积分总明细总表里,写的是 **`第一分公司二队`** 这种「单位名 + 队名」(队名留空时仍然只写 `第一分公司`)。⚠️ **导出件里没有单独的「队名」列**——所以**不要拿导出的报名名单直接改完再导回去**(那会撞「同一个单位同一个队」的重复报名、报错拦下);要改队名或改名单,用**导入模板**那条路,或到录入页点「单位」格改队名;
- **队名(同一个单位派两个队时写的那个,见 4.12)写进「单位」列**:分项成绩表 / 全部 / 全部(单页)/ 报名名单 / 单位奖牌明细总表 / 单位积分总明细总表里,写的是 **`第一分公司二队`** 这种「单位名 + 队名」(队名留空时仍然只写 `第一分公司`)。⚠️ **这张报表里没有单独的「队名」列**(队名拼在「单位」列里),所以**报表件不能改完再导回去**(那会撞「同一个单位同一个队」的重复报名、报错拦下);**要整份重导,用「报名名单」卡片里那两个「导入格式」按钮**(见本节末「『报名名单』卡片里的两种『导入格式』导出」:13 列与报名模板逐列一致,可以直接导回;那份里「队伍」是**独立的一列**,不是拼在单位名后面的)。只改队名可以到录入页点「单位」格改,或走**导入模板**那条路;
- **联队(一条报名挂多个单位)在这几份导出件里的写法**(见 4.11):
- **「分项成绩表」「全部」「全部(单页)」的「单位」列**:写成联队全名 `第一分公司+第二分公司联队`(成员单位名写全,与导入表的 `F1+F2` 同构);**「备注」列**写清这条分给了谁、各多少,例如 `联队分拆:第一分公司 5 分(50%)、第二分公司 5 分(50%)`——「积分」列写的是**联队拿到的总分**(上例 10 分),每家的那一份看备注;
- **「报名名单」**:「单位编码」列回写成 `F1+F2`(**导出的名单可以直接拿去重导**,不用手工改回单个单位)、「单位名」列写联队全名、「备注」列写 `联队分拆:第一分公司 50%、第二分公司 50%`(这张表没有积分列,所以只写份额比例);
- **「报名名单」(报表件)**:「单位编码」列回写成 `F1+F2`(**这一列本身可以直接拿去重导**,不用手工改回单个单位)、「单位名」列写联队全名、「备注」列写 `联队分拆:第一分公司 50%、第二分公司 50%`(这张表没有积分列,所以只写份额比例)。⚠️ 但它是**报表**:**姓名列拼了队员、队名拼在单位名后面**,整个文件不能直接导回;要整份重导请用本节末「导入格式」那两个按钮——那份的「单位编码」同样写 `F1+F2`,而且姓名 / 队伍列都是能导回的写法;
- **按单位筛选导出时,成员单位也看得到这条报名**:「报名名单」按 F2 筛选,能导出「主单位是 F1、成员里含 F2」的联队报名(否则 F2 导出自己的名单会发现「没派人上场」);
- 「单位积分明细 / 单位积分总明细」「个人积分总明细」「单位奖牌明细」里联队的写法见 8.3;**没有联队的赛事,这些列与升级前逐字一致**。
- **三种「还没出结果」的行也照样占一行**(「分项成绩表」「全部」「全部(单页)」都是,逐格口径完全一致):
@@ -951,6 +953,22 @@
- **「单位奖牌明细」与「个人积分总明细」不在本页**,在「积分榜」页对应榜单的卡片头点「导出奖牌明细」「导出个人明细」(见 8.3);个人积分总明细里的「得分」与个人积分榜一致,不受榜单口径折算系数影响;
- 导出文件由浏览器直接下载,表头、合并单元格与字体已按打印模板预设。
**「报名名单」卡片里的两种「导入格式」导出**
同一个「报名名单」卡片,在原来那个「导出报名名单」(给人看的**报表**)下面还有一组**导入格式**导出:
| 按钮 | 导出来是什么 | 文件名 |
| --- | --- | --- |
| 导出(汇总·导入格式) | 所有行**汇总在一张工作表**里 | `报名名单(导入格式).xlsx` |
| 导出(分小项·导入格式) | 按「小项名称@组别名称」**分成多张工作表** | `报名名单(导入格式·分小项).xlsx` |
- 两个按钮导出的都是 **13 列、与「基础数据 → 报名导入」里下载的报名模板逐列一致**(**顺序就是这个**):项目编码 / 组别 / 单位编码 / 姓名 / 证件号 / 性别 / 年龄 / 号码布 / 种子 / 批次 / 状态 / 队员名单 / 队伍——**没有小项名称、单位名称与备注列**(那三列只有上面的报表件才有,重导用不着:「项目编码 + 组别」已经足够定位)。**导出的文件可以直接拿去重新导入**;
- 四个筛选(小项 / 组别 / 单位 / 批次)与报表**完全一样**,都留空 = 全导;权限也和报表相同,**访客也能导**;
- 卡片上的**表头语言**两个小按钮「**中文表头**」(默认)/「**英文表头**」**只影响下面这两个导入格式的导出**,对上面的「导出报名名单」**不生效**(界面上写明了这一点)。选英文时表头是规范列名:`event_code` / `category` / `team_code` / `athlete_name` / `id_card` / `gender` / `age` / `bib` / `seed` / `heat` / `status` / `member_names` / `squad`;
- **一条报名都没有时不是报错**:照样下载回一张**只有表头**的表(一眼看得出是「这次没有数据」);分小项那种格式里,本来就没人报名的组合不会出一张空表;
- ⚠️ 分小项导出时,只要有**小项名或组别名里带 `@`**(模板里明令禁止的字符,见《报名名单导入规范》8.1),会**直接报错并点名是哪一项**,不会静默丢掉那几十行;
- 重导回去要注意的三件事(号码布可能撞冲突面板、联队份额会变成均分、队员名单只增不减)见《报名名单导入规范》第九节「导出的名单怎么导回去」。
### 11.2 赛事项目包
服务端一次只打开一个赛事项目,页面上看到的数据全部来自「当前」的那一项,其余项目只是躺在数据目录里的数据。
+41
View File
@@ -6,6 +6,47 @@
---
## dev_0.5.14
### 一句话
**没有任何数据迁移:不改一行已有数据、不用重配、不用重新导入规则包**,已有的成绩、名次、积分、榜单与**所有导出件一个字不变**。这一版**新增两种导出**:在「导出 → 结果 → 报名名单」卡片里,多了一组**与报名导入模板逐列一致**的导出(原来的报表导出**原样保留、一个字没改**)——以后**导出的报名名单可以直接拿回去重新导入**了。
### ① 新增:「报名名单」卡片里的两种「导入格式」导出
**先说清楚为什么要有它**:原来那张「导出报名名单」是**给人看的报表**(含小项名称、单位名称与备注,姓名列拼了队员、状态写「已退赛」),**导入器不认它**——想「导出 → 改几笔 → 再导回去」这条路以前走不通。现在同一个卡片里加了两个按钮:
| 按钮 | 导出来是什么 | 文件名 |
| --- | --- | --- |
| 导出(汇总·导入格式) | 13 列,所有行**汇总在一张工作表** | `报名名单(导入格式).xlsx` |
| 导出(分小项·导入格式) | 13 列,按「小项名称@组别名称」**分成多张工作表** | `报名名单(导入格式·分小项).xlsx` |
- **13 列与报名导入模板逐列一致**(顺序也是这个):项目编码 / 组别 / 单位编码 / 姓名 / 证件号 / 性别 / 年龄 / 号码布 / 种子 / 批次 / 状态 / 队员名单 / 队伍;**导出的文件可以直接拿去重新导入**(往返已测,见下);
- 卡片上的四个筛选(小项 / 组别 / 单位 / 批次)与原来的报表**完全一样**,都可留空;权限也一样,**访客也能导**;
- 新加的**表头语言**(中文表头 / 英文表头)**只影响这两个导出**,对上面的报表**不生效**;
- **原来的「导出报名名单」一个字没改**,照旧是给人看的报表(含小项名称、单位名称与备注)。
**往返测过**:把这两种导出件**直接喂回导入接口**各跑一遍——**零错误、行数一致、13 列逐项一致、团体行没有被变成个人报名**(队员关联还在)。真实服务端上也手工验过一遍:导出的文件回灌 `POST /api/entries/import` 得到 `created:0, updated:2, errors:[]`。
⚠️ 但它**不是"完全无损"的往返**,有三条限制请一并交代给用的人(详见《报名名单导入规范》第九节):
1. **号码布可能撞冲突面板**:导出件写的是**报名上登记的号码布**,导入时对个人行会拿它跟**运动员档案里的号码布**比;两边都非空且不同,这一行就进「冲突」列表等人工决策(库里两者一致是常态,那时是静默幂等);
2. **联队的份额权重带不回来**:13 列里联队只能写 `A+B`,重导回去是**均分(各 50%)**;原来是 `2:1` 这种非均分的会变均分,要保权重只能在编辑界面改;
3. **「队员名单」只增不减**:导出时会把界面上后来补进这支队的队员一并补上,所以重导后**队员不会少**,但个别名单的顺序 / 写法可能与最初那张表不完全一样。
### ② 升级后 5 分钟核对
1. 到「导出 → 结果」,在**报名名单**卡片点「**导出(汇总·导入格式)**」:打开下载到的 `报名名单(导入格式).xlsx`,确认**第一行就是 13 列表头**(项目编码 / 组别 / 单位编码 / 姓名 / 证件号 / 性别 / 年龄 / 号码布 / 种子 / 批次 / 状态 / 队员名单 / 队伍),并且**团体那一行的「姓名」列是空的**(队员在「队员名单」列);
2. 把刚导出的这个文件**直接**在同一页的「基础数据 → 报名导入」原样上传(**中间不要改任何一格**):应当是**零错误**,提示的「更新 N 条」里名单与上传前**看不出变化**;
3. 想要分小项的,回到卡片点「**导出(分小项·导入格式)**」:得到的文件里**每个「小项名称@组别名称」一张工作表**(没人报名的组合不会出空表),表名与导入模板同一套写法;
4. 其余照旧:**不需要数据迁移、不需要重新导入规则包、不需要重配任何东西**;原来的「导出报名名单」以及其它导出件**一个字不变**。
### ③ 详细说明在哪
《使用手册》§11.1 结果导出(xlsx);《报名名单导入规范》第九节「导出的名单怎么导回去」(含三条限制)。
---
## dev_0.5.13
### 一句话
+30 -1
View File
@@ -226,7 +226,7 @@ Console 启动的多屏窗口默认每屏锁定一页。到「大屏控制」点
## 导出与导入
**Q43:能导出哪些文件?**
「导出 → 结果导出」页有六类 Excel:**总表**(`总积分榜.xlsx`)、**全部**(`赛事成绩总表.xlsx`,多 sheet)、**全部(单页)**(`赛事成绩总表(单页).xlsx`,单张表平铺)、**分项成绩表**(`分项成绩表.xlsx`)、**单位积分明细**(`单位积分明细.xlsx`),以及可筛选的**报名名单**(`报名名单.xlsx`,见 Q87)。「积分榜」页另有四项:单位总分榜卡片头的**导出总明细**(`单位积分总明细.xlsx`)、单位奖牌榜卡片头的**导出奖牌明细**(`单位奖牌明细.xlsx`)、个人积分榜卡片头的**导出个人明细**(`个人积分总明细.xlsx`),以及展开单位后明细卡头的**导出该单位明细**(`单位积分明细.xlsx`)。另外可导出赛事项目包(zip)、**基础数据包**(xlsx,见 Q88)与规则包(YAML)。
「导出 → 结果导出」页有六类 Excel:**总表**(`总积分榜.xlsx`)、**全部**(`赛事成绩总表.xlsx`,多 sheet)、**全部(单页)**(`赛事成绩总表(单页).xlsx`,单张表平铺)、**分项成绩表**(`分项成绩表.xlsx`)、**单位积分明细**(`单位积分明细.xlsx`),以及可筛选的**报名名单**(`报名名单.xlsx`,见 Q87;同一张卡片里另有「导入格式」的两个版本 `报名名单(导入格式).xlsx` / `报名名单(导入格式·分小项).xlsx`,见 Q104)。「积分榜」页另有四项:单位总分榜卡片头的**导出总明细**(`单位积分总明细.xlsx`)、单位奖牌榜卡片头的**导出奖牌明细**(`单位奖牌明细.xlsx`)、个人积分榜卡片头的**导出个人明细**(`个人积分总明细.xlsx`),以及展开单位后明细卡头的**导出该单位明细**(`单位积分明细.xlsx`)。另外可导出赛事项目包(zip)、**基础数据包**(xlsx,见 Q88)与规则包(YAML)。
**Q44:导出文件保存在哪?**
浏览器默认下载目录。服务端生成的临时包位于 `data\exports\`,下载完成后自动删除。
@@ -543,6 +543,8 @@ Console 启动的多屏窗口默认每屏锁定一页。到「大屏控制」点
**Q87:怎么把报名名单导出来?**
到「导出 → 结果导出」页,往下找**「报名名单」**卡片:先按**小项 / 组别 / 单位 / 批次**筛选(都可以留空 = 不筛,即导全部),再点「导出报名名单」,得到 `报名名单.xlsx`。表里有 13 列:小项编码、小项名、组别、单位编码、单位名、姓名、证件号、号码布、批次、性别、年龄、状态(中文:正常参赛 / 已退赛 / 取消资格 / 未出场)、备注;号码布按文本导出,前导零不会丢。访客也能导出(只读)。
> 这份是**给人看的报表,不能导回去**。同一张卡片下面还有「**导出(汇总·导入格式)**」「**导出(分小项·导入格式)**」两个按钮,导出的 13 列与报名导入模板逐列一致、可以直接重新导入(见 Q104)。
**Q88:基础数据(单位 / 大项 / 小项 / 组别)能批量导入导出吗?**
能。到「导出 → 基础数据」页:
@@ -732,3 +734,30 @@ Console 启动的多屏窗口默认每屏锁定一页。到「大屏控制」点
- 升级前的旧版本遇到这个现象时,**挪一下盖在它上面的窗口**即可立刻恢复显示,**不需要重新发布成绩、也不需要重算**。详见《升级说明》的 `dev_0.5.13` 一节。
> 顺带分清另一件事:「**撤销发布**」**保留**成绩内容(只把分收回来,改完重新发布即可);要**连成绩内容一起清掉**,那是工具栏上另一对按钮「**清空本组 / 清空本批**」(危险操作,要勾选确认,清整组时还会一并清掉按单位录的团体名次)。两者的对照见使用手册 4.7。
**Q104:导出的报名名单为什么和导入模板不一样?能不能直接导回去?**
**先说结论:以前导出的那份不能,现在报名名单卡片里多了两个能导回去的按钮——挑对按钮就行。**
原来「导出报名名单」导出的是一张**给人看的报表**:额外有小项名称、单位名称与备注三列,**姓名列拼了队员**、状态写「已退赛」、单位名后面还拼着队名。**导入器不认这份表**(列对不上,状态那个写法也不认),拿它去「基础数据 → 报名导入」重导会被拦下——所以那份只能看、不能导回去。
现在同一个**报名名单卡片**里多了一组「**导入格式**」导出,与「基础数据 → 报名导入」里下载的模板**逐列一致**,可以直接导回去:
| 按钮 | 导出来是什么 | 文件名 |
| --- | --- | --- |
| 导出(汇总·导入格式) | 13 列汇总在**一张工作表**里 | `报名名单(导入格式).xlsx` |
| 导出(分小项·导入格式) | 13 列,按「小项名称@组别名称」**分成多张工作表** | `报名名单(导入格式·分小项).xlsx` |
- 13 列是:项目编码 / 组别 / 单位编码 / 姓名 / 证件号 / 性别 / 年龄 / 号码布 / 种子 / 批次 / 状态 / 队员名单 / 队伍(顺序就是这个,没有小项名称 / 单位名称 / 备注那三列);
- **团体报名的「姓名」列是空的**、队员写在「队员名单」列(「姓名」列填了就会被当成个人报名);「**队伍**」是**独立的一列**(报表件里是拼在单位名后面的);「状态」写的是导入器认的四个中文说法:`正常参赛` / `退赛` / `取消资格` / `未出场`;
- 筛选与权限跟报表一样:小项 / 组别 / 单位 / 批次都可留空(留空 = 不筛),**访客也能导**;
- 上方的**表头语言**(中文表头 / 英文表头)**只管这两个导出**,改它不会动上面那份报表(界面上写明了);
- **往返已经测过**:这两种导出件原样喂回导入接口,零错误、行数一致、13 列逐项一致,**团体行不会被变成个人报名**(队员关联还在)。想自己验一遍:导出 → **一个字都不改** → 在「基础数据 → 报名导入」原样上传,结果应当是「新增 0 / 更新 N / 错误 0」。
**重导前要知道的三条限制**(它不是"完全无损"):
1. **号码布可能进冲突面板**:导出件写的是**报名上登记的号码布**,导入时对个人行会拿它跟**运动员档案里的号码布**比;两边都非空且不同,这一行就进「冲突」列表等你逐条决定(库里两者一致是常态,那时是静默幂等);
2. **联队的份额会变成均分**:13 列里联队只能写 `A+B`,重导回去是**各 50%**;当初设成 `2:1` 这种非均分的会变均分——表格本身表达不了,要保权重只能在界面上改;
3. **「队员名单」只增不减**:导出时会把界面上后来补进这支队的队员一并补上,所以重导后这支队的队员**不会少**,但个别名单的**顺序 / 写法**可能与最初上传的那张表不完全一样。
**一句话**:给人看的用「导出报名名单」;**要拿回去重导,用「导出(汇总·导入格式)」或「导出(分小项·导入格式)」**,导出的文件**不要改表头、不要插删列**。详见[使用手册 §11.1](./使用手册.md)与[报名名单导入规范 · 第九节](./报名名单导入规范.md#九导出的名单怎么导回去)。
+36 -3
View File
@@ -125,7 +125,7 @@ F1+F2
**导入之后长什么样**
- 联队仍是一条报名,但**分与奖牌都按份额记给各成员单位**:单位总分榜、单位奖牌榜上 A、B 各有一份;
- 大屏和导出件里写的是**联队的名字**:`第一分公司+第二分公司联队`,报名名单导出的「单位编码」列也回写成 `F1+F2`(**导出的名单可以直接拿去重导**,不用手工改回单个单位);
- 大屏和导出件里写的是**联队的名字**:`第一分公司+第二分公司联队`,报名名单导出的「单位编码」列也回写成 `F1+F2`(**这一列本身可以直接重导**,不用手工改回单个单位;但那两份「报名名单」导出的口径不同——**报表件整份不能导回,要重导用卡片里的两个「导入格式」按钮**,见第九节);
- 用成员单位筛「报名名单」导出时,**也能看到这条联队报名**(否则 B 导出自己的名单会以为没派人上场)。
### `athlete_name` 运动员姓名
@@ -314,7 +314,7 @@ A001,A002
- `F2` 在**加号左边**,所以 **F2 是主单位**:这一条的名次与榜单以它为主体。写成 `F5+F2` 是另一条报名(主单位变成 F5),同一组别里只写一种;
- 默认**均分**:这条成绩拿到的分,F2 与 F5 **各一半**(团体第 1 名 15 分 → 各 7.5 分);奖牌**两边各记一枚整枚**(一块金牌,F2 榜上 1 枚、F5 榜上 1 枚);
- 要改成 **2:1** 这类非均分:**不能在这张表里写**,导入后到「成绩录入」页点那一行的「单位」格改(见[使用手册 · 4.11](./使用手册.md#411-联队两个单位合并参赛));
- 大屏与导出件里写的是 `第二分公司+第五分公司联队`,报名名单导出的「单位编码」列回写成 `F2+F5`(可以直接拿去重导)。
- 大屏与导出件里写的是 `第二分公司+第五分公司联队`,报名名单导出的「单位编码」列回写成 `F2+F5`(**这一列本身可以直接重导**;报表件整份不能导回,要重导用报名名单卡片里的两个「导入格式」按钮,见第九节)。
### 例 5:同一个单位派两个队(团体项目多队)
@@ -503,7 +503,40 @@ Excel 对工作表名有硬限制:**最长 31 个字符**,同一份工作簿
---
## 九、给填写人的最短提示(一页版)
## 九、导出的名单怎么导回去
系统里一共能导出**三份**报名名单,**只有标着「导入格式」的那两份是给导入器看的**(三份都在「导出 → 结果」页签的**报名名单卡片**里,四个筛选完全一样):
| 卡片上的按钮 | 导出来是什么 | 文件名 | 对应哪种模板 |
|---|---|---|---|
| 导出报名名单 | 给人看的**报表**:另含小项名称、单位名称与备注,姓名列拼了队员,状态写「已退赛」 | `报名名单.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. **一个人一行**;一个人报几项就写几行;