
### 📦 bi_user_unit_challenge_question_result（单元挑战 Challenge 源表）

> 🔔 **`question_list` JSON 包含四维度评分详情，需解析出 listening/speaking/reading/writing 各自的评分。**

| 字段 | 类型 | 释义 | 计算说明 |
|------|------|------|----------|
| `id` | bigint | 主键 | |
| `user_id` | bigint | 角色 ID | |
| `chapter_id` | bigint | 课时 ID | 注意：挑战是单元级功能 |
| `story_id` | bigint | 故事 ID | |
| `score` | integer | 总得分 | |
| `score_text` | varchar | 评分等级 | Perfect / Good / Oops |
| `question_list` | text | 题目列表 JSON | 包含 `listening`/`speaking`/`reading`/`writing` 四维度评分 |
| `play_time` | bigint | 播放时间 | |
| `created_at` | timestamptz | 首次进入时间 | **挑战进入时间** |
| `updated_at` | timestamptz | 更新时间 | |
| `deleted_at` | timestamptz | 删除时间 | |
| `unique_id` | varchar | 唯一标识 | |
| `sp_value` | integer | SP 值 | |
| `exp` | integer | 经验值 | |
| `level` | varchar | 等级 | |

---

### 📦 bi_vala_seasonal_ticket（季度券 PG 侧）

| 字段 | 类型 | 释义 | 计算说明 |
|------|------|------|----------|
| `id` | bigint | 主键 | |
| `account_id` | bigint | 账号 ID | |
| `character_id` | integer | 角色 ID | |
| `out_trade_no` | varchar | 订单号 | |
| `ticket_type` | smallint | 券类型 | 1=Season Pass，2=Season Copy |
| `season_package_id` | integer | 赛季包 ID | |
| `season_package_name` | varchar | 赛季包名称 | |
| `season_package_level` | varchar | 赛季包等级 | |
| `status` | integer | 状态 | 0=未使用，1=已使用，-1=禁用 |
| `give_time` | bigint | 发放时间戳 | |
| `expire_time` | bigint | 到期时间戳 | |
| `used_time` | bigint | 使用时间戳 | |
| `redeem_code` | varchar | 兑换码 | |
| `character_name` | varchar | 角色名 | |
| `created_at` | timestamptz | 创建时间 | |
| `updated_at` | timestamptz | 更新时间 | |
| `deleted_at` | timestamptz | 删除时间 | |

---

### 📦 其他 PG 表（简要）

> 🔔 以下表在统计分析中使用频率较低，列出字段概要。

#### account_detail_info（账号详情表）

| 字段 | 释义 |
|------|------|
| `id` | 主键 |
| `account_id` | 关联账号 |
| `login_time` | 登录时间 |
| `device` | 设备信息 |
| `device_os` | iOS/Android |
| `login_address` | 登录地址，"省份-城市"，`split_part(login_address,'-',2)` 取城市 |
| `login_times` | 登录次数 |
| `phone_login_times` | 手机登录次数（`=0` 从未手机登录） |
| `created_time` | 创建时间 |

#### account_login（账号登录表）

| 字段 | 释义 |
|------|------|
| `id` | 主键 |
| `account_id` | 关联账号 |
| `login_date` | 登录日期（日期维度分组） |
| `status` | 状态 |
| `created_time` | 创建时间 |

#### account_device（设备表）

| 字段 | 释义 |
|------|------|
| `id` | 主键 |
| `account_id` | 关联账号 |
| `device` | 设备标识 |
| `created_time` | 创建时间 |

#### account_activity_count（账号活动统计表）

| 字段 | 释义 |
|------|------|
| `id` | 主键 |
| `time_period` | 时间周期 |
| `counts` | 计数 |
| `stat_date` | 统计日期 |
| `created_time` | 创建时间 |

#### account_paid_activity_count（付费账号活动统计表）

| 字段 | 释义 |
|------|------|
| `id` | 主键 |
| `time_period` | 时间周期 |
| `counts` | 计数 |
| `stat_date` | 统计日期 |
| `created_time` | 创建时间 |

#### growth_activity_behavior（增长活动行为表）

| 字段 | 释义 |
|------|------|
| `id` | 主键 |
| `es_id` | ES 记录 ID |
| `account_id` | 账号 ID |
| `user_id` | 角色 ID |
| `activity` | 活动 |
| `behavior` | 行为 |
| `sub_behavior` | 子行为 |
| `source` | 来源 |
| `info` | 详细信息 |
| `created_at` | 创建时间 |

#### user_behavior_buried_points（埋点数据表）

| 字段 | 释义 |
|------|------|
| `id` | 主键 |
| `burying_point_id` / `burying_point_name` | 埋点信息 |
| `burying_point_sub_id` / `burying_point_sub_name` | 子埋点 |
| `account_id` / `account_name` | 账号 |
| `character_id` / `character_name` | 角色 |
| `unit_id` / `unit_name` | 单元 |
| `lesson_id` / `lesson_name` | 课时 |
| `component_id` / `component_name` | 组件 |
| `active_time` | 活跃时间 |
| `finish_status` | 完成状态 |
| `step_duration` | 步骤耗时 |
| `season_package_id` / `season_package_name` | 赛季包 |
| `c_type` / `c_id` | 组件类别 |

#### user_detail_info（用户详情表）

| 字段 | 释义 |
|------|------|
| `id` | 主键 |
| `user_id` | 角色 ID |
| `latest_login_time` | 最近登录时间戳 |
| `latest_active_time` | 最近活跃时间戳 |
| `created_time` | 创建时间 |

#### user_behavior_0 ~ user_behavior_15（用户行为分表，16 张）

| 字段 | 释义 |
|------|------|
| `id` | 主键 |
| `user_id` | 角色 ID |
| `stat_date` | 统计日期 |
| `learning_time` | 学习时长 |
| `created_time` | 创建时间 |

#### data_sync_config（数据同步配置表）

| 字段 | 释义 |
|------|------|
| `id` | 主键 |
| `job_name` | 任务名称 |
| `database_name` | 数据库名 |
| `origin_table` | 源表 |
| `dest_table` | 目标表 |
| `deal_time` | 处理时间 |

#### feishu_table_record（飞书表格记录表）

| 字段 | 释义 |
|------|------|
| `id` | 主键 |
| `data_table` | 数据表名 |
| `record_id` | 记录 ID |

#### chapter_component_index（组件索引表）

> 组件与课时的索引映射关系。

#### chapter_config_count（配置计数表）

> 课时配置的计数统计。

#### bi_user_task_log（用户任务日志表）

| 字段 | 释义 |
|------|------|
| `id` | 主键 |
| `user_id` | 角色 ID |
| `task_type` | 任务类型 |
| `task_id` | 任务 ID |
| `status` | 状态 |
| `start_time` | 开始时间（Unix 时间戳） |

---

## 三、MySQL `vala` 库（配置表）

### 📦 vala_game_info（游戏/单元信息表）

| 字段 | 类型 | 释义 | 计算说明 |
|------|------|------|----------|
| `id` | bigint | 单元 ID | 关联 `game_id` |
| `cn_name` | varchar | 中文名称 | |
| `en_name` | varchar | 英文名称 | |
| `game_code` | varchar | 游戏编码 | |
| `game_category` | tinyint | 游戏类型 | 1=改编，2=原创 |
| `season_package_id` | bigint | 季度包 ID | 关联 `vala_game_season_package.id` |
| `index` | int | 排序 | UnitIndex = (SeasonOfQuarter-1)×12 + Index |
| `level_type` | tinyint | 展开类型 | 1=顺序展开，2=触发式展开 |
| `is_hide` | tinyint | 是否隐藏 | 0=不隐藏，1=隐藏 |
| `is_ready` | tinyint | 是否就绪 | |
| `desc` | text | 简介 | |
| `plot_card_config` | text | 剧情卡配置 JSON | |
| `created_at` | datetime | 创建时间 | |
| `updated_at` | datetime | 更新时间 | |
| `deleted_at` | datetime | 删除时间 | |

---

### 📦 vala_game_chapter（游戏关卡/课时表）

| 字段 | 类型 | 释义 | 计算说明 |
|------|------|------|----------|
| `id` | bigint | 课时 ID | 即 `chapter_id` |
| `game_id` | bigint | 所属单元 ID | JOIN `vala_game_info.id` |
| `season_package_id` | bigint | 季度包 ID | |
| `cn_name` | varchar | 中文名称 | |
| `en_name` | varchar | 英文名称 | |
| `scene_id` | varchar | 关联场景 ID | |
| `index` | smallint | 排序 | 每单元 5 节课：1~5 → L01~L05 |
| `lesson_type` | tinyint | 课程类型 | 1=主线，2=支线 |
| `desc` | text | 简介 | |
| `learn_config` | text | 思路学习内容 JSON | |
| `created_at` | datetime | 创建时间 | |
| `updated_at` | datetime | 更新时间 | |
| `deleted_at` | datetime | 删除时间 | |

**课程结构公式**：
```
ChapterIndex = UnitIndex × 5 + Chapter.Index
UnitIndex = (SeasonOfQuarter - 1) × 12 + GameInfo.Index
```

---

### 📦 vala_game_season_package（赛季包表）

| 字段 | 类型 | 释义 | 计算说明 |
|------|------|------|----------|
| `id` | bigint | 赛季包 ID | |
| `cn_name` | varchar | 中文名称 | |
| `en_name` | varchar | 英文名称 | |
| `level` | char | 难度等级 | L1 / L2 |
| `season_of_year` | int | 年份 | |
| `season_of_quarter` | int | 季度 | 1/2/3/4 |
| `is_hide` | tinyint | 是否隐藏 | |
| `is_ready` | tinyint | 是否就绪 | |
| `index` | int | 排序 | |
| `created_at` | datetime | 创建时间 | |
| `updated_at` | datetime | 更新时间 | |
| `deleted_at` | datetime | 删除时间 | |

**课程结构层级**：
```
CourseLevel (L1/L2)
  └─ SeasonPackage (S0 / S1 / S2 / S3 / S4)
       └─ GameInfo (Unit, 每季 12 个)
            └─ GameChapter (Lesson, 每单元 5 个)
```

---

### 📦 unit_challenge_question（挑战题目配置表）

| 字段 | 类型 | 释义 | 计算说明 |
|------|------|------|----------|
| `id` | bigint | 主键 | |
| `category` | varchar | 挑战科目 | listening/speaking/reading/writing |
| `type` | varchar | 题目类型 | |
| `question_set_id` | varchar | 题目集 ID | |
| `question_content` | text | 题目配置 JSON | |
| `material_list` | text | 材料列表 | |
| `related_path` | text | 组件关联路径 | |
| `created_at` | datetime | 创建时间 | |
| `updated_at` | datetime | 更新时间 | |
| `deleted_at` | datetime | 删除时间 | |

---

## 四、MySQL `vala_user` 库（行为源表）

### 📦 vala_user_learn_record（用户学习记录表）

| 字段 | 类型 | 释义 |
|------|------|------|
| `id` | bigint | 主键 |
| `user_id` | bigint | 角色 ID |
| `game_id` | bigint | 故事 ID |
| `chapter_id` | bigint | 关卡/课时 ID |
| `component_type` | bigint | 组件类型 |
| `sub_component_type` | bigint | 组件子类型 |
| `component_id` | bigint | 组件 ID |
| `card_content` | text | 知识卡详情 JSON |
| `is_new` | tinyint | 是否新数据（0/1） |
| `created_at` | datetime | 创建时间 |
| `updated_at` | datetime | 更新时间 |
| `deleted_at` | datetime | 删除时间 |

---

### 📦 vala_user_chapter_finish_record（课时完成记录表）

| 字段 | 类型 | 释义 |
|------|------|------|
| `id` | bigint | 主键 |
| `user_id` | bigint | 角色 ID |
| `game_id` | bigint | 游戏 ID |
| `chapter_id` | bigint | 关卡/课时 ID |
| `created_at` | datetime | 首次完成时间 |
| `updated_at` | datetime | 更新时间 |
| `deleted_at` | datetime | 删除时间 |

---

### 📦 vala_user_interact_log（用户互动日志表）

| 字段 | 类型 | 释义 |
|------|------|------|
| `id` | bigint | 主键 |
| `user_id` | bigint | 角色 ID |
| `npc_id` | bigint | NPC ID |
| `session_id` | varchar | 会话 ID |
| `component_type` | tinyint | 互动类型（1=knowledge_QA） |
| `relation_type` | tinyint | 好友关系类型（1~5） |
| `summary` | text | 对话总结 |
| `dialog_list` | text | 对话详情 JSON |
| `dialog_score` | text | 对话得分汇总 |
| `tencent_soe` | text | 腾讯云语音评测 |
| `chat_review_resp` | text | 回顾学习数据 |
| `cost_time` | int | 耗时（秒） |
| `favor_value` | int | 好感度值 |
| `created_at` | datetime | 创建时间 |
| `updated_at` | datetime | 更新时间 |
| `deleted_at` | datetime | 删除时间 |

---

### 📦 vala_user_game_finish_record（游戏完成记录表）

| 字段 | 类型 | 释义 |
|------|------|------|
| `id` | int | 主键 |
| `user_id` | bigint | 角色 ID |
| `game_id` | bigint | 故事 ID |
| `chapter_id` | bigint | 关卡 ID |
| `score` | float | 总得分 |
| `score_level` | char | 得分等级 |
| `unique_code` | varchar | 唯一校验码 |
| `source_type` | tinyint | 来源类型（1=APP，2=小程序） |
| `created_at` | datetime | 创建时间 |
| `updated_at` | datetime | 更新时间 |
| `deleted_at` | timestamp | 删除时间 |

---

### 📦 vala_user_long_term_memory（用户长期记忆表）

| 字段 | 类型 | 释义 |
|------|------|------|
| `id` | bigint | 主键 |
| `user_id` | int | 角色 ID |
| `npc_id` | int | NPC 角色 ID |
| `robot_id` | int | 机器人 ID |
| `session_id` | varchar | 会话 ID |
| `memory_type` | varchar | 记忆类型 |
| `sub_type` | varchar | 来源子类型 |
| `source` | varchar | 来源 |
| `source_type` | varchar | 来源类型 |
| `user_content` | text | 用户内容 |
| `system_content` | text | 系统内容 |
| `created_at` | datetime | 创建时间 |
| `updated_at` | datetime | 更新时间 |
| `deleted_at` | datetime | 删除时间 |

---

## 五、MySQL `vala_order` 库

### 📦 vala_seasonal_ticket（季度券 MySQL 源表）

| 字段 | 类型 | 释义 |
|------|------|------|
| `id` | bigint | 主键 |
| `unique_code` | varchar | 季度券唯一码 |
| `account_id` | bigint | 账户 ID |
| `account_name` | varchar | 账户名 |
| `tel` | varchar | 手机号 |
| `give_time` | int | 发放时间戳 |
| `expire_time` | int | 到期时间戳 |
| `expire_type` | tinyint | 有效期类型 | 1=1个月 2=3个月 3=6个月 4=1年 5=3年 |
| `ticket_type` | tinyint | 券类型 | 1=Season Pass，2=Season Copy |
| `used_time` | int | 使用时间戳 |
| `season_package_id` | bigint | 赛季包 ID |
| `season_package_name` | varchar | 赛季包名称 |
| `status` | tinyint | 状态 | 0=未使用，1=已使用，-1=禁用 |
| `created_at` | datetime | 创建时间 |
| `updated_at` | datetime | 更新时间 |
| `deleted_at` | datetime | 删除时间 |
