feat(admin): 报名导入新增「从已有名单勾选报名」

原来只能上传 CSV/XLSX。现在同一个 tab 上方多一个选择器:选小项 → 组别 → 单位,
从该单位已有运动员里勾人,一键加入报名。

- 个人项目:勾 N 人 → N 条报名(一人一行)
- 团体/对抗项目:勾 N 人 → 1 条报名,姓名拼进 member_names(再次提交即更新队员名单)
- 已报名的人/单位会标「已报名」并禁止重复勾选
- 复用服务端唯一报名入口 POST /entries/import:勾选结果转成同格式 CSV 提交,
  字段校验、按 (组别,单位,运动员) upsert、行级报错回显与表格导入完全一致
- 纯函数 entrySelection.ts(表头唯一来源 + RFC 4180 转义)+ 4 个单测;
  表头定义从 ImportSection/mockBaseData 收敛到一处
- 号码布/种子仍走表格导入,界面与文档都写明

自检:vue-tsc + pnpm build 通过,前端 node --test 30/30。
This commit is contained in:
AskaEth committed 2026-09-10 02:03:16 +08:00
1 parent 7531ea29e1
commit c9d5b8ea89
6 files changed
+499 -77

No files matched your search

+14
View File
@@ -269,11 +269,25 @@
### 10.7 报名导入
报名有两种方式,都在本页完成:**从已有名单勾选**适合零散补报,**表格导入**适合批量录入。
**从已有名单勾选**
1. 依次选择小项、组别、单位;
2. 在运动员列表里按姓名 / 工号搜索并勾选:
- 个人项目:勾选的人各生成一条报名;已报名的运动员显示「已报名」且不可重复勾选;
- 团体 / 对抗项目:勾选的人合成一条报名,队员名单按列表顺序写入;该单位已报名时再次提交会更新队员名单;
3. 点「加入报名」,结果同样显示**新增 / 更新 / 跳过**数量。
**表格导入**
1. 点「下载 CSV 模板」获取表头样例;
2. 表头必须包含:`event_code`、`category`、`team_code`、`athlete_name`、`bib`、`seed`、`status`、`member_names`(大小写不敏感);
3. 把 `.csv` 或 `.xlsx` 拖入虚线框,或点击选择文件(单个文件不超过 16MB;xlsx 只解析第一个工作表);
4. 点「开始导入」,页面显示**新增 / 更新 / 跳过**数量;匹配不到的行会跳过并回显行号,修正后可重新上传。
号码布、种子等字段无法在勾选界面填写,仍需通过表格导入。
---
## 11. 导出