促销架构文档
1 需求说明
2 架构思路
2.1 数据存储
2.1.1 数据库设计
核心表:
1) es_promotion_goods(有效活动商品对照表)
设计思路:
此表中存储每一个活动与一个或多个商品的对照关系,活动的开始时间和结束时间是为了方便查询一个商品参与了哪些活动。活动id和活动类型之间是有关系的,当添加一个A团购活动时(可以是任意商城中的任意活动,此处仅是举例),此《活动商品对照表》的活动id为A团购活动的id,并且活动类型为PromotionTypeEnum枚举中团购活动代表的数值。
2)es_promotion_tool(促销工具表)
设计思路:
- 此表存储的是所有的促销工具。
- 权重字段:代表这个活动处理价格时的优先级,和是否可重叠字段相辅相成。1为最高,2次之,以此类推,此字段可以重复,例:同一时间内,A活动权重为1,B活动权重也为1,X商品只能参与其中一个,另一个则不能参加。
- 是否可重叠字段:代表这个活动是否可以与其他活动重叠使用。
- 为PromotionTypeEnum枚举中活动代表的数值。
3)各个活动表设计
1、积分换购表
2、团购活动表
3、第二件半价
4、单品立减
5、满优惠活动
2.1.2 cache存储设计
缓存key的存储说明:由店铺id + 活动代表的 beanid + 活动id组成,例:store_{store_id}_{groupbuyPlugin}_{activity_id},其中{}内的值需要替换包含{}。其中的groupbuyPlugin从PromotionTypeEnum枚举中读取。
缓存的value值存储说明:存储对应活动的Vo。
2.2 促销核心算法架构
核心图
思路说明:
从调用价格计算接口开始:
1、遍历购物车数据(List<Cart>)
2、进入不可重叠活动价格计算(传入cart)
读取不可重叠的活动集合
遍历cart中的商品列表
遍历不可重叠的活动集合
通过活动的活动类型字段,读取PromotionTypeEnum 中对应的活动pluginID
通过SpringContextHolder.getBean(pluginID)进入对应的插件价格处理类中。
i. 从redis缓存中读取对应的活动信息
ii. 处理商品价格,并保存回去
3、进入可重叠的活动价格计算(传入cart)
- 读取可重叠的活动集合
- 遍历cart中的商品列表
- 遍历可重叠的活动集合
- 以下步骤同上
4、计算交易价格,并存储到redis中。
2.3活动的维护
2.3.1团购活动(以团购活动举例)
添加团购活动流程图
设计思路:
1、调用团购活动的添加接口。
2、进入service层。
3、先要调用活动管理表,去检测将要添加的活动商品,是否可以与其他活动重叠使用。
a\) 若不能,则直接返回给客户,不能添加此商品。
b\) 若可以,则继续向下。
4、添加促销活动基础表(es_activity)。
5、添加团购活动表(es_groupbuy)。
6、添加活动商品对照表(es_promotion_goods)。
7、填充团购活动Vo。
8、获取团购的缓存key(PromotionServiceConstant)。
9、把团购活动Vo,写入reids中。
2.4 活动的读取
2.4.1 读取单一商品参与的活动
根据goods_id 读取 es_promotion_goods表。查出这个商品参与的活动id和活动名称。
2.4.2 读取单一活动的详细信息
根据2.1.2的key读取redis存储的数据中对应活动详细信息。
2.5 失效活动商品转移
es_promotion_goods_backend(失效活动商品对照表,与es_promotion_goods表结构相同)
设计此表的目的:在定时任务中调用,当es_promotion_goods中的活动已经失效后,将es_promotion_goods数据转移到es_promotion_goods_backend中,并把es_promotion_goods失效的数据删除。
2.6 包结构说明
促销包结构:com.enation.app.shop.promotion
促销工具包结构:com.enation.app.shop.promotion.tool
团购促销工具包结构:com.enation.app.shop.promotion.groupbuy
单品立减促销工具包结构:com.enation.app.shop.promotion.minus
第二件半价促销工具包结构:com.enation.app.shop.promotion.halfprice
积分换购促销工具包结构:com.enation.app.shop.promotion.exchange
满优惠促销工具包结构:com.enation.app.shop.promotion.fulldiscount
groupbuy | |
---|---|
model | 模型 |
enum | 存放枚举 |
po | po模型 |
vo | 促销所需相应模型 |
controller | 控制器 |
front | 前台api |
backend | 后台api |
service | 业务类接口 |
impl | 业务类实现 |
tag | 标签 |
support | 存放常量类 |