# 台费优惠记录（GetTaiFeeAdjustList） → table_fee_discount_records 字段映射

> 生成时间：2026-02-14

## 端点信息

| 属性 | 值 |
|------|-----|
| 接口路径 | `Site/GetTaiFeeAdjustList` |
| 请求方法 | POST |
| ODS 对应表 | `ods.table_fee_discount_records` |
| JSON 数据路径 | `data.taiFeeAdjustInfos` |

## 字段映射

| JSON 字段 | ODS 列名 | 类型转换 | 说明 |
|-----------|----------|----------|------|
| id | id | int→BIGINT（`parse_int`） | 台费打折 / 调整流水主键 ID |
| tenant_id | tenant_id | int→BIGINT（`parse_int`） | 租户/品牌 ID |
| site_id | site_id | int→BIGINT（`parse_int`） | 门店 ID，本批数据全部为同一家门店（朗朗桌球） |
| siteProfile | siteProfile | object→JSONB（原样存储） | 门店信息快照，用于报表时直接读取，无需再联门店档案 |
| site_table_id | site_table_id | int→BIGINT（`parse_int`） | 台桌 ID |
| tableProfile | tableProfile | object→JSONB（原样存储） | 折扣发生时，对应台桌的配置信息快照 |
| tenant_table_area_id | tenant_table_area_id | int→BIGINT（`parse_int`） | 租户维度的“台桌区域 ID” |
| adjust_type | adjust_type | int→INT（`parse_int`） | 文件名是“台费打折”，字段名为“调整类型”，当前所有记录都是 1，即“台费打折/台费减免”这一种调整类型 |
| ledger_amount | ledger_amount | float→NUMERIC(18,2)（`parse_decimal`） | 金额字段，用于计费/结算/分摊等金额计算 |
| ledger_count | ledger_count | float→NUMERIC(18,4)（`parse_decimal(scale=4)`） | 这里不是“秒数”，而是“调整次数/条数”的量化，目前固定为 1，表示“一次调账事件” |
| ledger_name | ledger_name | string→TEXT（原样） | 设计上应该用于记录“调账项目名称”或“打折原因描述”（例如某种优惠规则名称），但当前门店并未使用该字段 |
| ledger_status | ledger_status | int→INT（`parse_int`） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| applicant_id | applicant_id | int→BIGINT（`parse_int`） | 打折/调账申请人 ID |
| applicant_name | applicant_name | string→TEXT（原样） | 申请人姓名（带角色描述），为 applicant_id 的冗余显示字段 |
| operator_id | operator_id | int→BIGINT（`parse_int`） | 实际执行调账操作的操作员 ID |
| operator_name | operator_name | string→TEXT（原样） | 操作员姓名 |
| order_settle_id | order_settle_id | int→BIGINT（`parse_int`） | 结算单/小票 ID |
| order_trade_no | order_trade_no | string→TEXT（原样） | 订单交易号 |
| is_delete | is_delete | int→INT（`parse_int`） | 逻辑删除标记（0=否，1=是） |
| create_time | create_time | string→TIMESTAMP（`parse_timestamp`） | 台费调整记录的创建时间，即打折操作被执行的时间戳 |
| area_type_id | area_type_id | int→BIGINT（`parse_int`） | 台区类型 ID（新增字段） |
| charge_free | charge_free | bool→BOOLEAN | 是否免费台（新增字段） |
| site_table_area_id | site_table_area_id | int→BIGINT（`parse_int`） | 台桌所属区域 ID（新增字段） |
| site_table_area_name | site_table_area_name | string→TEXT（原样） | 台桌所属区域名称（新增字段） |
| sitename | sitename | string→TEXT（原样） | 门店名称（新增字段） |
| table_name | table_name | string→TEXT（原样） | 台桌名称/编号（新增字段） |
| table_price | table_price | float→NUMERIC(18,2)（`parse_decimal`） | 台费单价（新增字段） |
| tenant_name | tenant_name | string→TEXT（原样） | 租户名称（新增字段） |

## ETL 补充字段

| ODS 列名 | 生成逻辑 |
|-----------|----------|
| content_hash | 对业务字段（排除 ETL 元数据列）计算 SHA-256，用于变更检测与去重 |
| source_file | 固定值：`table_fee_discount_records.json`，标识原始导出文件 |
| source_endpoint | API 端点路径，如 `Site/GetTaiFeeAdjustList` |
| 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` 类型存储
