# CLAUDE.md — ETL Feiqiu Connector

进入本目录时自动加载。包含 DWD 和 DWS 层的强制业务规则。

## DWD-DOC 标杆文档（权威数据源）

`docs/reports/DWD-DOC/` 是业务模型与财务数据的权威标杆文档。所有涉及金额口径、支付渠道、消费链路、账务公式、字段语义的开发工作，必须以此目录为第一参考源。

### 文档清单

| 文件 | 内容 | 关键规则 |
|------|------|----------|
| `01-business-panorama.md` | 消费链路 + 优惠机制 + 消费场景 | settle_type 枚举、助教费用拆分、团购券三层价格 |
| `02-accounting-panorama.md` | 支付渠道 + 对账公式 + consume_money 口径 | 支付渠道恒等式、F2 三期公式 |
| `03-financial-panorama.md` | 收入构成 + 储值卡资金流 + 对账矩阵 | 平台结算互斥关系 |
| `04-dimension-panorama.md` | 维度表与主数据全景 | SCD2 维度取值规则 |
| `05-f2-balance-audit.md` | F2 收支平衡公式专项 | 三期公式 + 139 笔失败根因 |
| `06-calibration-checklist.md` | 校准清单 + 验证 SQL | 全部验证公式集中 |
| `consume/consume-money-caliber.md` | consume_money 口径变化时间线 | 三种口径(A/B/C)定义与切换时间点 |

### DWD 强制规则（12 条）

1. **consume_money 禁止直接用于计算**：存在三种历史口径(A/B/C)混合，DWS 层及下游统一使用 `items_sum = table_charge_money + goods_money + assistant_pd_money + assistant_cx_money + electricity_money`
2. **助教费用必须拆分**：使用 `assistant_pd_money`（陪打）和 `assistant_cx_money`（超休），禁止使用 `service_fee` / `ASSISTANT_BASE` / `ASSISTANT_BONUS`（`service_fee` 仅在平台结算表中表示"平台服务费"，语义不同）
3. **支付渠道恒等式**：`balance_amount = recharge_card_amount + gift_card_amount`（100% 成立），三者不可重复计算
4. **settle_type 过滤**：正向交易取 `IN (1, 3)`，本表无 `is_delete` 字段
5. **电费未启用**：`electricity_money` 全为 0，`gross_amount` 不含电费是正确的
6. **折扣互斥**：`discount_manual`（大客户优惠）与 `discount_other` 互斥，两者之和 = `adjust_amount`
7. **现金流互斥**：`cash_inflow_total` 中 `platform_settlement_amount` 和 `groupbuy_pay_amount` 互斥
8. **废单判断**：使用 `dwd_assistant_service_log_ex.is_trash`，`dwd_assistant_trash_event` 已废弃
9. **储值卡字段命名**：DWS 层使用 `balance_pay`/`recharge_card_pay`/`gift_card_pay`；财务日报用 `recharge_card_consume`
10. **会员字段断档（DQ-6）**：`settlement_head.member_phone/member_name` 自 2025-12 起全为 NULL → 通过 `member_id` LEFT JOIN `dwd.dim_member`（`scd2_is_current=1`）
11. **会员卡字段断档（DQ-7）**：`settlement_head.member_card_type_name` 自 2025-07-21 起全为 NULL → 通过 `member_id` LEFT JOIN `dwd.dim_member_card_account`（`scd2_is_current=1`）。通用规则：结算单上所有会员冗余字段均不可靠
12. **支付方式拆分（DQ-8）**：`dwd_settlement_head_ex.cash_amount`/`online_amount` 不可靠。正确来源是 `dwd_payment` 表：`payment_method=2` 现金，`payment_method=4` 扫码。通过 `relate_type=2` + `relate_id` 关联结算单

## DWS 层权威规范

> DWD 12 条在 DWS 层同样生效。冲突时以 DWD-DOC 为准。

### 幂等更新策略
- 汇总表默认 delete-before-insert（按日期范围 + site_id 先删后插）
- 库存表使用 upsert（`ON CONFLICT DO UPDATE`）
- 禁止 TRUNCATE

### 课程类型与定价
- 课程类型通过 `cfg_skill_type` 映射（`skill_id` → `course_type_code`：BASE/BONUS/ROOM），禁止硬编码
- 定价通过 `cfg_assistant_level_price` 按 SCD2 生效期 as-of join，禁止硬编码价格
- 包厢课统一 138 元/小时（`dws.salary.room_course_price`）

### 绩效档位与工资
- 绩效档位通过 `cfg_performance_tier` 按有效业绩小时数匹配 `[min_hours, max_hours)` 区间
- 新入职折算：入职日期在当月 1 日后按日均 × 30 定档；> 25 日最高 T2
- 奖金通过 `cfg_bonus_rules`：SPRINT 不累计取最高档，TOP_RANK 按排名（1000/600/400 元）
- 排名使用 `calculate_rank_with_ties()`，相同业绩并列

### 会员与散客
- 散客：`member_id ≤ 0`，不计入会员统计（但计入助教业绩）
- 客户分层：高价值（90 天 ≥ 3 次且 ≥ 1000 元）→ 中等 → 低活跃 → 流失
- 会员信息一律通过 ID 关联维度表

### 时间窗口与调度
- 滚动窗口标准集：7/10/15/30/60/90 天
- 月度任务宽限期：月初前 5 天可处理上月数据
- 工资计算周期：月初前 5 天运行

### 指数参数
- 所有权重和阈值通过 `cfg_index_parameters` 按 `index_type`（WBI/NCI/RS/OS/MS/ML/SPI）加载，禁止硬编码

### 台桌分类
- `cfg_area_category` 仅精确匹配 + 兜底：BILLIARD/SNOOKER/OTHER。`BILLIARD_VIP` 已废弃

### 参考优先级

DWD-DOC > DWS 权威规范 > BD 手册 > ETL 任务文档 > 业务规则文档 > DDL 注释
