# 门店商品销售记录（GetGoodsSalesList） → store_goods_sales_records 字段映射

> 生成时间：2026-02-14

## 端点信息

| 属性 | 值 |
|------|-----|
| 接口路径 | `TenantGoods/GetGoodsSalesList` |
| 请求方法 | POST |
| ODS 对应表 | `ods.store_goods_sales_records` |
| JSON 数据路径 | `data.orderGoodsLedgers` |

## 字段映射

| 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（系统主键） |
| site_id | siteid | int→BIGINT（`parse_int`） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| siteName | sitename | string→TEXT（原样） | 名称字段，用于展示与辅助识别 |
| site_goods_id | site_goods_id | int→BIGINT（`parse_int`） | 门店商品 ID |
| tenant_goods_id | tenant_goods_id | int→BIGINT（`parse_int`） | 租户（品牌）级商品 ID（全局商品 ID） |
| order_settle_id | order_settle_id | int→BIGINT（`parse_int`） | 订单结算 ID（结账单主键） |
| order_trade_no | order_trade_no | string→TEXT（原样） | 订单交易号（业务单号） |
| order_goods_id | order_goods_id | int→BIGINT（`parse_int`） | 订单商品明细 ID（订单内部的商品行主键） |
| order_goods_id | ordergoodsid | int→BIGINT（`parse_int`） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| order_pay_id | order_pay_id | int→BIGINT（`parse_int`） | 关联支付记录的 ID |
| order_coupon_id | order_coupon_id | int→BIGINT（`parse_int`） | 订单级优惠券 ID |
| ledger_name | ledger_name | string→TEXT（原样） | 销售项目名称（商品名称），例如 “哇哈哈矿泉水”“地道肠”“东方树叶”等 |
| ledger_group_name | ledger_group_name | string→TEXT（原样） | 销售项目所属的「门店内部分组名称」，类似前台菜单分组或大类标签 |
| ledger_amount | ledger_amount | float→NUMERIC(18,2)（`parse_decimal`） | 原始应收金额，公式上接近 ledger_unit_price × ledger_count |
| ledger_count | ledger_count | float→NUMERIC(18,4)（`parse_decimal(scale=4)`） | 销售数量（以 unit 为单位，unit 字段在门店商品档案中） |
| ledger_unit_price | ledger_unit_price | float→NUMERIC(18,4)（`parse_decimal(scale=4)`） | 商品在该次销售中的「结算单价」（元/单位） |
| ledger_status | ledger_status | int→INT（`parse_int`） | 销售流水状态 |
| discount_money | discount_money | float→NUMERIC(18,2)（`parse_decimal`） | 本条销售明细的「价格优惠金额」，即原价部分被减免掉的金额 |
| discount_price | discount_price | float→NUMERIC(18,2)（`parse_decimal`） | 折后单价（元/单位） |
| coupon_deduct_money | coupon_deduct_money | float→NUMERIC(18,2)（`parse_decimal`） | 被优惠券 / 团购券直接抵扣到这条商品明细上的金额 |
| member_discount_amount | member_discount_amount | float→NUMERIC(18,2)（`parse_decimal`） | 由会员身份（会员折扣）针对这一行商品产生的优惠金额 |
| option_coupon_deduct_money | option_coupon_deduct_money | float→NUMERIC(18,2)（`parse_decimal`） | 由优惠券抵扣“选项价格”的金额 |
| option_member_discount_money | option_member_discount_money | float→NUMERIC(18,2)（`parse_decimal`） | 由会员折扣作用在“选项价格”上的优惠金额 |
| point_discount_money | point_discount_money | float→NUMERIC(18,2)（`parse_decimal`） | 由积分抵扣的金额（顾客兑换积分抵现金额） |
| point_discount_money_cost | point_discount_money_cost | float→NUMERIC(18,2)（`parse_decimal`） | 积分抵扣对应的“成本金额”（后台核算用），例如按积分成本来计提费用 |
| real_goods_money | real_goods_money | float→NUMERIC(18,2)（`parse_decimal`） | 商品实际入账金额（考虑折扣、可能还会考虑其它抵扣后的实际销售金额） |
| cost_money | cost_money | float→NUMERIC(18,2)（`parse_decimal`） | 本条销售对应的成本金额（以元计） |
| push_money | push_money | float→NUMERIC(18,2)（`parse_decimal`） | 本条销售对应的提成金额（给营业员/促销员的提成） |
| sales_type | sales_type | int→INT（`parse_int`） | 销售类型 |
| is_single_order | is_single_order | int→INT（`parse_int`） | 是否单独订单标识 |
| is_delete | is_delete | int→INT（`parse_int`） | 逻辑删除标志 |
| goods_remark | goods_remark | string→TEXT（原样） | 商品备注/口味说明/特殊说明 |
| option_price | option_price | float→NUMERIC(18,2)（`parse_decimal`） | 商品选项（规格/加料）的附加价格 |
| option_value_name | option_value_name | string→TEXT（原样） | 商品选项名称（如规格、口味：大杯/小杯，不加冰等） |
| member_coupon_id | member_coupon_id | int→BIGINT（`parse_int`） | 会员券 ID（比如会员专享优惠券） |
| package_coupon_id | package_coupon_id | int→BIGINT（`parse_int`） | 套餐券 ID |
| sales_man_org_id | sales_man_org_id | int→BIGINT（`parse_int`） | 营业员所属组织/部门 ID |
| salesman_name | salesman_name | string→TEXT（原样） | 营业员姓名（如果有为具体销售员记业绩，则在此填姓名） |
| salesman_role_id | salesman_role_id | int→BIGINT（`parse_int`） | 营业员的系统角色 ID（例如某个角色代码表示“销售员”） |
| salesman_user_id | salesman_user_id | int→BIGINT（`parse_int`） | 营业员用户 ID（系统账号 ID） |
| operator_id | operator_id | int→BIGINT（`parse_int`） | 操作员 ID（录入这笔销售的员工） |
| operator_name | operator_name | string→TEXT（原样） | 操作员姓名，文字冗余 |
| openSalesman | openSalesman | string→TEXT（原样） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| returns_number | returns_number | int→INT（`parse_int`） | 退货数量（如果这条明细做了退货，会记录退货数量） |
| site_table_id | site_table_id | int→BIGINT（`parse_int`） | 球台 ID |
| tenant_goods_business_id | tenant_goods_business_id | int→BIGINT（`parse_int`） | 租户级商品「业务大类」ID（例如“零食类”“酒水类”等更高维度） |
| tenant_goods_category_id | tenant_goods_category_id | int→BIGINT（`parse_int`） | 租户级商品一级分类 ID |
| create_time | create_time | string→TIMESTAMP（`parse_timestamp`） | 销售记录创建时间，通常就是结账时间或录入时间 |
| coupon_share_money | coupon_share_money | float→NUMERIC(18,2)（`parse_decimal`） | 优惠券分摊金额（新增字段） |

## ETL 补充字段

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