feat(admin): 报名表导入补列名别名 + 只导参赛选手 + 判重口径(R32)

- COLUMN_ALIAS/pick():兼容上游列名(身份证号码/全名/队伍ID),上游导出表免改表头
- 只导身份=参赛选手:其余计入 result.ignored/ignoredBy(≠skipped),建团队同步过滤
- 判重改以身份证号为准(同证即同人);错误消息附「队伍/姓名/手机号」便于同名定位
- 修 teamUidCache 复用库内团队时写入 maxTeamUid 而非真实 uid 的 bug
- phone 空值写 ''(列 NOT NULL)
- 实测:1225 行 -> 成功 591 / 跳过 3(身份证非18位)/ 忽略 631 / 建队 297
This commit is contained in:
2026-09-29 09:40:51 +08:00
parent e74778ee08
commit 0531131f0e
2 changed files with 73 additions and 20 deletions

View File

@@ -170,7 +170,9 @@ class AdminController extends Controller {
// 清理临时文件
try { fs.unlinkSync(tempFilePath); } catch (e) { /* ignore */ }
ctx.body = ctx.helper.success(result, `导入完成:成功 ${result.imported} 条,跳过 ${result.skipped} 条`);
// 非参赛选手行按业务规则主动忽略(报名表含报名人/指导教师/领队),在提示中单列以免被误读为失败
const ignoredTip = result.ignored ? `,忽略非参赛选手 ${result.ignored} 条` : '';
ctx.body = ctx.helper.success(result, `导入完成:成功 ${result.imported} 条,跳过 ${result.skipped} 条${ignoredTip}`);
} catch (err) {
ctx.logger.error('Excel 导入失败:', err);
const msg = (err && err.message) ? err.message : '未知错误';