From a9e04119930d85010aba1aa29dd9400df21a60ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E9=92=8A?= Date: Sat, 20 Sep 2025 00:04:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E7=89=88=E4=B9=8B=E5=90=8Ebug?= =?UTF-8?q?=E4=BF=AE=E6=94=B9--=E5=AF=BB=E4=B9=90=E4=BC=9A=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E4=BF=AE=E5=A4=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/model/BlindBoxTurntableGiftDraw.php | 58 +++++++++++++------ application/api/model/User.php | 2 +- 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/application/api/model/BlindBoxTurntableGiftDraw.php b/application/api/model/BlindBoxTurntableGiftDraw.php index 232ed96..376cf8d 100644 --- a/application/api/model/BlindBoxTurntableGiftDraw.php +++ b/application/api/model/BlindBoxTurntableGiftDraw.php @@ -496,12 +496,13 @@ class BlindBoxTurntableGiftDraw extends Model ->where([ 'room_id' => $room_id, 'gift_bag_detail_id' => $giftId, - 'remaining_number' => ['>=', $count] +// 'remaining_number' => ['>=', $count] ]) ->setDec('remaining_number', $count); 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 期数 */ 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") ->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)'), '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)){ foreach ($remaining_available_gifts as $gift) { 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_draw_times = $total_quantity - $total_remaining; + if ($total_draw_times < 0) $total_draw_times = 0; // 5. 获取可用礼物(提前过滤无效礼物) $available_gifts = []; 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; } } - 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. 预计算抽奖结果 @@ -1261,7 +1277,8 @@ class BlindBoxTurntableGiftDraw extends Model $total_processed += $current_batch; } catch (\Exception $e) { 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) { 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); - $current_sum = 0; - - foreach ($available_gifts as $gift) { - if ($gift['remaining_number'] <= 0) { - continue; - } - $current_sum += $gift['remaining_number']; - if ($rand_value <= $current_sum) { - return $gift; + 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++; } - return null; + return $selected_gift; } /** diff --git a/application/api/model/User.php b/application/api/model/User.php index 15dd83e..d4066a7 100644 --- a/application/api/model/User.php +++ b/application/api/model/User.php @@ -392,7 +392,7 @@ class User extends Model } $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 里面的礼物 $gift_list = array_filter((array)$gift_list, function ($item) use ($data) { return !in_array($item['gift_id'], array_column($data, 'gift_id'));