促销总体架构

- 促销的计算分为两大类:
店铺级别促销和平台级别促销 - 店铺级别促销(上图蓝色区域),需要循环每个店铺的购物车来分别计算
- 平台级别(上图紫色区域)则需要合计店铺的促销活动计算完成后的结果再计算
- 上述计算后的结果由
PromotionResult封装返回,最后分别由以下三个消费者将促销结果应用到购物车中: SkuPromotionApplyConsumer:SKU级别的优惠,对sku价格进行优惠SkuPromotionApplyConsumer:店铺级别的优惠,对店铺购物车价格进行优惠PlatformPromotionApplyConsumer:平台级别的优惠,对整个购物车价格进行优惠
店铺级别的促销计算

- 在计算店铺活动之前需要取出所有的店铺活动,这些活动本身已经携带了可用的商品信息(
Promotion对象),促销活动的读取细节请参见促销活动的读取 - 然后循环调用所有的
PromotionHandler进行促销的计算(责任链模式),计算结果由PromotionResult集合返回表示 PromotionHandler是一个接口,具体的促销活动的计算需要实现这个接口,目前Javashop内置的促销活动有如下:

促销计算的一般逻辑
促销的计算一般来说是先对购物车中的sku进行过滤,过滤出在促销范围内的的sku,然后再根据具体活动促销规则进行计算,最终以PromotionResult的形式返回

促销活动的读取

活动读取重点
- 促销活动的读取的关键在于
可用性和适用商品 可用性是指要读取当前有效的活动适用的商品是此适用此活动的商品范围,分为全部和部分两种- 是否为全部商品标识在具体的活动表中,部分商品的范围存储在
活动商品表(es_promtion_goods)中
读取逻辑
- 要读取店铺的所有可用活动,首先由缓存加载,如果未命中则需要由数据库加载(图中紫色区域部分)
- 数据库数据的读取需要由各个
促销活动业务类读取自己的数据,最后拼合为整体的促销活动集合,表现为封装的Promotion - 由数据库读取之后压入缓存,以便下次使用
促销实体
缓存中的Promotion对象根据不同的促销活动会存入下图中的子类:

活动缓存的写入

活动变更时需要将活动数据(包括活动的商品)更新到缓存,如上图所示,这个逻辑是由具体的活动业务类负责的
