什么是鼓励金?我想大家应该都有用过,例如今早我买包子时,就抵扣了部分金额。 用支付宝或者微信支付,支付成功后会返还一小笔钱,从周日到周四累计5天,然后在周五和周六抵现金使用, 这笔钱就是鼓励金(当然支付宝称作奖励金)。 我们现在几乎每天都在使用支付宝或者微信,每天都会接触鼓励金,但是你知道鼓励金发放的一般逻辑嘛, 或者说如果让你来做一个类似鼓励金一样的产品,你会怎样来实现发放逻辑呢。
1 问题描述
问题描述,洋气一点,可以称作产品需求,需求如下:
- 根据订单金额分阶段发放,金额越高,得到的鼓励金要相应升高
- 每个金额阶段中再分层,每个层次指定发放金额的最小值和最大值,并指定百分比
- 商家可以根据上述两条规则自定义自己的发放逻辑
- 商家可分时段自定义发放倍率(放大或者缩小发送的金额)
- 平台可自定义全平台的发放倍率
2 解决思路与数据结构设计
数据结构如下:
1 | type Ecrg_fee_dura struct { |
给出数据结构和规则列表示例,应该就明白一半了,另一半的说明如下:
Ecrg_fee_arr
数组金额是从高到底,这里使用有序的列表来表示区间,第一项代表区间99.99到无限大,第二项代表49.99到99.99…Ecrg_fee_item
定义了中奖规则,由一个整数Num
和一个区间Dura
组成,Dura
代表发放金额的上限和下限,Num
就要放到数组中来理解, 同样这里也使用了有序数组来表示区间,只不过这里使用的是递增数组。Item_arr
的第一项表示1-700,代表的含义是随机1-1000,命中1-700的概率,也就是说这里使用此项定义出70%的概率区间; 第二项表示701-900,代表的含义是随机1-1000,命中701-900的概率,也就是说这里使用此项定义出20%的概率区间…- 数据结构和以上的解析基本映射出相应的算法执行步骤:
- 比对金额,定位金额区间
- 生成随机数,定位发放规则
- 生成随机数,生成鼓励金
3 编码实现
1 | // 四舍五入 |
Render by hexo-renderer-org with Emacs 25.3.2 (Org mode 8.2.10)