# 团购套餐详情（QueryPackageCouponInfo） → group_buy_package_details 字段映射

> 生成时间：2026-03-05

## 端点信息

| 属性 | 值 |
|------|-----|
| 接口路径 | `PackageCoupon/QueryPackageCouponInfo` |
| 请求方法 | POST |
| 请求参数 | `{ "couponId": <id> }`（从 `ods.group_buy_packages.id` 获取） |
| ODS 对应表 | `ods.group_buy_package_details` |
| JSON 数据路径 | `data` |
| 调用方式 | 二级详情拉取（`ODS_GROUP_PACKAGE` 任务的 `detail_endpoint` 子流程） |

## 响应结构

```json
{
  "data": {
    "groupPurchasePackage": {
      "id": 123,
      "packageName": "...",
      "duration": 3600,
      "startTime": "...",
      "endTime": "...",
      "addStartClock": "00:00:00",
      "addEndClock": "1.00:00:00",
      "isEnabled": 1,
      "isDelete": 0,
      "siteId": 456,
      "tenantId": 789,
      "createTime": "...",
      "creatorName": "...",
      "tableAreaId": [1, 2, 3],
      "tableAreaNameList": ["A区", "B区"]
    },
    "packageCouponAssistants": [...],
    "grouponSiteInfos": [...],
    "packagePackageService": [...],
    "packageCouponDetailsList": [...]
  }
}
```

## 字段映射

### 结构化字段（来自 data.groupPurchasePackage）

| JSON 路径 | ODS 列名 | 类型转换 | 说明 |
|-----------|----------|----------|------|
| data.groupPurchasePackage.id | coupon_id | int→BIGINT | 团购套餐 ID，主键 |
| data.groupPurchasePackage.packageName | package_name | string→TEXT | 套餐名称 |
| data.groupPurchasePackage.duration | duration | int→INTEGER | 台费计时时长（秒） |
| data.groupPurchasePackage.startTime | start_time | string→TIMESTAMPTZ | 可用日期开始 |
| data.groupPurchasePackage.endTime | end_time | string→TIMESTAMPTZ | 可用日期结束 |
| data.groupPurchasePackage.addStartClock | add_start_clock | string→TEXT | 可用时段开始 |
| data.groupPurchasePackage.addEndClock | add_end_clock | string→TEXT | 可用时段结束 |
| data.groupPurchasePackage.isEnabled | is_enabled | int→INTEGER | 是否启用 |
| data.groupPurchasePackage.isDelete | is_delete | int→INTEGER | 是否已删除 |
| data.groupPurchasePackage.siteId | site_id | int→BIGINT | 店铺 ID |
| data.groupPurchasePackage.tenantId | tenant_id | int→BIGINT | 租户 ID |
| data.groupPurchasePackage.createTime | create_time | string→TIMESTAMPTZ | 创建时间 |
| data.groupPurchasePackage.creatorName | creator_name | string→TEXT | 创建人 |

### JSONB 数组字段

| JSON 路径 | ODS 列名 | 类型转换 | 说明 |
|-----------|----------|----------|------|
| data.groupPurchasePackage.tableAreaId | table_area_ids | array→JSONB | 可用台区 ID 列表 |
| data.groupPurchasePackage.tableAreaNameList | table_area_names | array→JSONB | 可用台区名称列表 |
| data.packageCouponAssistants | assistant_services | array→JSONB | 助教服务关联（含 skillId/assistantLevel/assistantDuration） |
| data.grouponSiteInfos | groupon_site_infos | array→JSONB | 关联门店信息（含 siteId/siteName） |
| data.packagePackageService | package_services | array→JSONB | 套餐服务数组（待调研，可能为空） |
| data.packageCouponDetailsList | coupon_details_list | array→JSONB | 券明细数组（待调研，可能为空） |

## ETL 补充字段

| ODS 列名 | 生成逻辑 |
|-----------|----------|
| content_hash | 基于原始 payload + is_delete 计算 SHA-256 |
| payload | 完整原始 JSON 响应（`data` 节点） |
| fetched_at | ETL 拉取时间戳（`DEFAULT now()`） |

## 写入策略

- 全量快照模式（`SnapshotMode.FULL_TABLE`）
- UPSERT on `coupon_id`，每次运行覆盖全部记录
- 通过 `content_hash` 去重，内容未变则跳过写入
