定版之后bug修改--寻乐会报错修复。
This commit is contained in:
@@ -496,12 +496,13 @@ class BlindBoxTurntableGiftDraw extends Model
|
|||||||
->where([
|
->where([
|
||||||
'room_id' => $room_id,
|
'room_id' => $room_id,
|
||||||
'gift_bag_detail_id' => $giftId,
|
'gift_bag_detail_id' => $giftId,
|
||||||
'remaining_number' => ['>=', $count]
|
// 'remaining_number' => ['>=', $count]
|
||||||
])
|
])
|
||||||
->setDec('remaining_number', $count);
|
->setDec('remaining_number', $count);
|
||||||
|
|
||||||
if (!$ret) {
|
if (!$ret) {
|
||||||
throw new \Exception('更新礼物剩余数量失败');
|
Log::record('巡乐会更新礼物剩余数量: ' . $room_id."【数据】".var_export($precomputedResults, true),"info");
|
||||||
|
// throw new \Exception('更新礼物剩余数量失败');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -911,6 +912,9 @@ class BlindBoxTurntableGiftDraw extends Model
|
|||||||
* @param int $periods 期数
|
* @param int $periods 期数
|
||||||
*/
|
*/
|
||||||
private function reset_gift_pool($room_id, $gift_bag_id, $periods,$remaining_available_gifts=[]) {
|
private function reset_gift_pool($room_id, $gift_bag_id, $periods,$remaining_available_gifts=[]) {
|
||||||
|
$room_pan = db::name("vs_room_pan")
|
||||||
|
->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])
|
||||||
|
->select();
|
||||||
// 重置奖池中所有礼物数量
|
// 重置奖池中所有礼物数量
|
||||||
db::name("vs_room_pan")
|
db::name("vs_room_pan")
|
||||||
->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])
|
->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])
|
||||||
@@ -918,6 +922,13 @@ class BlindBoxTurntableGiftDraw extends Model
|
|||||||
'remaining_number' => db::raw('(SELECT quantity FROM fa_vs_gift_bag_detail WHERE id = fa_vs_room_pan.gift_bag_detail_id)'),
|
'remaining_number' => db::raw('(SELECT quantity FROM fa_vs_gift_bag_detail WHERE id = fa_vs_room_pan.gift_bag_detail_id)'),
|
||||||
'periods' => $periods
|
'periods' => $periods
|
||||||
]);
|
]);
|
||||||
|
//防止并发,上把如果件数小于0,则加上
|
||||||
|
foreach ($room_pan as $pan) {
|
||||||
|
if($pan['remaining_number']<0){
|
||||||
|
db::name("vs_room_pan")->where('id', $pan['id'])->setInc('remaining_number', $pan['remaining_number']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//补充上把礼物有剩余
|
||||||
if(!empty($remaining_available_gifts)){
|
if(!empty($remaining_available_gifts)){
|
||||||
foreach ($remaining_available_gifts as $gift) {
|
foreach ($remaining_available_gifts as $gift) {
|
||||||
db::name("vs_room_pan")->where('id', $gift['id'])->setInc('remaining_number',$gift['remaining_number']);
|
db::name("vs_room_pan")->where('id', $gift['id'])->setInc('remaining_number',$gift['remaining_number']);
|
||||||
@@ -1106,18 +1117,23 @@ class BlindBoxTurntableGiftDraw extends Model
|
|||||||
|
|
||||||
$total_remaining = array_sum(array_column($room_pan_data, 'remaining_number'));
|
$total_remaining = array_sum(array_column($room_pan_data, 'remaining_number'));
|
||||||
$total_draw_times = $total_quantity - $total_remaining;
|
$total_draw_times = $total_quantity - $total_remaining;
|
||||||
|
|
||||||
if ($total_draw_times < 0) $total_draw_times = 0;
|
if ($total_draw_times < 0) $total_draw_times = 0;
|
||||||
|
|
||||||
// 5. 获取可用礼物(提前过滤无效礼物)
|
// 5. 获取可用礼物(提前过滤无效礼物)
|
||||||
$available_gifts = [];
|
$available_gifts = [];
|
||||||
foreach ($room_pan_data as $pan) {
|
foreach ($room_pan_data as $pan) {
|
||||||
if ($pan['remaining_number'] > 0 && $pan['weight'] < $total_draw_times) {
|
if ($pan['remaining_number'] > 0 && $pan['weight'] <= $total_draw_times) {
|
||||||
$available_gifts[] = $pan;
|
$available_gifts[] = $pan;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($available_gifts)) {
|
if (empty($available_gifts)) {
|
||||||
return ['code' => 0, 'msg' => '当前盲盒无可用礼物', 'data' => []];
|
// 移除已无剩余数量的礼物
|
||||||
|
$remaining_available_gifts = array_filter($room_pan_data, function($gift) {
|
||||||
|
return $gift['remaining_number'] > 0;
|
||||||
|
});
|
||||||
|
$this->reset_gift_pool($room_id, $gift_bag_id, $room_pan_data[0]['periods'] + 1,$remaining_available_gifts);
|
||||||
|
// return ['code' => 0, 'msg' => '当前盲盒无可用礼物', 'data' => []];
|
||||||
}
|
}
|
||||||
|
|
||||||
// 6. 预计算抽奖结果
|
// 6. 预计算抽奖结果
|
||||||
@@ -1261,7 +1277,8 @@ class BlindBoxTurntableGiftDraw extends Model
|
|||||||
$total_processed += $current_batch;
|
$total_processed += $current_batch;
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
db::rollback();
|
db::rollback();
|
||||||
return ['code' => 0, 'msg' => $e->getMessage(), 'data' => null];
|
Log::record('巡乐会抽奖失败: ' . $e->getMessage(),"infos");
|
||||||
|
return ['code' => 0, 'msg' => "抽奖中,请稍等...", 'data' => null];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1338,21 +1355,28 @@ class BlindBoxTurntableGiftDraw extends Model
|
|||||||
if ($remaining <= 0) {
|
if ($remaining <= 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
// 循环尝试直到抽中有效礼物
|
||||||
|
$max_attempts = 5; // 最大尝试次数,防止无限循环
|
||||||
|
$attempt = 0;
|
||||||
|
$selected_gift = null;
|
||||||
|
while ($attempt < $max_attempts && !$selected_gift) {
|
||||||
|
$rand_value = mt_rand(1, $remaining);
|
||||||
|
$current_sum = 0;
|
||||||
|
|
||||||
$rand_value = mt_rand(1, $remaining);
|
foreach ($available_gifts as $gift) {
|
||||||
$current_sum = 0;
|
if ($gift['remaining_number'] <= 0) {
|
||||||
|
continue;
|
||||||
foreach ($available_gifts as $gift) {
|
}
|
||||||
if ($gift['remaining_number'] <= 0) {
|
$current_sum += $gift['remaining_number'];
|
||||||
continue;
|
if ($rand_value <= $current_sum) {
|
||||||
}
|
$selected_gift = $gift;
|
||||||
$current_sum += $gift['remaining_number'];
|
break;
|
||||||
if ($rand_value <= $current_sum) {
|
}
|
||||||
return $gift;
|
|
||||||
}
|
}
|
||||||
|
$attempt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return $selected_gift;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -392,7 +392,7 @@ class User extends Model
|
|||||||
}
|
}
|
||||||
$data = array_values($data);
|
$data = array_values($data);
|
||||||
//查询所有的礼物
|
//查询所有的礼物
|
||||||
$gift_list = db::name('vs_gift')->field('gid as gift_id,gift_name,base_image,gift_price')->where(['delete_time' => 0,'is_show' => 1,'label'=>['<>',2]])->select();
|
$gift_list = db::name('vs_gift')->field('gid as gift_id,gift_name,base_image,gift_price')->where(['delete_time' => 0,'label'=>['<>',2]])->select();
|
||||||
//对比去除$data 里面的礼物
|
//对比去除$data 里面的礼物
|
||||||
$gift_list = array_filter((array)$gift_list, function ($item) use ($data) {
|
$gift_list = array_filter((array)$gift_list, function ($item) use ($data) {
|
||||||
return !in_array($item['gift_id'], array_column($data, 'gift_id'));
|
return !in_array($item['gift_id'], array_column($data, 'gift_id'));
|
||||||
|
|||||||
Reference in New Issue
Block a user