赞
踩
我们在开发电商项目时,必须首先要了解两个概念,SPU与SKU是什么?这也是设计一个好的电商系统的必要前提。商系统实现了什么功能,大数情况下都是和商品模块相关联的。因此商品模块本身的实现要足够抽象、灵活、易于扩展,这样才能满足各种业务需求。而这一切的基础都建立在SPU和SKU的设计,所以说这两个概念,是设计好电商系统的关键。那SKU和SPU又分别是什么东西呢?
SPU (Standard Product Unit)即标准化产品单位,是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU。
SKU(stock keeping unit)即库存量单位,是物理上不可分割的最小存货单元。正因为它在物理上是不可分割的最小存货单元,所以也就可以通过SKU来确定具体的货物存量。
如一件M码(四个尺码:S码、M码、L码、X码)的粉色(三种颜色:粉色、黄色、黑色)Zara女士风衣,其中M码、粉色就是一组SKU的组合。
SKU在生成时, 会根据属性生成相应的笛卡尔积,根据一组SKU可以确定商品的库存情况,那么上面的Zara女士风衣一共有4 * 3 = 12个SKU组合。
下面我们通过一个具体的电商流程来搞懂SPU和SKU。
常规的业务流程是这样的:用户通过一个标有商品简略信息的入口点进一个商品页面,这时会有几个不同的配置、颜色、尺寸供选择,用户选择时需要判断这个商品是否有库存。
这一系列操作中一个商品的页面会是一个SPU,最后检查的库存就是SKU。
但是为什么业务的流程是这样的呢?我们通过下图的来进行分析。![在这里插入图片描述](https://img-blog.csdnimg.cn/411255b340ba414290d2d74ac8a57991.png
通过上图某东关于华为笔记本电脑MateBook D 14的商品页面我们不难在图中发现红框是SPU信息,蓝框是SKU信息。但是为什么是这样的呢?回顾一下这二者的概念:
SPU:标准化产品单位 SKU:库存量单位
那么上图红框中的信息就是标准化产品单位,我们可以这样理解标准化产品单位,无论选择购买什么样配置、颜色的华为笔记本电脑MateBook D 14, 首先它一定是一部华为笔记本电脑。而不同配置、颜色之间的华为笔记本电脑一定具有一些相同的属性,这些属性可以称之为公共属性,那么由这些公共属性组合而成的集合,就可以称为该产品的SPU。此时华为笔记本电脑就是这个SPU的名称。
通过在某东查看“规格与包装”来获得具体的SPU信息。如下图所示::
正是因为有了这个SPU我们在说起华为笔记本电脑MateBook D 14的时候,我们就能知道这是一部怎样的电脑了,但是这部华为笔记本电脑MateBook D 14的具体颜色,容量等信息对方是不清楚的。这是因为**SPU只定义了一个产品,但不是商品。**一个SPU可以拥有多个SKU(不同规格组合),SKU和SPU是一种多对一的关系,SKU才是定义了产品下的具体商品。回到最开始的图我们来细说。
我们通过点击选择红框中的不同规格,可以组合出不同的华为笔记本电脑MateBook D 14商品(SKU),同时价格、库存量会有相应的变化。因为SPU+SKU才会得到一个具体的商品。
这就跟你去手机店跟柜员说我要买手机或者我要买华为笔记本电脑MateBook D 14,多少钱,人家柜员需要反问你啥电脑、什么型号、多大内存、啥颜色不然没法给你报价一个道理。
那SKU为什么称之为“库存量单位”?因为在采购商品的时候,不可能只写华为笔记本电脑MateBook D 14,相反采购单是根据颜色、容量、规格等SKU组合来区分采购的。入库也是根据不同的SKU组合来入库的,所以SKU称之为库存量单位。
就好比华为笔记本电脑MateBook D 14上市的时候,16GB+512GB的容量是缺货状态的,但其他容量是正常供应的。一个SPU拥有的规格越多,可以组合出来的SKU商品就越多,就拿华为笔记本电脑MateBook D 14中颜色和版本这两个规格来举例,每部华为笔记本电脑MateBook D 14最多可以有3*3=9种SKU组合,就代表华为笔记本电脑MateBook D 14这个产品下有9种商品,而每种SKU组合又可以分别定价。
总结
如以电脑为例,基本属性分组包括:
主体 、基本信息、机器规格、芯片、屏幕
如图:
如以电脑为例,基本属性包括:
入网型号 上市年份 机身颜色 机身长度(mm) 机身材质工艺 CPU品牌 CPU型号
如图:
如以手机为例,销售属性包括:
颜色分类 内存大小 版本
如图,红色框内的是销售属性
产品分类是电商商品表最核心的内容之一,无论是SPU、SKU、还是商品属性都会关联到
产品分类表主要有:分类名称、父分类id、层级、是否显示、排序
实体类:
@Data @TableName("pms_category") public class CategoryEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 分类id */ @TableId private Long catId; /** * 分类名称 */ private String name; /** * 父分类id */ private Long parentCid; /** * 层级 */ private Integer catLevel; /** * 是否显示[0-不显示,1显示] */ @TableLogic(value = "1", delval = "0") private Integer showStatus; /** * 排序 */ private Integer sort; /** * 图标地址 */ private String icon; /** * 计量单位 */ private String productUnit; /** * 商品数量 */ private Integer productCount; @JsonInclude(value = JsonInclude.Include.NON_EMPTY) @TableField(exist = false) private List<CategoryEntity> children; }
SPU信息表最主要有:商品名称、商品描述、 所属分类id、品牌id、上架状态
实体类:
@Data @TableName("pms_spu_info") public class SpuInfoEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 商品id */ @TableId private Long id; /** * 商品名称 */ private String spuName; /** * 商品描述 */ private String spuDescription; /** * 所属分类id */ private Long catalogId; /** * 品牌id */ private Long brandId; @TableField(exist = false) private String brandName; /** * */ private BigDecimal weight; /** * 上架状态[0 - 下架,1 - 上架] */ private Integer publishStatus; /** * */ private Date createTime; /** * */ private Date updateTime; }
SKU信息表最主要有:sku名称、sku介绍描述、 所属分类id、品牌id、标题、副标题(下图中的蓝色框的内容)
实体类:
@Data @TableName("pms_sku_info") public class SkuInfoEntity implements Serializable { private static final long serialVersionUID = 1L; /** * skuId */ @TableId private Long skuId; /** * spuId */ private Long spuId; /** * sku名称 */ private String skuName; /** * sku介绍描述 */ private String skuDesc; /** * 所属分类id */ private Long catalogId; /** * 品牌id */ private Long brandId; /** * 默认图片 */ private String skuDefaultImg; /** * 标题 */ private String skuTitle; /** * 副标题 */ private String skuSubtitle; /** * 价格 */ private BigDecimal price; /** * 销量 */ private Long saleCount; }
Attr属性表最主要有:属性名、 是否需要检索、 值类型[0-为单个值,1-可以选择多个值]、可选值列表[用逗号分隔]、属性类型[0-销售属性,1-基本属性]、所属分类
实体类:
@Data @TableName("pms_attr") public class AttrEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 属性id */ @TableId private Long attrId; /** * 属性名 */ private String attrName; /** * 是否需要检索[0-不需要,1-需要] */ private Integer searchType; /** * 值类型[0-为单个值,1-可以选择多个值] */ private Integer valueType; /** * 属性图标 */ private String icon; /** * 可选值列表[用逗号分隔] */ private String valueSelect; /** * 属性类型[0-销售属性,1-基本属性 */ private Integer attrType; /** * 启用状态[0 - 禁用,1 - 启用] */ private Long enable; /** * 所属分类 */ private Long catelogId; /** * 快速展示【是否展示在介绍上;0-否 1-是】,在sku中仍然可以调整 */ private Integer showDesc; }
AttrGroup属性组表最主要有:组名、排序、所属分类id
实体类
@Data @TableName("pms_attr_group") public class AttrGroupEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 分组id */ @TableId private Long attrGroupId; /** * 组名 */ private String attrGroupName; /** * 排序 */ private Integer sort; /** * 描述 */ private String descript; /** * 组图标 */ private String icon; /** * 所属分类id */ private Long catelogId; /** * 分类路径,用于回显(1,2,3),表示祖父id = 1, 父id = 2, 当前ID 3 */ @TableField(exist = false) private List<Long> catelogPath; }
源码下载:
https://gitee.com/charlinchenlin/koo-erp
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。