@qq286531097
2018-01-04T07:21:45.000000Z
字数 2884
阅读 256
b2b2c
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 | 收货人电话 |
输入
Array
(
[lottery_id] => 3
[lottery_joint_limit] => 93
[last_modified_time] => 1499138818
)
获取对应的规则数据(syspromotion_lottery)
$lotteryInfo = app::get('topc')->rpcCall('promotion.lottery.get',$params);
接口输出
Array
(
[lottery_id] => 3
[lottery_name] => 配送活动测试
[lottery_desc] => 配送活动测试
[status] => active
[lottery_type] => 0
[used_platform] => 1
[lottery_joint_limit] => 100
[lottery_point_num] => 1
[lottery_rules] => Array
(
[0] => Array
(
[bonus_type] => none
[bonus_desc] => 感谢您的参与
[rate] => 10
[color] => #cccccc
)
[1] => Array
(
[bonus_type] => custom
[bonus_desc] => 小红书包
[img] => /images/b1/2f/29/e1211.png
[is_delivery] => on
[rate] => 90
[color] => #ff0000
)
)
[created_time] => 1499138818
[modified_time] => 1499138818
)
获得对应的使用次数(redis进行记录)
$jointNum = redis::scene('syspromotion')->get('lottery_joint_limit_'.$user_id.'-'.$data['lottery_id']);
对其中的规则进行重组
foreach ($lotteryInfo['lottery_rules'] as $key => $value) {
$arr[$key] = $value['rate'];
}
拼凑后的结果为
Array
(
[0] => 10
[1] => 90
)
获得的KEY值为规则ID,value值为对应的概率
核心算法获得对应的规则
调用
$prizeNum = $this->getRand($arr);
核心调用算法
//获取奖项id算法
public function getRand($proArr){
$result = "";
$proSum = array_sum($proArr);
foreach ($proArr as $key => $proCur) {
$randNum = mt_rand(1, $proSum);
if ($randNum <= $proCur) {
$result = $key;
break;
} else {
$proSum -= $proCur;
}
}
unset ($proArr);
return $result;
}
拿到对应的ID后,进行数据拼凑
拼凑后的结果为
Array
(
[user_id] => 76
[lottery_id] => 3
[bonus_type] => custom
[prizeInfo] => Array
(
[bonus_type] => custom
[bonus_desc] => 小红书包
[img] => /images/b1/2f/29/e1211d10f251ed8e39a69d6a5f060e08bebac7ea.png
[is_delivery] => on
[rate] => 90
[color] => #ff0000
[lottery_id] => 3
)
[lottery_name] => 配送活动测试
)
调用对应的接口(发放奖励)(promotion.bonus.issue)
输入为上部拼凑的结果
prizeInfo字段(下属数据进行对应的序列化操作[serialize])
其他的字段做对应的拼凑使用
Array
(
[bonus_type] => custom
[bonus_desc] => 小红书包
[is_delivery] => on
[img] => /images/b1/2f/29/e1211d10f251ed8e39a69d6a5f060e08bebac7ea.png
)
实际是对syspromotion_lottery_result进行数据储存使用
最终302跳转页面,以及对应的数据返回
Array
(
[bonus_type] => custom
[bonus_desc] => 小红书包
[img] => /images/b1/2f/29/e1211d10f251ed8e39a69d6a5f060e08bebac7ea.png
[is_delivery] => on
[rate] => 90
[color] => #ff0000
[lottery_joint_limit] => 87
[id] => 1
[hongbaomoney] => 1
)
http返回前端数据格式
{ "success" : TRUE,
"message" :{ "bonus_type" : "custom",
"bonus_desc" : "\u5c0f\u7ea2\u4e66\u5305",
"img" : "\/images\/b1\/2f\/29\/e1211d10f251ed8e39a69d6a5f060e08bebac7ea.png",
"is_delivery" : "on",
"rate" : "90",
"color" : "#ff0000",
"lottery_joint_limit" : 86,
"id" : 1,
"hongbaomoney" : TRUE }, "redirect" : "http:\/\/c.com\/jifen\/public\/index.php\/lottery.html?lottery_id=3" }