# BD_Manual：store_goods_sales_records（门店商品销售流水）

> ODS 表：`ods.store_goods_sales_records`
> DWD 表：`dwd.dwd_store_goods_sale`（主表）、`dwd.dwd_store_goods_sale_ex`（扩展表）
> API 接口：门店商品销售记录列表
> JSON 路径：`store_goods_sales_records.json → data.orderGoodsLedgers`
> 装载方式：事实表增量插入（`DwdLoadTask`）
> 代码位置：`apps/etl/connectors/feiqiu/tasks/dwd/dwd_load_task.py`

---

## 1. dwd_store_goods_sale（主表，25 列）

| DWD 列名 | 类型 | ODS 源列 | 映射方式 | 业务含义 | 取值范围/示例 |
|----------|------|---------|---------|---------|-------------|
| `store_goods_sale_id` | BIGINT | `id` | FACT_MAPPINGS | 销售记录唯一标识（PK） | 飞球雪花 ID |
| `order_trade_no` | BIGINT | `order_trade_no` | 自动映射 | 关联的订单交易号 | 飞球订单号 |
| `order_settle_id` | BIGINT | `order_settle_id` | 自动映射 | 关联的结算单 ID | 飞球结算单 ID |
| `order_pay_id` | BIGINT | `order_pay_id` | 自动映射 | 关联的支付单 ID | 飞球支付单 ID |
| `order_goods_id` | BIGINT | `order_goods_id` | 自动映射 | 订单商品明细 ID | 飞球雪花 ID |
| `site_id` | BIGINT | `site_id` | 自动映射 | 门店 ID | 飞球门店 ID |
| `tenant_id` | BIGINT | `tenant_id` | 自动映射 | 租户 ID | 飞球租户 ID |
| `site_goods_id` | BIGINT | `site_goods_id` | 自动映射 | 门店商品 ID，关联 `dim_store_goods` | 飞球商品 ID |
| `tenant_goods_id` | BIGINT | `tenant_goods_id` | 自动映射 | 租户商品 ID，关联 `dim_tenant_goods` | 飞球商品 ID |
| `tenant_goods_category_id` | BIGINT | `tenant_goods_category_id` | 自动映射 | 商品分类 ID | 飞球分类 ID |
| `tenant_goods_business_id` | BIGINT | `tenant_goods_business_id` | 自动映射 | 商品业务类型 ID | 飞球业务 ID |
| `site_table_id` | BIGINT | `site_table_id` | 自动映射 | 消费台桌 ID，关联 `dim_table.table_id` | 飞球台桌 ID |
| `ledger_name` | VARCHAR(200) | `ledger_name` | 自动映射 | 分账项名称（商品名称快照） | 如 `百威啤酒` |
| `ledger_group_name` | VARCHAR(100) | `ledger_group_name` | 自动映射 | 分账组名称 | 分账组名或 NULL |
| `ledger_unit_price` | NUMERIC(18,2) | `ledger_unit_price` | 自动映射 | 分账单价（元/单位） | 金额值 |
| `ledger_count` | INTEGER | `ledger_count` | 自动映射 | 分账数量（销售数量） | 正整数 |
| `ledger_amount` | NUMERIC(18,2) | `ledger_amount` | 自动映射 | 分账总金额（元），= 单价 × 数量 | 金额值 |
| `discount_money` | NUMERIC(18,2) | `discount_money` | FACT_MAPPINGS | 折扣金额（元），会员折扣减免的金额。⚠️ 2026-02-20 由原 `discount_price` 重命名而来，修正列名误导 | `0.00` ~ 金额值 |
| `real_goods_money` | NUMERIC(18,2) | `real_goods_money` | 自动映射 | 实收商品金额（元），扣除折扣后 | 金额值 |
| `cost_money` | NUMERIC(18,2) | `cost_money` | 自动映射 | 成本金额（元） | 金额值 |
| `ledger_status` | INTEGER | `ledger_status` | 自动映射 | 分账状态 | 枚举值 |
| `is_delete` | INTEGER | `is_delete` | 自动映射 | 是否已删除：0=正常，1=已删除 | `0` / `1` |
| `create_time` | TIMESTAMPTZ | `create_time` | 自动映射 | 销售记录创建时间 | ISO 时间戳 |
| `coupon_share_money` | NUMERIC(18,2) | `coupon_share_money` | FACT_MAPPINGS | 优惠券分摊金额（元），该商品分摊的优惠券减免 | `0.00` ~ 金额值 |
| `discount_price` | NUMERIC(18,2) | `discount_price` | FACT_MAPPINGS | 折后单价（元），会员折扣后的商品单价。⚠️ 2026-02-20 新增，映射自 ODS 真正的 `discount_price` | `0.00` ~ 金额值 |

---

## 2. dwd_store_goods_sale_ex（扩展表，28 列）

| DWD 列名 | 类型 | ODS 源列 | 映射方式 | 业务含义 | 取值范围/示例 |
|----------|------|---------|---------|---------|-------------|
| `store_goods_sale_id` | BIGINT | `id` | FACT_MAPPINGS | 销售记录唯一标识（PK） | 同主表 |
| `legacy_order_goods_id` | BIGINT | `ordergoodsid` | FACT_MAPPINGS | 旧版订单商品 ID（兼容字段） | 飞球 ID |
| `site_name` | TEXT | `sitename` | FACT_MAPPINGS | 门店名称快照 | 如 `朗朗桌球` |
| `legacy_site_id` | BIGINT | `siteid` | FACT_MAPPINGS | 旧版门店 ID（兼容字段） | 飞球门店 ID |
| `goods_remark` | TEXT | `goods_remark` | 自动映射 | 商品备注 | 自由文本或 NULL |
| `option_value_name` | TEXT | `option_value_name` | FACT_MAPPINGS | 商品规格选项名称 | 如 `大杯`、NULL |
| `operator_name` | TEXT | `operator_name` | 自动映射 | 操作员姓名 | 姓名或 NULL |
| `open_salesman_flag` | INTEGER | `opensalesman` | FACT_MAPPINGS (cast integer) | 是否开启销售员提成：0=否，1=是 | `0` / `1` |
| `salesman_user_id` | BIGINT | `salesman_user_id` | 自动映射 | 销售员用户 ID | 用户 ID 或 NULL |
| `salesman_name` | TEXT | `salesman_name` | FACT_MAPPINGS | 销售员姓名 | 姓名或 NULL |
| `salesman_role_id` | BIGINT | `salesman_role_id` | 自动映射 | 销售员角色 ID | 角色 ID 或 NULL |
| `salesman_org_id` | BIGINT | `sales_man_org_id` | FACT_MAPPINGS | 销售员组织 ID | 组织 ID 或 NULL |
| `discount_money` | NUMERIC(18,2) | `discount_money` | 自动映射 | 折扣金额（元），扩展表中的折扣明细 | `0.00` ~ 金额值 |
| `returns_number` | INTEGER | `returns_number` | 自动映射 | 退货数量 | `0` ~ 正整数 |
| `coupon_deduct_money` | NUMERIC(18,2) | `coupon_deduct_money` | 自动映射 | 优惠券抵扣金额（元） | `0.00` ~ 金额值 |
| `member_discount_amount` | NUMERIC(18,2) | `member_discount_amount` | 自动映射 | 会员折扣金额（元） | `0.00` ~ 金额值 |
| `point_discount_money` | NUMERIC(18,2) | `point_discount_money` | 自动映射 | 积分抵扣金额（元） | `0.00` ~ 金额值 |
| `point_discount_money_cost` | NUMERIC(18,2) | `point_discount_money_cost` | 自动映射 | 积分抵扣成本（元） | `0.00` ~ 金额值 |
| `package_coupon_id` | BIGINT | `package_coupon_id` | 自动映射 | 套餐券 ID | 券 ID 或 NULL |
| `order_coupon_id` | BIGINT | `order_coupon_id` | 自动映射 | 订单券 ID | 券 ID 或 NULL |
| `member_coupon_id` | BIGINT | `member_coupon_id` | 自动映射 | 会员券 ID | 券 ID 或 NULL |
| `option_price` | NUMERIC(18,2) | `option_price` | 自动映射 | 规格选项加价（元） | `0.00` ~ 金额值 |
| `option_member_discount_money` | NUMERIC(18,2) | `option_member_discount_money` | 自动映射 | 规格选项会员折扣金额（元） | `0.00` ~ 金额值 |
| `option_coupon_deduct_money` | NUMERIC(18,2) | `option_coupon_deduct_money` | 自动映射 | 规格选项优惠券抵扣金额（元） | `0.00` ~ 金额值 |
| `push_money` | NUMERIC(18,2) | `push_money` | 自动映射 | 推销提成金额（元） | `0.00` ~ 金额值 |
| `is_single_order` | INTEGER | `is_single_order` | 自动映射 | 是否单独订单 | `0` / `1` |
| `sales_type` | INTEGER | `sales_type` | 自动映射 | 销售类型 | 枚举值 |
| `operator_id` | BIGINT | `operator_id` | 自动映射 | 操作员 ID | 员工 ID 或 NULL |

---

## 3. 映射修正记录

| 日期 | 字段 | 修正内容 |
|------|------|---------|
| 2026-02-20 | `discount_price` → `discount_money` | 原 DWD `discount_price` 实际映射自 ODS `discount_money`（折扣金额），列名与语义不符，重命名为 `discount_money` |
| 2026-02-20 | `discount_price`（新增） | 新增 DWD 列，映射自 ODS 真正的 `discount_price`（折后单价） |

---

## 4. 代码引用

- FACT_MAPPINGS：`dwd_load_task.py` → `FACT_MAPPINGS["dwd.dwd_store_goods_sale"]` / `FACT_MAPPINGS["dwd.dwd_store_goods_sale_ex"]`
- TABLE_MAP：`"dwd.dwd_store_goods_sale" → "ods.store_goods_sales_records"`
- DWS 下游：`dws_finance_daily_task.py`（财务日报，商品销售汇总）
- 迁移脚本：`db/_archived/ddl_baseline_2026-02-22/db/etl_feiqiu/migrations/2026-02-20__fix_store_goods_sale_discount_price.sql`（已归档）
