feat: normalize legacy migration learning data

This commit is contained in:
Codex
2026-06-30 10:04:48 +08:00
parent 2510d736a4
commit 3303426806
7 changed files with 584 additions and 22 deletions

View File

@@ -172,6 +172,7 @@
| --- | --- | --- |
| PocketBase schema/导出分析 | 可联调 | `scripts/import-pocketbase` 支持 schema summary/risk、`npm run pb:import:dry-run` 导出目录静态迁移报告 |
| PocketBase JSON dry-run | 可联调 | 不写数据库检查导出目录、JSON 形态、核心集合、旧 ID、敏感字段、schema relation、未映射集合和关键业务计数`--profile=production` 会额外检查生产迁移必需集合和关键字段覆盖率,正式切换建议配合 `--fail-on-warnings` |
| PocketBase SQLite 标准化导入 | 迁移期 | 已支持真实 SQLite 只读导出后的核心集合标准化,新增覆盖 `user_answer_records -> answer_records/wrong_questions``mock_exam_configs -> practice_blueprints``referral_qrcodes -> referral_qrcodes/referral_codes``commission_settings -> tenant_commission_settings`;缺用户订单会进入财务复核且不自动开权益,缺归属手册章节会进入“迁移待复核手册”并写 `pb_import_issues`;全量真实导入仍需继续做批量化性能优化 |
| 题目 JSON preview/import | 可联调 | 后端负责规范化、issue、幂等、审计 |
| 公共题库采纳、手动同步和自动同步 | 可联调 | 平台授权后,租户可采纳公共题库并复制已发布题目快照;同步 API 和 `public-banks` worker 支持新增/更新题目、重新校验授权、跨租户拒绝、审计记录、租户内容通知和租户自改冲突保护;冲突处理 API 已支持单条/批量采纳平台版本和保留租户本地版本worker 失败会写 `public_question_bank_sync_failed` 租户通知并保留稳定错误码,恢复成功会自动关闭失败通知;平台可通过 `/api/platform-admin/question-bank-sync-status` 查看跨租户同步运营状态;已覆盖跨租户、重复采纳、采纳后组卷、同步新增题、通知隔离/已读/自动 resolved、冲突不覆盖、单条/批量冲突处理、worker 自动同步/失败通知/恢复关闭、starter 单地区不可见/不可采纳第二地区题库、pro 全国套餐可见第二地区题库等测试 |
| 单词 JSON preview/import | 可联调 | 兼容旧模板 |

View File

@@ -76,8 +76,9 @@
- 从 PocketBase 导出现有用户、题库、单词、知识手册、分数线、订单、权益数据。
- 已补 `npm run pb:export:sqlite` 只读 SQLite 导出工具,默认从 `F:\project\参考\旧题库数据库文件\data.db` 导出到 `.gitignore` 覆盖的 `pb_export/`,并生成 `sqlite-export-manifest.json``storage-manifest.json` 和脱敏统计。
- 已补 `npm run pb:import:dry-run` 静态迁移报告工具、`--profile=production` 生产迁移门禁、关键集合/关键字段覆盖率检查、strict warning 门禁测试和真实数据迁移验收 runbook真实 SQLite 已导出 58 个业务 collection、248555 条记录,并跑过 production dry-run。
- 当前真实 dry-run 剩余 blocker30 个订单缺 `userId`,其中 7 个 paid22 个知识手册章节缺 `subjectId`正式导入前必须补自动修复/隔离 mapper 和人工复核报告
- 当前真实 dry-run 剩余 mapper gap`user_answer_records` 85442 条`mock_exam_configs` 48 条、`referral_qrcodes` 79 条、`commission_settings` 1 条。它们分别对应学习历史/错题归因、全真模拟蓝图、推广码/小程序码、分佣设置,后续要进入标准化导入
- 当前真实 dry-run 剩余 blocker30 个订单缺 `userId`,其中 7 个 paid22 个知识手册章节缺 `subjectId`导入器已补隔离策略:缺用户订单进入财务复核且不自动开权益,缺归属手册章节进入“迁移待复核手册”。正式切换前仍必须人工找回/确认这些记录
- 已补真实 mapper gap`user_answer_records` 85442 条标准化到 `answer_records/wrong_questions``mock_exam_configs` 48 条标准化到 `practice_blueprints``referral_qrcodes` 79 条标准化到 `referral_qrcodes/referral_codes``commission_settings` 1 条标准化到 `tenant_commission_settings`
- 真实 `pb:import:json` 试跑已验证 raw 导入和新 mapper 开始落库,但 248555 条真实记录的逐条标准化仍超过 10 分钟,需要下一阶段继续做批量化/事务分批优化,重点是 `questions``question_versions``user_answer_records``pb_raw_records`
- 处理完 blocker 后再跑 `npm run pb:import:dry-run -- --profile=production --json --fail-on-warnings`,再跑 `pb:import:json``pb:import:validate` 和业务抽样。
- 对题目 JSON、单词、知识手册、分数线、视频走后端 preview/import API 做二次验证。

View File

@@ -136,18 +136,29 @@ storage-manifest: 9 个原始资源文件
auxiliary.db: _logs 121715 条,仅摘要
```
最近一次 production dry-run 仍有 2 个 blocker需要在正式导入前处理:
最近一次 production dry-run 仍有 2 个真实数据 blocker需要在正式切换前处理:
- `orders.userId` 覆盖率 95.3%30 个订单缺用户,其中 7 个为已支付订单。处理策略应优先从支付通知、手机号、订单号或人工售后记录找回用户;找不回的已支付订单必须进入人工异常台账,不允许静默开权益。
- `handbook_chapters.subjectId` 覆盖率 94.4%22 个章节缺所属手册。处理策略应按章节标题和条目归属归并到正确 `handbook_subjects`,无法归并的放入迁移隔离手册并标记待人工复核。
production dry-run 还有这些 warning属于后续 mapper 或运营处理项
当前导入器已经补齐下面 4 个旧集合的标准化 mapper
- `user_answer_records` 85442 条会导入到 `answer_records`,并按错误记录重建 `wrong_questions`
- `mock_exam_configs` 48 条会导入到 `practice_blueprints(mode='mock_exam', assembly_type='filters')`
- `referral_qrcodes` 79 条会导入到 `referral_qrcodes`,并同步补 `referral_codes`
- `commission_settings` 1 条会导入到 `tenant_commission_settings`
导入器对两个真实 blocker 采用“隔离 + 审计”策略,不会静默丢数据:
- 缺用户订单仍导入 `orders/payments/order_items``raw_payload.migration.reviewRequired=true``entitlementBlocked=true`,并写入 `pb_import_issues`。缺用户订单不会自动开通权益。
-`subjectId` 的手册章节会挂到 `handbook_subjects.legacy_id='__migration_orphan_handbook_subject__'` 的“迁移待复核手册”,章节 `metadata.reviewRequired=true`,并写入 `pb_import_issues`
production dry-run 还有这些 warning属于运营处理项
- `user_answer_records` 85442 条尚未规范化到新练习历史/答题记录模型。
- `mock_exam_configs` 48 条尚未规范化到 `practice_blueprints`
- `referral_qrcodes` 79 条尚未规范化到新推广码/小程序码模型。
- `commission_settings` 1 条需要迁移到新分佣设置。
- `dashboard_cache`、空 `customer_messages/smscodes/tenant_config` 可不作为正式数据源,必要时只保留审计摘要。
- `recent_practices` 和少量 `user_answer_records` 有旧用户引用断裂,需要在导入后复核 `pb_import_issues`
性能注意:真实 `pb:import:json` 试跑已经证明 248555 条真实记录会超过 10 分钟。正式迁移前需要继续优化 importer 的批量写入和分批事务,重点是 `pb_raw_records``questions/question_versions``user_answer_records`。迁移演练必须记录总耗时、每阶段耗时和失败恢复策略。
## 阶段 1静态 Dry-Run