商品(Goods)、产品(SKU/SPU/SKC)、货物(Stock)关系与业务流程分析
本 ERP 系统中存在三个不同层面的概念,很多人容易搞混,老王先给你捋清楚: 简单说:**产品是"是什么",商品是"在哪卖",货物是"放在哪"**。 产品体系由 服务管理(不是 creekson-base,也不是 creeks-produc
一、核心概念定义
本 ERP 系统中存在三个不同层面的概念,很多人容易搞混,老王先给你捋清楚:
| 概念 | 英文 | 所在服务 | 数据库表 | 层面 | 一句话描述 |
|---|---|---|---|---|---|
| 产品 | Product (SKU/SPU/SKC) | creekson-api | pms_sku / pms_spu | 产品层面 | 公司内部对商品的标准定义,与平台无关、与仓库无关 |
| 商品 | Goods | creeks-sales | mall_goods | 销售层面 | 在某个电商平台的某个店铺下上架售卖的东西 |
| 货物 | Stock | creeks-inventory | inv_stock | 仓库层面 | 放在某个仓库里的物理实体 |
简单说:产品是"是什么",商品是"在哪卖",货物是"放在哪"。
二、产品体系:SPU → SKC → SKU 层级结构
产品体系由 creekson-api 服务管理(不是 creekson-base,也不是 creeks-product-query),核心表都带 pms_ 前缀。
2.1 SPU(标准产品单元)
表:
pms_spu| 实体:creekson-api-product-client中的Spu.java
SPU 是产品的最粗粒度,代表一类产品。关键字段:
| 字段 | 说明 |
|---|---|
| spuCode | SPU 编码(唯一标识) |
| categoryId / categoryName | 产品分类 |
| brandId / brandName | 品牌 |
| productProperty | 产品特性(带电/带磁/液体/粉末/气体) |
| isCombo | 是否组合产品 |
| saleStatus | 可用状态(1=可用, 2=不可用) |
| skuList | 包含的 SKU 列表(1:N) |
2.2 SKC(款式色号,Style-Color)
注意:本系统中 SKC 不是独立实体,也不是独立的数据表。
SKC 在 pms_sku 表中以 skc_code 字段(String 类型)的形式存在。它是 SKU 的一个维度属性,代表同一 SPU 下相同颜色/款式的分组。
SKC 编码在采购模块中被广泛使用:
purchase_receipt_order_detail.product_skc_code— 送货单中的 SKCpurchase_product_inventory通过pms_sku.skc_code进行聚合查询receipt_box_detail.skc_code— 装箱明细中的 SKC
2.3 SKU(库存量单位,Stock Keeping Unit)
表:
pms_sku| 实体:creekson-api-product-client中的Sku.java| PO:creekson-api-web中的SkuPO.java
SKU 是产品体系最细粒度,代表具体到颜色+尺码的最小可售单元。关键字段:
| 字段 | 说明 |
|---|---|
| skuCode | SKU 编码(全局唯一标识) |
| spuId / spuCode | 所属 SPU |
| skcCode | 所属 SKC(颜色/款式分组) |
| categoryId / categoryName | 产品分类 |
| brandId / brandName | 品牌 |
| nameCn / nameEn | 产品中/英文名称 |
| color / size | 颜色 / 尺码 |
| isCombo | 是否组合产品 |
| comboSkuList | 组合品包含的子 SKU 列表 |
| taxPrice / noTaxPrice | 申报单价(包税/不包税) |
| saleStatus | 可用状态 |
| purchaseStatus | 采购状态(1=正常采购, 2=停止采购) |
| supplierId | 供应商 |
| height/length/width/weight/volume | 产品尺寸和重量 |
| packHeight/packLength/packWidth/packWeight | 包装尺寸和重量 |
2.4 产品层级关系图
erDiagram
SPU ||--o{ SKU : "1:N 包含"
SKU {
Long id PK
String skuCode "SKU编码"
Long spuId FK "所属SPU"
String spuCode "SPU编码"
String skcCode "SKC编码(颜色款式分组)"
String color "颜色"
String size "尺码"
String nameCn "中文名称"
Boolean isCombo "是否组合品"
}
SPU {
Long id PK
String spuCode "SPU编码"
Long categoryId "分类ID"
Long brandId "品牌ID"
Boolean isCombo "是否组合品"
}
SKU }o--o{ SKU : "组合品关系(pms_combo_sku_relation)"
note1["SKC 不是独立实体,是 SKU 上的 skc_code 字段"] --> SKU
2.5 组合产品(Combo SKU)
组合产品通过 pms_combo_sku_relation 表关联:
| 字段 | 说明 |
|---|---|
| comboSkuId | 组合品 SKU ID |
| subSkuId | 子品 SKU ID |
| subSkuCount | 子品数量 |
一个组合 SKU 由多个单品 SKU 按指定数量组成。通过 ProductRemoteService.queryComboSkuBySkuId() 查询。
三、商品(Goods)— 销售层面
服务:
creeks-sales| 表:mall_goods| 实体:creeks-sales-client中的Goods.java
3.1 商品是什么
商品是平台店铺维度的销售单元。同一个产品 SKU,在 Amazon 美国站、Amazon 欧洲站、eBay 店铺、Shopify 店铺各有一个商品记录。
关键字段分三组:
平台属性:
| 字段 | 说明 |
|---|---|
| platformId / platformName | 电商平台(Amazon/eBay/TikTok Shop 等) |
| platformSku | 平台 SKU(平台侧的商品标识) |
| asin | 平台唯一标识(Amazon 的 ASIN / 其他平台的 ItemNumber) |
| storeId / storeName | 店铺 |
| fnSku | FBA 仓库编码(Amazon 专用) |
| deliveryType | 发货类型(1=FBA, 2=FBM) |
产品关联:
| 字段 | 说明 |
|---|---|
| skuId | 关联的产品 SKU ID(FK → pms_sku.id) |
| productSku | 产品 SKU 编码(冗余) |
| categoryId / categoryName | 品类 |
销售属性:
| 字段 | 说明 |
|---|---|
| userId / userName | 销售人员 |
| status | 配对状态(0=未配对, 1=已配对) |
| isSale | 是否在售(0=否, 1=是) |
| goodsSalesStatus | 销售状态(试销/正常销售/清仓/停售) |
3.2 商品配对(匹配产品 SKU)
商品的 status 字段表示配对状态:
- 0(未配对):
skuId为空或userId为空 - 1(已配对):
skuId有值且userId有值
配对方式有两种:
- 自动配对:商品从平台同步过来时,通过
ProductSkuExtractor从platformSku中提取候选产品 SKU,调用ProductRemoteService.querySkuByCodes()匹配 - 手动配对:用户在界面上手动关联
3.3 商品相关附属表
| 表名 | 说明 |
|---|---|
| mall_goods_skc | 商品 SKC 表(平台侧的 SKC ID) |
| mall_goods_listing | 父级 ASIN 上架分组 |
| mall_goods_inventory | 商品库存上限 |
| mall_goods_snapshot | 商品快照(时间点状态) |
| mall_sku_sale_relation | 产品-销售人员关联 |
| mall_sku_sale_store_relation | 产品-销售人员-店铺关联 |
| mall_goods_reporting_exemption | 免上报商品 |
| mall_abnormal_goods_* | 异常商品统计 |
四、货物(Stock)— 仓库层面
服务:
creeks-inventory| 表:inv_stock| 实体:creeks-inventory-server中的Stock.java
4.1 货物是什么
货物是仓库维度的物理库存单元。同一个产品 SKU 入到不同的仓库,就是不同的货物记录。
关键字段:
仓库属性:
| 字段 | 说明 |
|---|---|
| warehouseId | 仓库 ID |
| type | 仓库类型(1=自营仓, 2=万邑通, 3=FBA仓, 4=百世云仓) |
| code | 货物编码 |
| name | 货物名称 |
产品关联:
| 字段 | 说明 |
|---|---|
| productId | 产品 ID(FK → pms_sku.id) |
| productCode | 产品编码(冗余) |
| productNameCn / productNameEn | 产品中/英文名称(冗余) |
| platformSku | 平台 SKU |
| asin | ASIN |
物理属性:
| 字段 | 说明 |
|---|---|
| registerLength / Width / Height / Volume / Weight | 注册物理尺寸 |
| declaredTaxExclusive / declaredTaxInclusive | 申报价格(不含税/含税) |
状态属性:
| 字段 | 说明 |
|---|---|
| stockStatus | 状态(pending/review/refunded/publish) |
| matchType | 认领状态(0=未认领, 1=已认领) |
| newStock | 新品状态 |
4.2 货物-商品关联(核心桥梁)
表:
inv_stock_goods_relation| 实体:StockGoodsRelation.java
这是连接仓库层面和销售层面的多对多桥梁表:
| 字段 | 说明 |
|---|---|
| stockId | 货物 ID(FK → inv_stock.id) |
| goodsId | 商品 ID(FK → mall_goods.id) |
| productId | 产品 ID |
| productCode | 产品编码 |
| userId | 销售人员 |
| categoryId | 品类 |
| platformSku | 平台 SKU |
| asin | ASIN |
一个货物可以对应多个商品(不同平台、不同店铺),一个商品也可能关联多个仓库的货物。
4.3 库存相关的货物子表
| 表名 | 说明 |
|---|---|
| inv_logic_inventory | 逻辑仓库存(stockId + productCode 维度) |
| inv_inbound_receipt_product | 入库单产品(stockId + productSku 维度) |
| inv_winit_stock | 万邑通货物(额外含货型分类) |
| inv_inventory_ledger | 库存台账(stock_code + product_sku 维度) |
五、全局关系图
erDiagram
SPU ||--o{ SKU : "1:N"
SKU {
Long id PK
String skuCode "SKU编码"
String skcCode "SKC编码"
Long spuId FK
String color "颜色"
String size "尺码"
}
SPU {
Long id PK
String spuCode "SPU编码"
}
SKU ||--o{ Goods : "1:N 一个SKU在不同店铺有不同的商品"
Goods {
Long id PK
String platformSku "平台SKU"
String asin "平台标识"
Long skuId FK "配对的产品SKU"
Long platformId "平台"
Long storeId "店铺"
Long userId "销售人员"
Integer status "配对状态"
}
SKU ||--o{ Stock : "1:N 一个SKU在不同仓库有不同的货物"
Stock {
Long id PK
String code "货物编码"
Long productId FK "关联的产品SKU"
Long warehouseId "仓库"
Integer type "仓库类型"
}
Stock }o--o{ Goods : "多对多(通过inv_stock_goods_relation)"
StockGoodsRelation {
Long stockId FK "货物ID"
Long goodsId FK "商品ID"
Long productId "产品ID"
}
Category ||--o{ SPU : "归属分类"
Category ||--o{ SKU : "归属分类"
Category {
Long id PK
String name "分类名称"
Integer level "分类层级"
}
六、核心业务流程
6.1 商品同步与配对流程
商品数据从各大电商平台通过 esync 系列服务同步到 ERP 系统。
flowchart TD
A[电商平台商品数据] -->|Kafka| B[esync-xxx 服务<br/>平台商品抓取]
B -->|Kafka| C[creeks-sales<br/>平台消费者]
C --> D{查找已有商品}
D -->|已存在| E[更新商品信息<br/>modifyGoods]
D -->|不存在| F[自动匹配产品SKU<br/>autoMatchSku]
F --> G[ProductSkuExtractor<br/>从platformSku提取候选]
G --> H[ProductRemoteService<br/>查询PMS产品库]
H --> I{匹配成功?}
I -->|是| J[填充skuId/productSku<br/>status=已配对]
I -->|否| K[status=未配对<br/>等待手动配对]
J --> L[saveGoods<br/>保存到mall_goods]
K --> L
E --> M[触发CDC<br/>同步到ES]
L --> M
自动匹配规则(ProductSkuExtractor):
- 横杠解析:从
StorePrefix-Nation&ProductSku-RandomCode格式中提取 - 直接匹配:
platformSku直接就是productSku - 末段截取:取最后一个
-前的内容
6.2 货物-商品关联同步流程
flowchart TD
A[mall_goods 表变更] -->|CDC Binlog<br/>Kafka| B[CdcGoodsConsumer<br/>creeks-inventory]
B --> C{变更类型}
C -->|INSERT/UPDATE| D[同步平台库存<br/>更新inv_stock_goods_relation]
C -->|DELETE| E[删除关联记录<br/>inv_stock_goods_relation]
D --> F[更新stockId-goodsId映射]
6.3 FBA 库存驱动的商品创建
flowchart TD
A[Amazon FBA 库存同步] --> B[FbaInventoryAndGoodsBusinessService]
B --> C{查找已有商品}
C -->|已存在| D[更新商品]
C -->|不存在| E[创建新商品<br/>来源:SYNC_FROM_INVENTORY]
E --> F[构建StockRegisterFbaBo<br/>注册库存记录]
F --> G[creeks-inventory<br/>创建货物]
6.4 采购流程中的维度传递
采购业务同时涉及产品维度和货物维度:
flowchart LR
A[采购下单] -->|产品SKU维度| B[purchase_product_inventory<br/>产品SKU采购库存]
A -->|产品SKU+渠道维度| C[purchase_product_sale_channel_inventory<br/>按渠道的采购库存]
B --> D[送货单<br/>purchase_receipt_order_detail<br/>stockId + productSkuCode + productSkcCode + productSpuCode]
D --> E[入库单<br/>inv_inbound_receipt_product<br/>stockId + productSku]
D --> F[装箱明细<br/>receipt_box_detail<br/>spuCode + skcCode + skuCode + stockCode]
七、总结对照表
| 维度 | 产品 (Product) | 商品 (Goods) | 货物 (Stock) |
|---|---|---|---|
| 服务 | creekson-api | creeks-sales | creeks-inventory |
| 核心表 | pms_sku / pms_spu | mall_goods | inv_stock |
| 唯一标识 | skuCode / spuCode | platformSku + asin + storeId | code(货物编码) |
| 粒度 | 产品标准定义 | 平台店铺级 | 仓库级 |
| 与产品关系 | 自身 | skuId → pms_sku.id | productId → pms_sku.id |
| 核心状态 | saleStatus(可用/不可用) | status(配对状态)+ goodsSalesStatus | stockStatus + matchType |
| 组合品支持 | pms_combo_sku_relation | 不涉及 | 不涉及 |
| 分类归属 | pms_category | categoryId(冗余) | categoryId(冗余) |
关键关系一句话总结
一个产品 SKU(pms_sku)可以在多个平台的多个店铺中以多个商品(mall_goods)的形式售卖,也可以存放在多个仓库中以多个货物(inv_stock)的形式存在。货物和商品之间通过
inv_stock_goods_relation表进行多对多关联。SPU 是产品的粗粒度分组,SKC 是 SKU 的颜色款式属性(非独立实体),SKU 是系统中最核心的产品标识,所有业务模块都围绕它运转。