盲盒转盘bug修改
This commit is contained in:
@@ -534,70 +534,87 @@ class BlindBoxTurntableGift extends Model
|
|||||||
/*
|
/*
|
||||||
* 预计算单次抽奖结果
|
* 预计算单次抽奖结果
|
||||||
*/
|
*/
|
||||||
private function precompute_single_draw($gift_bag_id,$room_id,$available_gifts,$last_periods_remaining=[]) {
|
private function precompute_single_draw($gift_bag_id, $room_id, $available_gifts, $last_periods_remaining = []) {
|
||||||
// 生成缓存键
|
// 生成缓存键
|
||||||
$available_cache_key = 'blindbox_available_gifts_' . $gift_bag_id . '_' . $room_id;
|
$available_cache_key = 'blindbox_available_gifts_' . $gift_bag_id . '_' . $room_id;
|
||||||
$last_remaining_cache_key = 'blindbox_last_remaining_' . $gift_bag_id . '_' . $room_id;
|
$last_remaining_cache_key = 'blindbox_last_remaining_' . $gift_bag_id . '_' . $room_id;
|
||||||
|
|
||||||
|
// 保证有可用礼物
|
||||||
if (empty($available_gifts)) {
|
if (empty($available_gifts)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$last_remaining_all = array_sum(array_column($last_periods_remaining, 'remaining_number'));
|
$last_remaining_all = array_sum(array_column($last_periods_remaining, 'remaining_number'));
|
||||||
if($last_remaining_all == 0){
|
if ($last_remaining_all == 0) {
|
||||||
$last_periods_remaining = [];
|
$last_periods_remaining = [];
|
||||||
cache($last_remaining_cache_key, null);
|
cache($last_remaining_cache_key, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
$last_periods_remaining_flag = 0;
|
$last_periods_remaining_flag = 0;
|
||||||
if(!empty($last_periods_remaining)){
|
if (!empty($last_periods_remaining)) {
|
||||||
$available_gifts = $last_periods_remaining;
|
$available_gifts = $last_periods_remaining;
|
||||||
//操作上期奖池标识
|
|
||||||
$last_periods_remaining_flag = 1;
|
$last_periods_remaining_flag = 1;
|
||||||
}
|
}
|
||||||
// 实现加权随机算法:剩余数量越多,被抽中的概率越大
|
|
||||||
$remaining = 0;
|
|
||||||
foreach ($available_gifts as $gift) {
|
|
||||||
$remaining += $gift['remaining_number'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$rand_value = mt_rand(1, $remaining);
|
// 循环尝试直到抽中有效礼物
|
||||||
$current_sum = 0;
|
$max_attempts = 5; // 最大尝试次数,防止无限循环
|
||||||
|
$attempt = 0;
|
||||||
$selected_gift = null;
|
$selected_gift = null;
|
||||||
|
|
||||||
foreach ($available_gifts as $gift) {
|
while ($attempt < $max_attempts && !$selected_gift) {
|
||||||
if($gift['remaining_number'] <= 0){
|
// 实现加权随机算法:剩余数量越多,被抽中的概率越大
|
||||||
continue;
|
$remaining = 0;
|
||||||
|
foreach ($available_gifts as $gift) {
|
||||||
|
$remaining += $gift['remaining_number'];
|
||||||
}
|
}
|
||||||
$current_sum += $gift['remaining_number'];
|
|
||||||
if ($rand_value <= $current_sum) {
|
if ($remaining <= 0) {
|
||||||
$selected_gift = $gift;
|
break; // 如果没有剩余数量,跳出循环
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$rand_value = mt_rand(1, $remaining);
|
||||||
|
$current_sum = 0;
|
||||||
|
|
||||||
|
foreach ($available_gifts as $gift) {
|
||||||
|
if ($gift['remaining_number'] <= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$current_sum += $gift['remaining_number'];
|
||||||
|
if ($rand_value <= $current_sum) {
|
||||||
|
$selected_gift = $gift;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$attempt++;
|
||||||
}
|
}
|
||||||
if (!$selected_gift) {
|
if (!$selected_gift) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取开出礼物的信息
|
// 获取开出礼物的信息
|
||||||
$gift = db::name("vs_gift")
|
$gift = db::name("vs_gift")
|
||||||
->where(['gid'=>$selected_gift['foreign_id']])
|
->where(['gid' => $selected_gift['foreign_id']])
|
||||||
->find();
|
->find();
|
||||||
|
|
||||||
if (!$gift) {
|
if (!$gift) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//操作缓存,减去缓存中对应数据数量
|
|
||||||
|
// 操作缓存,减去缓存中对应数据数量
|
||||||
foreach ($available_gifts as &$available_gifts_gift) {
|
foreach ($available_gifts as &$available_gifts_gift) {
|
||||||
if($selected_gift['id'] == $available_gifts_gift['id']){
|
if ($selected_gift['id'] == $available_gifts_gift['id']) {
|
||||||
$available_gifts_gift['remaining_number'] -= 1;
|
$available_gifts_gift['remaining_number'] -= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if($available_gifts_gift['remaining_number'] == 0){
|
if ($available_gifts_gift['remaining_number'] == 0) {
|
||||||
unset($available_gifts_gift);
|
unset($available_gifts_gift);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($last_periods_remaining_flag == 1){
|
if ($last_periods_remaining_flag == 1) {
|
||||||
//操作上一轮奖池
|
// 操作上一轮奖池
|
||||||
cache($last_remaining_cache_key,$available_gifts);
|
cache($last_remaining_cache_key, $available_gifts);
|
||||||
}else{
|
} else {
|
||||||
cache($available_cache_key,$available_gifts);
|
cache($available_cache_key, $available_gifts);
|
||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
@@ -631,16 +648,18 @@ class BlindBoxTurntableGift extends Model
|
|||||||
$play_image[] = $draw_gift['play_image'];
|
$play_image[] = $draw_gift['play_image'];
|
||||||
|
|
||||||
$text_message = $user_nickname . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $draw_gift['gift_name'] . 'X' . $value['count']."\n";
|
$text_message = $user_nickname . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $draw_gift['gift_name'] . 'X' . $value['count']."\n";
|
||||||
$text_list_new[] = [
|
if($draw_gift['is_public_server'] == 1) {
|
||||||
'text' => $text_message,
|
$text_list_new[] = [
|
||||||
'gift_picture' => $draw_gift['base_image'],
|
'text' => $text_message,
|
||||||
'room_id' => $room_id,
|
'gift_picture' => $draw_gift['base_image'],
|
||||||
'fromUserName' => $FromUserInfo['nickname'],
|
'room_id' => $room_id,
|
||||||
'toUserName' => $ToUserInfo['nickname'],
|
'fromUserName' => $FromUserInfo['nickname'],
|
||||||
'giftName' => $draw_gift['gift_name'],
|
'toUserName' => $ToUserInfo['nickname'],
|
||||||
'roomId' => $room_id,
|
'giftName' => $draw_gift['gift_name'],
|
||||||
'number' => $value['count'],
|
'roomId' => $room_id,
|
||||||
];
|
'number' => $value['count'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -666,7 +685,7 @@ class BlindBoxTurntableGift extends Model
|
|||||||
//聊天室推送系统消息
|
//聊天室推送系统消息
|
||||||
model('Chat')->sendMsg(1028,$room_id,$text1);
|
model('Chat')->sendMsg(1028,$room_id,$text1);
|
||||||
}else{
|
}else{
|
||||||
if($draw_gift['is_public_server'] == 1){
|
if(!empty($text_list_new)){
|
||||||
//推送礼物横幅
|
//推送礼物横幅
|
||||||
$push = new Push($blind_box_turntable['user_id'], $room_id);
|
$push = new Push($blind_box_turntable['user_id'], $room_id);
|
||||||
$push->giftBanner($text_list_new);
|
$push->giftBanner($text_list_new);
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ class RoomPan
|
|||||||
}
|
}
|
||||||
echo "开始发放".count($blind_box_turntable)." \n";
|
echo "开始发放".count($blind_box_turntable)." \n";
|
||||||
foreach ($blind_box_turntable as $k => $v) {
|
foreach ($blind_box_turntable as $k => $v) {
|
||||||
$blind_box_turntable_results_log = db('vs_blind_box_turntable_results_log')->where('tid',$v['id'])->find();
|
$blind_box_turntable_results_log = db('vs_blind_box_turntable_results_log')->where('tid',$v['id'])->select();
|
||||||
if(empty($blind_box_turntable_results_log)){
|
if(empty($blind_box_turntable_results_log)){
|
||||||
echo $v['id']." 没有需要发放的礼物 \n";
|
echo $v['id']." 没有需要发放的礼物 \n";
|
||||||
continue;
|
continue;
|
||||||
@@ -53,18 +53,21 @@ class RoomPan
|
|||||||
$play_image[] = $draw_gift['play_image'];
|
$play_image[] = $draw_gift['play_image'];
|
||||||
|
|
||||||
$text_message = $text_message . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $draw_gift['gift_name'] . 'X' . $value['count']."\n";
|
$text_message = $text_message . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $draw_gift['gift_name'] . 'X' . $value['count']."\n";
|
||||||
$text_list_new[] = [
|
if($draw_gift['is_public_server'] == 1) {
|
||||||
'text' => $text_message,
|
$text_list_new[] = [
|
||||||
'gift_picture' => $draw_gift['base_image'],
|
'text' => $text_message,
|
||||||
'room_id' => $room_id,
|
'gift_picture' => $draw_gift['base_image'],
|
||||||
'fromUserName' => $FromUserInfo['nickname'],
|
'room_id' => $room_id,
|
||||||
'toUserName' => $ToUserInfo['nickname'],
|
'fromUserName' => $FromUserInfo['nickname'],
|
||||||
'giftName' => $draw_gift['gift_name'],
|
'toUserName' => $ToUserInfo['nickname'],
|
||||||
'roomId' => $room_id,
|
'giftName' => $draw_gift['gift_name'],
|
||||||
'number' => $value['count'],
|
'roomId' => $room_id,
|
||||||
];
|
'number' => $value['count'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$text = [
|
$text = [
|
||||||
|
'FromUserInfo' => $FromUserInfo,
|
||||||
'GiftInfo' => [
|
'GiftInfo' => [
|
||||||
'play_image' => implode(',',$play_image),
|
'play_image' => implode(',',$play_image),
|
||||||
],
|
],
|
||||||
@@ -85,7 +88,7 @@ class RoomPan
|
|||||||
//聊天室推送系统消息
|
//聊天室推送系统消息
|
||||||
model('Chat')->sendMsg(1028,$room_id,$text1);
|
model('Chat')->sendMsg(1028,$room_id,$text1);
|
||||||
}else{
|
}else{
|
||||||
if($draw_gift['is_public_server'] == 1){
|
if(!empty($text_list_new)){
|
||||||
//推送礼物横幅
|
//推送礼物横幅
|
||||||
$push = new Push($v['user_id'], $room_id);
|
$push = new Push($v['user_id'], $room_id);
|
||||||
$push->giftBanner($text_list_new);
|
$push->giftBanner($text_list_new);
|
||||||
|
|||||||
Reference in New Issue
Block a user