# 台费流水（GetSiteTableOrderDetails） → table_fee_transactions 字段映射

> 生成时间：2026-02-14

## 端点信息

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

## 字段映射

| JSON 字段 | ODS 列名 | 类型转换 | 说明 |
|-----------|----------|----------|------|
| id | id | int→BIGINT（`parse_int`） | 台费流水记录主键（事实表主键） |
| tenant_id | tenant_id | int→BIGINT（`parse_int`） | 租户/品牌 ID |
| site_id | site_id | int→BIGINT（`parse_int`） | 门店 ID，本次数据全部来自同一门店（朗朗桌球） |
| siteProfile | siteProfile | object→JSONB（原样存储） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| site_table_id | site_table_id | int→BIGINT（`parse_int`） | 球台 ID |
| site_table_area_id | site_table_area_id | int→BIGINT（`parse_int`） | 门店内“台桌区域” ID（站在门店物理布局的角度） |
| site_table_area_name | site_table_area_name | string→TEXT（原样） | 台桌区域的名称，用于门店表现和区域统计 |
| tenant_table_area_id | tenant_table_area_id | int→BIGINT（`parse_int`） | 租户维度的台桌区域 ID（品牌层面的同一类区域） |
| order_trade_no | order_trade_no | string→TEXT（原样） | 订单交易号，是整笔订单的主编号 |
| order_pay_id | order_pay_id | int→BIGINT（`parse_int`） | 订单支付记录 ID |
| order_settle_id | order_settle_id | int→BIGINT（`parse_int`） | 结算单号/结账 ID，对应一次结账操作 |
| ledger_name | ledger_name | string→TEXT（原样） | 台号名称，实际展示给员工/顾客看的桌台编号 |
| ledger_amount | ledger_amount | float→NUMERIC(18,2)（`parse_decimal`） | 按单价与计费时长计算出的原始应收台费金额 |
| ledger_count | ledger_count | float→NUMERIC(18,4)（`parse_decimal(scale=4)`） | 台账记录的计费秒数，计费用秒数（应收时长） |
| ledger_unit_price | ledger_unit_price | float→NUMERIC(18,4)（`parse_decimal(scale=4)`） | 台费结算时设置的 每小时单价/计费单价 |
| ledger_status | ledger_status | int→INT（`parse_int`） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| ledger_start_time | ledger_start_time | string→TIMESTAMP（`parse_timestamp`） | 台账上的计费起始时间 |
| ledger_end_time | ledger_end_time | string→TIMESTAMP（`parse_timestamp`） | 台账上的计费结束时间 |
| start_use_time | start_use_time | string→TIMESTAMP（`parse_timestamp`） | 台开始使用的时间（实际开台时间） |
| last_use_time | last_use_time | string→TIMESTAMP（`parse_timestamp`） | 最后使用/操作时间 |
| real_table_use_seconds | real_table_use_seconds | int→INT（`parse_int`） | 实际使用的总秒数（系统真实统计的使用时长） |
| real_table_charge_money | real_table_charge_money | float→NUMERIC(18,2)（`parse_decimal`） | 台费中实际向顾客收取的金额（现金/实付维度，未含券方承担或内部调账的那一部分） |
| add_clock_seconds | add_clock_seconds | int→INT（`parse_int`） | 加钟秒数，在原有使用基础上追加的时长 |
| adjust_amount | adjust_amount | float→NUMERIC(18,2)（`parse_decimal`） | 调整金额/调账金额，用于将台费金额转移或冲减到其它项目，或手工调整 |
| coupon_promotion_amount | coupon_promotion_amount | float→NUMERIC(18,2)（`parse_decimal`） | 由优惠券/活动/团购（平台/门店促销）承担的优惠金额，直接抵扣在台费上 |
| member_discount_amount | member_discount_amount | float→NUMERIC(18,2)（`parse_decimal`） | 由会员权益产生的优惠金额，例如会员折扣、会员价等 |
| used_card_amount | used_card_amount | float→NUMERIC(18,2)（`parse_decimal`） | 由储值卡、次卡等“卡内余额”抵扣的金额 |
| mgmt_fee | mgmt_fee | float→NUMERIC(18,2)（`parse_decimal`） | 管理费字段，用于未来支持“台费附加管理费/服务费”的功能 |
| service_money | service_money | float→NUMERIC(18,2)（`parse_decimal`） | 门店用于记录“服务费/成本/分成金额”的字段，类似助教流水里的 service_money |
| fee_total | fee_total | float→NUMERIC(18,2)（`parse_decimal`） | 各种附加费用（如管理费、服务费）合计值 |
| is_single_order | is_single_order | int→INT（`parse_int`） | 布尔/开关字段，用于表示权限、可用性或状态开关 |
| is_delete | is_delete | int→INT（`parse_int`） | 逻辑删除标记（0=否，1=是） |
| member_id | member_id | int→BIGINT（`parse_int`） | 门店/租户内的会员 ID |
| operator_id | operator_id | int→BIGINT（`parse_int`） | 操作员 ID，负责开台/结账的员工账号 ID |
| operator_name | operator_name | string→TEXT（原样） | 操作员姓名（冗余字段），便于直接阅读，不必再联表员工档案 |
| salesman_name | salesman_name | string→TEXT（原样） | 业务员/营业员姓名，如果台费有单独提成员工，这里记录归属人 |
| salesman_org_id | salesman_org_id | int→BIGINT（`parse_int`） | 营业员所属机构/部门 ID |
| salesman_user_id | salesman_user_id | int→BIGINT（`parse_int`） | 营业员的用户 ID（与 salesman_name 搭配） |
| create_time | create_time | string→TIMESTAMP（`parse_timestamp`） | 这条台费流水记录的创建时间，通常接近结账时间 |
| activity_discount_amount | activity_discount_amount | float→NUMERIC(18,2)（`parse_decimal`） | 活动折扣金额（新增字段） |
| order_consumption_type | order_consumption_type | int→INT（`parse_int`） | 订单消费类型（新增字段） |
| real_service_money | real_service_money | float→NUMERIC(18,2)（`parse_decimal`） | 实际服务费金额（新增字段） |

## ETL 补充字段

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