# 数据流向详解：ODS → DWD → DWS

## 整体数据流

```
上游 SaaS API / 离线 JSON
        │
        ▼
┌───────────────────────────────────────┐
│  ODS 层（ods）                         │
│  操作数据存储 — 原始数据落地            │
│  保留源 payload，便于回溯              │
│  23 张 ODS 表，对应 23 个 API 端点     │
└───────────────┬───────────────────────┘
                │ DWD_LOAD_FROM_ODS
                ▼
┌───────────────────────────────────────┐
│  DWD 层（dwd）                         │
│  明细数据 — 清洗、标准化、关联          │
│  维度表走 SCD2（缓慢变化维度）          │
│  事实表按时间增量写入                   │
└───────┬───────────────┬───────────────┘
        │               │ CORE_DIM_SYNC
        │ DWS 汇总任务   ▼
        │       ┌───────────────────────┐
        │       │  Core 层（core）      │
        │       │  跨平台统一维度层      │
        │       │  dim_assistant / dim_ │
        │       │  member / dim_site /  │
        │       │  dim_table            │
        │       └───────────────────────┘
        ▼
┌───────────────────────────────────────┐
│  DWS 层（dws）                         │
│  数据服务 — 汇总、指标                  │
│  助教业绩 / 财务日报 / 会员分析         │
│  工资计算                               │
└───────────────┬───────────────────────┘
                │ INDEX 指数任务
                ▼
┌───────────────────────────────────────┐
│  INDEX 层（dws）                       │
│  自定义指数算法                         │
│  WBI / NCI / RS / OS / MS / ML         │
│  日快照存储（stat_date）               │
└───────────────────────────────────────┘
```

## ODS 层（操作数据存储）

- Schema：`ods`
- 职责：从上游 SaaS API 抓取原始数据并落地，保留完整源 payload
- 数据来源：在线 API 抓取（`APIClient`）或离线 JSON 回放（`LocalJsonClient`）
- 任务模式：每个业务实体对应一个 ODS 任务（如 `ODS_PAYMENT`、`ODS_MEMBER`、`ODS_SETTLEMENT_RECORDS` 等），由 `BaseOdsTask` + `OdsTaskSpec` 声明式配置驱动，通过 `_build_task_class()` 工厂函数动态生成任务类
- 加载方式：`_insert_records_schema_aware` schema-aware 写入——运行时从 `information_schema` 读取目标表结构，按列名自动匹配，批量 upsert + 冲突处理（`ON CONFLICT` 策略可配置）

### 核心业务实体（23 个 ODS 任务）

助教账号档案（assistant_accounts_master）、结账记录（settlement_records）、台费计费流水（table_fee_transactions）、助教服务流水（assistant_service_records）、助教废除记录（assistant_cancellation_records）、门店商品销售流水（store_goods_sales_records）、支付流水（payment_transactions）、退款流水（refund_transactions）、平台/团购券核销（platform_coupon_redemption_records）、会员档案（member_profiles）、会员储值卡（member_stored_value_cards）、会员余额变动（member_balance_changes）、充值结算（recharge_settlements）、团购套餐定义（group_buy_packages）、团购套餐核销（group_buy_redemption_records）、库存汇总（goods_stock_summary）、库存变化记录（goods_stock_movements）、台桌维表（site_tables_master）、库存商品分类树（stock_goods_category_tree）、门店商品档案（store_goods_master）、台费折扣/调账（table_fee_discount_records）、租户商品档案（tenant_goods_master）、结账小票详情（settlement_ticket_details）。

## DWD 层（明细数据）

- Schema：`dwd`
- 职责：对 ODS 原始数据进行清洗、标准化、关联，生成可分析的明细数据
- 核心任务：`DWD_LOAD_FROM_ODS`
- 质量检查：`DWD_QUALITY_CHECK`

### 维度处理（SCD2）

维度表采用 SCD2（缓慢变化维度 Type 2）策略，由 `scd/` 模块处理：
- 会员维度（`dim_member`）
- 助教维度（`dim_assistant`）
- 商品维度（`dim_product`）
- 台桌维度（`dim_table`）
- 套餐维度（`dim_package`）

每条维度记录包含 `valid_from`、`valid_to`、`is_current` 字段，支持历史版本追溯。

### 事实表处理

事实表按时间增量写入，由 `loaders/facts/` 中的加载器处理：
- 订单事实、支付事实、退款事实、小票明细、充值结算、台费流水等

## DWS 层（数据服务）

- Schema：`dws`
- 职责：基于 DWD 明细数据进行汇总计算，输出业务指标和分析结果

### 汇总任务分类

| 类别 | 任务示例 | 建议频率 |
|------|----------|----------|
| 助教业绩 | `DWS_ASSISTANT_DAILY`、`DWS_ASSISTANT_MONTHLY` | 每小时 / 每日 |
| 财务日报 | `DWS_FINANCE_DAILY`、`DWS_FINANCE_INCOME_STRUCTURE` | 每小时 |
| 会员分析 | `DWS_MEMBER_CONSUMPTION`、`DWS_MEMBER_VISIT` | 每日 |
| 工资计算 | `DWS_ASSISTANT_SALARY` | 每月（月初） |
| 指数算法 | `DWS_WINBACK_INDEX`、`DWS_NEWCONV_INDEX`、`DWS_RELATION_INDEX` | 每 2-4 小时 |
| Core 维度同步 | `CORE_DIM_SYNC` | 每日（DWD_LOAD_FROM_ODS 之后） |

### 自定义指数算法

系统实现了六个自定义业务指数，参数存储在 `dws.cfg_index_parameters`：

| 指数 | 全称 | 说明 |
|------|------|------|
| WBI | Winback Index | 召回指数 |
| NCI | New Conversion Index | 新客转化指数 |
| RS | Relation Score | 关系评分 |
| OS | Overall Score | 综合评分 |
| MS | Member Score | 会员评分 |
| ML | Manual Ledger | 人工台账 |

公共参数：`percentile_lower/upper`（分位截断锚点）、`ewma_alpha`（指数加权移动平均平滑系数）。

### 指数日快照（2026-04 重构）

三张指数表（`relation_index` / `winback_index` / `newconv_index`）新增 `stat_date DATE NOT NULL DEFAULT CURRENT_DATE` 字段，唯一约束扩展为 `(site_id, member_id[, assistant_id], stat_date)`。每次任务运行追加当日快照而非覆盖历史，为指数回测、历史演化分析提供原始数据基础。Winback 任务配套 365 天保留策略，清理超过 365 天的历史快照以控制表体积。

## Core 维度层（跨平台统一维度）

- Schema：`core`
- 定位：跨平台统一维度层，屏蔽 ODS/DWD 多数据源（飞球 / 美团 / 后续新平台）的字段差异，供 `app` 视图层和业务库 FDW 统一引用
- 核心任务：`CORE_DIM_SYNC`（归属 DWS 层任务目录 `tasks/dws/core_dim_sync_task.py`）
- 上游依赖：`DWD_LOAD_FROM_ODS`（必须先完成 DWD 维度表 SCD2 写入）
- 同步范围：4 张维度表 — `dim_assistant` / `dim_member` / `dim_site` / `dim_table`
- 数据来源：DWD 层 `scd2_is_current = 1` 的当前版本快照
- 同步策略：TRUNCATE + 全量 INSERT（维度表行数较小，执行时间极短，避免增量合并复杂度）
- 起因：修复 `app` 视图在 core 维度为空时返回空结果的问题（关联审计 `docs/audit/changes/2026-04-15__meituan-settle-core-sync.md`）

## Utility 工具任务

工具任务位于 `tasks/utility/`，不在日常编排链路中，由手动 CLI 触发，服务于 schema 初始化、历史数据回填和回测推演等一次性或周期性离线需求。

### DWS_INDEX_BACKFILL（指数历史快照回填）

- 源码：`tasks/utility/index_backfill_task.py`
- 职责：逐天调用三个指数任务（`DWS_RELATION_INDEX` / `DWS_WINBACK_INDEX` / `DWS_NEWCONV_INDEX`）生成历史日快照，回填缺失的 `stat_date` 行
- 性能优化：三个指数任务实例在整轮回填中创建 1 次、循环 N 天复用，避免 N×3 次初始化开销（以 255 天为例避免 765 次初始化）
- 前置条件：三张指数表已完成日快照改造（`stat_date` 字段 + 复合唯一约束）
- 用途：指数算法参数调优验证、历史对照、补齐生产数据缺口
- 关联专题：P19 指数回测框架 Phase 1e

### DWS_TASK_SIMULATION（任务引擎历史推演）

- 源码：`tasks/utility/task_simulation_task.py`
- 职责：基于指数日快照，逐天重放 `task_generator` + `recall_detector` 逻辑，还原任务的完整生命周期（生成 / 升级 / 转移 / 完成 / follow_up）
- 前置条件：需先运行 `DWS_INDEX_BACKFILL` 产出完整的历史指数快照作为推演输入
- 数据库连接：额外使用业务库独立连接（`APP_DB_DSN` 环境变量），推演结果写入业务库任务相关表
- 任务引擎双模式配合：`task_engine.py` 同期升级为双模式 — HTTP 实时模式（日常生产）+ 推演模式（回测，由 `as_of_date` 参数驱动），两种模式共用核心规则逻辑
- 用途：回测验证分级分配、升级、转移规则的参数配置与边界行为
- 关联专题：P19 指数回测框架 Phase 2

## ETL 管理层

- Schema：`meta`
- 职责：调度元数据管理
- 内容：游标（水位）记录、任务运行记录、调度配置
- 关键组件：`cursor_manager.py`（水位管理）、`run_tracker.py`（运行记录）

## 窗口切分与补偿

大时间范围的数据抓取会按窗口切分执行，避免单次请求数据量过大：

| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| `run.window_split.unit` | `day` | 切分单位：day / week / month / none |
| `run.window_split.days` | `10` | 切分天数 |
| `run.window_split.compensation_hours` | `2` | 补偿小时数（处理跨窗口数据） |

## 数据质量保障

- `DWD_QUALITY_CHECK`：DWD 层质量检查
- `quality/integrity_service.py`：完整性检查服务（余额一致性等）
- `tasks/verification/`：ETL 后置校验（ODS/DWD/DWS/指数校验器）
