# performance 页面数据来源排查 > 排查日期:2026-03-18 > 页面路径:pages/performance/performance ## 概览 | 分类 | 数量 | 说明 | |------|------|------| | A. Mock 数据(页面内联) | 4 组 | incomeItems / thisMonthRecords / newCustomers / regularCustomers,全部在 `loadData()` 的 `setTimeout` 中硬构造 | | B. 硬编码数据 | 11 个字段 | Banner 个人信息、收入档位、月度合计等,写死在 `data` 初始值中 | | C. 已对接 API | 0 | 页面无任何 `wx.request` 调用,无 API 对接 | | D. 前端计算/派生数据 | 3 个 | 展开/收起状态、AI 配色、pageState | | E. 路由参数 | 0 | `onLoad()` 未读取任何路由参数 | | F. WXML 硬编码文案 | 28+ 处 | 标题、标签、提示文字等 | --- ## 一、Mock 数据(页面内联 mock,`loadData()` 内 setTimeout 构造) > 页面未 import `utils/mock-data.ts`,所有 mock 数据均为 `loadData()` 方法内局部变量。 | # | 字段/变量 | 类型 | 位置 | 说明 | |---|-----------|------|------|------| | A1 | `incomeItems` | `IncomeItem[]` | `loadData()` 局部变量 | 4 条业绩明细:基础课 / 激励课 / 充值激励 / TOP3 销冠奖,icon + label + desc + value 全部硬写 | | A2 | `thisMonthRecords` | `DateGroup[]` | `loadData()` 局部变量 | 4 个日期组、共 7 条服务记录,含客户名 / 头像 / 时间 / 课时 / 课程类型 / 台位 / 收入 | | A3 | `newCustomers` | `Array<{...}>` | `loadData()` 局部变量 | 8 条新客数据:姓名 / 头像 / 最近服务日期 / 服务次数 | | A4 | `regularCustomers` | `Array<{...}>` | `loadData()` 局部变量 | 8 条常客数据:姓名 / 头像 / 累计课时 / 累计收入 / 服务次数 | | A5 | `gradients` | `string[]` | `loadData()` 局部变量 | 头像配色数组 `['blue','pink','teal',...]`,用于给 mock 数据分配 avatarColor | ### Mock 数据内部字段明细 **incomeItems 每条字段:** | 字段 | 示例值 | 联调时对应 API 字段(待定) | |------|--------|---------------------------| | `icon` | `'🎱'` | — | | `label` | `'基础课'` | 收入类型名称 | | `desc` | `'80元/h × 75h'` | 单价 × 课时的计算描述 | | `value` | `'¥6,000'` | 该类型收入金额 | **thisMonthRecords → DateGroup 字段:** | 字段 | 示例值 | 联调时对应 API 字段(待定) | |------|--------|---------------------------| | `date` | `'2月7日'` | 服务日期 | | `totalHours` | `'4.0h'` | 当日总课时 | | `totalIncome` | `'¥350'` | 当日总收入 | **thisMonthRecords → ServiceRecord 字段:** | 字段 | 示例值 | 联调时对应 API 字段(待定) | |------|--------|---------------------------| | `customerName` | `'王先生'` | 客户姓名 | | `avatarChar` | `'王'` | 姓氏首字(前端可派生) | | `avatarColor` | `'blue'` | 头像配色(前端可派生) | | `timeRange` | `'20:00-22:00'` | 服务时间段 | | `hours` | `'2.0h'` | 服务时长 | | `courseType` | `'基础课'` | 课程类型 | | `courseTypeClass` | `'tag-basic'` | CSS 类名(前端派生) | | `location` | `'3号台'` | 台位/包厢 | | `income` | `'¥160'` | 该次服务预估收入 | **newCustomers 每条字段:** | 字段 | 示例值 | 联调时对应 API 字段(待定) | |------|--------|---------------------------| | `name` | `'王先生'` | 客户姓名 | | `avatarChar` | `'王'` | 姓氏首字(前端可派生) | | `avatarColor` | `'blue'` | 头像配色(前端可派生) | | `lastService` | `'2月7日'` | 最近服务日期 | | `count` | `2` | 服务次数 | **regularCustomers 每条字段:** | 字段 | 示例值 | 联调时对应 API 字段(待定) | |------|--------|---------------------------| | `name` | `'张先生'` | 客户姓名 | | `avatarChar` | `'张'` | 姓氏首字(前端可派生) | | `avatarColor` | `'teal'` | 头像配色(前端可派生) | | `hours` | `12` | 累计课时(number) | | `income` | `'¥960'` | 累计收入 | | `count` | `6` | 服务次数 | --- ## 二、硬编码数据(`Page.data` 初始值) | # | 字段 | 硬编码值 | 说明 | |---|------|----------|------| | B1 | `coachName` | `'小燕'` | 助教姓名,应从登录态/API 获取 | | B2 | `coachRole` | `'助教'` | 角色标签,应从用户信息获取 | | B3 | `storeName` | `'广州朗朗桌球'` | 门店名称,应从用户绑定门店获取 | | B4 | `monthlyIncome` | `'¥6,206'` | 本月预计收入,应从 API 获取 | | B5 | `lastMonthIncome` | `'¥16,880'` | 上月收入,应从 API 获取 | | B6 | `currentTier.basicRate` | `80` | 当前档位基础课单价(元/h) | | B7 | `currentTier.incentiveRate` | `95` | 当前档位激励课单价(元/h) | | B8 | `nextTier.basicRate` | `90` | 下一档位基础课单价(元/h) | | B9 | `nextTier.incentiveRate` | `114` | 下一档位激励课单价(元/h) | | B10 | `upgradeHoursNeeded` | `15` | 距下一阶段所需课时 | | B11 | `upgradeBonus` | `800` | 到达下一阶段奖金(元) | | B12 | `monthlyTotal` | `'¥6,950.5'` | 本月合计预估收入 | | B13 | `visibleRecordGroups` | `2` | 默认显示前 N 条日期组(UI 配置,可保留硬编码) | --- ## 三、已对接 API **无。** 页面中不存在任何 `wx.request`、API 服务调用、或从 `getApp()` 获取全局数据的逻辑。 `loadData()` 使用 `setTimeout(500ms)` 模拟异步加载,内部全部为内联 mock 数据。 文件头部注释明确标注:`// TODO: 联调时替换为真实 API 调用` --- ## 四、前端计算/派生数据 | # | 字段 | 来源 | 说明 | |---|------|------|------| | D1 | `pageState` | 前端状态机 | `'loading' → 'normal' / 'error' / 'empty'`,由 `loadData()` 控制 | | D2 | `aiColor` | `initPageAiColor('performance')` | 从 `utils/ai-color-manager.ts` 获取,固定返回 `'blue'` | | D3 | `thisMonthRecordsExpanded` | 前端 toggle | 服务记录展开/收起状态,默认 `false` | | D4 | `newCustomerExpanded` | 前端 toggle | 新客列表展开/收起状态,默认 `false` | | D5 | `regularCustomerExpanded` | 前端 toggle | 常客列表展开/收起状态,默认 `false` | --- ## 五、路由参数 **无。** `onLoad()` 未接收任何路由参数(`options` 未使用)。 页面作为业绩总览入口,当前设计不依赖路由传参。联调后可能需要接收 `coachId` / `month` 等参数。 --- ## 六、WXML 硬编码文案 | # | 文案内容 | 位置 | 说明 | |---|----------|------|------| | F1 | `加载中...` | 加载态 toast | 可保留 | | F2 | `暂无业绩数据` | 空数据态 | 可保留 | | F3 | `加载失败,请点击重试` | 错误态 | 可保留 | | F4 | `重试` | 错误态按钮 | 可保留 | | F5 | `本月预计收入` | Banner 收入卡片标签 | 可保留 | | F6 | `上月收入` | Banner 收入卡片标签 | 可保留 | | F7 | `收入情况` | section 标题 | 可保留 | | F8 | `当前档位`(×2) | 档位卡片 badge + label | 可保留 | | F9 | `元/h`(×4) | 费率单位 | 可保留 | | F10 | `基础课到手`(×2) | 费率描述 | 可保留 | | F11 | `激励课到手`(×2) | 费率描述 | 可保留 | | F12 | `下一阶段`(×2) | 档位卡片 badge + label | 可保留 | | F13 | `距离下一阶段` | 升级提示标签 | 可保留 | | F14 | `需完成 ... 小时` | 升级提示(含动态插值) | 可保留 | | F15 | `到达即得` | 升级奖金标签 | 可保留 | | F16 | `元`(奖金后缀) | 升级奖金值 | 可保留 | | F17 | `本月业绩 预估` | section 标题 | 可保留 | | F18 | `本月合计 预估` | 合计行标签 | 可保留 | | F19 | `📋 我的服务记录明细` | 服务记录 header | 可保留 | | F20 | `展开更多` / `收起` | 服务记录 toggle | 可保留 | | F21 | `查看全部` | 跳转业绩记录按钮 | 可保留 | | F22 | `我的预估收入` | 服务记录行内文案 | 可保留 | | F23 | `我的新客` | section 标题 | 可保留 | | F24 | `最近服务:` | 新客详情前缀 | 可保留 | | F25 | `次` | 新客服务次数后缀 | 可保留 | | F26 | `查看更多 ↓` / `收起 ↑` | 新客/常客 toggle | 可保留 | | F27 | `我的常客` | section 标题 | 可保留 | | F28 | `📊` / `🎯` / `⏱️` | 档位/升级提示 emoji | 可保留 | | F29 | `业绩详情` | `performance.json` → `navigationBarTitleText` | 可保留 | --- ## 七、联调 TODO ### 7.1 需要对接的 API(按优先级排序) | 优先级 | API 用途 | 涉及字段 | 备注 | |--------|----------|----------|------| | P0 | 助教个人信息 | B1 `coachName`, B2 `coachRole`, B3 `storeName` | 可从登录态/全局 store 获取 | | P0 | 本月/上月收入概览 | B4 `monthlyIncome`, B5 `lastMonthIncome` | Banner 核心数据 | | P0 | 收入档位信息 | B6-B9 `currentTier.*`, `nextTier.*`, B10 `upgradeHoursNeeded`, B11 `upgradeBonus` | 档位规则可能来自配置表 | | P0 | 本月业绩明细 | A1 `incomeItems`, B12 `monthlyTotal` | 基础课/激励课/充值激励/奖金 | | P1 | 服务记录列表(按日期分组) | A2 `thisMonthRecords` | 需支持分页或按月查询 | | P1 | 新客列表 | A3 `newCustomers` | 本月新服务的客户 | | P1 | 常客列表 | A4 `regularCustomers` | 累计服务数据 | ### 7.2 联调时需要处理的事项 - [ ] 移除 `loadData()` 中的 `setTimeout` 模拟延迟 - [ ] 移除所有内联 mock 数据(incomeItems / thisMonthRecords / newCustomers / regularCustomers) - [ ] 替换 Banner 区域硬编码字段(coachName / coachRole / storeName / monthlyIncome / lastMonthIncome) - [ ] 替换收入档位硬编码(currentTier / nextTier / upgradeHoursNeeded / upgradeBonus / monthlyTotal) - [ ] 添加 `wx.request` 或封装的 API 调用 - [ ] 处理 API 错误 → 设置 `pageState: 'error'` - [ ] 处理空数据 → 设置 `pageState: 'empty'` - [ ] `avatarChar` / `avatarColor` / `courseTypeClass` 等前端派生字段需确认是后端返回还是前端计算 - [ ] `onLoad()` 可能需要接收路由参数(如 `coachId`、`month`) - [ ] 金额格式化(`¥` 前缀、千分位)确认由后端返回还是前端处理 - [ ] 服务记录的 `taskId` 字段当前 mock 中未提供,但 `onRecordTap` 已预留读取逻辑 ### 7.3 页面引用的外部依赖 | 依赖 | 类型 | 来源 | 数据影响 | |------|------|------|----------| | `ai-color-manager.ts` | 工具函数 | `utils/` | 仅提供 AI 图标配色,无业务数据 | | `ai-float-button` | 自定义组件 | `components/` | AI 悬浮按钮,无业务数据 | | `dev-fab` | 自定义组件 | `components/` | 开发调试按钮,无业务数据 | | `metric-card` | 自定义组件 | `components/` | 已注册但 WXML 中未使用 | | `t-icon` / `t-loading` | TDesign 组件 | `tdesign-miniprogram` | UI 组件,无业务数据 | | `mock-data.ts` | Mock 数据文件 | `utils/` | **未被本页面引用**(页面使用内联 mock) | ### 7.4 注意事项 1. 页面文件头部已有 `// TODO: 联调时替换为真实 API 调用` 注释 2. `loadData()` 内部也有 `// TODO: 替换为真实 API` 注释 3. `performance.json` 中注册了 `metric-card` 组件但 WXML 中未使用,联调时可清理或启用 4. 金额字段涉及助教收入计算,联调时需参考 DWD-DOC 标杆文档中的助教费用拆分规则(`assistant_pd_money` 陪打 / `assistant_cx_money` 超休)