Files
Neo-ZQYY/scripts/ops/_goods_inventory_content.md

441 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
### 7.1 dim_goods_category
**业务职责**商品分类维度表记录商品分类树结构两级分类无扩展表SCD2 缓慢变化维度)
**数据状态**2,127 行26 个分类 × 多版本),当前版本 26 行SCD2 版本范围 1~78
**主键**`category_id, scd2_start_time`(复合主键)
**关联表**`dim_tenant_goods`1:Ngoods_category_id / goods_second_category_id → category_id`dim_store_goods`1:Ngoods_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 | ✅ 已验证 | 父分类 ID0 或 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:1tenant_goods_id + scd2_start_time`dim_goods_category`N:1goods_category_id → category_id100% 可关联)、`dim_goods_category`N:1goods_second_category_id → category_id100% 可关联)、`dim_store_goods`1:Ntenant_goods_id`dwd_store_goods_sale`1:Ntenant_goods_id100% 可关联)
#### 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:1tenant_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:1site_goods_id + scd2_start_time`dim_tenant_goods`N:1tenant_goods_id100% 可关联)、`dim_goods_category`N:1goods_category_id100% 可关联)、`dim_goods_category`N:1goods_second_category_id100% 可关联)、`dwd_store_goods_sale`1:Nsite_goods_id100% 可关联)、`dwd_goods_stock_summary`1:Nsite_goods_id`dwd_goods_stock_movement`1:Nsite_goods_id100% 可关联)
> 注:当前版本 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_goodstenant_goods_id100% 可关联到 dim_goods_categorygoods_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:1site_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:1store_goods_sale_id`dwd_settlement_head`N:1order_settle_id100% 可关联)、`dim_store_goods`N:1site_goods_id100% 可关联)、`dim_tenant_goods`N:1tenant_goods_id100% 可关联)
#### 业务关键字段
| 字段名 | 类型 | 验证状态 | 语义说明 | 值域/分布 |
|--------|------|----------|----------|-----------|
| ledger_unit_price | numeric(18,2) | ✅ 已验证 | 商品单价 | MIN=2 MAX=1,690 AVG=11.82 中位数=8is_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,17530 笔有微小偏差。
> `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:1store_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:1site_goods_id100% 可关联)
#### 业务关键字段
| 字段名 | 类型 | 验证状态 | 语义说明 | 值域/分布 |
|--------|------|----------|----------|-----------|
| 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:1site_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) |