# BD_Manual：ods.group_buy_package_details 团购套餐详情表

> 日期：2026-03-05
> 涉及库：`etl_feiqiu` / `test_etl_feiqiu`
> DDL 路径：`db/etl_feiqiu/ods/group_buy_package_details.sql`
> 直接原因：整合团购详情接口（QueryPackageCouponInfo），新建 ODS 详情表存储每个团购套餐的详情数据
> Prompt 摘要：etl-coupon-detail spec — 需求 3 验收标准 1-4

---

## 1. 变更说明

### 变更内容

新建 `ods.group_buy_package_details` 表，用于存储 `QueryPackageCouponInfo` 详情接口的原始数据。

| Schema | 表 | 操作 | 说明 |
|--------|-----|------|------|
| ods | group_buy_package_details | 新建 | 团购套餐详情，主键 `coupon_id`，含 12 个结构化字段 + 6 个 JSONB 数组字段 + 3 个 ETL 元数据字段 |

### 数据获取方式

通过 `ODS_GROUP_PACKAGE` 任务的 `detail_endpoint` 二级详情拉取子流程：
- 主流程拉取团购列表 → `ods.group_buy_packages`
- 子流程遍历每个 `id`，串行调用 `QueryPackageCouponInfo` → 本表
- 全量快照模式，UPSERT on `coupon_id`

### 关键字段

| 字段 | 类型 | 说明 |
|------|------|------|
| `coupon_id` | BIGINT PK | 团购套餐 ID（= group_buy_packages.id） |
| `table_area_ids` | JSONB | 可用台区 ID 列表 |
| `table_area_names` | JSONB | 可用台区名称列表 |
| `assistant_services` | JSONB | 助教服务关联数组 |
| `groupon_site_infos` | JSONB | 关联门店信息数组 |
| `package_services` | JSONB | 套餐服务数组（待调研） |
| `coupon_details_list` | JSONB | 券明细数组（待调研） |
| `content_hash` | TEXT | 内容哈希，用于变更检测 |
| `payload` | JSONB | 完整原始 JSON 响应 |

---

## 2. 兼容性影响

| 组件 | 影响 | 说明 |
|------|------|------|
| ETL ODS 层 | 新增表 | `ODS_GROUP_PACKAGE` 任务通过 `detail_endpoint` 配置自动写入 |
| ETL DWD 层 | 需配合修改 | `dwd_load_task.py` 需 LEFT JOIN 本表将 4 个 JSONB 字段合并到 `dim_groupbuy_package_ex` |
| 后端 API | 无影响 | 当前无接口直接查询本表 |
| 小程序 | 无影响 | 不直接使用 ODS 层表 |

---

## 3. 回滚策略

```sql
DROP TABLE IF EXISTS ods.group_buy_package_details;
```

回滚后需同步移除 `ODS_GROUP_PACKAGE` 任务中的 `detail_endpoint` 相关配置。

---

## 4. 验证 SQL

```sql
-- 1. 确认表存在且主键正确
SELECT column_name, data_type, is_nullable
  FROM information_schema.columns
 WHERE table_schema = 'ods'
   AND table_name = 'group_buy_package_details'
 ORDER BY ordinal_position;
-- 预期：22 列，coupon_id 为 BIGINT NOT NULL

-- 2. 确认主键约束
SELECT constraint_name, constraint_type
  FROM information_schema.table_constraints
 WHERE table_schema = 'ods'
   AND table_name = 'group_buy_package_details'
   AND constraint_type = 'PRIMARY KEY';
-- 预期：1 行，pk_group_buy_package_details

-- 3. 确认 JSONB 列存在
SELECT column_name, data_type
  FROM information_schema.columns
 WHERE table_schema = 'ods'
   AND table_name = 'group_buy_package_details'
   AND data_type = 'jsonb'
 ORDER BY ordinal_position;
-- 预期：8 行（table_area_ids, table_area_names, assistant_services, groupon_site_infos, package_services, coupon_details_list, payload）
```
