feat: add spreadsheet async imports

This commit is contained in:
Codex
2026-06-29 08:00:17 +08:00
parent 78a26d1df2
commit eee21f6eed
27 changed files with 2972 additions and 267 deletions

View File

@@ -713,7 +713,7 @@ content_entries
## 租户内容导入对接
租户后台导入统一使用 preview -> issues -> import 流程,前端不要直接写 Supabase 表或绕过 `apps/api`
租户后台导入统一使用 preview -> issues -> import 流程,前端不要直接写 Supabase 表或绕过 `apps/api`当前 JSON、CSV 和 Excel 都进入同一套后端规范化、逐行 issue、幂等和审计管线。
当前可联调:
@@ -734,14 +734,63 @@ GET /api/tenant-content/imports/issues
前端流程:
1. 上传或粘贴 JSON先调用对应 preview。
1. 上传或粘贴 JSON/CSV/Excel,先调用对应 preview。
2. 展示 `job.totalCount/validCount/errorCount/warningCount`
3. 展示逐行 `issues`,错误行必须让运营修正;如果后端允许 `allowPartial`,也要二次确认。
4. 用户确认后调用 import导入完成后刷新内容列表、分数线列表或题目视频列表
3. 展示 `job.sourceFormat``job.parserMetadata`逐行 `issues`,错误行必须让运营修正;如果后端允许 `allowPartial`,也要二次确认。
4. 小批量确认后直接调用 import大批量确认时传 `executionMode=async` 排队,前端轮询 job 状态
5. 导入完成后刷新内容列表、分数线列表或题目视频列表。
CSV 请求示例:
```json
{
"sourceFormat": "csv",
"sourceName": "questions.csv",
"csvText": "legacyId,题型,题干,选项A,选项B,答案\nq1,choice,题干,A,B,B",
"subjectId": "...",
"categoryId": "...",
"entryId": "...",
"contentNodeId": "...",
"collectionId": "..."
}
```
Excel 请求示例:
```json
{
"sourceFormat": "excel",
"sourceName": "scoreline.xlsx",
"fileBase64": "<xlsx base64>",
"sheetName": "records",
"regionId": "..."
}
```
异步确认导入示例:
```json
{
"previewJobId": "uuid",
"executionMode": "async",
"allowPartial": false
}
```
异步导入状态:
```text
pending/importing展示处理中不允许重复同步执行同一 job。
completed刷新目标内容列表。
completed_with_errors刷新成功内容并提示查看 issues。
failed/rejected展示 errorMessage 和 issues允许运营修正后重新 preview。
```
前端文件限制应与后端一致:单文件最大 8MB最多 5000 行、160 列。后端不会保存原始 `fileBase64`,但前端仍不要把含隐私的导入文件写入长期缓存。
分数线导入前端注意:
- 后端支持 `fields/schools/majors/records` 分桶,也支持 `items` 列表。
- 后端支持 `fields/schools/majors/records` 分桶,也支持 `items` 列表Excel 可用 `fields``schools``majors``records` 多 Sheet
- 页面筛选字段仍以 `/api/scoreline/fields` 为准,不要从导入 JSON 临时生成筛选 UI。
- `record` 至少需要 `schoolId``schoolLegacyId``schoolName`,否则 preview 会返回 issue。
@@ -1081,7 +1130,7 @@ ACTIVATION_CODE_REGION_MISMATCH
- 角色模板:`GET/PUT /api/tenant-admin/role-templates``POST /api/tenant-admin/role-templates/disable`
- 内容入口/分类树/题目集合/练习蓝图
- 题目/单词/知识手册/分数线/视频维护
- 题目/单词/知识手册/分数线/视频 JSON 导入 preview/import/issues
- 题目/单词/知识手册/分数线/视频 JSON/CSV/Excel 导入 preview/import/issues
- Banner/FAQ/公告/激活码/优惠券
- 勋章:`GET/PUT /api/tenant-admin/badges``GET/POST /api/tenant-admin/badge-grants`
- 考试日期:`GET/PUT /api/tenant-admin/exam-dates`