# 平台券核销记录（GetOfflineCouponConsumePageList） → platform_coupon_redemption_records 字段映射

> 生成时间：2026-02-14

## 端点信息

| 属性 | 值 |
|------|-----|
| 接口路径 | `Promotion/GetOfflineCouponConsumePageList` |
| 请求方法 | POST |
| ODS 对应表 | `ods.platform_coupon_redemption_records` |
| JSON 数据路径 | `$（平铺结构，外层含 siteProfile）` |

## 字段映射

| JSON 字段 | ODS 列名 | 类型转换 | 说明 |
|-----------|----------|----------|------|
| id | id | int→BIGINT（`parse_int`） | 本条平台验券记录在本系统内的主键 ID |
| verify_id | verify_id | int→BIGINT（`parse_int`） | 平台核销记录 ID（某些平台会为每一次核销生成一个唯一 ID） |
| certificate_id | certificate_id | string→TEXT（原样） | 平台侧的凭证 ID（通常由第三方团购平台生成的券实例 ID） |
| coupon_code | coupon_code | string→TEXT（原样） | 券码，顾客出示的团购券密码/编号 |
| coupon_name | coupon_name | string→TEXT（原样） | 团购券产品名称（即第三方平台上向顾客展示的名称） |
| coupon_channel | coupon_channel | int→INT（`parse_int`） | 券来源渠道（第三方平台渠道编号） |
| groupon_type | groupon_type | int→INT（`parse_int`） | 团购券类型 |
| group_package_id | group_package_id | int→BIGINT（`parse_int`） | 标识类 ID 字段，用于关联/定位相关实体 |
| sale_price | sale_price | float→NUMERIC(18,2)（`parse_decimal`） | 顾客在第三方平台上实际支付的价格（团购售价） |
| coupon_money | coupon_money | float→NUMERIC(18,2)（`parse_decimal`） | 券面值 / 套餐价值（系统层面的“可抵扣金额或对应套餐价值”） |
| coupon_free_time | coupon_free_time | float→NUMERIC(18,2)（`parse_decimal`） | 券附带的“免费时长”字段（例如送多少分钟台费） |
| coupon_cover | coupon_cover | string→TEXT（原样） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| coupon_remark | coupon_remark | string→TEXT（原样） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| use_status | use_status | int→INT（`parse_int`） | 值 1：198 条 |
| consume_time | consume_time | string→TIMESTAMP（`parse_timestamp`） | 券被核销/使用的业务时间 |
| create_time | create_time | string→TIMESTAMP（`parse_timestamp`） | 验券记录在本系统中创建的时间（记录入库时间） |
| deal_id | deal_id | string→TEXT（原样） | 另一个层次的团购产品 ID |
| channel_deal_id | channel_deal_id | string→TEXT（原样） | 渠道侧 dealId / 产品 ID，一般是第三方平台给该团购商品定义的主键 |
| site_id | site_id | int→BIGINT（`parse_int`） | 门店 ID |
| site_order_id | site_order_id | int→BIGINT（`parse_int`） | 门店内部的订单 ID（平台券核销时对应的店内订单） |
| table_id | table_id | int→BIGINT（`parse_int`） | 使用券的球台 ID |
| tenant_id | tenant_id | int→BIGINT（`parse_int`） | 商户/租户 ID（品牌级别） |
| operator_id | operator_id | int→BIGINT（`parse_int`） | 操作员 ID（执行验券操作的收银员/员工） |
| operator_name | operator_name | string→TEXT（原样） | 操作员姓名，例如 "收银员:郑丽珊" |
| is_delete | is_delete | int→INT（`parse_int`） | 把平台验券记录挂到本门店的一条订单上 |
| siteProfile | siteProfile | object→JSONB（原样存储） | 门店信息快照 |

## ETL 补充字段

| ODS 列名 | 生成逻辑 |
|-----------|----------|
| content_hash | 对业务字段（排除 ETL 元数据列）计算 SHA-256，用于变更检测与去重 |
| source_file | 固定值：`platform_coupon_redemption_records.json`，标识原始导出文件 |
| source_endpoint | API 端点路径，如 `Promotion/GetOfflineCouponConsumePageList` |
| fetched_at | ETL 入库时间戳（`TIMESTAMPTZ DEFAULT now()`） |
| payload | 完整原始 JSON 记录快照（`JSONB NOT NULL`），用于回溯与二次解析 |

## 类型转换规则

- **时间戳**：通过 `TypeParser.parse_timestamp()` 转换，支持 ISO 字符串和 Unix 毫秒时间戳，自动处理时区
- **金额**：通过 `TypeParser.parse_decimal(value, scale=2)` 转换，`ROUND_HALF_UP` 四舍五入
- **整数**：通过 `TypeParser.parse_int()` 转换，`None` 保持为 `NULL`
- **字符串**：原样保留，`None` / 空字符串均存为 `NULL` 或空文本
- **布尔值**：API 返回 `true/false`，ODS 存为 `BOOLEAN` 或 `INT`（0/1）
- **JSONB**：`siteProfile`、`payload` 等复合对象直接以 `JSONB` 类型存储
