Files
Neo-ZQYY/docs/miniprogram-dev/api-audit/board-finance.md

353 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 口径