# 变更审计记录：助教等级映射硬编码修复（P2-9）

| 字段 | 值 |
|------|-----|
| 日期 | 2026-03-19 |
| 关联问题 | P2-9（RNS1 系列审计遗留项） |
| 违反规则 | feiqiu-data-rules 规则 6：等级名称禁止硬编码 |

## 操作摘要

`fdw_queries.py` 中两处 `_level_map = {1: "junior", 2: "middle", 3: "senior", 4: "star"}` 硬编码存在双重问题：
1. 违反 feiqiu-data-rules 规则 6（等级必须从配置表读取）
2. 映射值域完全错误——`v_dim_assistant.level` 实际值为 8/10/20/30/40，硬编码的 1/2/3/4 永远匹配不上，所有助教的 level 字段始终返回空字符串

## 改动方案

### 新增函数
- `get_level_map(conn, site_id)` — 从 `app.v_cfg_assistant_level_price` 动态读取 `level_code → level_name` 映射，查询失败返回空 dict

### 修改函数
- `get_assistant_info()` — 删除硬编码 `_level_map`，改用 `get_level_map()` 动态查询
- `get_all_assistants()` — 同上

### 验证
- 配置表实际数据：`{8: "助教管理", 10: "初级", 20: "中级", 30: "高级", 40: "星级"}`
- `v_dim_assistant.level` 实际值域：8(1), 10(35), 20(34), 30(6), 40(4)

## 影响范围

| 接口 | 影响 |
|------|------|
| BOARD-1 助教看板 | `get_all_assistants()` 返回的 level 从空字符串变为中文等级名 |
| COACH-1 助教详情 | `get_assistant_info()` 返回的 level 从空字符串变为中文等级名 |
| 前端 | 需确认前端是否依赖英文 level 值（junior/middle/senior/star）做逻辑判断 |

## 风险评估

- 风险等级：低
- level 字段之前始终返回空字符串（映射不上），现在返回中文名称，是功能修正而非破坏性变更
- 降级机制：配置表查询失败返回空 dict，level 字段回退为空字符串（与修复前行为一致）

## 文件清单

| 文件 | 操作 |
|------|------|
| `apps/backend/app/services/fdw_queries.py` | 修改（新增 `get_level_map()`，修改 2 处调用） |
| `docs/audit/changes/2026-03-19__level-map-hardcode-fix.md` | 新增（本文件） |
