feat: build legacy practice navigation

This commit is contained in:
Codex
2026-06-30 12:47:27 +08:00
parent fce5513464
commit d005f65fe7
12 changed files with 2460 additions and 11 deletions

View File

@@ -148,6 +148,15 @@ auxiliary.db: _logs 121715 条,仅摘要
- `referral_qrcodes` 79 条会导入到 `referral_qrcodes`,并同步补 `referral_codes`
- `commission_settings` 1 条会导入到 `tenant_commission_settings`
当前导入器还会把旧题库的树形导航整理成新 SaaS 题库导航:
- `region_modules` 生成 `content_entries(entry_type='question_practice')`
- `module_nodes``subjects``categories` 生成 `content_nodes`,保留任意深度分类和考试意向标记。
- `questions.nodeId` 会优先生成 `module_node:*:direct` 题目合集;旧库真实数据中 74102 道题都有 `nodeId`,因此这是迁移后的第一归属。
- `categoryId` 只覆盖 27665 道题,作为补充分类合集处理,不再作为唯一前端入口。
- 每个有效合集自动生成顺序刷题和随机刷题 `practice_blueprints`,旧 `mock_exam_configs` 继续生成全真模拟蓝图。
- 每道已发布旧题都会回填 `entry_id``content_node_id``primary_collection_id`,方便 Taro 前端直接按 `content_entries/content_nodes/question_collections/practice_blueprints` 对接。
导入器对两个真实 blocker 采用“隔离 + 审计”策略,不会静默丢数据:
- 缺用户订单仍导入 `orders/payments/order_items``raw_payload.migration.reviewRequired=true``entitlementBlocked=true`,并写入 `pb_import_issues`。缺用户订单不会自动开通权益。
@@ -163,7 +172,7 @@ production dry-run 还有这些 warning属于运营处理项
```text
环境:本地 Supabase先执行 npx supabase db reset
命令npm run pb:import:json
耗时:约 858
耗时:约 1011
导入后校验npm run pb:import:validate => 0 failures, 3 warnings
核心计数:
@@ -173,9 +182,20 @@ answer_records: 85199
wrong_questions: 38205
orders: 636
entitlements: 447
practice_blueprints(mode=mock_exam): 48
referral_qrcodes: 79
tenant_commission_settings: 1
新题库导航计数:
content_entries: 11
content_nodes: 2830
question_collections: 1597
question_collection_items: 82106
practice_blueprints: 3102
questions_missing_entry/node/collection: 0
node_direct_collections: 1518
hidden_review_entries: 1
orphan_review_collections: 5
orphan_review_questions: 103
```
最新导入 run 的 `pb_import_issues` 仍有 29 个 critical需要正式切换前人工复核
@@ -185,11 +205,16 @@ tenant_commission_settings: 1
导入后校验的 3 个 warnings 当前含义:
- 2533 道题保留 `legacy_category_id` 但无法解析到旧 `categories/module_nodes`,原始 `categoryId``nodeId` 相同,且旧导出中已没有对应分类或节点。不能由导入器硬绑到错误分类,需后续按科目/题型人工归档或在内容后台批量挂载
- 2533 道题保留 `legacy_category_id` 但无法解析到旧 `categories/module_nodes`。其中能落到明确 `nodeId` 或公开科目的题会进入对应合集;确实断裂且不可公开归类的 103 道题进入隐藏的“迁移待复核题库”,不会出现在学生端目录
- 5298 条旧答题记录保留 `legacy_question_id` 但无法解析到题目,说明旧学习日志引用了已删除/未导出的题目;这些记录不会进入错题本有效组卷。
- 最新 run 存在 29 个 critical import issues即上面的付费订单和手册章节人工复核项。
性能注意:真实 `pb:import:json` 已能在 9 分钟左右完成 248555 条真实记录导入。后续若题库规模继续增长,仍建议继续批量化 `questions/question_versions` 并补阶段耗时统计、失败恢复和断点重跑策略。
`nodeId` 断裂的题目分两类处理:
- 103 道题:科目可解析,但旧节点和科目入口都无法恢复,进入隐藏入口 `migration_review:orphan_questions`、inactive 节点和 draft 合集,只给租户后台复核。
- 129 道题:旧节点断裂,但科目/入口仍可公开解析,挂到对应公开科目 fallback 合集,学生端可正常看到。
性能注意:真实 `pb:import:json` 已能在约 10 分钟完成 248555 条真实记录导入并生成新导航。后续若题库规模继续增长,仍建议继续批量化 `questions/question_versions`、记录阶段耗时、增加失败恢复和断点重跑策略,并按 `docs/refactor/performance-benchmark-runbook.md` 做导入后 API 压测。
## 阶段 1静态 Dry-Run