From 3994a7ad14fe5826e016794d6504b125025e0261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E9=92=8A?= Date: Sat, 30 Aug 2025 15:31:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A1=E4=B9=90=E4=BC=9A=E6=8A=BD=E5=A5=96?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=8F=90=E4=BA=A4.-=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/model/BlindBoxTurntableGift.php | 406 ++++++++++-------- 1 file changed, 217 insertions(+), 189 deletions(-) diff --git a/application/api/model/BlindBoxTurntableGift.php b/application/api/model/BlindBoxTurntableGift.php index 9f31e65..d891872 100644 --- a/application/api/model/BlindBoxTurntableGift.php +++ b/application/api/model/BlindBoxTurntableGift.php @@ -88,60 +88,79 @@ class BlindBoxTurntableGift extends Model if ($room['is_open_blind_box_turntable'] != 1) { return ['code' => 0, 'msg' => '该房间未开启盲盒转盘', 'data' => null]; } - //盲盒转盘抽奖记录 - $box_turntable_log = db::name('vs_blind_box_turntable_log')->insertGetId([ - 'user_id' => $user_id, - 'gift_bag_id' => $gift_bag_id, - 'num' => $num, - 'room_id' => $room_id, - 'bag_price' => $bag_gift['gift_price'], - 'createtime' => time() - ]); - foreach ($toarray as $gift_user_id){ - for($i = 0; $i < $num; $i++){ - $reslut_draw_gift_data = $this->draw_gift_one($gift_bag_id, $user_id, $gift_user_id,$bag_gift['gift_price'],$room['blind_box_turntable_periods'],$room_id,$box_turntable_log); - $reslut_draw_gift[] = $reslut_draw_gift_data['data']; - } - } - $reslut_gift = []; - $reslut_data = []; - foreach ($reslut_draw_gift as $key => $value) { - $gift_user_id = $value['gift_user_id']; - $gift_id = $value['gift_id']; - - // 以 gift_user_id 和 gift_id 作为键进行分组 - $group_key = $gift_user_id . '_' . $gift_id; - - if (!isset($reslut_gift[$group_key])) { - $reslut_gift[$group_key] = [ - 'gift_user_id' => $gift_user_id, - 'gift_id' => $gift_id, - 'count' => 1, - 'gift_price' => $value['gift_price'] - ]; - } else { - $reslut_gift[$group_key]['count']++; - } - if (!isset($reslut_data[$gift_id])) { - $reslut_data[$gift_id] = [ - 'gift_id' => $gift_id, - 'count' => 1 - ]; - }else { - $reslut_data[$gift_id]['count']++; - } - } - $reslut_gift = array_values($reslut_gift); - foreach ($reslut_gift as $key => $value) { - db::name('vs_blind_box_turntable_results_log')->insert([ - 'tid' => $box_turntable_log, - 'gift_user_id' => $value['gift_user_id'], - 'gift_id' => $value['gift_id'], - 'count' => $value['count'], - 'gift_price' => $value['gift_price'], - 'all_gift_price' => $value['gift_price'] * $value['count'], + db::startTrans(); + try{ + //盲盒转盘抽奖记录 + $box_turntable_log = db::name('vs_blind_box_turntable_log')->insertGetId([ + 'user_id' => $user_id, + 'gift_bag_id' => $gift_bag_id, + 'num' => $num, + 'room_id' => $room_id, + 'bag_price' => $bag_gift['gift_price'], 'createtime' => time() ]); + if (!$box_turntable_log) { + db::rollback(); + return ['code' => 0, 'msg' => '添加盲盒转盘记录失败', 'data' => null]; + } + foreach ($toarray as $gift_user_id){ + for($i = 0; $i < $num; $i++){ + $reslut_draw_gift_data = $this->draw_gift_one($gift_bag_id, $user_id, $gift_user_id,$bag_gift['gift_price'],$room['blind_box_turntable_periods'],$room_id,$box_turntable_log); + if($reslut_draw_gift_data['code'] != 1){ + db::rollback(); + return ['code' => 0, 'msg' => $reslut_draw_gift_data['msg'], 'data' => null]; + } + $reslut_draw_gift[] = $reslut_draw_gift_data['data']; + } + } + $reslut_gift = []; + $reslut_data = []; + foreach ($reslut_draw_gift as $key => $value) { + $gift_user_id = $value['gift_user_id']; + $gift_id = $value['gift_id']; + + // 以 gift_user_id 和 gift_id 作为键进行分组 + $group_key = $gift_user_id . '_' . $gift_id; + + if (!isset($reslut_gift[$group_key])) { + $reslut_gift[$group_key] = [ + 'gift_user_id' => $gift_user_id, + 'gift_id' => $gift_id, + 'count' => 1, + 'gift_price' => $value['gift_price'] + ]; + } else { + $reslut_gift[$group_key]['count']++; + } + if (!isset($reslut_data[$gift_id])) { + $reslut_data[$gift_id] = [ + 'gift_id' => $gift_id, + 'count' => 1 + ]; + }else { + $reslut_data[$gift_id]['count']++; + } + } + $reslut_gift = array_values($reslut_gift); + foreach ($reslut_gift as $key => $value) { + $ret = db::name('vs_blind_box_turntable_results_log')->insert([ + 'tid' => $box_turntable_log, + 'gift_user_id' => $value['gift_user_id'], + 'gift_id' => $value['gift_id'], + 'count' => $value['count'], + 'gift_price' => $value['gift_price'], + 'all_gift_price' => $value['gift_price'] * $value['count'], + 'createtime' => time() + ]); + if (!$ret) { + db::rollback(); + return ['code' => 0, 'msg' => '添加盲盒转盘结果记录失败', 'data' => null]; + } + } + db::commit(); + } catch(\Exception $e) { + db::rollback(); + return V(0,$e->getMessage()); } //巡乐会 $xlh_box = db::name('vs_gift_bag')->where('id',13)->find(); @@ -324,8 +343,6 @@ class BlindBoxTurntableGift extends Model return ['code' => 0, 'msg' => '开奖数据不存在','data' => null]; } //获取盲盒配置 -// $bag_data = db::name("vs_gift_bag")->field('id,name,ext,periods')->where('id',$blind_box_turntable['gift_bag_id'])->find(); -// $ext = json_decode($bag_data['ext'],true); foreach ($blind_box_turntable_log as $key => $value) { $give_gift_ext['gift_id'] = $value['gift_id']; $give_gift_ext['count'] = $value['count']; @@ -474,149 +491,160 @@ class BlindBoxTurntableGift extends Model return ['code' => 0, 'msg' => '未开始', 'data' => null]; } $is_zhong_jiang = 0; - for($i = 0; $i < $num; $i++){ - //随机获取一个礼物 - $where = [ - 'a.gift_bag_id' => $gift_bag_id, - 'a.quantity' => ['>',0], - 'b.remaining_number' => ['>',0], - 'b.room_id' => $room_id - ]; - // 优化:基于剩余数量的加权随机选择 - $gift_bag_details = db::name("vs_gift_bag_detail") - ->field('a.id,a.quantity,b.remaining_number,a.weight,a.foreign_id') - ->alias('a') - ->join('vs_room_pan b','b.gift_bag_detail_id = a.id','left') - ->where($where) - ->select(); - if (empty($gift_bag_details)) { - return ['code' => 0, 'msg' => '当前盲盒无可用礼物', 'data' => []]; - } - //奖池总的抽奖次数 - $total_quantity = db::name("vs_gift_bag_detail")->where(['gift_bag_id' => $gift_bag_id])->sum('quantity'); - // 实现加权随机算法:剩余数量越多,被抽中的概率越大 - $total_remaining = 0; - foreach ($gift_bag_details as $gift) { - $total_remaining += $gift['remaining_number']; - } - //本期当前第多少次后抽奖 总的抽奖次数- 剩余数量 - $total_draw_times = $total_quantity - $total_remaining; - - $rand_value = mt_rand(1, $total_remaining); - $current_sum = 0; - $gift_bag_detail = null; - foreach ($gift_bag_details as $gift) { - if($gift['remaining_number'] <= 0){ - continue; - } - if($total_draw_times < $gift['weight']){ - continue; - } - $current_sum += $gift['remaining_number']; - if ($rand_value <= $current_sum) { - $gift_bag_detail = $gift; - break; - } - } - if($gift_bag_detail){ - //获取开出礼物的信息 - $gift = db::name("vs_gift")->where(['gid'=>$gift_bag_detail['foreign_id']])->find(); - //抽中礼物落包 - $res = model('UserGiftPack')->change_user_gift_pack($user_id,$gift_bag_detail['foreign_id'],1,model('UserGiftPack')::XLH_DRAW_GIFT_GET,$bag_data['name']."抽奖所得"); - if ($res['code'] != 1) { - return ['code' => 0, 'msg' => $res['msg'], 'data' => null]; - } - //处理抽中礼物命中主奖品逻辑 - if($gift_bag_detail['foreign_id'] == $ext['locking_condition']['selected_gift_id']){ - //中奖 - $pan_xlh_num = $pan_xlh['num']+1; - if($pan_xlh_num <= 1){ - $end_time = time() + $ext['locking_time']['tow_no_locking_time'] * 60; - }else{ - $end_time = time() + ($ext['locking_time']['tow_no_locking_time']-$ext['locking_time']['next_time']) * 60; - } - db::name('vs_room_pan_xlh')->where('id',$pan_xlh['id'])->update([ - 'user_id' => $user_id, - 'pay_price' =>$ext['xlh_box_price'], - 'locking_gift_id' =>$gift_bag_detail['foreign_id'], - 'num' => $pan_xlh_num, - 'end_time' => $end_time, - 'updatetime' => time() - ]); - db::name('vs_room_pan_xlh_log')->insertGetId([ - 'xlh_id' => $pan_xlh['id'], - 'user_id' => $user_id, - 'num' => $pan_xlh_num, - 'locking_end_time' => $end_time, - 'createtime' => time() - ]); - $is_zhong_jiang = 1; - } - //减去盲盒包礼物数量 - $ret = db::name("vs_room_pan")->where(['room_id'=>$room_id,'gift_bag_detail_id'=>$gift_bag_detail['id']])->setDec('remaining_number',1); - if(!$ret){ - return ['code' => 0, 'msg' => '失败.', 'data' => []]; - } - //判断剩余数量是否为0 为0重置,进入下一期 - $gift_bag_num = db::name("vs_room_pan")->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])->sum('remaining_number'); - if($gift_bag_num <= 0){ - db::name("vs_room_pan")->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])->update( - ['remaining_number' => db::raw('(SELECT quantity FROM fa_vs_gift_bag_detail WHERE id = fa_vs_room_pan.gift_bag_detail_id)')]); - } - }else{ - return ['code' => 0, 'msg' => '失败!', 'data' => []]; - } - $result_data[] = [ - 'user_id' => $user_id, - 'gift_id'=>$gift_bag_detail['foreign_id'], - 'gift_price'=>$gift['gift_price'], - 'is_public_screen'=>$gift['is_public_screen'], - ]; - } - $reslut_data = []; - foreach ($result_data as $key => $value) { - $gift_id = $value['gift_id']; - if (!isset($reslut_data[$gift_id])) { - $reslut_data[$gift_id] = [ - 'gift_id' => $gift_id, - 'gift_price'=>$value['gift_price'], - 'count' => 1 + db::startTrans(); + try{ + for($i = 0; $i < $num; $i++){ + //随机获取一个礼物 + $where = [ + 'a.gift_bag_id' => $gift_bag_id, + 'a.quantity' => ['>',0], + 'b.remaining_number' => ['>',0], + 'b.room_id' => $room_id + ]; + // 优化:基于剩余数量的加权随机选择 + $gift_bag_details = db::name("vs_gift_bag_detail") + ->field('a.id,a.quantity,b.remaining_number,a.weight,a.foreign_id') + ->alias('a') + ->join('vs_room_pan b','b.gift_bag_detail_id = a.id','left') + ->where($where) + ->select(); + if (empty($gift_bag_details)) { + return ['code' => 0, 'msg' => '当前盲盒无可用礼物', 'data' => []]; + } + //奖池总的抽奖次数 + $total_quantity = db::name("vs_gift_bag_detail")->where(['gift_bag_id' => $gift_bag_id])->sum('quantity'); + // 实现加权随机算法:剩余数量越多,被抽中的概率越大 + $total_remaining = 0; + foreach ($gift_bag_details as $gift) { + $total_remaining += $gift['remaining_number']; + } + //本期当前第多少次后抽奖 总的抽奖次数- 剩余数量 + $total_draw_times = $total_quantity - $total_remaining; + + $rand_value = mt_rand(1, $total_remaining); + $current_sum = 0; + $gift_bag_detail = null; + foreach ($gift_bag_details as $gift) { + if($gift['remaining_number'] <= 0){ + continue; + } + if($total_draw_times < $gift['weight']){ + continue; + } + $current_sum += $gift['remaining_number']; + if ($rand_value <= $current_sum) { + $gift_bag_detail = $gift; + break; + } + } + if($gift_bag_detail){ + //获取开出礼物的信息 + $gift = db::name("vs_gift")->where(['gid'=>$gift_bag_detail['foreign_id']])->find(); + //抽中礼物落包 + $res = model('UserGiftPack')->change_user_gift_pack($user_id,$gift_bag_detail['foreign_id'],1,model('UserGiftPack')::XLH_DRAW_GIFT_GET,$bag_data['name']."抽奖所得"); + if ($res['code'] != 1) { + db::rollback(); + return ['code' => 0, 'msg' => $res['msg'], 'data' => null]; + } + //处理抽中礼物命中主奖品逻辑 + if($gift_bag_detail['foreign_id'] == $ext['locking_condition']['selected_gift_id']){ + //中奖 + $pan_xlh_num = $pan_xlh['num']+1; + if($pan_xlh_num <= 1){ + $end_time = time() + $ext['locking_time']['tow_no_locking_time'] * 60; + }else{ + $end_time = time() + ($ext['locking_time']['tow_no_locking_time']-$ext['locking_time']['next_time']) * 60; + } + db::name('vs_room_pan_xlh')->where('id',$pan_xlh['id'])->update([ + 'user_id' => $user_id, + 'pay_price' =>$ext['xlh_box_price'], + 'locking_gift_id' =>$gift_bag_detail['foreign_id'], + 'num' => $pan_xlh_num, + 'end_time' => $end_time, + 'updatetime' => time() + ]); + db::name('vs_room_pan_xlh_log')->insertGetId([ + 'xlh_id' => $pan_xlh['id'], + 'user_id' => $user_id, + 'num' => $pan_xlh_num, + 'locking_end_time' => $end_time, + 'createtime' => time() + ]); + $is_zhong_jiang = 1; + } + //减去盲盒包礼物数量 + $ret = db::name("vs_room_pan")->where(['room_id'=>$room_id,'gift_bag_detail_id'=>$gift_bag_detail['id']])->setDec('remaining_number',1); + if(!$ret){ + db::rollback(); + return ['code' => 0, 'msg' => '失败.', 'data' => []]; + } + //判断剩余数量是否为0 为0重置,进入下一期 + $gift_bag_num = db::name("vs_room_pan")->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])->sum('remaining_number'); + if($gift_bag_num <= 0){ + db::name("vs_room_pan")->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])->update( + ['remaining_number' => db::raw('(SELECT quantity FROM fa_vs_gift_bag_detail WHERE id = fa_vs_room_pan.gift_bag_detail_id)')]); + } + }else{ + db::rollback(); + return ['code' => 0, 'msg' => '失败!', 'data' => []]; + } + $result_data[] = [ + 'user_id' => $user_id, + 'gift_id'=>$gift_bag_detail['foreign_id'], + 'gift_price'=>$gift['gift_price'], + 'is_public_screen'=>$gift['is_public_screen'], ]; - }else { - $reslut_data[$gift_id]['count']++; } - } - foreach ($reslut_data as $key => $value) { - //处理礼包发放记录表 - $data = []; - $data['user_id'] = $user_id; - $data['parent_id'] = $pan_xlh['id']; - $data['gift_bag_id'] = $gift_bag_id; - $data['gift_id'] = $value['gift_id']; - $data['periods'] = $room['blind_box_turntable_periods']; - $data['room_id'] = $room_id; - $data['num'] = $value['count']; - $data['gift_price'] = $value['gift_price']; - $data['bag_price'] = $ext['xlh_box_price']; - $data['createtime'] = time(); - $result = db::name("vs_gift_bag_receive_log")->insert($data); - if(!$result){ - return ['code' => 0, 'msg' => '失败,', 'data' => []]; + $reslut_data = []; + foreach ($result_data as $key => $value) { + $gift_id = $value['gift_id']; + if (!isset($reslut_data[$gift_id])) { + $reslut_data[$gift_id] = [ + 'gift_id' => $gift_id, + 'gift_price'=>$value['gift_price'], + 'count' => 1 + ]; + }else { + $reslut_data[$gift_id]['count']++; + } } + foreach ($reslut_data as $key => $value) { + //处理礼包发放记录表 + $data = []; + $data['user_id'] = $user_id; + $data['parent_id'] = $pan_xlh['id']; + $data['gift_bag_id'] = $gift_bag_id; + $data['gift_id'] = $value['gift_id']; + $data['periods'] = $room['blind_box_turntable_periods']; + $data['room_id'] = $room_id; + $data['num'] = $value['count']; + $data['gift_price'] = $value['gift_price']; + $data['bag_price'] = $ext['xlh_box_price']; + $data['createtime'] = time(); + $result = db::name("vs_gift_bag_receive_log")->insert($data); + if(!$result){ + db::rollback(); + return ['code' => 0, 'msg' => '失败,', 'data' => []]; + } + } + // 添加活动记录 + $reslut = Db::name('vs_activities_receive')->insert([ + 'user_id' => $user_id, + 'activities_id' => 6, + 'room_id' => $room_id, + 'createtime' => time(), + 'updatetime' => time() + ]); + db::commit(); + } catch(\Exception $e) { + db::rollback(); + return V(0,$e->getMessage()); } - // 添加活动记录 - $reslut = Db::name('vs_activities_receive')->insert([ - 'user_id' => $user_id, - 'activities_id' => 6, - 'room_id' => $room_id, - 'createtime' => time(), - 'updatetime' => time() - ]); if($is_zhong_jiang == 1){ //推送 $FromUserInfo = db::name('user')->field('nickname,avatar')->where(['id'=>$user_id])->find(); $room_name = db::name('vs_room')->where(['id'=>$room_id])->value('room_name'); - $gift_name = db::name('vs_gift')->where(['id'=>$value['gift_id']])->value('gift_name'); + $gift_name = db::name('vs_gift')->where(['gid'=>$value['gift_id']])->value('gift_name'); $text = $FromUserInfo['nickname'] . ' 用户在 ' . $room_name.' 房间巡乐会中 ' .$gift_name.'礼物 x ' .$value['count']." 已收入背包"; $text = [ 'gift_num' => $pan_xlh_num,