# board-finance 页面数据来源排查

> 排查日期：2026-03-18
> 页面路径：pages/board-finance/board-finance
> 排查人：Kiro AI
> 状态：**全量内联 Mock，零 API 对接**

## 概览

| 分类 | 数量 | 说明 |
|------|------|------|
| Mock 数据（内联） | **120+ 个字段** | 全部财务指标写死在 `data` 对象中，无外部 mock 函数调用 |
| 硬编码数据 | **19 个字段/配置** | 筛选选项、目录导航、指标解释、板块描述等 |
| 已对接 API | **0 个接口** | 页面无任何 `request()` / `wx.request` 调用 |
| 前端计算/派生 | **8 个字段** | UI 状态、滚动位置、配色等 |
| 路由参数 | **0 个** | `onLoad` 未读取 `options` |
| WXML 硬编码文案 | **3 处** | AI 洞察文案、平台服务费说明 |

---

## 一、Mock 数据（内联在 data 对象中）

> 本页面 **不引用** `utils/mock-data.ts`（该文件虽定义了 `BoardFinanceData` 接口，但页面未 import）。
> 所有 mock 数据直接写死在 `Page({ data: { ... } })` 中，文件头注释标注 `TODO: 联调时替换 mock 数据为真实 API 调用`。

### 1.1 经营一览 `overview`

| 字段 | 类型 | 当前 Mock 值 | 联调替换 API | 备注 |
|------|------|-------------|-------------|------|
| `overview.occurrence` | string | `¥823,456` | 财务看板-经营一览 | 发生额/正价 |
| `overview.occurrenceCompare` | string | `12.5%` | 同上（环比） | |
| `overview.discount` | string | `-¥113,336` | 同上 | 总优惠 |
| `overview.discountCompare` | string | `3.2%` | 同上（环比） | |
| `overview.discountRate` | string | `13.8%` | 同上 | 优惠占比 |
| `overview.discountRateCompare` | string | `1.5%` | 同上（环比） | |
| `overview.confirmedRevenue` | string | `¥710,120` | 同上 | 成交/确认收入 |
| `overview.confirmedCompare` | string | `8.7%` | 同上（环比） | |
| `overview.cashIn` | string | `¥698,500` | 同上 | 实收/现金流入 |
| `overview.cashInCompare` | string | `5.3%` | 同上（环比） | |
| `overview.cashOut` | string | `¥472,300` | 同上 | 现金支出 |
| `overview.cashOutCompare` | string | `2.1%` | 同上（环比） | |
| `overview.cashBalance` | string | `¥226,200` | 同上 | 现金结余 |
| `overview.cashBalanceCompare` | string | `15.2%` | 同上（环比） | |
| `overview.balanceRate` | string | `32.4%` | 同上 | 结余率 |
| `overview.balanceRateCompare` | string | `3.8%` | 同上（环比） | |


### 1.2 预收资产 `recharge`

| 字段 | 类型 | 当前 Mock 值 | 联调替换 API | 备注 |
|------|------|-------------|-------------|------|
| `recharge.actualIncome` | string | `¥352,800` | 财务看板-预收资产 | 储值卡充值实收 |
| `recharge.actualCompare` | string | `18.5%` | 同上（环比） | |
| `recharge.firstCharge` | string | `¥188,500` | 同上 | 首充 |
| `recharge.firstChargeCompare` | string | `12.3%` | 同上（环比） | |
| `recharge.renewCharge` | string | `¥164,300` | 同上 | 续费 |
| `recharge.renewChargeCompare` | string | `8.7%` | 同上（环比） | |
| `recharge.consumed` | string | `¥238,200` | 同上 | 消耗 |
| `recharge.consumedCompare` | string | `5.2%` | 同上（环比） | |
| `recharge.cardBalance` | string | `¥642,600` | 同上 | 储值卡总余额 |
| `recharge.cardBalanceCompare` | string | `11.4%` | 同上（环比） | |
| `recharge.allCardBalance` | string | `¥586,500` | 同上 | 全类别会员卡余额合计 |
| `recharge.allCardBalanceCompare` | string | `6.2%` | 同上（环比） | |

#### 赠送卡明细 `recharge.giftRows`（3 行 × 7 字段 = 21 个值）

| 行 | label | total | wine | table | coupon | 各字段均含 Compare |
|----|-------|-------|------|-------|--------|-------------------|
| 0 | 新增 | ¥108,600 | ¥43,200 | ¥54,100 | ¥11,300 | 9.8%/11.2%/8.5%/6.3% |
| 1 | 消费 | ¥75,800 | ¥32,100 | ¥32,800 | ¥10,900 | 7.2%/8.1%/6.5%/5.8% |
| 2 | 余额 | ¥243,900 | ¥118,500 | ¥109,200 | ¥16,200 | 4.5%/5.2%/3.8%/2.5% |

> 联调 API：财务看板-预收资产-赠送卡统计

### 1.3 应计收入确认 `revenue`

#### 收入结构 `revenue.structureRows`（9 行 × 5~6 字段）

| id | name | desc | amount | discount | booked | bookedCompare | isSub |
|----|------|------|--------|----------|--------|---------------|-------|
| `table` | 开台与包厢 | - | ¥358,600 | -¥45,200 | ¥313,400 | 9.2% | false |
| `area-a` | A区 | - | ¥118,200 | -¥11,600 | ¥106,600 | 12.1% | true |
| `area-b` | B区 | - | ¥95,800 | -¥11,200 | ¥84,600 | 8.5% | true |
| `area-c` | C区 | - | ¥72,600 | -¥11,100 | ¥61,500 | 6.3% | true |
| `team` | 团建区 | - | ¥48,200 | -¥6,800 | ¥41,400 | 5.8% | true |
| `mahjong` | 麻将区 | - | ¥23,800 | -¥4,500 | ¥19,300 | -2.1% | true |
| `coach-basic` | 助教 | 基础课 | ¥232,500 | - | ¥232,500 | 15.3% | false |
| `coach-incentive` | 助教 | 激励课 | ¥112,800 | - | ¥112,800 | 8.2% | false |
| `food` | 食品酒水 | - | ¥119,556 | -¥68,136 | ¥51,420 | 6.5% | false |

> 联调 API：财务看板-应计收入-收入结构

#### 项目正价 `revenue.priceItems`（4 项）

| name | value | compare |
|------|-------|---------|
| 开台消费 | ¥358,600 | 9.2% |
| 酒水商品 | ¥186,420 | 18.5% |
| 包厢费用 | ¥165,636 | 12.1% |
| 助教服务 | ¥112,800 | 15.3% |

#### 发生额合计

| 字段 | 值 |
|------|-----|
| `revenue.totalOccurrence` | ¥823,456 |
| `revenue.totalOccurrenceCompare` | 12.5% |

#### 优惠扣减 `revenue.discountItems`（4 项）

| name | desc | value | compare |
|------|------|-------|---------|
| 团购优惠 | - | -¥56,200 | 5.2% |
| 手动调整 + 大客户优惠 | - | -¥34,800 | 3.1% |
| 赠送卡抵扣 | 台桌卡+酒水卡+抵用券 | -¥22,336 | 8.6% |
| 其他优惠 | 免单+抹零 | -¥0 | （空） |

#### 成交收入合计

| 字段 | 值 |
|------|-----|
| `revenue.confirmedTotal` | ¥710,120 |
| `revenue.confirmedTotalCompare` | 8.7% |

#### 收款渠道 `revenue.channelItems`（3 项）

| name | desc | value | compare |
|------|------|-------|---------|
| 储值卡结算冲销 | - | ¥238,200 | 11.2% |
| 现金/线上支付 | - | ¥345,800 | 7.8% |
| 团购核销确认收入 | 团购成交价 | ¥126,120 | 5.3% |

> 联调 API：财务看板-应计收入-损益链

### 1.4 现金流入 `cashflow`

#### 消费收入 `cashflow.consumeItems`（3 项）

| name | desc | value | compare | isDown |
|------|------|-------|---------|--------|
| 纸币现金 | 柜台现金收款 | ¥85,600 | 12.3% | true |
| 线上收款 | 微信/支付宝/刷卡 已扣除平台服务费 | ¥260,200 | 8.5% | false |
| 团购平台 | 美团/抖音回款 已扣除平台服务费 | ¥126,120 | 15.2% | false |

#### 充值收入 `cashflow.rechargeItems`（1 项）

| name | desc | value | compare |
|------|------|-------|---------|
| 会员充值到账 | 首充/续费实收 | ¥352,800 | 18.5% |

#### 合计

| 字段 | 值 |
|------|-----|
| `cashflow.total` | ¥824,720 |
| `cashflow.totalCompare` | 10.2% |

> 联调 API：财务看板-现金流入

### 1.5 现金流出 `expense`

#### 进货与运营 `expense.operationItems`（3 项）

| name | value | compare | isDown |
|------|-------|---------|--------|
| 食品饮料 | ¥108,200 | 4.5% | false |
| 耗材 | ¥21,850 | 2.1% | true |
| 报销 | ¥10,920 | 6.8% | false |

#### 固定支出 `expense.fixedItems`（4 项）

| name | value | compare | isFlat |
|------|-------|---------|--------|
| 房租 | ¥125,000 | 持平 | true |
| 水电 | ¥24,200 | 3.2% | false |
| 物业 | ¥11,500 | 持平 | true |
| 人员工资 | ¥112,000 | 持平 | true |

#### 助教薪资 `expense.coachItems`（4 项）

| name | value | compare | isDown |
|------|-------|---------|--------|
| 基础课分成 | ¥116,250 | 8.2% | false |
| 激励课分成 | ¥23,840 | 5.6% | false |
| 充值提成 | ¥12,640 | 12.3% | false |
| 额外奖金 | ¥11,500 | 3.1% | true |

#### 平台服务费 `expense.platformItems`（3 项）

| name | value | compare |
|------|-------|---------|
| 汇来米 | ¥10,680 | 1.5% |
| 美团 | ¥11,240 | 2.8% |
| 抖音 | ¥10,580 | 3.5% |

#### 合计

| 字段 | 值 |
|------|-----|
| `expense.total` | ¥600,400 |
| `expense.totalCompare` | 2.1% |

> 联调 API：财务看板-现金流出

### 1.6 助教分析 `coachAnalysis`

#### 基础课 `coachAnalysis.basic`

| 字段 | 值 | 环比 |
|------|-----|------|
| totalPay | ¥232,500 | 15.3% |
| totalShare | ¥116,250 | 15.3% |
| avgHourly | ¥25/h | 4.2% |

明细行（4 行 × 7 字段）：

| level | pay | payCompare | share | shareCompare | hourly | hourlyCompare | 特殊标记 |
|-------|-----|------------|-------|--------------|--------|---------------|----------|
| 初级 | ¥68,600 | 12.5% | ¥34,300 | 12.5% | ¥20/h | 持平 | hourlyFlat |
| 中级 | ¥82,400 | 18.2% | ¥41,200 | 18.2% | ¥25/h | 8.7% | |
| 高级 | ¥57,800 | 14.6% | ¥28,900 | 14.6% | ¥30/h | 持平 | hourlyFlat |
| 星级 | ¥23,700 | 3.2% ↓ | ¥11,850 | 3.2% ↓ | ¥35/h | 持平 | payDown, shareDown, hourlyFlat |

#### 激励课 `coachAnalysis.incentive`

| 字段 | 值 | 环比 |
|------|-----|------|
| totalPay | ¥112,800 | 8.2% |
| totalShare | ¥33,840 | 8.2% |
| avgHourly | ¥15/h | 2.1% |

明细行（4 行 × 7 字段）：

| level | pay | payCompare | share | shareCompare | hourly | hourlyCompare | 特殊标记 |
|-------|-----|------------|-------|--------------|--------|---------------|----------|
| 初级 | ¥32,400 | 6.8% | ¥9,720 | 6.8% | ¥12/h | 持平 | hourlyFlat |
| 中级 | ¥38,600 | 10.5% | ¥11,580 | 10.5% | ¥15/h | 5.2% | |
| 高级 | ¥28,200 | 7.3% | ¥8,460 | 7.3% | ¥18/h | 持平 | hourlyFlat |
| 星级 | ¥13,600 | 2.1% ↓ | ¥4,080 | 2.1% ↓ | ¥22/h | 持平 | payDown, shareDown, hourlyFlat |

> 联调 API：财务看板-助教分析

---

## 二、硬编码数据

| 字段 | 当前值 | 应改为 | 风险 | 所在位置 |
|------|--------|--------|------|----------|
| `timeOptions` | 8 个固定选项（本月/上月/本周/上周/前3月/本季/上季/近6月） | 前端常量或后端配置 | **低** | data.timeOptions |
| `areaOptions` | 7 个固定选项（全部/大厅/A区/B区/C区/麻将房/团建房） | **API 获取门店区域列表** | **高** | data.areaOptions |
| `tocItems` | 6 个目录项（emoji + title + sectionId） | 前端常量（合理） | **低** | data.tocItems |
| `tipContents` | 13 个指标解释（title + content） | 前端常量或后端配置 | **低** | 模块级常量 |
| `_sectionDescs` | 6 条板块描述文案 | 前端常量（合理） | **低** | 实例属性 |
| `selectedTime` | `'month'` | 默认值合理，但需与 API 参数对齐 | **中** | data.selectedTime |
| `selectedTimeText` | `'本月'` | 同上 | **低** | data.selectedTimeText |
| `selectedArea` | `'all'` | 默认值合理 | **低** | data.selectedArea |
| `selectedAreaText` | `'全部区域'` | 同上 | **低** | data.selectedAreaText |
| `compareEnabled` | `false` | 默认值合理 | **低** | data.compareEnabled |
| `pageState` | `'normal'` | 联调后应初始为 `'loading'` | **高** | data.pageState |
| Tab 导航 `data-tab` | `finance/customer/coach` 三个固定值 | 前端常量（合理） | **低** | WXML |
| 导航路径 | `/pages/board-customer/board-customer` 等 | 前端常量（合理） | **低** | onTabChange |
| `onPullDownRefresh` | `setTimeout 500ms` 后停止 | 联调后应触发数据刷新 | **高** | onPullDownRefresh |
| AI 洞察文案 | 3 行硬编码文案（优惠率Top/差异最大/建议关注） | **API 返回或 AI 生成** | **高** | WXML 内联 |
| 平台服务费说明 | "服务费在流水流入时，平台已经扣除。不产生支出流水。" | 前端常量（合理） | **低** | WXML 内联 |
| 板块头描述文案 | 各板块 desc（如"快速了解收入与现金流的整体健康度"） | 前端常量（合理） | **低** | WXML 内联 |
| `filter-dropdown label` | `"本月"` / `"全部区域"` | 应绑定 `selectedTimeText` / `selectedAreaText` | **中** | WXML 属性 |
| 激励课表格 | WXML 中只渲染了合计行，缺少明细行 `wx:for` | 需补齐明细行渲染 | **中** | WXML 板块6 |

---

## 三、已对接 API

**无。** 页面当前零 API 调用。

唯一的 `import` 是 `getRandomAiColor`（纯前端工具函数，与数据无关）。

文件头注释明确标注：
```
// TODO: 联调时替换 mock 数据为真实 API 调用
```

`onShow` 中也有注释：
```
// TODO: 联调时在此刷新看板数据
```

---

## 四、前端计算/派生数据

| 字段 | 计算逻辑 | 说明 |
|------|----------|------|
| `aiColorClass` | `getRandomAiColor().className` | onLoad 时随机选取 AI 配色 |
| `stickyHeaderVisible` | 滚动方向 + scrollTop 阈值判断 | 下滑 >80px 显示，上滑隐藏 |
| `stickyHeaderEmoji` / `Title` / `Desc` | 从 `tocItems[currentIdx]` + `_sectionDescs[idx]` 映射 | 吸顶头内容 |
| `currentSectionIndex` | 滚动位置与 `_sectionTops` 数组比较 | 当前所在板块索引 |
| `_sectionTops` | `wx.createSelectorQuery` 获取各 section 的 top | 缓存的 DOM 位置 |
| `selectedTimeText` | 从 `timeOptions` 中按 `value` 查找 `text` | 筛选文案 |
| `selectedAreaText` | 从 `areaOptions` 中按 `value` 查找 `text` | 筛选文案 |
| `tocVisible` / `tipVisible` | 用户交互切换 | UI 状态 |

---

## 五、路由参数

**无。** `onLoad()` 未读取 `options` 参数。

---

## 六、WXML 硬编码文案（业务数据）

| 位置 | 内容 | 类型 | 处理建议 |
|------|------|------|----------|
| AI 洞察区域 第1行 | `优惠率Top：团购(5.2%) / 大客户(3.1%) / 赠送卡(2.5%)` | **业务数据** | 应从 API 获取 |
| AI 洞察区域 第2行 | `差异最大：酒水(+18%) / 台桌(-5%) / 包厢(+12%)` | **业务数据** | 应从 API 获取 |
| AI 洞察区域 第3行 | `建议关注：充值高但消耗低，会员活跃度需提升` | **业务数据** | 应从 API/AI 生成 |
| 平台服务费说明 | `服务费在流水流入时，平台已经扣除。不产生支出流水。` | UI 说明文案 | 可保留为前端常量 |

---

## 七、联调 TODO

### 高优先级（P0 — 阻塞联调）

- [ ] **设计并对接财务看板主 API**：一次请求返回全部板块数据（overview / recharge / revenue / cashflow / expense / coachAnalysis），或按板块拆分为 6 个接口
- [ ] **替换 `data` 中全部内联 mock**：将 120+ 个字段从 API 响应填充
- [ ] **`pageState` 初始值改为 `'loading'`**：onLoad/onShow 发起请求，成功→`'normal'`，失败→`'error'`，空数据→`'empty'`
- [ ] **`onPullDownRefresh` 对接数据刷新**：替换当前的 `setTimeout 500ms` 空操作
- [ ] **`areaOptions` 从 API 获取**：当前硬编码的区域列表（大厅/A区/B区/C区/麻将房/团建房）应从门店配置接口动态获取

### 中优先级（P1 — 影响数据准确性）

- [ ] **AI 洞察文案从 API 获取**：当前 WXML 中 3 行硬编码的洞察文案应由后端计算或 AI 生成
- [ ] **`filter-dropdown` 的 `label` 属性绑定动态值**：当前硬编码 `"本月"` / `"全部区域"`，应改为 `"{{selectedTimeText}}"` / `"{{selectedAreaText}}"`
- [ ] **激励课明细行补齐**：WXML 板块6 激励课部分只渲染了合计行，缺少 `wx:for="{{coachAnalysis.incentive.rows}}"` 的明细行循环
- [ ] **时间/区域筛选参数传递给 API**：`onTimeChange` / `onAreaChange` 变更后需重新请求数据
- [ ] **环比开关联动 API**：`toggleCompare` 切换后，若环比数据需要额外请求，需对接

### 低优先级（P2 — 优化项）

- [ ] **`tipContents` 指标解释考虑后端配置化**：当前 13 条解释硬编码在前端，如需动态更新可改为接口
- [ ] **`timeOptions` 考虑后端配置化**：如需支持自定义时间范围
- [ ] **加载态优化**：当前使用 toast 浮层，可考虑骨架屏
- [ ] **错误态重试**：`onRetry` 当前只是重置 `pageState`，需对接真实重新请求

### 数据口径注意事项（参考 DWD-DOC 标杆文档）

- [ ] **助教费用拆分**：API 返回的助教数据需区分 `assistant_pd_money`（陪打/基础课）和 `assistant_cx_money`（超休/激励课），禁止使用笼统的 `service_fee`
- [ ] **储值卡字段命名**：API 应使用 `balance_pay`（总额）、`recharge_card_pay`（现金充值卡）、`gift_card_pay`（赠送卡），与 DWS 层一致
- [ ] **支付渠道恒等式**：`balance_amount = recharge_card_amount + gift_card_amount`，前端展示需校验
- [ ] **折扣互斥**：`discount_manual`（大客户优惠）与 `discount_other` 互斥，两者之和 = `adjust_amount`
- [ ] **consume_money 禁止直接用于计算**：前端展示的发生额应使用 `items_sum` 口径
