促销中心购物车结算

加入购物车逻辑:

1.传入CartDto,传入以后生成购物车id,购物id逻辑为:公司_渠道_店铺编码_会员账号.
促销中心购物车结算_第1张图片
购物车id,如下:公司_渠道店铺编码_会员账号
促销中心购物车结算_第2张图片
2.购物车为空–>>新增购物车–>新增商品到购物车商品明细list,购物车不为空,更新购物车(更新商品数量)。然后重新插入mongoDB中,插入mongodb的对象结构如下,主要是购物车id,会员账号,公司,渠道,购物车明细。
促销中心购物车结算_第3张图片

购物车分组:

购物车api传入商品明细list给促销侧,促销侧根据传入的参数主要做如下几件事情。
1.初始化商品相关的数据,并将其放入缓存中,比如设置商品的价格等
促销中心购物车结算_第4张图片
2.设置会员等级,会员品牌
3.获取店铺下有效活动.
1.判断是否参与活动。
在这里插入图片描述
2.存在临时校验的活动,按照校验活动的开始时间进行校验。
促销中心购物车结算_第5张图片
3.获取店铺下的活动并按优先级排序,每个活动在创建的时候都会有一个优先级序号。先从本地缓存中获取,本地缓存中有就返回,本地缓存中没有就查redis,redis中有就返回,没有就查DB,如果数据库有数据则保存到缓存中,如果没有则将该店铺的活动设为空值,过期时间设置为1天.
促销中心购物车结算_第6张图片
4.从ThreadLocal中获取当前购物车商品的品牌列表,方便后面的促销活动按品牌过滤。
促销中心购物车结算_第7张图片
5.然后就是过滤活动,比如我查询出当前店铺下正在进行的活动有20个,但实际满足要求的活动可能就2,3个。所以要做活动过滤。
1.按品牌过滤,购物车商品的品牌要在促销活动的品牌范围里面。

2.会员范围过滤,当前用户必须在促销活动会员范围中。

3.生日购过滤,比如会员当天生日可参加活动,或者生日前后多少天可以参加活动,与活动的生效时间段做比较。

促销中心购物车结算_第8张图片
4.会员限购次数过滤。

6.过滤完后,得到删选后的活动集合。然后开始活动-商品,商品-活动的分组。
促销中心购物车结算_第9张图片
7.循环删选过后的活动list,这个list是按优先级排好的,假如活动list中有A,B,C三个活动,购物车的商品有good1(A,B),good2(B),goods3©,goods4©,goods5商品,如果good1商品同时属于A,B两个活动,但由于A活动优先级比B高,所以good1会放在A活动的商品集合,但同时会维护一个商品good1对应A,B活动的关系。所以最终会返回给前台,活动与商品的关系:A-good1 ,B-goods2,C-goods3,goods4.而goods5会单独创建一个空活动给它,并将goods5设置进去。商品与活动的关系:good1-A,B,good2-B,goos3-C,goods4-C.

购物车结算:

方法路径:com.purcotton.omni.promotion.api.PromotionOrderRestApi#carComputed
主要是返回下面这些内容给前台。
促销中心购物车结算_第10张图片
总金额:购物车所有商品的牌价之和。

总优惠:促销活动优惠之和。

促销活动对应的凑单信息:这个要执行促销活动规则后才能得到,比如阶梯满减(订单),满100减20,满200减50,当前订单金额为110,满足满100减20,不满足满200减50得门槛条件,但在购物车展示的时候,这个满减活动的tip会显示:“已优惠20元,还差90元可参加满200减50的优惠。"

是否包邮:在创建活动的时候可以设置是否包邮,购物车中如果有一个活动包邮,那整个购物车里面的商品都包邮。
促销中心购物车结算_第11张图片
赠品列表:比如像线上满赠这种。赠品查出来返回给前端。

分摊逻辑:
按数量分摊(默认):商品按价格做升序.总优惠/总数量=每个商品分摊的价格。商品价格小于分摊价格,取商品价格。最后没有摊尽的,直接摊到金额最大的商品上。

按金额占比分摊公式:商品按价格做升序.当前货品行金额*剩余金额/剩余总金额。商品价格小于分摊价格,取商品价格。最后没有摊尽的,直接摊到金额最大的商品上。
促销中心购物车结算_第12张图片

点击”立即结算”按钮逻辑:

代码路径:com.pureh2b.omni.api.OrderApi#settlementOrder

  1. 初始化:初始化商品明细价格,设置会员等级,会员品牌

  2. 调用计算逻辑:查出当前店铺下的所有在运行的活动,然后根据商品,会员,店铺,活动时间等条件过滤活动,得到过滤后的活动结果集,循环每个促销活动,算出活动优惠,然后将优惠分摊到商品明细中,同时在订单主对象中设置促销活动优惠。其中还一种情况,比如购物车中有3个商品A,B,C参加了满100减20的满减活动,这三个商品先按价格排降序,假设排好的顺序就是A,B,C,这个时候A+B的价格之后已经达到了100块钱的门槛,那C商品将分出去参加其他活动,比如商品C这个时候它达到了其他活动(E活动)的门槛,那E活动也按价格排降序,然后执行相同的逻辑,达到金额门槛条件后的商品分出去,参加其他活动.

  3. 设置通用规则.
    促销中心购物车结算_第13张图片

  4. 会员折扣计算:根据会员编码获取会员(或付费会员)信息,订单明细根据会员信息中的折扣算出会员折扣优惠,并设置到对应的每条订单明细中去,以及设置总订单中所有商品的折扣优惠之和。

  5. 优惠券计算:如果前台有传优惠券编码,那通过会员服务获取优惠规则,如果前台没有传优惠券编码,则根据会员编码查出所有可用的优惠券(门店过滤).,并通过店铺,时间等条件过滤得到优惠券 集合,剔除运费劵。

  6. 计算优惠券金额:优惠券金额分摊到每个订单商品明细中,公式为:订单商品金额*优惠券金额/优惠券下所有商品的总金额.设置订单商品明细分摊优惠券优惠,设置总订单优惠券优惠。举个例子:如果购物车的商品A同时满足满减劵和折扣券,但根据我们如果下图所定义的优惠券排序,那我们是先算折扣券的,而且一个商品,只能用一张劵。
    促销中心购物车结算_第14张图片

  7. 计算订单每个商品明细的税费,总订单设置总税费。 !!!!!!兑换卷 订单只能用一张

  8. 设置订单总金额(吊牌价累加),设置订单促销活动优惠,设置订单销售价总金额,设置订单总优惠,设置订单应付金额(订单总金额-总优惠),设置订单用户积分.

  9. 运费劵计算:如果购物车中有一个活动是包邮的,那整单包邮。订单没有包邮的才要用运费劵,首先判断是否到达了包邮门槛条件,找出订单中可用运费券的商品,设置运费劵优惠,设置订单总优惠(总优惠+运费劵优惠).举个例子:比如当前订单没有包邮标识,那我们查询运费模板,得到运费,假如运费是10块,然后运费劵可抵6元,那我们自己还要出4块钱的运费。

  10. 把最终的订单商品明细和总订单信息返回给前台展示。

你可能感兴趣的:(业务)