PMS SKU Stock解析
Erstellt am: 7. Februar 2025
Erstellt am: 7. Februar 2025
pms_sku_stock
表主要用于存储商品 SKU(Stock Keeping Unit,库存单位)的库存信息。在电商系统中,商品(Product)通常有不同的规格(如颜色、尺码等),每个规格组合对应一个 SKU。因此,该表的主要作用是:
在业务流程中,该表通常用于:
pms_sku_stock
表的字段如下:
字段名 | 数据类型 | 说明 |
---|---|---|
id | bigint(20) | 主键,自增 |
product_id | bigint(20) | 关联 pms_product 表,表示该 SKU 属于哪个商品 |
sku_code | varchar(64) | SKU 编码,唯一标识 SKU |
price | decimal(10,2) | SKU 的原价 |
stock | int(11) | SKU 的可用库存数量 |
low_stock | int(11) | 预警库存,当库存低于该值时,可能会触发预警通知 |
pic | varchar(255) | SKU 关联的展示图片 |
sale | int(11) | 该 SKU 的销量 |
promotion_price | decimal(10,2) | SKU 在促销活动中的价格(如果有促销) |
lock_stock | int(11) | 锁定库存(如:待付款订单锁定的库存,支付完成才扣减) |
sp_data | varchar(500) | 商品销售属性(JSON 格式),用于描述该 SKU 的规格,如 {"颜色":"红色", "尺码":"L"} |
pms_sku_stock
表主要和以下表有外键关系:
商品表 pms_product
product_id
关联,表示该 SKU 属于哪个商品pms_product
表中可能有 "Nike 运动鞋",而 pms_sku_stock
可能有 "Nike 运动鞋(黑色,42码)"、"Nike 运动鞋(白色,41码)" 等 SKU购物车表 oms_cart_item
product_sku_id
关联 pms_sku_stock
表的 id
订单项表 oms_order_item
product_sku_id
关联 pms_sku_stock
表的 id
stock
减少 1促销表 sms_flash_promotion_product_relation
product_id
关联 pms_product
,并可能涉及 pms_sku_stock
promotion_price
字段stock
是否足够,再扣减 lock_stock
stock
lock_stock
promotion_price
字段Nike 运动鞋(黑色,42码)
原价 ¥499
,促销价 ¥399
stock
低于 low_stock
时,触发库存预警Nike 运动鞋(黑色,42码)
低于 5
件,通知补货pms_sku_stock
的 sp_data
显示不同规格的 SKUpms_sku_stock
负责管理 SKU 级别的库存、价格、促销等信息pms_product
(商品)、oms_cart_item
(购物车)、oms_order_item
(订单项)等表紧密相关lock_stock
机制避免超卖,low_stock
机制实现库存预警这个表是电商系统中至关重要的库存管理核心,影响整个库存调度和订单履约流程。
sku_code、sale、promotion_price、lock_stock这几个字段我没接触过,不太了解
在电商后台管理中,pms_sku_stock
里面的字段可能有些在实际场景中使用频率较高,有些则是为更灵活的业务需求做的预留。下面从业务和实际使用层面,分别阐述一下 sku_code
、sale
、promotion_price
、lock_stock
这几个字段的含义与作用。
sku_code
varchar(64)
(或类似长度)sku_code
通常是SKU 在业务或仓储系统中的唯一识别码,用于区分不同的 SKU。sku_code
也会用来与线下或第三方仓储系统进行对接,因为仓库通常使用 SKU 编码来定位和出入库。sku_code
对应到仓库系统里的 SKU 代码。sku_code
进行精确查找。sku_code
在同一个商品体系里要保证全局或至少商品维度唯一,否则会造成数据混乱。sku_code
。有些公司会用流水号或规则编码自动生成(如 “SKU_商品ID_颜色_尺码_随机码” 之类)。sale
int(11)
(或整型)sale
一般代表该 SKU 的累计销售量或销量统计,用于展示、统计或做营销决策。promotion_price
decimal(10,2)
(或类似精度的小数)promotion_price
表示SKU 在促销或活动期间的售价。当有优惠活动时,通常会将商品临时以折扣价对外显示和售卖。promotion_price
,前端在活动时间内优先展示 promotion_price
而不是 price
。promotion_price
有值且活动进行中,则页面会显示促销价;若促销结束或 promotion_price
为空,则显示原价 price
。promotion_price
是否一定要存储在 pms_sku_stock
里,或者存储在哪个促销专用表里,需要结合系统设计考虑。如果活动很多,可能会使用更灵活的方式去记录,而不是直接写在 SKU 表里。promotion_price
做交易结算,过期或提前结束后必须恢复原价。lock_stock
int(11)
(或整型)lock_stock
用于记录正在被“锁定”的库存数量。通常在下单环节或活动预留库存时,会先锁定库存,等真正支付完成后再扣减实际库存。stock
里扣除一部分放到 lock_stock
中,代表已被这笔订单占用,避免其他用户重复购买导致超卖。stock
,并且相应地减少 lock_stock
。stock
里去。lock_stock
或其他“占用库存”字段来保障不会超卖。lock_stock
;stock
;lock_stock
。sku_code
:SKU 的唯一识别码,便于库存、仓储、订单系统进行对接或定位sale
:累计销量统计字段,可用于前台展示及后台运营决策promotion_price
:在促销活动或优惠期间所使用的价格lock_stock
:订单下单后锁定的库存量,用于防止并发购买时的超卖问题这四个字段体现了一个电商平台在SKU 管理、库存管理、营销活动管理和销售统计方面的基本需求与流程。在实际开发中,需要结合订单、支付、库存扣减等核心链路,才能让这些字段真正发挥作用。
lock_stock这块到底怎么操作你没说清楚啊兄弟,用一些具体的例子吧,我这里也有数据库表中的数据做参考:
98 27 201808270027001 2699.00 86 -24 [{"key":"颜色","value":"黑色"},{"key":"容量","value":"32G"}]
99 27 201808270027002 2999.00 100 0 [{"key":"颜色","value":"黑色"},{"key":"容量","value":"64G"}]
你看着来吧
下面给你一个逐步、场景化的例子,帮你理解实际业务中 lock_stock
(锁定库存)是怎么操作的,以及为什么有时会出现看似“奇怪”的数值(例如负数)。
你给出了两行示例数据(字段取决于你的表结构,以下仅根据你提供的信息做推测):
id | product_id | sku_code | price | stock | lock_stock | sp_data |
---|---|---|---|---|---|---|
98 | 27 | 201808270027001 | 2699.00 | 86 | -24 | [{"key":"颜色","value":"黑色"},{"key":"容量","value":"32G"}] |
99 | 27 | 201808270027002 | 2999.00 | 100 | 0 | [{"key":"颜色","value":"黑色"},{"key":"容量","value":"64G"}] |
从这儿可以看出两个 SKU(都是 product_id = 27 的同一个商品的不同规格):
stock=86
,lock_stock=-24
stock=100
,lock_stock=0
其中,SKU2
的 lock_stock=0
很常见,表示目前没有被下单占用的库存;但 SKU1
出现了 lock_stock=-24
,就比较特殊或“诡异”了,按正常逻辑,锁定库存一般不会为负。
我们先简单回顾一下“正常的”锁库流程是什么样的,随后再讨论为什么会出现负数。
stock >= 3
吗?如果够,就把这 3 个“暂时锁定”,以防止别人再买走。lock_stock
的值(+3)stock
,或者把 stock
保持原样,仅用 lock_stock
来标识“被占用”的量——不同项目对字段意义可能略有差异。stock
只记录“可售库存”剩余量,而“锁定库存”用 lock_stock
记录。stock
记录“理论总库存”,lock_stock
记录已被锁的。无论哪种,都不应该出现负数锁定。stock=86
, lock_stock=0
。stock
可能保持 86 不变,lock_stock
变成 3;stock
直接改为 83,lock_stock
变为 3;要看具体项目如何定义字段含义。stock
在下单时未减过,这时就 stock = 86 - 3 = 83
,lock_stock = 0
(释放占用)stock
减到 83,只是还在 lock_stock
里标记 3,那么支付成功后,一般就把 lock_stock
清零即可。stock
未扣减过,那么 lock_stock
减 3,stock
保持不变;stock
在下单时就减掉了,那就要把 stock
+3 回到 86,lock_stock
减到 0。lock_stock = -24
?在理想的锁库逻辑里,lock_stock
应该始终是一个大于等于 0 的数,因为它表示“被占用、锁住”的数量。出现 -24 一般可能是以下几种原因:
lock_stock
,还没来得及把 stock
增回来,就被其他流程打断或出现异常,导致 lock_stock
累减到负数。stock
当作“理论库存”,而把 lock_stock
当作“实际可售库存 - 理论库存”的“差额”之类的含义,用法不一致。lock_stock
用来记“超卖”多少,正数或负数表示一种补偿量、差额量。lock_stock
扣成了负数。stock
”,某些同步逻辑把这 24 件错误地记录在 lock_stock
里,从而出现负数。在大部分电商主流做法中,很少会直接把 lock_stock
设为负数,因为从名称和常识上看,“锁定”本身就不应该是负的;但在有些系统里,他们的 stock
、lock_stock
字段不完全按“可售库存 + 锁定库存”的思路来用,而是作为差异值或“校正值”。这就导致你看到的 lock_stock = -24
。
假设在某些项目里,他们定义了如下计算公式:
可用库存 = stock + lock_stock
stock
可能指“理论库存”或“原始库存”,lock_stock
则是一个“校正量”(正数表示还可以用多少,负数表示超卖或需要补多少)。那么,如果 stock=86
,lock_stock=-24
,意味着:
可用库存 = 86 + (-24) = 62
也就是系统当前真正可卖的只有 62 件。
把 -24
理解为:“这 24 个是已经超卖了,需要补回”。或是“已经被订单占用,超出了某个基准值”。
stock=86
, lock_stock=0
, 可卖 = 86。lock_stock
。lock_stock
= “可用库存 - 原始库存” = 36 - 86 = -50(举例)。
lock_stock
是 -50 的情况。lock_stock
也就变成 -24,表示还在被占用或者超卖的量是 24。总之,这种“带负数”的用法是把 lock_stock 当作修正量而非简单的“锁住的数量”。
如果你想要实现**正常的“锁库 + 释放 + 扣减”**逻辑,通常会这样做(不出现负数):
初始:
stock=86
, lock_stock=0
,可售=86用户下单(比如 5 件):
stock
是否>= 5lock_stock += 5
( lock_stock = 5 )stock -= 5
( stock = 81 )lock_stock
,不改 stock
,看具体业务定义)订单支付成功:
stock
改到 81,那么就只需要 lock_stock -= 5
= 0。stock
,而是只给 lock_stock=5
,那此刻就要真正 stock -= 5
= 81,并 lock_stock
回到 0。订单取消:
stock
。stock=86 → 81
,那就此刻 stock=81+5=86
,lock_stock=0
。lock_stock=5
, 没动 stock
,那现在只需要 lock_stock=0
并保持 stock=86
。通过以上步骤,就可以很清晰地做到不出现锁定库存为负数。
“常规”做法:
lock_stock
表示锁住的库存数,通常应 >= 0。你表中 lock_stock=-24
的可能原因:
lock_stock
当“差异量”或“超卖校正量”来使用,从而出现负数。如何修正或理解现状:
stock
、lock_stock
、以及“可用库存=?” 的算法。lock_stock
只用于“锁定的量”并确保其非负,把库存超卖、差异同步等逻辑放在别的字段或别的机制里处理。总之,从你的示例可以推测,要么是“表中字段混用了其他含义”,要么是“系统曾经出现过异常或人工数据修改”。如果你们想把库存逻辑做得更“干净可控”,就最好遵循“锁定库存 = 正数”并配合清晰的加减流程,这样在查问题或扩展功能时更容易追踪。