# 退费用户学习数据 - 数据模型参考

## 数据库连接

| 库名 | 用途 | 主机 | 端口 | 用户 | 密码来源 |
|------|------|------|------|------|----------|
| vala_bi (PG) | BI统计表、同步表 | bj-postgres-16pob4sg.sql.tencentcdb.com | 28591 | ai_member | secrets.env → PG_ONLINE_PASSWORD |
| vala (PG) | 用户学习记录源表 | 同上 | 同上 | 同上 | 同上 |

## 核心表

### 订单相关 (vala_bi)

| 表名 | 说明 |
|------|------|
| `bi_vala_order` | 订单表。`order_status=3` 已支付, `order_status=4` 已退款, `pay_success_date` 付款时间 |
| `bi_refund_order` | 退费表。通过 `out_trade_no` 与订单关联, `status=3` 退费成功 |
| `bi_vala_app_account` | 账号表。`status=1` 正常, `status=2` 测试账号 |
| `bi_vala_app_character` | 角色表。`account_id` 关联账号, 一个账号可有多个角色 |

### 课时完成 (vala_bi)

| 表名 | 说明 |
|------|------|
| `bi_user_chapter_play_record_{0-7}` | 课时游玩记录分表(按user_id%8)。`play_status=1` 完成, `chapter_id` 课时ID |
| `bi_level_unit_lesson` | 课程结构映射表。`id`=chapter_id, 含 course_level/season/unit/lesson |

### 巩固 (vala_bi)

| 表名 | 说明 |
|------|------|
| `bi_user_unit_review_question_result` | 课程巩固记录。`chapter_id` 课时, `play_time` 用时(ms), `question_list` JSON含isRight |

### 单元强化 (vala_bi)

| 表名 | 说明 |
|------|------|
| `bi_user_unit_summary_km_result` | 强化练习记录。`story_id` 为 GameInfo.ID, `km_type` 知识模块类型(vocab/pron/sentence/grammar) |

### 单元挑战 (vala_bi)

| 表名 | 说明 |
|------|------|
| `bi_user_unit_challenge_question_result` | 挑战记录。`story_id` GameInfo.ID, `category` 维度(listening/speaking/reading/writing), `score_text` 评分(Perfect/Good/Oops) |

### 完成记录 (vala库)

| 表名 | 说明 |
|------|------|
| `user_learn_record_report_summary_{3-7}` | 学习完成汇总分表。`learn_card_type=1,record_type=3` 强化完成, `learn_card_type=1,record_type=4` 挑战完成 |

## U0 关键ID映射

### Chapter ID (课时)

| 等级 | 课时 | chapter_id |
|------|------|-----------|
| L1-U0 | L01~L05 | 343, 344, 345, 346, 348 |
| L2-U0 | L01~L05 | 55, 56, 57, 58, 59 |

### Story ID (单元)

| 等级 | story_id |
|------|----------|
| L1-U0 | 65 |
| L2-U0 | 8 |

### 知识模块

| 等级 | km_type 列表 | 总数 |
|------|-------------|------|
| L1-U0 | vocab, pron, sentence | 3 |
| L2-U0 | vocab, pron, sentence, grammar | 4 |

### 挑战维度

| 等级 | category 列表 |
|------|--------------|
| L1-U0 | listening, speaking |
| L2-U0 | listening, speaking, reading, writing |

## 课程结构映射公式

- `UnitIndex = (SeasonOfQuarter - 1) * 12 + GameInfo.Index`
- `ChapterIndex = UnitIndex * 5 + Chapter.Index`
- U0 对应 `season_package_index = 0, unit_index = 0`
