这些审计记录原本堆积在 docs/audit/changes/changes/ 嵌套误产物目录下(由开发机迁移
79d3c2e 前后的不明批量操作产生)。由于同期 .gitignore 屏蔽了 docs/audit/ 全目录,
它们从未入过 git 任何分支 history。删除即永久丢失。
按 docs/specs/audit-gap-recovery/tasks.md 阶段 1 执行,将全部 96 份 D 类孤本
(主目录无同名、git history 亦无记录)复制到 docs/audit/changes/ 主目录入仓。
涵盖主题: P1-P18 全栈集成 / 多模块累积变更 / ETL bug 修复 / 业务日切 /
召回与任务引擎改造 / 租户管理与审批 / 董事会财务 / 客户与助教详情 /
DDL 基线合并 / Kiro 到 Claude Code 迁移
阶段 2(B 类内容漂移 1 份)和阶段 4(嵌套目录删除)独立推进。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
71 lines
4.9 KiB
Markdown
71 lines
4.9 KiB
Markdown
# 变更审计记录:审核弹窗手机号不显示修复 + 自动匹配优化 + 身份标签中文化
|
||
|
||
| 字段 | 值 |
|
||
|------|-----|
|
||
| 日期 | 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` 标签来自累积变更,本次对话未涉及数据库结构变更
|