# P1-10 customer-detail 跳转入口实证调研

> 调研时间:2026-05-04
> 调研范围:`apps/miniprogram/miniprogram/pages/`
> Neo 反馈:"customer-detail 页面上,我没有找到 customer-service-records 的跳转入口"

## 一、customer-detail 页面作用

文件:`apps/miniprogram/miniprogram/pages/customer-detail/customer-detail.ts` + `.wxml`

定位:**单个客户的 360 度全景管理页**,服务于店长 / 助教视角下"管理某位会员"。

页面分块(从 wxml 顺序):
1. **Banner**:头像 + 姓名 + 手机号(查看/复制) + 4 项核心指标(储值余额 / 60 天消费 / 理想间隔 / 距今到店)
2. **AI 智能洞察**(`aiInsight`):AI 摘要 + 推荐策略,接 `app7_customer_analysis`
3. **维客线索**(`clues`):AI 生成的客户挽留/转化线索
4. **助教任务分配**(`coachTasks`):该客户被分配给哪些助教,任务进行中
5. **最喜欢的助教**(`favoriteCoaches`):近 60 天关系指数排名,前 3 默认展示,折叠展开
6. **消费记录**(`consumptionRecords`):台桌结账 / 商城订单卡片(已是详细消费明细)
7. **备注记录**(`sortedNotes`):增删备注(走 `createNote` / `deleteNote` 后端 API)
8. **底部操作栏**:`问问助手`(跳 chat) + `备注`(打开 noteModal)

数据来源:`fetchCustomerDetail(id)` 一次性返回所有结构化字段。

## 二、customer-detail 实际有的跳转入口

扫 `customer-detail.ts` 中所有 `wx.navigateTo` 与外部跳转事件:

| 触发位置 | 方法 | 目标页面 | 备注 |
|---------|------|---------|------|
| `<view class="card-header" bindtap="onViewServiceRecords">` (消费记录区块右上 chevron-right) | `onViewServiceRecords` (line 182-188) | `pages/customer-records/customer-records?customerId=${id}` | 客户消费记录(月度切换) |
| 底部"问问助手"按钮 | `onStartChat` (line 190-196) | `pages/chat/chat?customerId=${id}` | AI 对话 |
| 备注弹窗内部确认 | `onNoteConfirm` (line 203-230) | 不跳转,仅创建备注 | 调 createNote API |

**结论:customer-detail 总共只有 2 个外跳入口**:
- `customer-records`(消费记录页)
- `chat`(AI 对话页)

**没有 `customer-service-records` 跳转**(注意!`customer-records` 与 `customer-service-records` 是两个不同的页面)。

## 三、customer-service-records 的全部上游入口

> `customer-service-records`(客户**服务**记录,服务于"助教视角")

grep `customer-service-records` 在整个 `apps/miniprogram/miniprogram/pages/`:

| 引用位置 | 性质 | 是否上游入口 |
|---------|------|------------|
| `app.json:17` | 页面注册 | 否 |
| `pages/task-detail/task-detail.ts:440` | `wx.navigateTo` `/pages/customer-service-records/...` | **是,唯一上游入口** |
| `components/service-record-card/service-record-card.ts:3` | 注释,说明组件被该页和 task-detail 复用 | 否 |
| `utils/auth-guard.ts:35` | 路由权限映射(`view_board_customer`) | 否 |
| `pages/customer-records/customer-records.wxss:135` 等 | 注释中"复用月份切换交互" | 否 |
| `pages/dev-tools/dev-tools.ts:21` | 调试页面跳转列表(开发用) | 不算业务上游 |
| `pages/customer-service-records/customer-service-records.ts:109` | 自身权限守卫 | 否 |

**结论:customer-service-records 业务上游入口**:**仅 task-detail 一处**(`onViewAllRecords` 方法,line 436-443)。

```ts
// task-detail.ts:436-442
onViewAllRecords() {
  const customerId = (this.data.detail as any)?.customerId || this.data.detail?.id || ''
  wx.navigateTo({
    url: `/pages/customer-service-records/customer-service-records?customerId=${customerId}`,
    ...
  })
}
```

## 四、customer-records 的全部上游入口

> `customer-records`(客户**消费**记录,服务于"店长 / 客户管理视角")

grep `customer-records`(注意排除 `customer-service-records` 子串误匹配):

| 引用位置 | 性质 | 是否上游入口 |
|---------|------|------------|
| `app.json:18` | 页面注册 | 否 |
| `pages/customer-detail/customer-detail.ts:185` | `wx.navigateTo` `/pages/customer-records/...` | **是,唯一上游入口** |
| `utils/runtime-clock.ts:3` | 注释说明 sandbox 模式涉及该页 | 否 |
| `pages/customer-records/customer-records.ts:59` | 自身权限守卫 | 否 |

**结论:customer-records 业务上游入口**:**仅 customer-detail 一处**(`onViewServiceRecords` 方法,line 182-188)。

## 五、修正 P1-10 原结论

P1-10 conflict 矩阵原假设:"customer-detail 页面有跳转到 customer-service-records 的入口"。

**实证修正**:
- customer-detail **没有**跳 customer-service-records 的入口
- customer-detail **只有**跳 customer-records 的入口(消费记录区右上 chevron-right)
- customer-service-records 的**唯一**业务上游是 task-detail(助教任务详情页)
- 两个页面用户角色和数据语义不同:
  - **customer-records**(消费):面向门店/店长,展示客户每月消费金额、储值
  - **customer-service-records**(服务):面向助教,展示助教对该客户的服务次数、时长、到手收入

## 六、推荐处理

P1-10 应该**关闭/重新定义**,因为原命题(customer-detail 双跳问题)不存在:

1. **现状是单跳,无冲突**:customer-detail → customer-records,task-detail → customer-service-records,各走各路。
2. **若 P1-10 想表达的是"两个 records 页是否应合并"**,这属于产品决策(消费视角 vs 服务视角是否要做同一页),不属于代码冲突。
3. **若想表达"页面命名重叠容易混淆"**,可考虑改名(如 `customer-consumption` / `customer-service`),属于命名规范优化,无紧迫性。

**建议操作**:
- P1-10 在 `04-doc-conflicts.md` 表格中标注"已实证,原结论不成立",从冲突清单移除;
- 或者升级为"命名规范建议",降级到 P3。
