forked from wangziqi/gongxue-base
feat: add spreadsheet async imports
This commit is contained in:
@@ -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`
|
||||
|
||||
Reference in New Issue
Block a user