# 变更审计记录(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 展示