Files
Neo-ZQYY/docs/audit/changes/2026-03-19__coach-tier-hardcode-fix.md
Neo 14a12342b5 chore(audit): 补追 96 份未入仓审计孤本 — 覆盖 2026-02-26 ~ 2026-04-08
这些审计记录原本堆积在 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>
2026-04-20 06:35:42 +08:00

56 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 变更审计记录coach_service 绩效档位硬编码修复
| 字段 | 值 |
|------|-----|
| 日期 | 2026-03-19 16:45:10 |
| Prompt-ID | P20260319-163903 |
| Session-ID | 4782a6d3 |
| Session 路径 | docs/audit/session_logs/2026-03/19/43_4782a6d3_162502 |
## 操作摘要
RNS1 全系列 SPEC 审计发现 `coach_service.py``DEFAULT_TIER_NODES` 硬编码 `[0, 100, 130, 160, 190, 220]` 违反 feiqiu-data-rules 规则 6绩效档位禁止硬编码。配置表 `cfg_performance_tier` 实际有效值为 `[0, 120, 150, 180, 210]`,两者完全不一致。本次修复删除硬编码常量,改为从配置表动态读取,并修复 `perf_target` 推算逻辑。
## 本次对话文件变更
### 新增文件
- `docs/audit/prompt_logs/prompt_log_20260319_163903.md`
- `docs/audit/session_logs/2026-03/19/43_4782a6d3_162502/main_01_bab93fd1.md`
### 删除文件
- `docs/audit/session_logs/2026-03/19/43_4782a6d3_162502/main_01_48b374db.md`
## 风险评估
- **风险等级**:低
- `_FALLBACK_TIER_NODES` 作为降级保底,配置表查询失败不会导致崩溃
- `perf_target` 推算逻辑简单:找到第一个大于当前工时的 tier 节点
- 影响范围仅限 `coach_service.get_coach_detail()` 接口返回的 `tierNodes``perf_target` 字段
## 合规检查
| 检查项 | 状态 |
|--------|------|
| 新增迁移 SQL | 无 |
| DDL 基线更新 | 不适用 |
| OpenAPI spec 同步 | 不适用(`api_changed: false` |
| BD 手册更新 | 不适用(无 DB schema 变更,仅读取已有配置表) |
| 文档同步 | `code_without_docs` 为空,无缺失 |
## 改动注解
### `apps/backend/app/services/coach_service.py`
- 变更类型:修改
- 原始原因:`DEFAULT_TIER_NODES` 硬编码 `[0, 100, 130, 160, 190, 220]` 违反 feiqiu-data-rules 规则 6且与配置表实际值 `[0, 120, 150, 180, 210]` 完全不一致,导致前端展示的绩效档位与实际业务规则脱节
- 思路分析:
1. 删除 `DEFAULT_TIER_NODES` 硬编码常量,替换为 `_FALLBACK_TIER_NODES`(值更新为与配置表一致的 `[0, 120, 150, 180, 210]`),仅在配置表查询失败时作为降级使用
2. `_build_tier_nodes()` 签名从 `(salary_data: dict)` 改为 `(conn, site_id)`,内部调用 `fdw_queries.get_performance_tiers()``app.v_cfg_performance_tier` 视图读取当前有效档位
3. `get_coach_detail()``perf_target``salary_this.get("next_tier_hours", 0.0)`(总是返回 0改为根据 `tier_nodes` 和当前工时动态推算下一档目标
- 修改结果:绩效档位数据源从硬编码切换为配置表驱动,符合 feiqiu-data-rules 规则 6`perf_target` 能正确反映下一档目标工时;降级机制确保配置表不可用时不崩溃
### `apps/backend/app/services/fdw_queries.py`
- 变更类型:修改
- 原始原因:配合 `coach_service.py` 的档位读取改造,需要更新 `get_salary_calc()` 中关于 `tier_nodes` 的注释说明
- 思路分析:`get_salary_calc()` 返回的 `tier_nodes` 字段改为空数组,注释明确说明"由 `coach_service._build_tier_nodes()``cfg_performance_tier` 读取",职责分离清晰
- 修改结果:`fdw_queries` 不再承担档位数据的传递职责,`get_performance_tiers()` 函数(上一个 session 已创建)作为独立查询入口供 `coach_service` 调用