促销总体架构
- 促销的计算分为两大类:
店铺级别促销
和平台级别促销
- 店铺级别促销(上图蓝色区域),需要循环每个店铺的购物车来分别计算
- 平台级别(上图紫色区域)则需要合计店铺的促销活动计算完成后的结果再计算
- 上述计算后的结果由
PromotionResult
封装返回,最后分别由以下三个消费者将促销结
果应用到购物车
中: SkuPromotionApplyConsumer
:SKU级别的优惠,对sku价格进行优惠SkuPromotionApplyConsumer
:店铺级别的优惠,对店铺购物车价格进行优惠PlatformPromotionApplyConsumer
:平台级别的优惠,对整个购物车价格进行优惠
店铺级别的促销计算
- 在计算店铺活动之前需要取出所有的店铺活动,这些活动本身已经携带了可用的商品信息(
Promotion对象
),促销活动的读取细节请参见促销活动的读取 - 然后循环调用所有的
PromotionHandler
进行促销的计算(责任链模式),计算结果由PromotionResult
集合返回表示 PromotionHandler
是一个接口,具体的促销活动的计算需要实现这个接口,目前Javashop内置的促销活动有如下:
促销计算的一般逻辑
促销的计算一般来说是先对购物车中的sku进行过滤,过滤出在促销范围内的的sku,然后再根据具体活动促销规则进行计算,最终以PromotionResult
的形式返回
促销活动的读取
活动读取重点
- 促销活动的读取的关键在于
可用性
和适用商品
可用性
是指要读取当前有效的活动适用的商品
是此适用此活动的商品范围,分为全部
和部分
两种- 是否为全部商品标识在具体的活动表中,部分商品的范围存储在
活动商品表(es_promtion_goods)中
读取逻辑
- 要读取店铺的所有可用活动,首先由缓存加载,如果未命中则需要由数据库加载(图中紫色区域部分)
- 数据库数据的读取需要由各个
促销活动业务类
读取自己的数据,最后拼合为整体的促销活动集合,表现为封装的Promotion
- 由数据库读取之后压入缓存,以便下次使用
促销实体
缓存中的Promotion
对象根据不同的促销活动会存入下图中的子类:
活动缓存的写入
活动变更时需要将活动数据(包括活动的商品)更新到缓存,如上图所示,这个逻辑是由具体的活动业务类负责的