# P2：ETL 扩展层 — etl-dws-miniapp-extensions

> 优先级：P2（依赖 P1）
> 预估工作量：大

---

## 需求（Requirements）

### 用户故事

1. 作为产品经理，我需要 SPI 消费力指数来评估客户消费层级，替代现有的 `customer_tier` 分层。
2. 作为产品经理，我需要助教订单流水四项统计（订单总流水/订单净流水/时效贡献流水/时效净贡献），以便评估助教个人能力。
3. 作为产品经理，我需要客户 30/60/90 天充值次数和金额、次均消费，以便在客户看板中展示。
4. 作为产品经理，我需要定档折算惩罚数据，以便在绩效页面展示折算详情。

### 验收标准

- AC1：`dws_member_spending_power_index` 表存在，SPI 展示分 0-10 分布合理
- AC2：`dws_assistant_order_contribution` 表存在，四项统计数值可对照 PRD 示例验算
- AC3：`dws_member_consumption_summary` 新增字段有值（`recharge_count_30d/60d/90d`、`recharge_amount_30d/60d/90d`、`avg_ticket_amount`）
- AC4：`dws_assistant_daily_detail` 新增字段在符合惩罚条件的订单上正确填充
- AC5：新表的 RLS 视图和 FDW 映射已同步创建
- AC6：`cfg_index_parameters` 中新增 `SPI` 类型的配置行 ✅（已完成，26 个参数，effective_from=2026-02-23）

---

## 设计要点

### SPI 指数
- 完整算法见 `docs/prd/SPI 消费力指数.md`
- 新建 ETL 任务 `SpendingPowerIndexTask`，继承 `BaseIndexTask`
- 粒度：`(site_id, member_id)`，每日计算

### 助教订单流水四项统计
- 新建 ETL 任务 `AssistantOrderContributionTask`
- 粒度：`(site_id, assistant_id, stat_date)`，`stat_date` 为营业日（以 08:00 为日切点，08:00 前的记录归属前一天）
- 完整算法与表结构见 `docs/database/BD_Manual_dws_assistant_order_contribution.md`
- 数据来源（已校准，数据源：DWD-DOC 01-业务全景 + 02-账务全景）：
  - `dwd.dwd_settlement_head`：结算单信息，筛选 `settle_type IN (1, 3)`
  - `dwd.dwd_table_fee_log`：台桌使用时长、台费金额
  - `dwd.dwd_assistant_service_log`：助教服务时长、服务流水、分成
- 消费金额口径：使用 `items_sum` 相关字段（table_charge_money + goods_money + assistant_pd_money + assistant_cx_money），不使用 `consume_money`

### 命名方案

| 中文名 | 字段名 | 含义 |
|--------|--------|------|
| 订单总流水 | `order_gross_revenue` | 助教参与订单的全部流水 |
| 订单净流水 | `order_net_revenue` | 总流水 - 助教服务分成 |
| 时效贡献流水 | `time_weighted_revenue` | 按服务时长折算的个人贡献 |
| 时效净贡献 | `time_weighted_net_revenue` | 时效贡献 - 助教服务分成 |

### 定档折算惩罚
- 扩展 `dws_assistant_daily_detail`：`penalty_minutes`、`penalty_reason`、`is_exempt`、`per_hour_contribution`
- 检测逻辑：同一台桌同一时段 >2 名助教 → 计算单人贡献流水 → <24 元则按比例折算
- 豁免标记：在订单级别打标（`is_exempt` 字段）
- 每日 ETL 自动计算

---

## 任务清单

- [x] T1：设计并创建 `dws_member_spending_power_index` 表 ✅（已完成，24 字段 + 2 索引，迁移脚本 `2026-02-23_create_dws_member_spending_power_index.sql`，测试库已建表，0 行待跑数）
- [x] T2：实现 `SpendingPowerIndexTask`（含 Level/Speed/Stability 子分）✅（已完成，代码 `tasks/dws/index/spending_power_index_task.py`，已注册 task_registry，含单元测试 + 属性测试 + BD_Manual 文档）
- [x] T3：在 `cfg_index_parameters` 中插入 SPI 默认参数 ✅（已完成，27 个参数含 Level/Speed/Stability 权重、压缩基数、窗口天数等）
- [ ] T4：设计并创建 `dws_assistant_order_contribution` 表
- [ ] T5：实现 `AssistantOrderContributionTask`
- [ ] T6：扩展 `dws_member_consumption_summary`（充值窗口 + 次均消费字段）
- [ ] T7：修改 `MemberConsumptionSummaryTask` 填充新字段
- [ ] T8：扩展 `dws_assistant_daily_detail`（定档折算惩罚字段）
- [ ] T9：实现定档折算惩罚检测与计算逻辑
- [ ] T10：为新表创建 RLS 视图 + FDW 映射
- [ ] T11：影子跑数验证（SPI 分布、流水统计对账）
