# 手机号 → 账号ID → 角色ID 检索方法

> ⚠️ 本文为脱敏参考版。凭证已移至 `~/.hermes/.env`，数据库字典见 `data_dict/vala_user.md`。

## 数据关系

```
手机号 (明文)
  │  XXTEA 加密
  ▼
tel_encrypt (密文)          account_id
  │                           │
  ▼                           ▼
vala_app_account ──────────► vala_app_character
  (账号表)       1:N 关联       (角色表)
```

- **一个账号** (`vala_app_account`) 可以有 **多个角色** (`vala_app_character`)
- 关联字段：`vala_app_character.account_id = vala_app_account.id`

## 数据库

| 项目 | 值 |
|------|-----|
| 数据库 | MySQL 线上环境 |
| 库名 | `vala_user` |
| 用户 | `read_only` |

> 具体连接信息从 `~/.hermes/.env` 读取。

## 表结构

### vala_app_account（账号表）

| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint | 账号ID（主键） |
| `tel` | varchar(20) | 手机号（脱敏显示，如 `158****7007`） |
| `tel_encrypt` | varchar(100) | 手机号密文（用于精确匹配） |

### vala_app_character（角色表）

| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | bigint | 角色ID（主键） |
| `account_id` | bigint | 所属账号ID |
| `nickname` | varchar(20) | 角色昵称 |
| `gender` | tinyint(1) | 性别 |
| `birthday` | varchar(50) | 生日 |
| `purchase_season_package` | text | 已购赛季包 |

## 手机号加密方式

手机号在数据库中以密文存储，加密算法为 **XXTEA + Base64 URL-safe**。

密钥从 `~/.hermes/.env` → `VALA_PHONE_XXTEA_KEY` 读取。

## 查询步骤

### 步骤 1：加密手机号

```bash
python3 business_knowledge/scripts/phone_encrypt.py encrypt 15849377007
```

### 步骤 2：用密文查询账号和角色

```sql
SELECT 
    a.id AS account_id,
    a.tel,
    c.id AS character_id,
    c.nickname,
    c.gender,
    c.birthday,
    c.purchase_season_package,
    c.created_at
FROM vala_app_account a
LEFT JOIN vala_app_character c ON c.account_id = a.id
WHERE a.tel_encrypt = '<密文>';
```

### 步骤 3：解读结果

```
account_id  tel          character_id  nickname  gender  birthday    purchase_season_package
18279       158****7007  23600         Morris    1       2021-09-09  [16,17,18,19,20]
18279       158****7007  23686         Nathan    1       2018-03-13  [16]
```

- **账号ID**: 18279
- **角色**: 23600 (Morris)、23686 (Nathan)
- 一个账号下可能有多个角色（一个孩子一个角色）

## 注意事项

1. **tel 字段是脱敏的**（如 `158****7007`），不能直接用于精确匹配
2. **必须用 tel_encrypt 密文匹配**，密文由 XXTEA 加密生成
3. **一个账号可以有多个角色**，查询结果可能返回多行
4. 测试环境和线上环境的 `tel_encrypt` 值相同（加密算法一致）
