# 财务看板优化 PRD

> 日期：2026-04-08
> 触发：财务看板数据评估，发现数据失真、展示缺陷、指标缺失

---

## 一、Bug 修复

### 1.1 [P2] 会员卡余额快照不变动

**问题**：`dws_finance_recharge_summary` 表中 `cash_card_balance`（62,674）和 `total_card_balance`（67,760）连续多日完全相同。当前实际余额约 118K，ETL 快照值 67K，数字严重失真。

**根因**（已调研确认）：

`finance_recharge_task.py` 中：
1. `_extract_card_balances()` 只调用一次（传入 `end_date`），所有日期复用同一快照（第 64、89 行）
2. SQL 查询只取 `scd2_is_current = 1`，`stat_date` 参数传入但未使用（第 197-216 行）
3. 赠送卡余额同样受影响

**DWD 维度表验证**（已确认可用）：
- `dim_member_card_account` SCD2 版本充足（主卡类 55,526 个版本，覆盖 53 天）
- 按日有明确余额变化（4/6: ¥3,745 → 4/7: ¥9,291 → 4/8: ¥1,587）
- 可通过 `scd2_start_time <= stat_date AND scd2_end_time > stat_date` 做 as-of 查询

**修复方案**：
- `_extract_card_balances()` 改为按日遍历，每天查该日生效的 SCD2 版本
- `transform()` 中按 `stat_date` 查表，不再共用同一快照

**状态**：待实施

### 1.2 [P2] 充值首充/续费笔数全为 0

**问题**：`dws_finance_daily_summary` 中 `first_recharge_count` 和 `renewal_count` 全为 0，但 `recharge_count` 有值。

**DWD 验证**（已确认源数据正确）：
- `dwd_recharge_order.is_first` 字段完好
- 3 月：首充 6 笔 ¥14,996 / 续费 43 笔 ¥204,998
- ETL 聚合时未读取 `is_first` 字段进行分类统计

**修复方案**：`finance_recharge_task.py` 中按 `is_first` 分组统计，写入 `first_recharge_count` / `renewal_count`

**状态**：待实施

---

## 二、文案优化

### 2.1 "储值卡结算冲销" → "储值卡消费抵扣"

**位置**：
- `board_service.py:984` — 空降级值
- `board_service.py:1023` — 正常取值
- `fdw_queries.py:2898` — 查询层

**状态**：待实施

---

## 三、新增指标

### 3.1 经营一览 — 补充效率指标

在经营一览板块"实收流水"数据下方新增一行，3 个指标横向排列：

```
┌──────────┬──────────┬──────────┐
│  开台数   │  客单价   │  日均额   │
│  3,262   │  ¥128.7  │ ¥13,991  │
└──────────┴──────────┴──────────┘
```

#### 计算方案

> 注意：客单价和日均额的分子使用**确认收入**（发生额-优惠后的实际入账），与所在位置"实收流水"语境一致。

| 指标 | 公式 | 数据来源 | 说明 |
|---|---|---|---|
| 开台数 | `SUM(order_count)` | `dws_finance_daily_summary.order_count` | 日期范围内结算单总数 |
| 客单价 | `SUM(confirmed_income) / SUM(order_count)` | 同上 | 确认收入 / 开台数 |
| 日均额 | `SUM(confirmed_income) / COUNT(DISTINCT stat_date)` | 同上 | 确认收入 / 营业天数 |

3 月实测值：开台 3,262 | 客单价 ¥128.7 | 日均额 ¥13,991

#### 展示方案

- 位置：经营一览板块"实收流水"数据下方
- 样式：3 列等宽卡片，灰色标签 + 黑色数值
- 环比：支持（compare=1 时显示环比变化）
- 区域过滤：area!=all 时，从 `dws_finance_area_daily` 对应 area_code 取 `order_count` + `confirmed_income`

#### 实现影响

- **后端**：`fdw_queries.get_finance_overview()` 追加返回 `order_count`；`board_service._build_overview()` 计算 `avg_per_order` 和 `avg_daily`
- **前端**：`board-finance.wxml` 经营一览实收流水下方加一行三列

### 3.2 预收资产 — 补充充值笔数

在储值卡充值实收行追加笔数信息：

```
储值卡充值实收  ¥222,994   50笔
```

> 首充/续费区分待 Bug 1.2 修复后展开为 `50笔（首充6 / 续费44）`

#### 计算方案

| 指标 | 公式 | 数据来源 |
|---|---|---|
| 充值笔数 | `SUM(recharge_count)` | `dws_finance_recharge_summary.recharge_count` |

#### 展示方案

- 位置：储值卡充值实收金额右侧
- 格式：`50笔`
- 环比：暂不做

### 3.3 应计收入 — 优惠扣减增加占比

每个优惠项显示金额 + 占总优惠的百分比：

```
团购优惠    ¥48,231   23.6%
会员折扣    ¥89,102   43.6%
手动调整    ¥31,540   15.4%
赠送卡抵扣  ¥28,230   13.8%
其他优惠    ¥7,209     3.5%
────────────────────────
总优惠      ¥204,312  100%
```

#### 计算方案

| 指标 | 公式 |
|---|---|
| 各项占比 | `该项金额 / discount_total * 100` |

#### 展示方案

- 位置：每个优惠项金额右侧
- 格式：`23.6%`，灰色小字
- 仅在总优惠 > 0 时显示占比

### 3.4 团购展示优化

#### 背景

团购数据上传时已上传的是**结算金额**（扣除平台各种扣费后的实际回款），因此不需要额外展示手续费和面值拆分。

#### 方案

将现金流入板块中"团购平台"标签改为"团购结算"，明确表达该金额是平台结算后到账金额，避免与核销面值混淆。

**位置**：后端 `board_service.py` / `fdw_queries.py` 中 cashflow 板块的团购项 label

**状态**：待实施

---

## 四、实施优先级

| 优先级 | 事项 | 工作量 |
|---|---|---|
| P1 | 文案优化（储值卡消费抵扣） | 小 |
| P1 | 经营一览补充效率指标（开台数/客单价/日均额） | 中 |
| P1 | 团购标签改为"团购结算" | 小 |
| P2 | 优惠占比展示 | 小 |
| P2 | 充值笔数展示 | 小 |
| P2 | 卡余额快照修复（Bug 1.1） | 中 |
| P2 | 充值首充/续费识别修复（Bug 1.2） | 小 |
