feat: 人员唯一标识改为证件号 + 导入冲突逐条决策
需求:人员以证件号为准(避免重名);批量导入时若证件号已存在于本地人员数据, 先导入其余人员,再把重复的人单独列出,由用户逐条/多选决定保留已有数据还是新数据。 服务端: - 迁移 0013:athletes 增加 id_card + 部分唯一索引(空值可共存) - athleteDTO/CRUD 读写 idCard,重复返回 409 - 导入表头新增可选列 id_card/gender;有姓名的行必须给证件号 - 匹配顺序:证件号 → 姓名+单位(且库中证件号为空则回填)→ 新建人员 - 证件号命中但姓名/性别/单位不一致 → 冲突,本轮不落库(报名也不建) - 新增 POST /api/entries/import/resolve(file + decisions),keep-existing/keep-new - 10 个新测试覆盖匹配/回填/冲突/决策/唯一索引 前端: - 运动员表单与列表新增「证件号」,搜索支持证件号 - 报名导入:新模板 10 列;导入后冲突面板(每行复选框 + existing↔incoming 差异高亮 + 全选/清空 + 保留已有数据/使用新数据 批量与逐条),未决策项始终可见 - 勾选报名(EntryPicker)缺证件号的运动员禁止勾选并提示 - 新增 import-conflicts.test.ts 等,前端测试 39/39 文档:使用手册(运动员证件号、导入表头与冲突流程)、常见问题(证件号重复怎么办)。 注:报名行的 team_code 与人员绑定单位不一致会计入冲突,由用户决策,不会静默改单位。
This commit is contained in:
1 parent
c9d5b8ea89
commit
24fff8dd08
21 files changed
+1590
-67
No files matched your search
+21
-6
@@ -263,9 +263,10 @@
|
||||
|
||||
### 10.6 运动员
|
||||
|
||||
1. 点「新增运动员」,填写姓名 *、工号、所属单位等;
|
||||
2. 「编辑」修改,「停用」后不再出现在新报名选择中;
|
||||
3. 个人项目的报名项会关联到运动员,团体项目可以留空。
|
||||
1. 点「新增运动员」,填写姓名 *、证件号、性别、工号 / 学号、所属单位等;
|
||||
2. **证件号是人员的唯一标识**(如身份证号),用于区分重名;同一个证件号不允许重复,重复会被拒绝。已有历史数据可以留空;
|
||||
3. 「编辑」修改,「停用」后不再出现在新报名选择中;
|
||||
4. 个人项目的报名项会关联到运动员,团体项目可以留空。
|
||||
|
||||
### 10.7 报名导入
|
||||
|
||||
@@ -282,9 +283,23 @@
|
||||
**表格导入**
|
||||
|
||||
1. 点「下载 CSV 模板」获取表头样例;
|
||||
2. 表头必须包含:`event_code`、`category`、`team_code`、`athlete_name`、`bib`、`seed`、`status`、`member_names`(大小写不敏感);
|
||||
3. 把 `.csv` 或 `.xlsx` 拖入虚线框,或点击选择文件(单个文件不超过 16MB;xlsx 只解析第一个工作表);
|
||||
4. 点「开始导入」,页面显示**新增 / 更新 / 跳过**数量;匹配不到的行会跳过并回显行号,修正后可重新上传。
|
||||
2. 表头共 10 列:`event_code`、`category`、`team_code`、`athlete_name`、`id_card`、`gender`、`bib`、`seed`、`status`、`member_names`(大小写不敏感)。其中 `id_card`(证件号)与 `gender`(性别)为可选列,缺失不影响导入,其余列必须包含;
|
||||
3. **只要有姓名的行必须填 `id_card`**,否则该行报错并跳过;`gender` 只认「男」「女」,其他值忽略;同一份文件里同一个证件号重复出现时,重复的行会报错;
|
||||
4. 人员匹配顺序:先按证件号匹配已有人员;没匹配到,再按「姓名 + 单位」匹配且该人员证件号为空,视为同一人并回填证件号(不算冲突);都没匹配到则新建人员;
|
||||
5. 把 `.csv` 或 `.xlsx` 拖入虚线框,或点击选择文件(单个文件不超过 16MB;xlsx 只解析第一个工作表);
|
||||
6. 点「开始导入」,页面显示**新增 / 更新 / 跳过**数量;匹配不到的行会跳过并回显行号,修正后可重新上传。
|
||||
|
||||
**证件号冲突的处理**
|
||||
|
||||
导入时如果某个证件号在系统里已经存在,但表里的姓名、性别或单位与已有人员不一致,这个人会被列为**冲突**,本次不写入(该人的报名也不会创建)。处理办法:
|
||||
|
||||
1. 导入结果里会单独列出冲突人员,每条显示已有数据、新数据,以及不一致的字段;
|
||||
2. 用左侧复选框选中一条或多条(也可以全选),再点「保留已有数据」或「使用新数据」:
|
||||
- **保留已有数据**:人员字段沿用系统里已有的,按这个人的信息建 / 更新报名;
|
||||
- **使用新数据**:用表里的姓名、性别、单位等更新该人员,再建 / 更新报名;
|
||||
3. **没有做决定的冲突不会被写入**,可以稍后再处理;全部处理完后冲突列表清空。
|
||||
|
||||
> 「从已有名单勾选」走的是同一个导入通道,人员匹配与冲突处理规则完全一致。
|
||||
|
||||
号码布、种子等字段无法在勾选界面填写,仍需通过表格导入。
|
||||
|
||||
|
||||
Reference in new issue
Block a user