# 变更审计记录:审核弹窗手机号不显示修复 + 自动匹配优化 + 身份标签中文化 | 字段 | 值 | |------|-----| | 日期 | 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` 标签来自累积变更,本次对话未涉及数据库结构变更