# 需求文档 — RNS1.0：基础设施与契约重写

## 简介

RNS1.0 是 NS1 小程序后端 API 补全项目的第一个子 spec，负责建立全局基础设施（响应包装、camelCase 转换）、修正路由路径、适配前端解包逻辑、完全重写 API 契约响应定义、以及修复前端跨页面参数传递问题。本 spec 阻塞所有后续子 spec（RNS1.1-1.4），必须最先完成。

### 来源文档

- `docs/prd/Neo_Specs/RNS1-split-plan.md` — 拆分计划主文档
- `docs/prd/Neo_Specs/NS1-xcx-backend-api.md` — NS1 原始 spec（含八½前置审查决策 R1-R8）
- `docs/prd/Neo_Specs/storyboard-walkthrough-assistant-view.md` — 助教视角走查报告（51 Gap）
- `docs/prd/Neo_Specs/miniprogram-storyboard-walkthrough-gaps.md` — 管理层视角走查报告（31 Gap）

## 术语表

- **Response_Wrapper**：全局响应包装中间件，将 FastAPI 路由返回值统一封装为 `{ code: 0, data: ... }` 格式
- **Exception_Handler**：全局异常处理器，将 HTTPException 和未捕获异常统一封装为 `{ code: <status_code>, message: <detail> }` 格式
- **CamelCase_Converter**：Pydantic schema 的 `alias_generator=to_camel` 配置，使 JSON 响应字段名从 snake_case 转为 camelCase
- **API_Contract**：`docs/miniprogram-dev/API-contract.md`，定义前后端接口的请求/响应格式基准文档
- **Frontend_Unpacker**：前端 `services/api.ts` 中 `request()` 工具函数的 `.data` 解包逻辑，从全局包装中提取业务数据
- **Backend**：FastAPI 后端应用，位于 `apps/backend/`
- **Miniprogram**：微信小程序前端应用，位于 `apps/miniprogram/`
- **FDW**：PostgreSQL Foreign Data Wrapper，用于从业务库 `zqyy_app` 访问 ETL 库 `etl_feiqiu` 的数据
- **DateGroup**：按日期分组的数据结构，包含日期标签、当日汇总、记录列表
- **DWD-DOC**：`docs/reports/DWD-DOC/` 标杆文档，金额口径和字段语义的权威参考
- **items_sum**：DWD-DOC 强制使用的消费金额口径，= `table_charge_money + goods_money + assistant_pd_money + assistant_cx_money + electricity_money`
- **环比**：月环比，当期值与上一个相同时间周期的对比百分比

## 需求

### 需求 1：全局响应包装中间件（T0-1）

**用户故事：** 作为后端开发者，我希望所有 API 响应自动包装为统一格式，以便前端可以用一致的方式解析成功和错误响应。

#### 验收标准

1. THE Response_Wrapper SHALL 将所有成功响应（HTTP 2xx）封装为 `{ "code": 0, "data": <原始响应体> }` 格式
2. THE Exception_Handler SHALL 将 HTTPException 封装为 `{ "code": <HTTP状态码>, "message": <错误详情> }` 格式
3. THE Exception_Handler SHALL 将未捕获的服务端异常封装为 `{ "code": 500, "message": "Internal Server Error" }` 格式，同时将完整异常堆栈写入服务端日志
4. WHEN 已有接口（Auth、Tasks、Notes、AI Chat 共 16 个端点）返回响应时，THE Response_Wrapper SHALL 对这些接口同样生效，保持向后兼容
5. WHEN 响应内容类型为 `text/event-stream`（SSE 流式端点）时，THE Response_Wrapper SHALL 跳过包装，直接透传原始响应
6. WHEN 响应内容类型为非 JSON 格式（如文件下载）时，THE Response_Wrapper SHALL 跳过包装，直接透传原始响应


### 需求 2：Pydantic Schema 统一 camelCase 输出（T0-2）

**用户故事：** 作为前端开发者，我希望后端 API 响应的 JSON 字段名统一为 camelCase 格式，以便前端无需手动转换 snake_case 字段。

#### 验收标准

1. THE CamelCase_Converter SHALL 为所有 Pydantic 响应 schema 配置 `alias_generator=to_camel` 和 `populate_by_name=True`
2. WHEN Backend 返回 JSON 响应时，THE CamelCase_Converter SHALL 将所有字段名从 snake_case 转换为 camelCase（例如 `user_id` → `userId`，`store_name` → `storeName`）
3. THE CamelCase_Converter SHALL 同时应用于所有现有 schema（Auth、Tasks、Notes、AI Chat 模块）和所有新增 schema
4. WHEN Backend 接收请求体时，THE CamelCase_Converter SHALL 同时接受 camelCase 和 snake_case 格式的字段名（通过 `populate_by_name=True` 实现）

### 需求 3：后端路由路径修正（T0-3）

**用户故事：** 作为前端开发者，我希望后端任务恢复端点的路径与 API 契约和前端调用一致，以便联调时不会因路径不匹配而失败。

#### 验收标准

1. THE Backend SHALL 将 `POST /api/xcx/tasks/{taskId}/cancel-abandon` 端点的路径修改为 `POST /api/xcx/tasks/{taskId}/restore`
2. WHEN 前端调用 `POST /api/xcx/tasks/{taskId}/restore` 时，THE Backend SHALL 执行与原 `/cancel-abandon` 端点相同的业务逻辑（将任务状态从 `abandoned` 恢复为 `pending`）
3. THE Backend SHALL 移除原 `/cancel-abandon` 路径，不保留旧路径的兼容映射

### 需求 4：前端请求工具函数适配全局包装（T0-4）

**用户故事：** 作为前端开发者，我希望 `request()` 工具函数自动从全局包装中提取业务数据，以便各页面调用 API 后无需手动解包。

#### 验收标准

1. THE Frontend_Unpacker SHALL 在 `services/api.ts` 的 `request()` 函数中，对成功响应自动提取 `.data` 字段并返回给调用方
2. WHEN 响应的 `code` 字段不为 0 时，THE Frontend_Unpacker SHALL 抛出包含 `code` 和 `message` 的错误对象，供调用方的 catch 块处理
3. WHEN 响应不包含 `code` 字段（非标准格式，如 SSE 流式响应）时，THE Frontend_Unpacker SHALL 直接返回原始响应体，不做解包处理
4. THE Frontend_Unpacker SHALL 确保所有现有 API 调用（Auth、Tasks、Notes、AI Chat）在解包后行为不变


### 需求 5：API 契约完全重写（T0-5）

**用户故事：** 作为前后端开发者，我希望 API 契约文档准确反映前端实际需要的响应结构，以便后续子 spec（RNS1.1-1.4）的后端实现有明确的、与前端一致的接口定义作为基准。

#### 5.1 BOARD-3 财务看板契约重写

##### 验收标准

1. THE API_Contract SHALL 将 BOARD-3 响应从扁平 `metrics` 数组重写为 6 个独立板块的嵌套结构：`overview`（经营一览）、`recharge`（预收资产）、`revenue`（应计收入确认）、`cashflow`（现金流入）、`expense`（现金流出）、`coachAnalysis`（助教分析）
2. THE API_Contract SHALL 为 `overview` 板块定义 8 个指标字段（`occurrence`/`discount`/`discountRate`/`confirmedRevenue`/`cashIn`/`cashOut`/`cashBalance`/`balanceRate`），每个指标附带对应的环比字段（`xxxCompare: string`）和方向标记（`isDown: boolean`、`isFlat: boolean`）
3. THE API_Contract SHALL 为 `recharge` 板块定义储值卡 5 个指标（`actualIncome`/`firstCharge`/`renewCharge`/`consumed`/`cardBalance`）及各自环比字段，以及赠送卡 3×4 矩阵（行：新增/消费/余额，列：合计/酒水卡/台费卡/抵用券），每个单元格含值和环比字段，以及全类别会员卡余额合计（`allCardBalance`）及环比
4. THE API_Contract SHALL 为 `revenue` 板块定义收入结构表（`structureRows`：9 行含子行标记 `isSub`，每行含 `name`/`desc`/`amount`/`discount`/`booked`/`bookedCompare`）、正价明细（`priceItems`：4 项）、优惠明细（`discountItems`：4 项）、渠道明细（`channelItems`：3 项），以及确认收入合计及环比
5. THE API_Contract SHALL 为 `cashflow` 板块定义消费收款（`consumeItems`：3 项）、充值收款（`rechargeItems`：1 项）、合计及环比，每项含 `name`/`desc`/`value`/`compare`/`isDown`
6. THE API_Contract SHALL 为 `expense` 板块定义 4 个子分组：经营支出（`operationItems`：3 项）、固定支出（`fixedItems`：4 项）、助教分成（`coachItems`：4 项）、平台服务费（`platformItems`：3 项），以及合计及环比
7. THE API_Contract SHALL 为 `coachAnalysis` 板块定义基础课（`basic`）和激励课（`incentive`）两个子表，每个子表含汇总行（`totalPay`/`totalShare`/`avgHourly` 及各自环比）和按等级分行的数组（`rows`：初级/中级/高级/星级，每行含 `level`/`pay`/`payCompare`/`share`/`shareCompare`/`hourly`/`hourlyCompare` 及 `payDown`/`shareDown`/`hourlyFlat` 布尔标记）
8. THE API_Contract SHALL 为 BOARD-3 定义请求参数：`time`（8 种时间范围枚举：`month`/`lastMonth`/`week`/`lastWeek`/`quarter3`/`quarter`/`lastQuarter`/`half6`）、`area`（7 种区域枚举：`all`/`hall`/`hallA`/`hallB`/`hallC`/`mahjong`/`teamBuilding`）、`compare`（`0`/`1`，控制是否返回环比数据）
9. WHEN `area` 不为 `all` 时，THE API_Contract SHALL 标注 `recharge`（预收资产）板块不返回数据（储值卡数据不按区域拆分）
10. THE API_Contract SHALL 标注所有金额字段使用 `items_sum` 口径（DWD-DOC 强制规则 1），助教费用使用 `assistant_pd_money` + `assistant_cx_money` 拆分（DWD-DOC 强制规则 2）

#### 5.2 BOARD-1 助教看板契约重写

##### 验收标准

1. THE API_Contract SHALL 将 BOARD-1 响应从 10 个通用字段扩展为包含基础字段和 4 维度专属字段的结构
2. THE API_Contract SHALL 为每个助教 item 定义基础字段：`id`/`name`/`initial`/`avatarGradient`/`level`/`skills`/`topCustomers`，其中 `skills` 类型为 `Array<{ text: string, cls: string }>`（含 emoji 和样式类），`topCustomers` 类型为 `string[]`（含 P6 AC3 四级 emoji 前缀，如 `'💖 王先生'`/`'🧡 李女士'`/`'💛 张先生'`/`'💙 赵女士'`）
3. THE API_Contract SHALL 为 `perf` 维度定义专属字段：`perfHours`（当期定档工时）、`perfHoursBefore`（上期定档工时，可选）、`perfGap`（距升档差距描述，可选）、`perfReached`（是否已达标）
4. THE API_Contract SHALL 为 `salary` 维度定义专属字段：`salary`（工资总额）、`salaryPerfHours`（定档工时）、`salaryPerfBefore`（上期定档工时，可选）
5. THE API_Contract SHALL 为 `sv` 维度定义专属字段：`svAmount`（客源储值总额）、`svCustomerCount`（储值客户数）、`svConsume`（储值消耗额）
6. THE API_Contract SHALL 为 `task` 维度定义专属字段：`taskRecall`（召回任务完成数）、`taskCallback`（回访任务完成数）
7. THE API_Contract SHALL 为 BOARD-1 定义请求参数：`sort`（6 种排序枚举：`perf_desc`/`perf_asc`/`salary_desc`/`salary_asc`/`sv_desc`/`task_desc`）、`skill`（5 种技能枚举：`all`/`chinese`/`snooker`/`mahjong`/`karaoke`）、`time`（6 种时间范围枚举：`month`/`quarter`/`last_month`/`last_3m`/`last_quarter`/`last_6m`）
8. THE API_Contract SHALL 标注交叉约束：`time=last_6m` 与 `sort=sv_desc` 不兼容，后端收到此组合时返回 HTTP 400

#### 5.3 BOARD-2 客户看板契约重写

##### 验收标准

1. THE API_Contract SHALL 将 BOARD-2 响应从 8 个通用字段扩展为包含基础字段和 8 维度专属字段的结构
2. THE API_Contract SHALL 为每个客户 item 定义基础字段：`id`/`name`/`initial`/`avatarCls`/`assistants`，其中 `assistants` 类型为 `Array<{ name: string, cls: string, heartScore: number, badge?: string, badgeCls?: string }>`，`heartScore` 范围 0-10，前端通过 heart-icon 组件按 P6 AC3 四级映射渲染（💖>8.5 / 🧡>7 / 💛>5 / 💙≤5）
3. THE API_Contract SHALL 为 `recall`（最应召回）维度定义专属字段：`idealDays`/`elapsedDays`/`overdueDays`/`visits30d`/`balance`/`recallIndex`
4. THE API_Contract SHALL 为 `potential`（最大消费潜力）维度定义专属字段：`potentialTags`（`Array<{ text: string, theme: string }>`）/`spend30d`/`avgVisits`/`avgSpend`
5. THE API_Contract SHALL 为 `balance`（最高余额）维度定义专属字段：`balance`/`lastVisit`/`monthlyConsume`/`availableMonths`
6. THE API_Contract SHALL 为 `recharge`（最近充值）维度定义专属字段：`lastRecharge`/`rechargeAmount`/`recharges60d`/`currentBalance`
7. THE API_Contract SHALL 为 `recent`（最近到店）维度定义专属字段：`daysAgo`/`visitFreq`/`idealDays`/`visits30d`/`avgSpend`
8. THE API_Contract SHALL 为 `spend60`（最高消费近60天）维度定义专属字段：`spend60d`/`visits60d`/`highSpendTag`/`avgSpend`
9. THE API_Contract SHALL 为 `freq60`（最频繁近60天）维度定义专属字段：`visits60d`/`avgInterval`/`weeklyVisits`（`Array<{ val: number, pct: number }>`，8 周柱状图数据）/`spend60d`
10. THE API_Contract SHALL 为 `loyal`（最专一近60天）维度定义专属字段：`intimacy`/`topCoachName`/`topCoachHeart`/`topCoachScore`/`coachName`/`coachRatio`/`coachDetails`（`Array<{ name, cls, heartScore, badge?, avgDuration, serviceCount, coachSpend, relationIdx }>`）
11. THE API_Contract SHALL 为 BOARD-2 定义请求参数：`dimension`（8 种维度枚举）、`project`（5 种项目枚举：`all`/`chinese`/`snooker`/`mahjong`/`karaoke`）、`page`（页码，默认 1）、`pageSize`（每页条数，默认 20）


#### 5.4 CUST-1 客户详情契约重写

##### 验收标准

1. THE API_Contract SHALL 为 CUST-1 响应补充客户 Banner 字段：`balance`（余额）、`consumption60d`（近60天消费）、`idealInterval`（理想到店间隔）、`daysSinceVisit`（距上次到店天数）
2. THE API_Contract SHALL 为 CUST-1 响应补充 `aiInsight` 模块：`summary`（AI 分析摘要，string）和 `strategies`（策略建议列表，`Array<{ color: string, text: string }>`），数据来源标注为 `biz.ai_cache`（`cache_type=app4_analysis`）
3. THE API_Contract SHALL 为 CUST-1 响应补充 `coachTasks` 模块（关联助教任务列表）：每个助教含 `name`/`level`/`levelColor`/`taskType`/`taskColor`/`bgClass`/`status`/`lastService`/`metrics`（`Array<{ label, value, color? }>`，含近60天次数/总时长/次均时长）
4. THE API_Contract SHALL 为 CUST-1 响应补充 `favoriteCoaches` 模块（最亲密助教）：每位助教含 `emoji`/`name`/`relationIndex`/`indexColor`/`bgClass`/`stats`（`Array<{ label, value, color? }>`，含基础课时/激励课时/上课次数/充值金额）
5. THE API_Contract SHALL 将 CUST-1 消费记录从扁平结构重写为嵌套结构：每条记录含 `id`/`type`（`table`/`shop`/`recharge` 枚举）/`date`/`tableName`/`startTime`/`endTime`/`duration`/`tableFee`/`tableOrigPrice`/`coaches`（`Array<{ name, level, levelColor, courseType, hours, perfHours?, fee }>`）/`foodAmount`/`foodOrigPrice`/`totalAmount`/`totalOrigPrice`/`payMethod`/`rechargeAmount`
6. THE API_Contract SHALL 为 CUST-1 响应补充 `notes` 模块（备注列表）：每条备注含 `id`/`tagLabel`/`createdAt`/`content`
7. THE API_Contract SHALL 标注会员信息获取规则：通过 `member_id` JOIN `dim_member` 获取手机号和昵称（DWD-DOC 强制规则 DQ-6），禁止直接使用 `settlement_head.member_phone`

#### 5.5 COACH-1 助教详情契约重写

##### 验收标准

1. THE API_Contract SHALL 为 COACH-1 响应补充基本信息字段：`workYears`（工龄）、`customerCount`（客户数）、`hireDate`（入职日期）
2. THE API_Contract SHALL 为 COACH-1 响应补充 `performance` 模块（6 个绩效指标）：`monthlyHours`/`monthlySalary`/`customerBalance`/`tasksCompleted`/`perfCurrent`/`perfTarget`
3. THE API_Contract SHALL 为 COACH-1 响应补充 `income` 模块（收入明细）：`thisMonth` 和 `lastMonth` 各含 4 项收入分类（基础课时费/激励课时费/充值提成/酒水提成），每项含 `label`/`amount`/`color`
4. THE API_Contract SHALL 为 COACH-1 响应补充 `tierNodes` 字段（档位节点数组，如 `[0, 100, 130, 160, 190, 220]`），供前端绩效进度条组件使用
5. THE API_Contract SHALL 为 COACH-1 响应补充 `historyMonths` 模块（历史月份统计，最近 5+ 个月）：每月含 `month`（标签）/`estimated`（是否预估）/`customers`/`hours`/`salary`/`callbackDone`/`recallDone`
6. THE API_Contract SHALL 扩展 COACH-1 的 `topCustomers` 字段结构，从 5 个字段扩展为 10 个字段：补充 `initial`/`avatarGradient`/`heartEmoji`（P6 AC3 四级映射：💖/🧡/💛/💙）/`relationScore`（关系指数，0-10）/`scoreColor`/`balance`
7. THE API_Contract SHALL 为 COACH-1 响应补充近期服务明细中的 `perfHours`（折算工时）和 `customerId` 字段
8. THE API_Contract SHALL 为 COACH-1 的任务分组（`visibleTasks`/`hiddenTasks`/`abandonedTasks`）补充字段：TaskItem 补充 `noteCount`/`pinned`/`notes`（`Array<{ pinned?, text, date }>`），AbandonedTask 补充 `reason`
9. THE API_Contract SHALL 为 COACH-1 响应补充 `notes` 模块（备注列表）：每条备注含 `id`/`content`/`timestamp`/`aiScore`（AI 应用 6 评分，1-10，展示用）/`customerName`/`tagLabel`/`createdAt`

#### 5.6 PERF-1 绩效概览契约重写

##### 验收标准

1. THE API_Contract SHALL 将 PERF-1 的 `thisMonthRecords` 从扁平数组重写为按日期分组的 DateGroup 结构：每组含 `date`（日期标签）/`totalHours`（当日总工时）/`totalIncome`（当日总收入）/`records`（记录列表），每条记录含 `customerName`/`timeRange`/`hours`/`courseType`/`courseTypeClass`/`location`/`income`
2. THE API_Contract SHALL 为 PERF-1 响应补充收入档位数据：`currentTier`（当前档，含 `basicRate`/`incentiveRate`）、`nextTier`（下一档，含 `basicRate`/`incentiveRate`）、`upgradeHoursNeeded`（距升档所需工时）、`upgradeBonus`（升档奖金）
3. THE API_Contract SHALL 为 PERF-1 响应补充 `lastMonthIncome`（上月收入）字段
4. THE API_Contract SHALL 为 PERF-1 的 `incomeItems` 每项补充 `desc` 字段（费率×工时的拆分描述，如 `"80元/h × 75h"`）
5. THE API_Contract SHALL 为 PERF-1 的 `newCustomers` 补充 `lastService`（最后服务日期）和 `count`（服务次数）字段；为 `regularCustomers` 补充 `hours`（总工时）和 `income`（总收入）字段

#### 5.7 TASK-1 绩效概览字段契约重写

##### 验收标准

1. THE API_Contract SHALL 将 TASK-1 响应中的 `performance` 从 4 个字段（`totalHours`/`totalIncome`/`totalCustomers`/`monthLabel`）扩展为 15+ 个字段，补充：`tierNodes`（档位节点数组）/`basicHours`（基础课时）/`bonusHours`（激励课时）/`currentTier`（当前档位索引）/`nextTierHours`（下一档位工时阈值）/`tierCompleted`（是否已达标）/`bonusMoney`（升档奖金）/`incomeTrend`（收入趋势，如 `"↓368"`）/`incomeTrendDir`（`up`/`down`）/`prevMonth`（上月标签）
2. THE API_Contract SHALL 为 TASK-1 的任务 item 补充可选扩展字段：`lastVisitDays`（距上次到店天数）、`balance`（客户余额）、`aiSuggestion`（AI 建议摘要）

#### 5.8 CHAT-1/2 对话模块契约重写

##### 验收标准

1. THE API_Contract SHALL 统一 CHAT-2 消息的时间字段名为 `createdAt`（替代前端使用的 `timestamp` 和契约定义的 `created_at`，遵循 camelCase 规范）
2. THE API_Contract SHALL 为 CHAT-1 历史列表的每条记录补充 `title`（对话标题）字段
3. THE API_Contract SHALL 为 CHAT-2 消息补充 `referenceCard` 可选字段：含 `type`（`customer`/`record` 枚举）/`title`/`summary`/`data`（`Record<string, string>` 键值对）
4. THE API_Contract SHALL 补充 SSE 流式端点定义：`POST /api/xcx/chat/stream`，请求体含 `chatId`/`content`，响应为 `text/event-stream`
5. THE API_Contract SHALL 标注 CHAT 消息查询端点支持 `customerId` 查询参数：后端根据 `customerId` 自动查找或创建对话，返回对应的 `chatId` 和消息列表


### 需求 6：前端跨页面参数修复（T0-6）

**用户故事：** 作为助教或管理层用户，我希望在小程序中从一个页面跳转到另一个页面时，目标页面能正确加载对应的数据，而不会因为参数传递错误导致页面空白或加载错误数据。

#### 6.1 task-detail 页面跳转修复

##### 验收标准

1. WHEN 用户从 task-detail 页面点击"问问助手"跳转到 chat 页面时，THE Miniprogram SHALL 传递 `customerId={detail.customerId}` 参数（而非当前错误传递的 `detail.id` 即 taskId）
2. WHEN 用户从 task-detail 页面点击"查看全部服务记录"跳转到 customer-service-records 页面时，THE Miniprogram SHALL 传递 `customerId={detail.customerId}` 参数（而非当前错误传递的 `detail.id` 即 taskId）
3. IF TASK-2 响应中不包含 `customerId` 字段，THEN THE Miniprogram SHALL 无法完成上述跳转修复，因此本需求依赖 API 契约中 TASK-2 响应包含 `customerId` 字段的定义

#### 6.2 customer-detail 页面跳转修复

##### 验收标准

1. WHEN 用户从 customer-detail 页面点击"查看服务记录"跳转到 customer-service-records 页面时，THE Miniprogram SHALL 传递 `customerId={detail.id}` 参数（当前未传任何参数）
2. WHEN 用户从 customer-detail 页面点击"问问助手"跳转到 chat 页面时，THE Miniprogram SHALL 传递 `customerId={detail.id}` 参数（当前未传任何参数）
3. THE Miniprogram SHALL 修复 customer-detail 页面的 `loadDetail()` 函数，从 `onLoad(options)` 的 `options.id` 获取客户 ID，替代当前通过 `__route__` 解析的错误方式

#### 6.3 coach-detail 页面跳转修复

##### 验收标准

1. WHEN 用户从 coach-detail 页面点击任务项跳转到 customer-detail 页面时，THE Miniprogram SHALL 传递 `id={customerId}` 参数（而非当前错误传递的 `name={customerName}`），此修复依赖 COACH-1 响应中 TaskItem 包含 `customerId` 字段

#### 6.4 performance 页面跳转修复

##### 验收标准

1. WHEN 用户从 performance 页面点击客户卡片或服务记录跳转到 task-detail 页面时，THE Miniprogram SHALL 传递 `id={taskId}` 参数（而非当前错误传递的 `customerName={name}`），此修复依赖 PERF-1 响应中记录包含 `taskId` 字段

#### 6.5 chat 页面多入口参数路由

##### 验收标准

1. WHEN chat 页面从 task-detail 或 customer-detail 跳转进入（携带 `customerId` 参数）时，THE Miniprogram SHALL 使用 `customerId` 查询参数调用 CHAT 消息端点，由后端自动查找或创建对话
2. WHEN chat 页面从 chat-history 跳转进入（携带 `historyId` 参数）时，THE Miniprogram SHALL 使用 `historyId` 作为 `chatId` 直接加载历史消息
3. WHEN chat 页面从 coach-detail 跳转进入（携带 `coachId` 参数）时，THE Miniprogram SHALL 使用 `coachId` 作为上下文参数传递给 CHAT 端点

#### 6.6 globalData.authUser 字段扩展

##### 验收标准

1. THE Miniprogram SHALL 在登录成功后（`/api/xcx/me` 响应）将 `role`、`storeName`、`coachLevel`、`avatar` 字段存入 `globalData.authUser`，供 task-list Banner、performance Banner、performance-records Banner 等多个页面使用
2. WHEN `globalData.authUser` 已包含上述字段时，THE Miniprogram SHALL 不再需要各页面单独请求 `/me` 接口获取这些信息

### 需求 7：契约文档一致性与完整性

**用户故事：** 作为后续子 spec（RNS1.1-1.4）的开发者，我希望重写后的 API 契约文档内部一致、无歧义，以便直接作为后端实现的唯一基准。

#### 验收标准

1. THE API_Contract SHALL 确保所有接口的响应字段名统一使用 camelCase 格式（与需求 2 的 CamelCase_Converter 输出一致）
2. THE API_Contract SHALL 确保所有涉及金额的字段标注使用 `items_sum` 口径，禁止使用 `consume_money`（DWD-DOC 强制规则 1）
3. THE API_Contract SHALL 确保所有涉及助教费用的字段标注使用 `assistant_pd_money`（陪打）+ `assistant_cx_money`（超休）拆分，禁止使用 `service_fee`（DWD-DOC 强制规则 2）
4. THE API_Contract SHALL 确保所有涉及会员信息的字段标注通过 `member_id` JOIN `dim_member` 获取，禁止直接使用 `member_phone`/`member_name`（DWD-DOC 强制规则 DQ-6/DQ-7）
5. THE API_Contract SHALL 为每个接口标注数据源（FDW 表名或业务表名），供后续子 spec 实现时参考
6. THE API_Contract SHALL 确保重写后的 8 个接口响应定义（BOARD-1/2/3、CUST-1、COACH-1、PERF-1、TASK-1 performance、CHAT-1/2）与前端内联 mock 数据结构完全对齐，无字段遗漏或类型不匹配
