# DWD 层删除 dwd_settlement_head_ex.settle_list 冗余列 — 变更记录

> 结构性变更：删除 1 张表的 1 个 JSONB 列

## 溯源

- 日期：2026-02-14（Asia/Shanghai）
- Prompt：P20260214-040000 — 删除 DWD 层 dwd_settlement_head_ex 的 settle_list JSONB 列
- Direct cause：`settle_list` 列存储结算明细 JSON，与 ODS 层 `payload` 中的 `settleList` 对象完全重复。ODS 层 `settlelist` 列已在 `20260214_drop_ods_settlelist.sql` 中删除，DWD 层该列同样冗余。结算明细可随时从 ODS `payload->'settleList'` 按需提取。

## 变更内容

| Schema | 表名 | 操作 | 列名 | 原类型 | 说明 |
|--------|------|------|------|--------|------|
| `dwd` | `dwd_settlement_head_ex` | DROP COLUMN | `settle_list` | `JSONB` | 结算明细 JSON，与 ODS payload 中 settleList 重复 |

### Before / After

- Before：31 个字段（order_settle_id PK + 29 个业务字段 + settle_list JSONB）
- After：30 个字段（order_settle_id PK + 29 个业务字段）

## 变更原因

1. ODS 层 `settlement_records.payload`（jsonb）已存储完整 API 响应，其中包含 `settleList` 对象
2. ODS 层 `settlelist` 列已在同日迁移 `20260214_drop_ods_settlelist.sql` 中删除
3. DWD 层 `settle_list` 是从 ODS `settlelist` 映射而来的副本，上游已删除，DWD 层同步清理
4. DWD 加载映射（`dwd_load_task.py` FACT_MAPPINGS）中 `settle_list` 映射已移除

## 影响范围

| 影响对象 | 影响程度 | 说明 |
|----------|----------|------|
| DWD 加载任务 | ✅ 已处理 | `dwd_load_task.py` FACT_MAPPINGS 中 `dwd_settlement_head_ex` 的 `settle_list` 映射已移除 |
| DWS 汇总层 | 无影响 | DWS 层不消费 `settle_list` 列 |
| API 契约 | 无影响 | API 响应结构不变 |
| 小程序 | 无影响 | 小程序不直接读 DWD 层 |
| BD 手册 | ✅ 已处理 | `BD_manual_dwd_settlement_head_ex.md` 字段列表已不含 `settle_list` |

## 回滚策略

```sql
-- 1) 恢复列结构
ALTER TABLE dwd.dwd_settlement_head_ex ADD COLUMN settle_list JSONB;

-- 2) 从 ODS payload 回填数据
UPDATE dwd.dwd_settlement_head_ex e
SET settle_list = o.payload->'settleList'
FROM ods.settlement_records o
WHERE e.order_settle_id = o.id;
```

**注意事项**：
- 回滚后 `settle_list` 列数据为 NULL，必须执行回填 UPDATE
- 若 ODS 中 `payload IS NULL` 的行，对应 DWD 行的 `settle_list` 将为 NULL（无法恢复）

## 验证 SQL

```sql
-- 1) 确认 settle_list 列已不存在
SELECT column_name
FROM information_schema.columns
WHERE table_schema = 'dwd'
  AND table_name = 'dwd_settlement_head_ex'
  AND column_name = 'settle_list';
-- 预期：0 行

-- 2) 确认表当前列数
SELECT count(*) AS total_columns
FROM information_schema.columns
WHERE table_schema = 'dwd'
  AND table_name = 'dwd_settlement_head_ex';
-- 预期：30（order_settle_id + 29 个业务字段）

-- 3) 确认 ODS payload 中 settleList 仍可按需提取
SELECT count(*)
FROM ods.settlement_records
WHERE payload IS NOT NULL AND payload->'settleList' IS NOT NULL;
-- 预期：> 0（结算明细数据仍可从 ODS 获取）

-- 4) 确认 DWD 表数据完整性（主表-扩展表行数一致）
SELECT
  (SELECT count(*) FROM dwd.dwd_settlement_head) AS main_count,
  (SELECT count(*) FROM dwd.dwd_settlement_head_ex) AS ex_count;
-- 预期：两个计数相等
```

## 迁移文件

`database/migrations/20260214_drop_dwd_settle_list.sql`

## 关联变更

- ODS 层同日变更：`database/migrations/20260214_drop_ods_settlelist.sql`（删除 `settlement_records.settlelist` 和 `recharge_settlements.settlelist`）
- BD 手册 ODS 变更记录：`docs/database/ODS/changes/20260214_drop_ods_settlelist.md`
