[关闭]
@qq286531097 2018-01-04T07:21:45.000000Z 字数 2884 阅读 256

大转盘实现逻辑

b2b2c


界面

后台界面实现展示

image_1bk5ojgtb7esdf51hks1gf31be99.png-54.8kB

前台界面实现展示

image_1bk5opb1nfdslpferfq73ar8m.png-128.1kB

表结构

syspromotion_lottery(转盘抽奖规则表)

field 描述
lottery_id 活动ID
lottery_name 活动名称
lottery_desc 活动描述
status 是否启用('stop'/'active')
lottery_type 0(全部)/1(初始可抽奖)/2(积分兑换)
used_platform 使用平台(0-全场/1-pc/2-wap)
lottery_joint_limit 初始可抽奖次数
lottery_point_num 兑换抽奖所需积分
lottery_rules 奖项设置规则

syspromotion_lottery_result(转盘抽奖结果列表)

field 描述
result_id 获奖ID
lottery_id 转盘ID(关联字段)
user_id 会员ID
loginName 登录名
lottery_name 转盘名称(通过主表获得)
bonus_type 奖项设置('custom'自定义/'hongbao'红包/'point'积分)
bonus_desc 奖项描述
prizeInfo 奖品信息
receiver_name 收货人姓名
receiver_area 收货人地区
addr 收货人详细地址
receiver_zip 收货人邮编
receiver_phone 收货人电话

实现

核心代码实现

输入

  1. Array
  2. (
  3. [lottery_id] => 3
  4. [lottery_joint_limit] => 93
  5. [last_modified_time] => 1499138818
  6. )

获取对应的规则数据(syspromotion_lottery)

  1. $lotteryInfo = app::get('topc')->rpcCall('promotion.lottery.get',$params);

接口输出

  1. Array
  2. (
  3. [lottery_id] => 3
  4. [lottery_name] => 配送活动测试
  5. [lottery_desc] => 配送活动测试
  6. [status] => active
  7. [lottery_type] => 0
  8. [used_platform] => 1
  9. [lottery_joint_limit] => 100
  10. [lottery_point_num] => 1
  11. [lottery_rules] => Array
  12. (
  13. [0] => Array
  14. (
  15. [bonus_type] => none
  16. [bonus_desc] => 感谢您的参与
  17. [rate] => 10
  18. [color] => #cccccc
  19. )
  20. [1] => Array
  21. (
  22. [bonus_type] => custom
  23. [bonus_desc] => 小红书包
  24. [img] => /images/b1/2f/29/e1211.png
  25. [is_delivery] => on
  26. [rate] => 90
  27. [color] => #ff0000
  28. )
  29. )
  30. [created_time] => 1499138818
  31. [modified_time] => 1499138818
  32. )

获得对应的使用次数(redis进行记录)

  1. $jointNum = redis::scene('syspromotion')->get('lottery_joint_limit_'.$user_id.'-'.$data['lottery_id']);

对其中的规则进行重组

  1. foreach ($lotteryInfo['lottery_rules'] as $key => $value) {
  2. $arr[$key] = $value['rate'];
  3. }

拼凑后的结果为

  1. Array
  2. (
  3. [0] => 10
  4. [1] => 90
  5. )
  6. 获得的KEY值为规则IDvalue值为对应的概率

核心算法获得对应的规则
调用

  1. $prizeNum = $this->getRand($arr);

核心调用算法

  1. //获取奖项id算法
  2. public function getRand($proArr){
  3. $result = "";
  4. $proSum = array_sum($proArr);
  5. foreach ($proArr as $key => $proCur) {
  6. $randNum = mt_rand(1, $proSum);
  7. if ($randNum <= $proCur) {
  8. $result = $key;
  9. break;
  10. } else {
  11. $proSum -= $proCur;
  12. }
  13. }
  14. unset ($proArr);
  15. return $result;
  16. }

拿到对应的ID后,进行数据拼凑
拼凑后的结果为

  1. Array
  2. (
  3. [user_id] => 76
  4. [lottery_id] => 3
  5. [bonus_type] => custom
  6. [prizeInfo] => Array
  7. (
  8. [bonus_type] => custom
  9. [bonus_desc] => 小红书包
  10. [img] => /images/b1/2f/29/e1211d10f251ed8e39a69d6a5f060e08bebac7ea.png
  11. [is_delivery] => on
  12. [rate] => 90
  13. [color] => #ff0000
  14. [lottery_id] => 3
  15. )
  16. [lottery_name] => 配送活动测试
  17. )

调用对应的接口(发放奖励)(promotion.bonus.issue)
输入为上部拼凑的结果

  1. prizeInfo字段(下属数据进行对应的序列化操作[serialize])
  2. 其他的字段做对应的拼凑使用
  3. Array
  4. (
  5. [bonus_type] => custom
  6. [bonus_desc] => 小红书包
  7. [is_delivery] => on
  8. [img] => /images/b1/2f/29/e1211d10f251ed8e39a69d6a5f060e08bebac7ea.png
  9. )
  10. 实际是对syspromotion_lottery_result进行数据储存使用

最终302跳转页面,以及对应的数据返回

  1. Array
  2. (
  3. [bonus_type] => custom
  4. [bonus_desc] => 小红书包
  5. [img] => /images/b1/2f/29/e1211d10f251ed8e39a69d6a5f060e08bebac7ea.png
  6. [is_delivery] => on
  7. [rate] => 90
  8. [color] => #ff0000
  9. [lottery_joint_limit] => 87
  10. [id] => 1
  11. [hongbaomoney] => 1
  12. )

http返回前端数据格式

  1. { "success" : TRUE,
  2. "message" :{ "bonus_type" : "custom",
  3. "bonus_desc" : "\u5c0f\u7ea2\u4e66\u5305",
  4. "img" : "\/images\/b1\/2f\/29\/e1211d10f251ed8e39a69d6a5f060e08bebac7ea.png",
  5. "is_delivery" : "on",
  6. "rate" : "90",
  7. "color" : "#ff0000",
  8. "lottery_joint_limit" : 86,
  9. "id" : 1,
  10. "hongbaomoney" : TRUE }, "redirect" : "http:\/\/c.com\/jifen\/public\/index.php\/lottery.html?lottery_id=3" }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注