①单张优惠券算法
单张优惠券的优惠金额计算流程如下:
- 1)判断优惠券限定范围,找出范围内的课程
- 2)计算课程总价
- 3)判断券是否可用
- 4)计算优惠金额
假设有商品信息如下:
序号 | 价格 | 分类 |
---|---|---|
1 | 100 | a |
2 | 100 | b |
3 | 100 | b |
有优惠券信息如下:
序号 | 满 | 减 | 分类 |
---|---|---|---|
1 | 200 | 100 | b |
我们按照上述算法来判断:
- 1)判断限定范围:这张券限定分类 b,对应的商品序号是2、3
- 2)计算课程总价:商品序号2、3的总价为200
- 3)判断是否可用:总价刚好达到优惠券满减门槛200,可以使用
- 4)计算优惠:满200减100,因此最终优惠金额就是100元
- 5)计算优惠明细:因为-100在商品序号2/3上,各占50%,因此优惠金额均摊,各为50,如下
序号 | 价格 | 分类 | 优惠金额 |
---|---|---|---|
1 | 100 | a | 0 |
2 | 100 | b | 50 |
3 | 100 | b | 50 |
这里如果序号2/3的价格不是2的倍数,应该怎么整呢?一般的实现方案是:为了避免出现精度损失导致的金额不一致,最后一个商品的优惠明细等于优惠总金额减去其它商品的优惠明细之和
②叠加优惠券算法
券叠加就是按照券组合的顺序,依次计算每张券的优惠金额,最终优惠金额就是所有权的优惠累加。
需要注意的是:由于一张券计算完优惠后,商品的金额会发生变化,因此下一张券的计算金额会随之改变,因此券叠加的顺序非常重要。
而且为了方便计算后续券的优惠金额,我们必须知道商品金额具体的变化,也就是弄清楚每一张优惠券使用后,每个商品的具体优惠金额,我们称之为优惠明细,我们可以用一个表格来记录:
序号 | 优惠明细 |
---|---|
1 | * |
2 | * |
3 | * |
因此,券叠加算法比单券算法需要多一步:
- 1)判断优惠券限定范围,找出范围内的课程
- 2)计算课程总价
- 3)判断券是否可用
- 4)计算优惠金额
- 5)计算优惠明细
假设有商品信息如下:
序号 | 价格 | 分类 |
---|---|---|
1 | 100 | a |
2 | 100 | b |
3 | 100 | b |
有优惠券信息如下:
序号 | 满 | 减 | 分类 |
---|---|---|---|
1 | 100(每) | 20 | a,b |
2 | 200 | 100 | b |
3 | 80 | 20 | a |
我们按照上述算法来一条条判断:
- 1)判断限定范围:券1可用于所有分类,因此商品序号1、2、3都可以用
- 2)计算课程总价:所有商品累加共300元
- 3)判断是否可用:券1门槛是100,符合要求
- 4)计算优惠:每满100减20,因此总共折扣就是60元
- 5)计算优惠明细
正常情况下,按照商品价格在商品总价中的比例,乘以优惠总金额
最后一个商品,为了避免出现精度损失导致的金额不一致,最后一个商品的优惠明细等于优惠总金额减去其它商品的优惠明细之和
例如,商品1、2的折扣:(100 / 300) 60 = 20 ,商品3的折扣等于:*60 - 20 - 20 = 20,因此
券1信息如下:
券2的计算步骤如下:
- 1)判断范围:券2可用于分类b,因此商品序号2、3都可以用
- 2)计算总价:商品2已经优惠了20,现在价格是80,商品3已经优惠了20,现在价格是80。因此商品总价是160
- 3)判断是否可用:券2门槛是200,不符合要求,跳过
券2信息如下:
券3的计算步骤如下:
- 1)判断范围:券3可用于分类a,因此商品序号1可以用
- 2)计算总价:商品1原价100元,已经优惠20,现价80元
- 3)判断是否可用:券3门槛是80,符合要求
- 4)计算优惠金额:满80减20,因此总共折扣就是20元
- 5)计算优惠明细:由于只有商品1可用,商品1优惠明细就是20元
券3信息如下: