feat: P1-P3 全栈集成 — 数据库基础 + DWS 扩展 + 小程序鉴权 + 工程化体系

## P1 数据库基础
- zqyy_app: 创建 auth/biz schema、FDW 连接 etl_feiqiu
- etl_feiqiu: 创建 app schema RLS 视图、商品库存预警表
- 清理 assistant_abolish 残留数据

## P2 ETL/DWS 扩展
- 新增 DWS 助教订单贡献度表 (dws.assistant_order_contribution)
- 新增 assistant_order_contribution_task 任务及 RLS 视图
- member_consumption 增加充值字段、assistant_daily 增加处罚字段
- 更新 ODS/DWD/DWS 任务文档及业务规则文档
- 更新 consistency_checker、flow_runner、task_registry 等核心模块

## P3 小程序鉴权系统
- 新增 xcx_auth 路由/schema(微信登录 + JWT)
- 新增 wechat/role/matching/application 服务层
- zqyy_app 鉴权表迁移 + 角色权限种子数据
- auth/dependencies.py 支持小程序 JWT 鉴权

## 文档与审计
- 新增 DOCUMENTATION-MAP 文档导航
- 新增 7 份 BD_Manual 数据库变更文档
- 更新 DDL 基线快照(etl_feiqiu 6 schema + zqyy_app auth)
- 新增全栈集成审计记录、部署检查清单更新
- 新增 BACKLOG 路线图、FDW→Core 迁移计划

## Kiro 工程化
- 新增 5 个 Spec(P1/P2/P3/全栈集成/核心业务)
- 新增审计自动化脚本(agent_on_stop/build_audit_context/compliance_prescan)
- 新增 6 个 Hook(合规检查/会话日志/提交审计等)
- 新增 doc-map steering 文件

## 运维与测试
- 新增 ops 脚本:迁移验证/API 健康检查/ETL 监控/集成报告
- 新增属性测试:test_dws_contribution / test_auth_system
- 清理过期 export 报告文件
- 更新 .gitignore 排除规则
This commit is contained in:
Neo
2026-02-26 08:03:53 +08:00
parent fafc95e64c
commit b25308c3f4
224 changed files with 17660 additions and 32198 deletions

View File

@@ -51,10 +51,10 @@ graph LR
| 文档 | 说明 |
|------|------|
| [BaseTask 公共机制](base_task_mechanism.md) | 任务基类模板方法、TaskContext、时间窗口、注册表、Flow 执行 |
| [ODS 层任务](ods_tasks.md) | 22 个通用 ODS 任务的架构、配置结构、API 端点、目标表 |
| [ODS 层任务](ods_tasks.md) | 23 个通用 ODS 任务的架构、配置结构、API 端点、目标表 |
| [DWD 层任务](dwd_tasks.md) | DWD_LOAD_FROM_ODS 核心装载、SCD2 处理、质量校验 |
| [DWS 层任务](dws_tasks.md) | 助教业绩、会员分析、财务统计、运维任务共 13 个 DWS 任务 |
| [INDEX 层任务](index_tasks.md) | WBI/NCI/RS 指数算法 + ML 手动台账导入 |
| [DWS 层任务](dws_tasks.md) | 助教业绩、会员分析、财务统计、库存汇总、运维任务共 17 个 DWS 任务 |
| [INDEX 层任务](index_tasks.md) | WBI/NCI/RS/SPI 指数算法 + ML 手动台账导入 |
| [工具类任务](utility_tasks.md) | Schema 初始化、手动入库、归档、截止检查、完整性校验 |
---
@@ -89,6 +89,7 @@ graph LR
| `ODS_STORE_GOODS_SALES` | `OdsGoodsLedgerTask` | `ods.store_goods_sales_records` | 门店商品销售流水 | [查看](ods_tasks.md) |
| `ODS_TENANT_GOODS` | `OdsTenantGoodsTask` | `ods.tenant_goods_master` | 租户商品档案 | [查看](ods_tasks.md) |
| `ODS_SETTLEMENT_RECORDS` | `OdsOrderSettleTask` | `ods.settlement_records` | 结账记录 | [查看](ods_tasks.md) |
| `ODS_STAFF_INFO` | `OdsStaffInfoTask` | `ods.staff_info_master` | 员工档案(含在职/离职) | [查看](ods_tasks.md) |
### DWD 层(明细数据)
@@ -108,6 +109,7 @@ graph LR
| `DWS_ASSISTANT_CUSTOMER` | `AssistantCustomerTask` | `dws_assistant_customer_stats` | 日期+助教+会员 | [查看](dws_tasks.md) |
| `DWS_ASSISTANT_SALARY` | `AssistantSalaryTask` | `dws_assistant_salary_calc` | 月份+助教 | [查看](dws_tasks.md) |
| `DWS_ASSISTANT_FINANCE` | `AssistantFinanceTask` | `dws_assistant_finance_analysis` | 日期+助教 | [查看](dws_tasks.md) |
| `DWS_ASSISTANT_ORDER_CONTRIBUTION` | `AssistantOrderContributionTask` | `dws_assistant_order_contribution` | 日期+助教 | [查看](dws_tasks.md) |
#### 会员分析域
@@ -125,6 +127,14 @@ graph LR
| `DWS_FINANCE_INCOME_STRUCTURE` | `FinanceIncomeStructureTask` | `dws_finance_income_structure` | 日期+收入类型 | [查看](dws_tasks.md) |
| `DWS_FINANCE_DISCOUNT_DETAIL` | `FinanceDiscountDetailTask` | `dws_finance_discount_detail` | 日期+折扣类型 | [查看](dws_tasks.md) |
#### 库存汇总域
| 任务代码 | Python 类 | 目标表 | 粒度 | 详情 |
|----------|-----------|--------|------|------|
| `DWS_GOODS_STOCK_DAILY` | `GoodsStockDailyTask` | `dws_goods_stock_daily_summary` | 日期+商品 | [查看](dws_tasks.md) |
| `DWS_GOODS_STOCK_WEEKLY` | `GoodsStockWeeklyTask` | `dws_goods_stock_weekly_summary` | ISO周+商品 | [查看](dws_tasks.md) |
| `DWS_GOODS_STOCK_MONTHLY` | `GoodsStockMonthlyTask` | `dws_goods_stock_monthly_summary` | 月份+商品 | [查看](dws_tasks.md) |
#### 运维任务
| 任务代码 | Python 类 | 简要说明 | 详情 |
@@ -140,6 +150,7 @@ graph LR
| `DWS_NEWCONV_INDEX` | `NewconvIndexTask` | `dws_member_newconv_index` | NCI新客转化指数 | [查看](index_tasks.md) |
| `DWS_RELATION_INDEX` | `RelationIndexTask` | `dws_relation_index` | RS关系指数 | [查看](index_tasks.md) |
| `DWS_ML_MANUAL_IMPORT` | `MlManualImportTask` | `dws_ml_manual_ledger` | ML手动台账导入 | [查看](index_tasks.md) |
| `DWS_SPENDING_POWER_INDEX` | `SpendingPowerIndexTask` | `dws_member_spending_power_index` | SPI消费力指数 | [查看](index_tasks.md) |
### 工具类 / 校验类
@@ -353,4 +364,4 @@ python -m cli.main --tasks DATA_INTEGRITY_CHECK
---
> 最后更新日期2026-02-18
> 最后更新日期2026-02-26

View File

@@ -286,8 +286,8 @@ default_registry.register("DWS_ASSISTANT_FINANCE", AssistantFinanceTask, layer="
|----|------|------|
| ODS | 23 | 通用 ODS 任务(由 `ODS_TASK_CLASSES` 动态生成),全部默认 `skip_unchanged=True` |
| DWD | 2 | 含核心装载任务 `DWD_LOAD_FROM_ODS` 和质量检查 |
| DWS | 13 | 助教业绩、会员分析、财务统计、统一维护任务(原 3 个 MV 刷新/清理任务已合并为 DWS_MAINTENANCE |
| INDEX | 4 | 回流指数、新客转化指数、关系指数、手动台账导入 |
| DWS | 17 | 助教业绩(含订单流水贡献)、会员分析、财务统计、库存汇总、运维维护(原 3 个 MV 刷新/清理任务已合并为 DWS_MAINTENANCE |
| INDEX | 5 | 回流指数、新客转化指数、关系指数、消费力指数、手动台账导入 |
| 工具类 | 7 | Schema 初始化、手动入库、归档、校验等 |
| 校验类 | 1 | 数据完整性校验 |

View File

@@ -8,9 +8,9 @@
## 概述
DWS 层共有 13 个已注册任务,按业务域分为组:
DWS 层共有 17 个已注册任务(含 DWS_MAINTENANCE,按业务域分为组:
### 助教业绩域(5 个)
### 助教业绩域(6 个)
| 任务代码 | Python 类 | 目标表 | 粒度 | 更新策略 |
|----------|-----------|--------|------|----------|
@@ -19,6 +19,7 @@ DWS 层共有 13 个已注册任务,按业务域分为四组:
| `DWS_ASSISTANT_CUSTOMER` | `AssistantCustomerTask` | `dws_assistant_customer_stats` | 日期+助教+会员 | delete-before-insert |
| `DWS_ASSISTANT_SALARY` | `AssistantSalaryTask` | `dws_assistant_salary_calc` | 月份+助教 | delete-before-insert |
| `DWS_ASSISTANT_FINANCE` | `AssistantFinanceTask` | `dws_assistant_finance_analysis` | 日期+助教 | delete-before-insert |
| `DWS_ASSISTANT_ORDER_CONTRIBUTION` | `AssistantOrderContributionTask` | `dws_assistant_order_contribution` | 日期+助教 | delete-before-insert |
### 会员分析域2 个)
@@ -36,6 +37,14 @@ DWS 层共有 13 个已注册任务,按业务域分为四组:
| `DWS_FINANCE_INCOME_STRUCTURE` | `FinanceIncomeStructureTask` | `dws_finance_income_structure` | 日期+收入类型 | delete-before-insert |
| `DWS_FINANCE_DISCOUNT_DETAIL` | `FinanceDiscountDetailTask` | `dws_finance_discount_detail` | 日期+折扣类型 | delete-before-insert |
### 库存汇总域3 个)
| 任务代码 | Python 类 | 目标表 | 粒度 | 更新策略 |
|----------|-----------|--------|------|----------|
| `DWS_GOODS_STOCK_DAILY` | `GoodsStockDailyTask` | `dws_goods_stock_daily_summary` | 日期+商品 | upsert |
| `DWS_GOODS_STOCK_WEEKLY` | `GoodsStockWeeklyTask` | `dws_goods_stock_weekly_summary` | ISO周+商品 | upsert |
| `DWS_GOODS_STOCK_MONTHLY` | `GoodsStockMonthlyTask` | `dws_goods_stock_monthly_summary` | 月份+商品 | upsert |
### 运维任务2 个)
| 任务代码 | Python 类 | 继承 | 说明 | 更新策略 |
@@ -377,6 +386,51 @@ dwd_assistant_service_log ────► DWS_ASSISTANT_CUSTOMER客户关系
---
### DWS_ASSISTANT_ORDER_CONTRIBUTION — 助教订单流水四项统计
| 属性 | 值 |
|------|-----|
| 任务代码 | `DWS_ASSISTANT_ORDER_CONTRIBUTION` |
| Python 类 | `AssistantOrderContributionTask``tasks/dws/assistant_order_contribution_task.py` |
| 目标表 | `dws.dws_assistant_order_contribution` |
| 主键 | `site_id`, `assistant_id`, `stat_date` |
| 粒度 | 日期 + 助教 |
| 更新策略 | delete-before-insert按日期窗口 |
| 更新频率 | 每日更新 |
| 依赖 | `DWD_LOAD_FROM_ODS` |
#### 数据来源
| 来源表 | Schema | 用途 |
|--------|--------|------|
| `dwd_settlement_head` | `dwd` | 结算主表(订单级信息) |
| `dwd_table_fee_log` | `dwd` | 台费明细(台桌使用时长、台费金额) |
| `dwd_assistant_service_log` | `dwd` | 助教服务记录(服务时长、流水、分成) |
#### 聚合维度与输出字段
`(assistant_id, stat_date)` 聚合,输出以下字段:
| 字段分组 | 字段 | 说明 |
|----------|------|------|
| 标识 | `site_id`, `tenant_id`, `assistant_id`, `assistant_nickname`, `stat_date` | 门店、助教、日期 |
| 四项统计 | `order_gross_revenue` | 订单总流水:台费 + 酒水食品 + 所有助教服务费 |
| | `order_net_revenue` | 订单净流水:订单总流水 - 所有助教服务分成 |
| | `time_weighted_revenue` | 时效贡献流水:按服务时长折算的个人贡献 |
| | `time_weighted_net_revenue` | 时效净贡献:时效贡献流水 - 个人服务分成 |
| 辅助 | `order_count`, `total_service_seconds` | 参与订单数、总服务时长秒数 |
#### 核心业务逻辑
1. **订单总流水order_gross_revenue**:助教参与订单的全部流水(台费 + 酒水食品 + 所有助教服务费),每个参与助教获得相同值
2. **订单净流水order_net_revenue**:订单总流水 - 该订单所有助教的服务分成总额,每个参与助教获得相同值
3. **时效贡献流水time_weighted_revenue**:台费按助教在各台桌的服务时长占比分摊 + 个人服务费 + 酒水食品按总时长比例均分
4. **时效净贡献time_weighted_net_revenue**:时效贡献流水 - 该助教个人的服务分成
5. **超休/打赏课特殊处理**`course_type = BONUS` 的助教不参与订单级分摊,四项统计均等于个人服务流水和分成
6. **台费分摊公式**`billable_seconds = MAX(SUM(助教服务时长), 台桌使用时长)`,各助教按 `service_seconds / billable_seconds` 比例分摊
---
### DWS_ASSISTANT_DAILY — 助教日度业绩明细
| 属性 | 值 |

View File

@@ -8,16 +8,17 @@
## 概述
INDEX 层共有 4 个已注册任务:
INDEX 层共有 5 个已注册任务:
| 任务代码 | Python 类 | 目标表 | 指数类型 | 更新策略 |
|----------|-----------|--------|----------|----------|
| `DWS_WINBACK_INDEX` | `WinbackIndexTask` | `dws_member_winback_index` | WBI回流指数 | delete-before-insert按门店全量刷新 |
| `DWS_NEWCONV_INDEX` | `NewconvIndexTask` | `dws_member_newconv_index` | NCI新客转化指数 | delete-before-insert按门店全量刷新 |
| `DWS_RELATION_INDEX` | `RelationIndexTask` | `dws_member_assistant_relation_index` | RS/OS/MS/ML关系指数 | delete-before-insert按门店全量刷新 |
| `DWS_SPENDING_POWER_INDEX` | `SpendingPowerIndexTask` | `dws_member_spending_power_index` | SPI消费力指数 | delete-before-insert按门店全量刷新 |
| `DWS_ML_MANUAL_IMPORT` | `MlManualImportTask` | `dws_ml_manual_order_source` / `dws_ml_manual_order_alloc` | ML手动台账导入 | 按 scope 先删后写 |
> 注册位置:`orchestration/task_registry.py`,所有 INDEX 任务的 `requires_db_config=False`、`layer="INDEX"`。
> 注册位置:`orchestration/task_registry.py`,所有 INDEX 任务的 `requires_db_config=False`、`layer="INDEX"`。SPI 任务额外声明 `depends_on=["DWS_MEMBER_CONSUMPTION"]`。
---
@@ -34,8 +35,9 @@ BaseTask
├── MemberIndexBaseTask ← WBI / NCI 共享的会员特征提取
│ ├── WinbackIndexTask
│ └── NewconvIndexTask
├── RelationIndexTask ← RS/OS/MS/ML 四合一
── MlManualImportTask ← ML 人工台账导入
├── RelationIndexTask ← RS/OS/MS/ML 四合一
── SpendingPowerIndexTask SPI 消费力指数(独立数据提取)
└── MlManualImportTask ← ML 人工台账导入
```
### 子类必须实现的抽象方法
@@ -414,6 +416,177 @@ NCI 产出 3 个 Display Score
| `w_value` | 1.0 | 价值权重 |
---
## DWS_SPENDING_POWER_INDEX — 消费力指数SPI
| 属性 | 值 |
|------|-----|
| 任务代码 | `DWS_SPENDING_POWER_INDEX` |
| Python 类 | `SpendingPowerIndexTask``tasks/dws/index/spending_power_index_task.py` |
| 继承链 | `BaseTask → BaseDwsTask → BaseIndexTask → SpendingPowerIndexTask` |
| 目标表 | `dws.dws_member_spending_power_index` |
| 主键 | `site_id, member_id` |
| 指数类型 | `SPI` |
| 依赖任务 | `DWS_MEMBER_CONSUMPTION` |
| 更新策略 | 按门店全量刷新(先 DELETE WHERE site_id = %s再 INSERT |
### 业务含义
SPI 衡量会员在门店内的综合消费力层级——分数越高,表示该会员的消费能力和消费意愿越强。适用于客户分层、资源分配和精准营销场景,与 WBI/NCI 等运营指数协同使用。
SPI 不使用 `MemberIndexBaseTask` 的会员分群逻辑NEW/OLD/STOP所有在近 90 天内有消费或充值记录的会员均参与计算。
### 计算范围
所有在近 90 天内有消费订单settle_type IN (1, 3)或充值订单settle_type = 5的会员。无任何消费/充值数据的门店跳过计算,返回 `{'status': 'skipped', 'reason': 'no_data'}`
### 数据来源
| 数据 | 来源表 | 提取方式 |
|------|--------|----------|
| 消费订单 | `dwd.dwd_settlement_head` | settle_type IN (1, 3),近 90 天,聚合为会员级特征 |
| 充值订单 | `dwd.dwd_recharge_order` | settle_type = 5近 90 天,聚合为会员级充值特征 |
| 算法参数 | `dws.cfg_index_parameters` | index_type = 'SPI' |
### 基础特征SPIMemberFeatures
从 DWD 层提取并计算的会员级消费特征:
| 字段 | 类型 | 含义 |
|------|------|------|
| `spend_30` | float | 近 30 天消费总额 |
| `spend_90` | float | 近 90 天消费总额 |
| `recharge_90` | float | 近 90 天充值总额 |
| `orders_30` | int | 近 30 天消费笔数 |
| `orders_90` | int | 近 90 天消费笔数 |
| `visit_days_30` | int | 近 30 天消费日数(按天去重) |
| `visit_days_90` | int | 近 90 天消费日数(按天去重) |
| `avg_ticket_90` | float | 90 天客单价:`spend_90 / max(orders_90, 1)` |
| `active_weeks_90` | int | 近 90 天有消费的自然周数(最多 13 周) |
| `daily_spend_ewma_90` | float | 近 90 天日消费 EWMA |
### 算法概要
SPI 由三个子分加权合成:
```
SPI_raw = w_L × Level + w_S × Speed + w_P × Stability
```
默认权重:`w_L = 0.60``w_S = 0.30``w_P = 0.10`
#### 子分 1消费水平Level
基于消费金额和客单价的 log1p 压缩加权,衡量客户消费金额层级:
```
L = w_s30 × ln(1 + spend_30 / M30)
+ w_s90 × ln(1 + spend_90 / M90)
+ w_ticket × ln(1 + avg_ticket_90 / T0)
+ w_r90 × ln(1 + recharge_90 / R90)
```
| 参数 | 默认值 | 含义 |
|------|--------|------|
| `w_level_spend_30` (w_s30) | 0.30 | 近 30 天消费权重 |
| `w_level_spend_90` (w_s90) | 0.35 | 近 90 天消费权重 |
| `w_level_ticket_90` (w_ticket) | 0.20 | 客单价权重 |
| `w_level_recharge_90` (w_r90) | 0.15 | 充值权重 |
| `amount_base_spend_30` (M30) | 500 | 30 天消费压缩基数 |
| `amount_base_spend_90` (M90) | 1500 | 90 天消费压缩基数 |
| `amount_base_ticket_90` (T0) | 200 | 客单价压缩基数 |
| `amount_base_recharge_90` (R90) | 1000 | 充值压缩基数 |
当所有消费和充值金额均为 0 时Level 子分为 0.0。
#### 子分 2消费速度Speed
衡量近期消费推进速度与节奏变化,由三个速度指标加权合成:
```
S = w_abs × V_abs + w_rel × max(0, V_rel) + w_ewma × V_ewma
```
| 速度指标 | 公式 | 含义 |
|----------|------|------|
| V_abs绝对速度 | `ln(1 + spend_30 / (max(visit_days_30, 1) × V0))` | 每消费日平均消费的对数压缩 |
| V_rel相对速度 | `ln((v_30 + ε) / (v_90 + ε))`,其中 `v_30 = spend_30/30``v_90 = spend_90/90` | 近期消费速率相对长期的变化 |
| V_ewmaEWMA 速度) | `ln(1 + daily_spend_ewma_90 / E0)` | 日消费 EWMA 的对数压缩 |
设计要点:仅对加速(`V_rel > 0`)加分,不对减速直接扣分(通过 `max(0, V_rel)` 实现)。
| 参数 | 默认值 | 含义 |
|------|--------|------|
| `w_speed_abs` | 0.50 | 绝对速度权重 |
| `w_speed_rel` | 0.30 | 相对速度权重 |
| `w_speed_ewma` | 0.20 | EWMA 速度权重 |
| `amount_base_speed_abs` (V0) | 100 | 绝对速度压缩基数 |
| `amount_base_ewma_90` (E0) | 50 | EWMA 速度压缩基数 |
| `speed_epsilon` (ε) | 1e-6 | 防除零小量 |
#### 子分 3消费稳定性Stability
基于近 90 天周覆盖率,识别稳定高消费与偶发冲高:
```
P = active_weeks_90 / 13
```
近 90 天共约 13 个自然周,`active_weeks_90` 为其中有消费的周数。取值范围 [0, 1]。
`use_stability = 0`Stability 子分权重视为 0跳过稳定性计算。
### Display Score 归一化
SPI 产出 4 组 Display Score各自独立归一化到 0-10 分:
| 展示分 | 对应 Raw Score | 分位历史 index_type |
|--------|---------------|---------------------|
| `display_score` | `raw_score`SPI 总分) | `SPI` |
| `score_level_display` | `score_level_raw` | `SPI_LEVEL` |
| `score_speed_display` | `score_speed_raw` | `SPI_SPEED` |
| `score_stability_display` | `score_stability_raw` | `SPI_STABILITY` |
归一化流程复用 `BaseIndexTask.batch_normalize_to_display`
```
Raw Score → [可选压缩] → Winsorize(P5, P95) → MinMax(0, 10) → [可选 EWMA 平滑]
```
### 金额压缩基数校准
SPI 支持金额压缩基数的自动校准机制:
1. 首次执行或参数缺失时,从门店近 90 天消费数据计算各基数的中位数作为建议值
2.`cfg_index_parameters` 中已存在对应参数,优先使用配置表中的值
3. 实际使用的基数值会输出到日志,便于运营人员审查和手动调优
### 执行流程
```
1. 获取 site_id
2. load_index_parameters('SPI') 加载参数(缺失参数使用 DEFAULT_PARAMS
3. _extract_spending_features从 dwd_settlement_head 提取消费特征
4. _extract_recharge_features从 dwd_recharge_order 提取充值特征
5. _compute_daily_spend_ewma计算日消费 EWMA
6. _calibrate_amount_bases校准金额压缩基数
7. 逐会员计算compute_level → compute_speed → compute_stability → compute_spi_raw
8. batch_normalize_to_displaySPI 总分 + 三个子分各自独立归一化
9. DELETE FROM dws_member_spending_power_index WHERE site_id = %s
10. _save_spi_data批量 INSERT
11. 保存分位点历史到 dws_index_percentile_historyindex_type='SPI'
```
### 默认权重
| 参数 | 默认值 | 含义 |
|------|--------|------|
| `weight_level` | 0.60 | Level 子分在总分中的权重 |
| `weight_speed` | 0.30 | Speed 子分在总分中的权重 |
| `weight_stability` | 0.10 | Stability 子分在总分中的权重 |
---
## DWS_RELATION_INDEX — 关系指数RS/OS/MS/ML
@@ -751,5 +924,29 @@ ORDER BY effective_from DESC
| `compression_mode` | 1 | 压缩模式(默认 log1p |
| `use_smoothing` / `ewma_alpha` | 1 / 0.2 | EWMA 平滑 |
### SPI 参数清单
| 参数名 | 默认值 | 说明 |
|--------|--------|------|
| `spend_window_short_days` | 30 | 短期消费窗口(天) |
| `spend_window_long_days` | 90 | 长期消费窗口(天) |
| `ewma_alpha_daily_spend` | 0.3 | 日消费 EWMA 平滑系数 |
| `amount_base_spend_30` | 500 | 30 天消费压缩基数 |
| `amount_base_spend_90` | 1500 | 90 天消费压缩基数 |
| `amount_base_ticket_90` | 200 | 客单价压缩基数 |
| `amount_base_recharge_90` | 1000 | 充值压缩基数 |
| `amount_base_speed_abs` | 100 | 绝对速度压缩基数 |
| `amount_base_ewma_90` | 50 | EWMA 速度压缩基数 |
| `w_level_spend_30` / `w_level_spend_90` | 0.30 / 0.35 | Level 子分中消费权重 |
| `w_level_ticket_90` / `w_level_recharge_90` | 0.20 / 0.15 | Level 子分中客单/充值权重 |
| `w_speed_abs` / `w_speed_rel` / `w_speed_ewma` | 0.50 / 0.30 / 0.20 | Speed 子分三项权重 |
| `weight_level` / `weight_speed` / `weight_stability` | 0.60 / 0.30 / 0.10 | SPI 总分三子分权重 |
| `stability_window_days` | 90 | 稳定性计算窗口(天) |
| `use_stability` | 1 | 是否启用稳定性子分0=跳过) |
| `percentile_lower` / `percentile_upper` | 5 / 95 | 归一化分位点 |
| `compression_mode` | 1 | 压缩模式(默认 log1p |
| `use_smoothing` / `ewma_alpha` | 1 / 0.2 | EWMA 分位平滑 |
| `speed_epsilon` | 1e-6 | 速度计算防除零小量 |
> 种子数据脚本:`db/etl_feiqiu/seeds/seed_index_parameters.sql`
> DDL 定义:`docs/database/ddl/etl_feiqiu__dws.sql`

View File

@@ -228,7 +228,7 @@ execute(cursor_data)
### content_hash 去重机制
`content_hash` 是通用 ODS 任务的核心去重手段,所有 22 个任务默认开启(`skip_unchanged=True`)。
`content_hash` 是通用 ODS 任务的核心去重手段,所有 23 个任务默认开启(`skip_unchanged=True`)。
#### 计算方式