跳到主要内容

促销总体架构

promotion-calculate

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

店铺级别的促销计算

shop-promotion

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

PromotionHandler

促销计算的一般逻辑

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

PromotionCalculator

促销活动的读取

promtion-goods-get

活动读取重点

  • 促销活动的读取的关键在于可用性适用商品
  • 可用性是指要读取当前有效的活动
  • 适用的商品是此适用此活动的商品范围,分为全部部分两种
  • 是否为全部商品标识在具体的活动表中,部分商品的范围存储在活动商品表(es_promtion_goods)中

读取逻辑

  • 要读取店铺的所有可用活动,首先由缓存加载,如果未命中则需要由数据库加载(图中紫色区域部分)
  • 数据库数据的读取需要由各个促销活动业务类读取自己的数据,最后拼合为整体的促销活动集合,表现为封装的Promotion
  • 由数据库读取之后压入缓存,以便下次使用

促销实体

缓存中的Promotion对象根据不同的促销活动会存入下图中的子类:

image-20240103111148312

活动缓存的写入

活动写入缓存

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

促销-数据库结构