跳到正文
Kale的数字花园
目录 文章
/7 分钟/7 阅读/0 评论

商品(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 — 送货单中的 SKC
  • purchase_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 有值

配对方式有两种:

  1. 自动配对:商品从平台同步过来时,通过 ProductSkuExtractor 从 platformSku 中提取候选产品 SKU,调用 ProductRemoteService.querySkuByCodes() 匹配
  2. 手动配对:用户在界面上手动关联

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):

  1. 横杠解析:从 StorePrefix-Nation&ProductSku-RandomCode 格式中提取
  2. 直接匹配:platformSku 直接就是 productSku
  3. 末段截取:取最后一个 - 前的内容

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 是系统中最核心的产品标识,所有业务模块都围绕它运转。

相关阅读

8 分钟

Creeks 系统线程池与多线程使用分析

整个系统使用了 **3 种多线程模式**,涉及 **4 个独立的线程池配置类**,覆盖 **定时任务、并行查询、异步通知、报告处理** 等场景。 假设服务器 8 核 CPU: Amazon 同步服务选 是明智的——调用者自己跑任务,自动降速

面试#其他6 阅读 · 0 评论

22 分钟

多平台财务核算系统

集团旗下跨境电商业务覆盖 eBay、AliExpress(速卖通)、Wish、Shopee、Walmart、Allegro、美客多、Joom、Joybuy、CDiscount、自建站(Shopify)等 **13+ 电商平台**,每个平台的

面试#其他7 阅读 · 0 评论

21 分钟

多线程与JUC并发编程实战

Creeks ERP 系统是一套跨境电商全链路管理平台,涵盖库存(inventory)、销售(sales)、履约(fulfillment)、财务(finance)、平台同步(esync)等十余个微服务模块。系统对接了 eBay、Amazon

面试#其他6 阅读 · 0 评论

评论需要登录。生产环境使用 GitHub 登录,本地可前往 登录页 使用开发登录。

还没有评论,来抢沙发。