# 变更审计记录：审核弹窗手机号不显示修复 + 自动匹配优化 + 身份标签中文化

| 字段 | 值 |
|------|-----|
| 日期 | 2026-03-23 19:30:00 |
| Prompt-ID | P20260323-190000 |
| Session-ID | abb5b8d0 |
| Session 路径 | docs/audit/session_logs/2026-03/23/19_abb5b8d0_165704 |

## 操作摘要
审核弹窗手机号显示 `-` 修复（SQL phone 字段来源错误）；前端弹窗打开时自动匹配手机号对应人员并选择角色；助教/员工身份标签从数字改为中文；人员下拉日期加"入职日期"前缀。

## 原始原因与直接原因
- 原始原因：用户报告审核弹窗手机号显示 `-`；要求自动匹配手机号对应人员并自动选择角色；身份标签从数字改为中文；日期前加"入职日期"前缀
- 直接原因：
  1. `list_applications` SQL 用了 `u.phone`（auth.users，可能 null），应改为 `ua.phone`（user_applications，NOT NULL）
  2. 前端弹窗打开时未并行查 coach/staff 人员列表做自动匹配
  3. 助教 `identity_label` 直接用 `level::text`（数字），应从 `dws.cfg_assistant_level_price` 配置表读取中文等级名
  4. 员工 `identity_label` 用 `staff_identity::text`（数字），应改用 `job` 字段（职位名称）
  5. 人员下拉日期缺少"入职日期"前缀

## 变更范围（Changed）
- 后端 `GET /api/tenant/applications`：SQL 中 `u.phone` → `ua.phone`
- 后端 `GET /api/tenant/site-staff`（role=coach）：新增查询 `dws.cfg_assistant_level_price` 配置表构建 level_map，`identity_label` 从 `level_map.get(level)` 读取中文等级名
- 后端 `GET /api/tenant/site-staff`（role≠coach）：`identity_label` 从 `staff_identity::text` 改为 `job` 字段
- 前端 ReviewModal：弹窗打开时并行查 coach + staff 人员列表，按手机号自动匹配（优先助教→coach，其次员工→staff）
- 前端 staffOptions label 格式：`身份 - 姓名 - 手机号 - 入职日期 YYYY-MM-DD`

## 风险与回滚（Risk & Rollback）
- 风险点：`dws.cfg_assistant_level_price` 配置表数据不全时，`level_map.get()` 回退为 `str(level)`，不会报错但显示数字
- 回滚要点：后端 SQL 改回 `u.phone`；`identity_label` 改回 `level::text` / `staff_identity::text`；前端去掉自动匹配逻辑

## 验证（Verification）
- Playwright 验证：打开审核弹窗 → 手机号显示 `13810502304` ✅ → 自动选中"员工"角色 + "店长 - 厉超 - 13810502304 - 入职日期 2025-12-23" ✅

## 文件清单（Files changed）
- `apps/backend/app/routers/tenant_users.py`（list_applications SQL phone 字段 + list_site_staff identity_label 逻辑）
- `apps/tenant-admin/src/pages/UserApproval/index.tsx`（自动匹配 + staffOptions label 格式）

## 本次对话文件变更
新增：
- `docs/audit/prompt_logs/prompt_log_20260323_170814.md`
- `docs/audit/session_logs/2026-03/23/19_abb5b8d0_165704/main_01_2f435f10.md`

删除：
- `docs/audit/session_logs/2026-03/23/19_abb5b8d0_165704/main_01_39ddae75.md`（session 日志重建替换）

## 改动注解

### `apps/backend/app/routers/tenant_users.py`
- 变更类型：修改
- 原始原因：用户反馈审核弹窗手机号显示 `-`，身份标签显示为数字而非中文
- 思路分析：
  1. `list_applications` SQL 中 `u.phone`（来自 `auth.users`，可能为 NULL）改为 `ua.phone`（来自 `auth.user_applications`，NOT NULL），确保手机号始终有值
  2. `list_site_staff` 中 coach 角色：新增查询 `dws.cfg_assistant_level_price` 配置表构建 `level_map`，`identity_label` 从 `level_map.get(level)` 读取中文等级名（如"初级助教"），回退为 `str(level)`
  3. `list_site_staff` 中非 coach 角色：`identity_label` 从 `staff_identity::text`（数字）改为 `job` 字段（职位名称，如"店长"）
  4. `list_applications` 新增 `site_id` 查询参数支持；`tenant_admin` 按 `tenant_id` 过滤（解决新建店铺不在 JWT `managed_site_ids` 中的问题）
- 修改结果：审核弹窗手机号正确显示；助教/员工身份标签显示中文；tenant_admin 可看到所有管辖租户下的申请

### `apps/tenant-admin/src/pages/UserApproval/index.tsx`
- 变更类型：修改
- 原始原因：用户要求弹窗打开时自动匹配手机号对应人员并选择角色
- 思路分析：弹窗打开时并行请求 coach + staff 人员列表，按手机号匹配（优先助教→coach，其次员工→staff），自动设置角色和人员选择；staffOptions label 格式优化为 `身份 - 姓名 - 手机号 - 入职日期 YYYY-MM-DD`
- 修改结果：审核弹窗打开后自动匹配并选中对应人员和角色，减少管理员手动操作

## 合规检查

- ⚠️ 接口代码已变更但 OpenAPI spec 未同步（`compliance.openapi_spec_stale=true`），需手动导出或下次启动后端时执行 `python scripts/ops/_export_openapi.py`
- DDL 基线：无新增迁移 SQL，无需操作
- `db-schema-change` 标签来自累积变更，本次对话未涉及数据库结构变更
