# 变更审计记录（Change Audit Record）

- 日期/时间（Asia/Shanghai）：2026-03-25 22:30:00
- Prompt-ID：task-detail-svc-records-6
- 原始原因（Prompt）：60天内服务记录改：台桌显示名称、时长xx.xh格式、酒水商品明细、预估规则、电话隐藏格式、AI文案字段
- 直接原因：任务详情页服务记录区域需要展示更丰富的信息（台桌名、酒水明细、助教到手收入），并统一格式规范（时长h后缀、电话脱敏、预估标记）

## 变更范围（Changed）

- 后端 FDW 查询：`get_service_records_for_task()` SQL 重写，新增 3 个 LEFT JOIN（dim_table、settlement_head、store_goods_sale LATERAL 聚合）
- 后端任务详情：`get_task_detail()` 新增 60 天统计窗口（total_hours_60d / total_income_60d / count_60d）、预估规则（当月且 day ≤ 5）
- 前端 WXS：新增 `maskPhone()` 函数、`hoursH()` 已有
- 前端 WXML：task-detail 页电话脱敏、AI 文案动态绑定、统计区 hoursH 格式；service-record-card 组件 hoursH 格式 + drinks 字段展示
- 收入口径：从 `ledger_amount` 改为 `assistant_pd_money + assistant_cx_money`（助教到手，符合 feiqiu-data-rules 规则2）

## 风险与回滚（Risk & Rollback）

- 风险点：
  - LATERAL 子查询在 order_settle_id 无商品记录时返回 NULL（已用 COALESCE 兜底为空字符串）
  - settlement_head JOIN 可能因 order_settle_id 为空导致 income=0（与实际无结算一致，可接受）
  - 预估规则依赖服务器时间 `date.today()`，跨时区部署需注意
- 回滚要点：
  - 后端：`fdw_queries.py` 恢复原 SQL（去掉 3 个 LEFT JOIN，SELECT 改回 ledger_amount）
  - 后端：`task_manager.py` 恢复原统计逻辑（去掉 cutoff_60d / is_estimate_month 分支）
  - 前端：WXML 恢复 `fmt.hours()` 和硬编码电话/AI文案

## 验证（Verification）

- SQL 验证：通过 MCP pg-app-test 执行 `get_service_records_for_task` 等效 SQL，确认台桌名（S1/A6/S3/A18/M4）、收入口径（pd_money+cx_money）、酒水明细（东方树叶×2、地道肠×2、椰汁×1）均正确
- getDiagnostics：7 个文件零错误
- 联调验证：小程序开发者工具打开任务详情页，确认服务记录卡片展示台桌名、Nh 时长、酒水明细、到手金额、预估标记、电话脱敏

## 文件清单（Files changed）

- `apps/backend/app/services/fdw_queries.py` — get_service_records_for_task SQL 重写（+dim_table +settlement_head +store_goods_sale LATERAL）
- `apps/backend/app/services/task_manager.py` — get_task_detail 60天统计窗口 + 预估规则
- `apps/miniprogram/miniprogram/utils/format.wxs` — 新增 maskPhone() 函数
- `apps/miniprogram/miniprogram/pages/task-detail/task-detail.wxml` — 电话脱敏、AI文案动态绑定、统计区 hoursH
- `apps/miniprogram/miniprogram/pages/task-detail/task-detail.ts` — loadByMember await 修复（前序 TASK-3 遗留）
- `apps/miniprogram/miniprogram/components/service-record-card/service-record-card.wxml` — hoursH 格式 + drinks 展示
