---

### 7.1 dim_goods_category

**业务职责**：商品分类维度表，记录商品分类树结构（两级分类），无扩展表（SCD2 缓慢变化维度）
**数据状态**：2,127 行（26 个分类 × 多版本），当前版本 26 行，SCD2 版本范围 1~78
**主键**：`category_id, scd2_start_time`（复合主键）
**关联表**：`dim_tenant_goods`（1:N，goods_category_id / goods_second_category_id → category_id）、`dim_store_goods`（1:N，goods_category_id / goods_second_category_id → category_id）

> ⚠️ 注意：`dim_goods_category` 是唯一没有扩展表的维度表。

#### SCD2 字段

| 字段名 | 类型 | 说明 |
|--------|------|------|
| scd2_start_time | timestamptz | 版本生效时间（PK 组成部分） |
| scd2_end_time | timestamptz | 版本失效时间（NULL=当前版本） |
| scd2_is_current | integer | 当前版本标记（1=当前，0=历史） |
| scd2_version | integer | 版本号（1~78） |

#### 业务关键字段

| 字段名 | 类型 | 验证状态 | 语义说明 | 值域/分布 |
|--------|------|----------|----------|-----------|
| category_name | varchar(50) | ✅ 已验证 | 分类名称 | 18 个不同名称（含历史版本） |
| parent_category_id | bigint | ✅ 已验证 | 父分类 ID（0 或 NULL=一级分类） | 一级分类 9 个（parent=0），二级分类 17 个 |
| category_level | integer | ✅ 已验证 | 分类层级 | 1=一级分类(9), 2=二级分类(17)（当前版本） |
| is_leaf | integer | ✅ 已验证 | 是否叶子节点 | 0=非叶子(9, 一级), 1=叶子(17, 二级) |
| business_name | varchar(50) | ✅ 已验证 | 业务线名称 | 9 个不同值，与一级分类对应 |
| tenant_goods_business_id | bigint | ✅ 已验证 | 业务线 ID | 与 business_name 一一对应 |
| open_salesman | integer | ✅ 已验证 | 是否开启销售员 | 2=否(2,127)，100% 单值 |
| is_warehousing | integer | ✅ 已验证 | 是否入库管理 | 1=是(2,127)，100% 单值 |
| sort_order | integer | ✅ 已验证 | 排序序号 | 0(大部分) 或 1(少量) |

**全空字段**：`alias_name`（801 行 NULL，其余为空字符串或与 category_name 相同）

#### 商品分类树结构（当前版本，26 个分类）

| 一级分类 | 业务线 | 二级分类 |
|----------|--------|----------|
| 酒水 | 酒水 | 饮料、酒水、茶水、咖啡、加料、洋酒 |
| 零食 | 零食 | 零食、面 |
| 器材 | 器材 | 球杆、皮头、其他 |
| 小吃 | 小吃 | 小吃 |
| 果盘 | 水果 | 果盘 |
| 雪糕 | 雪糕 | 雪糕 |
| 槟榔 | 槟榔 | 槟榔 |
| 香烟 | 香烟 | 香烟 |
| 其他 | 其他 | 其他2 |

> ✅ 分类树为严格的两级结构：9 个一级分类（is_leaf=0）→ 17 个二级分类（is_leaf=1）。所有商品挂在二级分类下。

---

### 7.2 dim_tenant_goods

**业务职责**：租户商品维度主表，记录租户级别的商品基本信息（名称、分类、市场价、状态），是门店商品的上级（SCD2）
**数据状态**：15,416 行（174 个商品 × 多版本），当前版本 174 行，SCD2 版本范围 1~78
**主键**：`tenant_goods_id, scd2_start_time`（复合主键）
**关联表**：`dim_tenant_goods_ex`（1:1，tenant_goods_id + scd2_start_time）、`dim_goods_category`（N:1，goods_category_id → category_id，100% 可关联）、`dim_goods_category`（N:1，goods_second_category_id → category_id，100% 可关联）、`dim_store_goods`（1:N，tenant_goods_id）、`dwd_store_goods_sale`（1:N，tenant_goods_id，100% 可关联）

#### SCD2 字段

同 dim_goods_category：`scd2_start_time`(PK), `scd2_end_time`, `scd2_is_current`, `scd2_version`

#### 业务关键字段

| 字段名 | 类型 | 验证状态 | 语义说明 | 值域/分布 |
|--------|------|----------|----------|-----------|
| goods_name | varchar(128) | ✅ 已验证 | 商品名称 | "百威235毫升"、"哇哈哈矿泉水"、"东方树叶"等 |
| category_name | varchar(64) | ✅ 已验证 | 所属二级分类名称（冗余） | 14 个分类，零食(48)、饮料(38)、其他2(18)、香烟(17) 等 |
| goods_category_id | bigint | ✅ 已验证 | 一级分类 ID | 100% 可关联到 dim_goods_category（当前版本） |
| goods_second_category_id | bigint | ✅ 已验证 | 二级分类 ID | 100% 可关联到 dim_goods_category（当前版本） |
| market_price | numeric(18,2) | ✅ 已验证 | 市场价（建议零售价） | MIN=2 MAX=11,360 AVG=269.89 中位数=12（当前版本） |
| goods_state | integer | ✅ 已验证 | 商品状态 | 1=上架(168), 2=下架(6)（当前版本） |
| is_delete | integer | ✅ 已验证 | 删除标记 | 0=未删除(174)，当前版本 100% 未删除 |
| not_sale | integer | ✅ 已验证 | 禁售标记 | 2=否(174)，当前版本 100% 可售 |
| goods_number | varchar(64) | ✅ 已验证 | 商品编号 | 非空 |
| unit | varchar(16) | ✅ 已验证 | 计量单位 | 非空 |

**透明字段**：`tenant_goods_id`(PK), `tenant_id`

**全零/全空字段**：`supplier_id`(全0/NULL — 15,416 行)、`update_time`(2,578 行 NULL)

#### 商品分类分布（当前版本，174 个商品）

| 二级分类 | 商品数 | 典型商品 |
|----------|--------|----------|
| 零食 | 48 | 奥利奥饼干、薯片 |
| 饮料 | 38 | 哇哈哈矿泉水、东方树叶、红牛 |
| 其他2 | 18 | 杂项商品 |
| 香烟 | 17 | 钻石荷花、荷花双中支 |
| 雪糕 | 14 | 各类雪糕 |
| 酒水 | 10 | 百威、蓝妹、风花雪月 |
| 球杆 | 8 | 台球杆 |
| 槟榔 | 6 | 各品牌槟榔 |
| 小吃 | 4 | 地道肠、鱼蛋 |
| 面 | 4 | 红烧牛肉面 |
| 果盘 | 2 | 水果拼盘 |
| 洋酒 | 2 | 进口酒 |
| 皮头 | 2 | 球杆皮头 |
| 其他 | 1 | — |

---

### 7.3 dim_tenant_goods_ex

**业务职责**：租户商品扩展表，记录商品图片、条码、成本价、折扣设置等补充信息（SCD2）
**数据状态**：15,414 行（与主表基本 1:1，差 2 行），当前版本 174 行
**主键**：`tenant_goods_id, scd2_start_time`（复合主键）
**关联表**：`dim_tenant_goods`（1:1，tenant_goods_id + scd2_start_time）

> ⚠️ 注意：dim_tenant_goods_ex 有 15,414 行 vs dim_tenant_goods 的 15,416 行，差 2 行。当前版本均为 174 行，1:1 关系在当前版本上成立。

#### SCD2 字段

同 dim_tenant_goods：`scd2_start_time`(PK), `scd2_end_time`, `scd2_is_current`, `scd2_version`

#### 业务关键字段

| 字段名 | 类型 | 验证状态 | 语义说明 | 值域/分布 |
|--------|------|----------|----------|-----------|
| pinyin_initial | varchar(128) | ✅ 已验证 | 拼音首字母（用于搜索） | 非空 |
| goods_cover | varchar(512) | ✅ 已验证 | 商品封面图 URL | 非空 |
| able_discount | integer | ✅ 已验证 | 是否允许折扣 | 1=允许(174)，当前版本 100% 允许 |
| is_warehousing | integer | ✅ 已验证 | 是否入库管理 | 非空 |
| cost_price_type | integer | ✅ 已验证 | 成本价类型 | 非空 |
| able_site_transfer | integer | ✅ 已验证 | 是否允许门店调拨 | 非空 |

**全零/全空字段**：`remark_name`(全NULL)、`goods_bar_code`(全NULL)、`sale_channel`(全NULL)、`common_sale_royalty`(全0)、`point_sale_royalty`(全0)、`out_goods_id`(全0)

**大量零值字段**：`min_discount_price`(12,658/15,414 为 0 或 NULL)、`cost_price`(14,973/15,414 为 0 或 NULL)

---

### 7.4 dim_store_goods

**业务职责**：门店商品维度主表，记录门店级别的商品信息（售价、库存快照、销量统计、分类冗余），是租户商品在具体门店的实例化（SCD2）
**数据状态**：18,765 行（173 个商品 × 多版本），当前版本 173 行，SCD2 版本范围 1~78
**主键**：`site_goods_id, scd2_start_time`（复合主键）
**关联表**：`dim_store_goods_ex`（1:1，site_goods_id + scd2_start_time）、`dim_tenant_goods`（N:1，tenant_goods_id，100% 可关联）、`dim_goods_category`（N:1，goods_category_id，100% 可关联）、`dim_goods_category`（N:1，goods_second_category_id，100% 可关联）、`dwd_store_goods_sale`（1:N，site_goods_id，100% 可关联）、`dwd_goods_stock_summary`（1:N，site_goods_id）、`dwd_goods_stock_movement`（1:N，site_goods_id，100% 可关联）

> 注：当前版本 173 个门店商品 vs 174 个租户商品，差 1 个（某商品未分配到门店）。

#### SCD2 字段

同 dim_tenant_goods：`scd2_start_time`(PK), `scd2_end_time`, `scd2_is_current`, `scd2_version`

#### 业务关键字段

| 字段名 | 类型 | 验证状态 | 语义说明 | 值域/分布 |
|--------|------|----------|----------|-----------|
| goods_name | text | ✅ 已验证 | 商品名称（与租户商品一致） | 同 dim_tenant_goods |
| sale_price | numeric(18,2) | ✅ 已验证 | 门店售价 | MIN=2 MAX=11,360 AVG=271.10 中位数=12（当前版本） |
| category_level1_name | text | ✅ 已验证 | 一级分类名称（冗余） | 与 dim_goods_category 一致 |
| category_level2_name | text | ✅ 已验证 | 二级分类名称（冗余） | 与 dim_goods_category 一致 |
| goods_state | integer | ✅ 已验证 | 商品状态 | 1=上架(154), 2=下架(19)（当前版本） |
| enable_status | integer | ✅ 已验证 | 启用状态 | 1=启用(173)，当前版本 100% 启用 |
| send_state | integer | ✅ 已验证 | 配送状态 | 1=可配送(173)，当前版本 100% |
| is_delete | integer | ✅ 已验证 | 删除标记 | 0=未删除(173)，当前版本 100% |
| not_sale | integer | ✅ 已验证 | 禁售标记 | 2=否(173)，当前版本 100% 可售 |
| batch_stock_qty | integer | ✅ 已验证 | 批次库存数量 | MIN=0 MAX=1,000（当前版本） |
| sale_qty | integer | ✅ 已验证 | 销售数量（累计） | MIN=0 MAX=6,681 零值=17 |
| total_sales_qty | integer | ✅ 已验证 | 总销售数量 | MIN=0 MAX=6,681 零值=17（与 sale_qty 一致） |
| avg_monthly_sales | numeric(18,4) | ⚠️ 部分验证 | 月均销量 | 91/173 为 NULL 或 0 |
| commodity_code | text | ✅ 已验证 | 商品编码 | 非空 |

**透明字段**：`site_goods_id`(PK), `tenant_id`, `site_id`, `tenant_goods_id`, `goods_category_id`, `goods_second_category_id`, `created_at`, `updated_at`

#### 租户商品与门店商品的关系（关键验证）

> ✅ **关联完整性**：当前版本 173 个门店商品 100% 可关联到 dim_tenant_goods（tenant_goods_id），100% 可关联到 dim_goods_category（goods_category_id 和 goods_second_category_id）。
>
> **层级关系**：`dim_goods_category`（分类）→ `dim_tenant_goods`（租户商品）→ `dim_store_goods`（门店商品）。租户商品定义商品基本信息和市场价，门店商品实例化为具体门店的售价和库存。当前数据中 sale_price 与 market_price 高度一致（门店未单独调价）。

#### 商品分类分布（当前版本，173 个门店商品）

| 一级分类 | 二级分类 | 商品数 |
|----------|----------|--------|
| 零食 | 零食 | 47 |
| 酒水 | 饮料 | 38 |
| 其他 | 其他2 | 18 |
| 香烟 | 香烟 | 17 |
| 雪糕 | 雪糕 | 14 |
| 酒水 | 酒水 | 10 |
| 器材 | 球杆 | 8 |
| 槟榔 | 槟榔 | 6 |
| 零食 | 面 | 4 |
| 小吃 | 小吃 | 4 |
| 器材 | 皮头 | 2 |
| 果盘 | 果盘 | 2 |
| 酒水 | 洋酒 | 2 |
| 器材 | 其他 | 1 |

---

### 7.5 dim_store_goods_ex

**业务职责**：门店商品扩展表，记录门店级别的库存详情、成本价、折扣设置、审核状态等运营信息（SCD2）
**数据状态**：18,723 行（173 个商品 × 多版本），当前版本 173 行
**主键**：`site_goods_id, scd2_start_time`（复合主键）
**关联表**：`dim_store_goods`（1:1，site_goods_id + scd2_start_time）

> ⚠️ 注意：dim_store_goods_ex 有 18,723 行 vs dim_store_goods 的 18,765 行，扩展表版本数略少于主表。当前版本均为 173 行，1:1 关系在当前版本上成立。

#### SCD2 字段

同 dim_store_goods：`scd2_start_time`(PK), `scd2_end_time`, `scd2_is_current`, `scd2_version`

#### 业务关键字段

| 字段名 | 类型 | 验证状态 | 语义说明 | 值域/分布 |
|--------|------|----------|----------|-----------|
| unit | text | ✅ 已验证 | 计量单位 | 非空 |
| stock_qty | integer | ✅ 已验证 | 当前库存数量 | MIN=0 MAX=976 AVG=27.91（当前版本），4,674 行 NULL（历史版本） |
| cost_price | numeric(18,4) | ⚠️ 部分验证 | 成本价 | MIN=0 MAX=2.87 仅 9 个非零值（当前版本），大部分商品无成本价 |
| cost_price_type | integer | ✅ 已验证 | 成本价类型 | 非空 |
| is_discountable | integer | ✅ 已验证 | 是否可折扣 | 1=可折扣(172), 另 1 个不同（当前版本） |
| forbid_sell_status | integer | ✅ 已验证 | 禁售状态 | 1=正常(173)，当前版本 100% |
| audit_status | integer | ✅ 已验证 | 审核状态 | 2=已审核(173)，当前版本 100% |
| is_warehousing | integer | ✅ 已验证 | 是否入库管理 | 1=是(173)，当前版本 100% |
| able_site_transfer | integer | ✅ 已验证 | 是否允许门店调拨 | 2=否(172), 0(1)（当前版本） |
| custom_label_type | integer | ✅ 已验证 | 自定义标签类型 | 2(173)，当前版本 100% 单值 |
| option_required | integer | ✅ 已验证 | 是否必选规格 | 1(173)，当前版本 100% 单值 |
| days_on_shelf | integer | ⚠️ 部分验证 | 上架天数 | MIN=0 MAX=13,942 零值=10,359（全量） |
| sort_order | integer | ✅ 已验证 | 排序序号 | 非空 |

**全零/全空字段**：`goods_barcode`(全NULL)、`stock_secondary_qty`(全0/NULL)、`safety_stock_qty`(全0/NULL)、`freeze_status`(全0/NULL)、`remark`(全NULL)、`warning_sales_day`(全0/NULL)、`warning_day_max`(全0/NULL)、`warning_day_min`(全0/NULL)

**大量零值字段**：`provisional_total_cost`(18,319/18,723 为 0 或 NULL)、`total_purchase_cost`(17,740/18,723 为 0 或 NULL)、`min_discount_price`(15,862/18,723 为 0 或 NULL)

**冗余/透明字段**：`site_name`("朗朗桌球"), `goods_cover_url`(商品图片), `pinyin_initial`(拼音首字母)

---

### 7.6 dwd_store_goods_sale

**业务职责**：商品销售流水事实表，记录每笔商品销售的单价、数量、金额、折扣等明细
**数据状态**：26,911 行，时间范围 2025-07-21 ~ 2026-03-04。其中 is_delete=0（有效）26,709 行，is_delete=1（已删除）202 行
**主键**：`store_goods_sale_id`
**关联表**：`dwd_store_goods_sale_ex`（1:1，store_goods_sale_id）、`dwd_settlement_head`（N:1，order_settle_id，100% 可关联）、`dim_store_goods`（N:1，site_goods_id，100% 可关联）、`dim_tenant_goods`（N:1，tenant_goods_id，100% 可关联）

#### 业务关键字段

| 字段名 | 类型 | 验证状态 | 语义说明 | 值域/分布 |
|--------|------|----------|----------|-----------|
| ledger_unit_price | numeric(18,2) | ✅ 已验证 | 商品单价 | MIN=2 MAX=1,690 AVG=11.82 中位数=8（is_delete=0） |
| ledger_count | integer | ✅ 已验证 | 销售数量（负值=退货） | MIN=-1 MAX=66 AVG=1.73 |
| ledger_amount | numeric(18,2) | ✅ 已验证 | 销售金额 = `ledger_unit_price × ledger_count` ✅ 100% 成立 | MIN=-12 MAX=1,690 AVG=20.50 中位数=8 |
| discount_money | numeric(18,2) | ✅ 已验证 | 折扣金额 | MIN=0 MAX=990 AVG=1.02 非零=1,833(6.9%) |
| real_goods_money | numeric(18,2) | ✅ 已验证 | 实收金额 = `ledger_amount - discount_money` ✅ 100% 成立 | MIN=-12 MAX=1,690 AVG=19.49 |
| cost_money | numeric(18,2) | ✅ 已验证 | 成本金额 | MIN=0 MAX=81.82 非零=2,521(9.4%) |
| ledger_status | integer | ✅ 已验证 | 账本状态 | 1=已结算(26,911)，100% 单值 |
| is_delete | integer | ✅ 已验证 | 删除标记 | 0=有效(26,709), 1=已删除(202) |
| discount_price | numeric(18,2) | ✅ 已验证 | 折扣后单价 | 非零=26,618，零值=293 |
| coupon_share_money | numeric(18,2) | ✅ 已验证 | 券分摊金额 | **全部为 0** |
| ledger_name | varchar(200) | ✅ 已验证 | 商品名称（冗余） | 与 dim_store_goods.goods_name 对应 |
| ledger_group_name | varchar(100) | ✅ 已验证 | 商品分组名称 | 非空 |

**全零字段**：`order_pay_id`(全0)、`coupon_share_money`(全0)

**透明字段**：`store_goods_sale_id`(PK), `order_trade_no`, `order_settle_id`, `site_id`, `tenant_id`, `site_goods_id`, `tenant_goods_id`, `tenant_goods_category_id`, `tenant_goods_business_id`, `site_table_id`(6,724 为 0 — 商城订单无台桌), `create_time`

#### 商品销售金额公式（关键验证）

> ✅ **公式 G1：销售金额 = 单价 × 数量**
> `ledger_amount = ledger_unit_price × ledger_count`
> 验证结果：is_delete=0 的 26,709 条 **100% 成立**（误差 < 0.02 元）

> ✅ **公式 G2：实收金额 = 销售金额 - 折扣金额**
> `real_goods_money = ledger_amount - discount_money`
> 验证结果：is_delete=0 的 26,709 条 **100% 成立**

> ✅ **交叉验证 G3：商品流水 ↔ 结算单**
> `SUM(sale.ledger_amount WHERE is_delete=0) = settlement_head.goods_money`
> 验证结果：10,175 笔有商品流水的结算中 **99.7% 成立**（10,145/10,175），30 笔有微小偏差。
> `SUM(sale.real_goods_money WHERE is_delete=0) = settlement_head.real_goods_money`
> 同样 **99.7% 成立**。

#### 销售 TOP 10 商品（is_delete=0）

| 商品名称 | 销售笔数 | 总数量 | 总金额 |
|----------|----------|--------|--------|
| 百威235毫升 | 667 | 6,349 | 95,235 |
| 钻石荷花 | 438 | 615 | 28,700 |
| 哇哈哈矿泉水 | 3,322 | 5,511 | 27,555 |
| 东方树叶 | 2,033 | 2,813 | 22,504 |
| 荷花双中支 | 188 | 246 | 17,036 |
| 蓝妹 | 98 | 856 | 15,408 |
| 红牛 | 979 | 1,540 | 15,400 |
| 地道肠 | 1,192 | 2,618 | 13,090 |
| 轻上椰子水 | 608 | 1,046 | 12,552 |
| 风花雪月 | 109 | 756 | 12,096 |

---

### 7.7 dwd_store_goods_sale_ex

**业务职责**：商品销售流水扩展表，记录操作员、销售员、退货、券抵扣等补充信息
**数据状态**：26,911 行，与主表 1:1
**主键**：`store_goods_sale_id`
**关联表**：`dwd_store_goods_sale`（1:1，store_goods_sale_id）

#### 业务关键字段

| 字段名 | 类型 | 验证状态 | 语义说明 | 值域/分布 |
|--------|------|----------|----------|-----------|
| operator_name | text | ✅ 已验证 | 操作员名称 | 非空 |
| operator_id | bigint | ✅ 已验证 | 操作员 ID | 非空 |
| open_salesman_flag | integer | ✅ 已验证 | 是否开启销售员 | 2=否(26,911)，100% 单值 |
| is_single_order | integer | ✅ 已验证 | 是否独立订单 | 1=独立(26,911)，100% 单值 |
| sales_type | integer | ✅ 已验证 | 销售类型 | 1=普通销售(26,911)，100% 单值 |
| discount_money | numeric(18,2) | ✅ 已验证 | 折扣金额（与主表冗余） | 非零=1,837 |
| returns_number | integer | ✅ 已验证 | 退货数量 | 仅 1 笔非零（值=1） |
| site_name | text | ✅ 已验证 | 门店名称 | "朗朗桌球" |
| goods_remark | text | ⚠️ 部分验证 | 商品备注 | 非空=20,203(75.1%)，NULL=6,708 |

**全零/全空字段**：`legacy_order_goods_id`(全0)、`option_value_name`(全NULL)、`salesman_name`(全NULL)、`salesman_user_id`(全0)、`salesman_role_id`(全0)、`salesman_org_id`(全0)、`coupon_deduct_money`(全0)、`member_discount_amount`(全0)、`point_discount_money`(全0)、`point_discount_money_cost`(全0)、`package_coupon_id`(全0)、`order_coupon_id`(全0)、`member_coupon_id`(全0)、`option_price`(全0)、`option_member_discount_money`(全0)、`option_coupon_deduct_money`(全0)、`push_money`(全0)

---

### 7.8 商品域空字段汇总

| 表名 | 全零/全空字段 |
|------|--------------|
| dim_goods_category | `alias_name`(801 行 NULL) |
| dim_tenant_goods | `supplier_id`(全0/NULL) |
| dim_tenant_goods_ex | `remark_name`(全NULL), `goods_bar_code`(全NULL), `sale_channel`(全NULL), `common_sale_royalty`(全0), `point_sale_royalty`(全0), `out_goods_id`(全0) |
| dim_store_goods | — |
| dim_store_goods_ex | `goods_barcode`(全NULL), `stock_secondary_qty`(全0/NULL), `safety_stock_qty`(全0/NULL), `freeze_status`(全0/NULL), `remark`(全NULL), `warning_sales_day`(全0/NULL), `warning_day_max`(全0/NULL), `warning_day_min`(全0/NULL) |
| dwd_store_goods_sale | `order_pay_id`(全0), `coupon_share_money`(全0) |
| dwd_store_goods_sale_ex | `legacy_order_goods_id`(全0), `option_value_name`(全NULL), `salesman_name`(全NULL), `salesman_user_id`(全0), `salesman_role_id`(全0), `salesman_org_id`(全0), `coupon_deduct_money`(全0), `member_discount_amount`(全0), `point_discount_money`(全0), `point_discount_money_cost`(全0), `package_coupon_id`(全0), `order_coupon_id`(全0), `member_coupon_id`(全0), `option_price`(全0), `option_member_discount_money`(全0), `option_coupon_deduct_money`(全0), `push_money`(全0) |

===SECTION_8_BOUNDARY===

### 表清单与数据状态

| 表名 | 类型 | 行数 | 时间范围 | 时间字段 |
|------|------|------|----------|----------|
| `dwd_goods_stock_summary` | 事实表 | 7,320 | 2025-12-19 ~ 2026-03-04 | fetched_at |
| `dwd_goods_stock_movement` | 事实表 | 35,325 | 2025-07-18 ~ 2026-03-04 | create_time |

---

### 8.1 dwd_goods_stock_movement

**业务职责**：库存变动流水事实表，记录每次库存变动的类型、数量、前后库存、价格等明细
**数据状态**：35,325 行，时间范围 2025-07-18 ~ 2026-03-04
**主键**：`site_goods_stock_id`
**关联表**：`dim_store_goods`（N:1，site_goods_id，100% 可关联）

#### 业务关键字段

| 字段名 | 类型 | 验证状态 | 语义说明 | 值域/分布 |
|--------|------|----------|----------|-----------|
| stock_type | integer | ✅ 已验证 | 库存变动类型（见下方枚举） | 6 种类型 |
| change_num | numeric(18,4) | ✅ 已验证 | 变动数量（负值=出库，正值=入库，0=盘点） | MIN=-66 MAX=1,000 |
| start_num | numeric(18,4) | ✅ 已验证 | 变动前库存 | 非空 |
| end_num | numeric(18,4) | ✅ 已验证 | 变动后库存 = `start_num + change_num` ✅ 100% 成立 | 非空 |
| price | numeric(18,4) | ✅ 已验证 | 商品价格 | MIN=2 MAX=11,360 AVG=18.50 中位数=8 零值=0 |
| goods_name | text | ✅ 已验证 | 商品名称 | 非空 |
| unit | text | ✅ 已验证 | 计量单位 | 非空 |
| operator_name | text | ✅ 已验证 | 操作员名称 | 非空 |
| create_time | timestamptz | ✅ 已验证 | 变动时间 | 2025-07-18 ~ 2026-03-04 |
| fetched_at | timestamptz | ✅ 已验证 | ETL 抓取时间 | 非空 |

**大量零值字段**：`change_num_a`(33,225/35,325 为 0 或 NULL)、`start_num_a`(34,275 为 0 或 NULL)、`end_num_a`(34,275 为 0 或 NULL)

**全空字段**：`remark`(34,240/35,325 为 NULL)

**透明字段**：`site_goods_stock_id`(PK), `tenant_id`, `site_id`, `site_goods_id`, `goods_category_id`, `goods_second_category_id`

#### stock_type 枚举分布（关键验证）

| stock_type | 笔数 | change_num 方向 | 合计变动量 | 推断含义 |
|------------|------|----------------|-----------|----------|
| 1 | 29,931 | 负值（-1 ~ -66） | -54,462 | **销售出库**（最大量，占 84.7%） |
| 2 | 1,016 | 0 | 0 | **盘点（无变动）** |
| 4 | 3,294 | 正值（1 ~ 66） | +7,301 | **退货入库** |
| 7 | 34 | 0 | 0 | **盘点（调整类）** |
| 8 | 1,016 | 正值（1 ~ 1,000） | +52,427 | **采购入库** |
| 9 | 34 | 负值（-1 ~ -50） | -445 | **报损出库** |

> ✅ 库存变动净值：-54,462 + 7,301 + 52,427 - 445 = +4,821（净入库），符合门店持续补货的业务逻辑。

#### 库存等式验证（关键验证）

> ✅ **公式 SM1：变动后库存 = 变动前库存 + 变动数量**
> `end_num = start_num + change_num`
> 验证结果：35,325 条 **100% 成立**

---

### 8.2 dwd_goods_stock_summary

**业务职责**：库存汇总快照事实表，按商品+抓取日期记录期间的库存变动汇总（期初、入库、出库、销售、盘点、期末、当前库存）
**数据状态**：7,320 行，时间范围 2025-12-19 ~ 2026-03-04，覆盖 173 个商品 × 25 个抓取日
**主键**：`site_goods_id, fetched_at`（复合主键）
**关联表**：`dim_store_goods`（N:1，site_goods_id）

#### 业务关键字段

| 字段名 | 类型 | 验证状态 | 语义说明 | 值域/分布 |
|--------|------|----------|----------|-----------|
| range_start_stock | numeric(18,4) | ✅ 已验证 | 期初库存 | 非空 |
| range_end_stock | numeric(18,4) | ✅ 已验证 | 期末库存 | 非空 |
| range_in | numeric(18,4) | ⚠️ 部分验证 | 期间入库量 | 5,142/7,320 为 0 或 NULL |
| range_out | numeric(18,4) | ⚠️ 部分验证 | 期间出库量（**负值**，含销售和其他出库） | 2,999/7,320 为 0 或 NULL |
| range_sale | numeric(18,4) | ⚠️ 部分验证 | 期间销售量 | 3,040/7,320 为 0 或 NULL |
| range_sale_money | numeric(18,2) | ⚠️ 部分验证 | 期间销售金额 | MIN=0 MAX=20,250 |
| range_inventory | numeric(18,4) | ✅ 已验证 | 期间盘点调整量 | **全部为 0**（7,320 行） |
| current_stock | numeric(18,4) | ✅ 已验证 | 当前实时库存 | MIN=0 MAX=976 AVG=38.30 |
| category_name | text | ✅ 已验证 | 分类名称 | 非空 |
| goods_name | text | ✅ 已验证 | 商品名称 | 非空 |
| goods_unit | text | ✅ 已验证 | 计量单位 | 非空 |

**透明字段**：`site_goods_id`(PK), `site_id`, `tenant_id`, `goods_category_id`, `goods_category_second_id`, `fetched_at`(PK)

#### 库存汇总等式验证（关键验证）

> ⚠️ **公式 SS1：期末库存 = 期初库存 + 入库 + 出库 + 盘点**
> `range_end_stock = range_start_stock + range_in + range_out + range_inventory`
> （注意：`range_out` 为负值，已包含销售出库和其他出库）
> 验证结果：7,320 条中 **6,625 条成立（90.5%）**，695 条不成立。
>
> **不成立原因分析**：
> - 无活动记录（range_sale=0, range_in=0, range_out=0）但 range_start_stock ≠ range_end_stock 的仅 2 条 → 可能是跨期调整
> - 有活动记录但等式不成立的 693 条 → `range_out` 不完全等于销售出库，可能存在其他出库类型（退货冲正、调拨等）未完全反映在汇总字段中
> - `range_sale` 与 `ABS(range_out)` 的关系：2,012 条完全相等，1,087 条 range_out 绝对值大于 range_sale（含非销售出库），1,019 条 range_out 绝对值小于 range_sale（数据不一致）
>
> ⚠️ **警告**：库存汇总表的等式成立率仅 90.5%，`range_out` 与 `range_sale` 的关系不完全一致。建议后续验证时以 `dwd_goods_stock_movement` 的逐笔流水为准，汇总表仅作参考。

---

### 8.3 库存域空字段汇总

| 表名 | 全零/全空字段 |
|------|--------------|
| dwd_goods_stock_movement | `remark`(34,240 NULL), `change_num_a`(33,225 为 0/NULL), `start_num_a`(34,275 为 0/NULL), `end_num_a`(34,275 为 0/NULL) |
| dwd_goods_stock_summary | `range_inventory`(全0) |
