diff --git a/application/adminapi/controller/BlindBox.php b/application/adminapi/controller/BlindBox.php index 1e6c885..a0a1455 100644 --- a/application/adminapi/controller/BlindBox.php +++ b/application/adminapi/controller/BlindBox.php @@ -453,12 +453,14 @@ class BlindBox extends adminApi $tow_no_locking_time = input('tow_no_locking_time', ''); $next_time = input('next_time', ''); $introd =$_POST['introd']??""; + $price = input('price', ''); if(empty($inlet_bag_id)){ return V(0,"请选择巡乐会绑定入口"); } $ext =[ 'inlet_bag_id' => $inlet_bag_id, 'gift_id' => $selected_gift_id, + 'xlh_box_price' => $price, 'open_condition' => [ 'waiting_start_num' => $waiting_start_num, 'start_num' => $start_num, diff --git a/application/api/controller/BlindBoxTurntable.php b/application/api/controller/BlindBoxTurntable.php index d71f214..c64e302 100644 --- a/application/api/controller/BlindBoxTurntable.php +++ b/application/api/controller/BlindBoxTurntable.php @@ -72,4 +72,23 @@ class BlindBoxTurntable extends BaseCom $reslut = model('BlindBoxTurntableGift')->get_all_record($gift_bag_id,$page,$page_size); return v($reslut['code'], $reslut['msg'], $reslut['data']); } + /* + * 巡乐会 + */ + public function xlh(){ + $room_id = input('room_id',0); + $reslut = model('BlindBoxTurntableGift')->xlh_gift_list($room_id); + return v($reslut['code'], $reslut['msg'], $reslut['data']); + } + + /* + * 巡乐会抽奖 + */ + public function xlh_draw_gift(){ + $user_id = $this->uid; + $room_id = input('room_id',0); + $num = input('num',1); + $reslut = model('BlindBoxTurntableGift')->xlh_draw_gift($user_id,$num,$room_id); + return v($reslut['code'], $reslut['msg'], $reslut['data']); + } } \ No newline at end of file diff --git a/application/api/model/BlindBoxTurntableGift.php b/application/api/model/BlindBoxTurntableGift.php index 656ae6b..1ac17a2 100644 --- a/application/api/model/BlindBoxTurntableGift.php +++ b/application/api/model/BlindBoxTurntableGift.php @@ -65,7 +65,7 @@ class BlindBoxTurntableGift extends Model $result_data = [ 'title' => $box['name'], 'rule_url' => get_system_config_value('web_site')."/api/Page/get_gift_box_rule?box_id=".$box["id"], - 'rule' => $ext['introd'], +// 'rule' => $ext['introd'], 'box_price' => $box_gift['gift_price'], 'is_xlh' => $is_xlh, 'xlh_data' => $xlh, @@ -102,7 +102,7 @@ class BlindBoxTurntableGift extends Model ]); 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'],$bag_data['periods'],$room_id,$box_turntable_log); + $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']; } } @@ -237,32 +237,44 @@ class BlindBoxTurntableGift extends Model //巡乐会飘屏 $xlh_box = db::name('vs_gift_bag')->where('id',13)->find(); $xlh_ext = json_decode($xlh_box['ext'],true); - if($xlh_ext['inlet_bag_id'] == $gift_bag_id['id']){ - $room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name'); + if($xlh_ext['inlet_bag_id'] == $gift_bag_id){ if($total_draw_times == $xlh_ext['open_condition']['waiting_start_num']){ + $room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name'); //即将开始推送飘屏 $text = $room_name."的巡乐会即将开始,请大家尽快参与哦!"; + //推送礼物横幅 + $push = new Push(UID, $room_id); + $text_list_new = [ + 'text' => $text, + 'gift_picture' => "", + 'room_id' => $room_id, + 'fromUserName' => "", + 'toUserName' => "", + 'giftName' => "", + 'roomId' => $room_id, + 'number' => "", + ]; + $push->giftBanner($text_list_new); } if($total_draw_times == $xlh_ext['open_condition']['start_num']){ + $room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name'); //正式开始推送飘屏 $text = $room_name."的巡乐会正式开始,请大家尽快参与哦!"; + //推送礼物横幅 + $push = new Push(UID, $room_id); + $text_list_new = [ + 'text' => $text, + 'gift_picture' => "", + 'room_id' => $room_id, + 'fromUserName' => "", + 'toUserName' => "", + 'giftName' => "", + 'roomId' => $room_id, + 'number' => "", + ]; + $push->giftBanner($text_list_new); } - //推送礼物横幅 - $push = new Push(UID, $room_id); - $room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name'); - $text_list_new = [ - 'text' => $text, - 'gift_picture' => "", - 'room_id' => $room_id, - 'fromUserName' => "", - 'toUserName' => "", - 'giftName' => "", - 'roomId' => $room_id, - 'number' => "", - ]; - $push->giftBanner($text_list_new); } - $result_data = [ 'user_id' => $user_id, 'gift_user_id'=>$gift_user_id, @@ -349,4 +361,185 @@ class BlindBoxTurntableGift extends Model } return ['code' => 1, 'msg' => '成功', 'data' => $list]; } + /* + * 巡乐会 + */ + public function xlh_gift_list($room_id){ + $gift_bag_id = 13; + $xlh_box = db::name('vs_gift_bag')->where('id',$gift_bag_id)->find(); + $xlh_ext = json_decode($xlh_box['ext'],true); + $gifts = db::name('vs_gift_bag_detail')->where('gift_bag_id',$gift_bag_id)->order("id desc")->select(); + $gift_list = []; + foreach ($gifts as $key => $value) { + $gift_data = db::name('vs_gift')->where('gid',$value['foreign_id'])->where('delete_time',0)->find(); + if($gift_data){ + $gift_list[$key]['number'] = $key; + $gift_list[$key]['gift_id'] = $gift_data['gid']; + $gift_list[$key]['gift_name'] = $gift_data['gift_name']; + $gift_list[$key]['base_image'] = $gift_data['base_image']; + $gift_list[$key]['play_image'] = $gift_data['play_image']; + $gift_list[$key]['gift_price'] = $gift_data['gift_price']; + } + } + //巡乐会结束时间 + $xlh_end_time = time() + $xlh_ext['locking_time']['end_time'] * 60; + //房主礼物 + $room_user_gift = db::name('vs_gift')->where('gid',$xlh_ext['locking_condition']['give_homeowner_gift_id'])->find(); + //巡乐会主礼物 + $xlh_main_gift = db::name('vs_gift')->where('gid',$xlh_ext['locking_condition']['locking_gift_id'])->find(); + //中奖用户 + $result_data = [ + 'title' => $xlh_box['name'], + 'rule_url' => get_system_config_value('web_site')."/api/Page/get_gift_box_rule?box_id=".$xlh_box["id"], + 'box_price' => $xlh_ext['xlh_box_price'], + 'xlh_end_time' =>date('Y-m-d H:i:s',$xlh_end_time), + 'give_homeowner_gift' => [ + 'gift_id' => $room_user_gift['gid'], + 'gift_name' => $room_user_gift['gift_name'], + 'base_image' => $room_user_gift['base_image'], + ], + 'locking_gift' => [ + 'gift_id' => $xlh_main_gift['gid'], + 'gift_name' => $xlh_main_gift['gift_name'], + 'gift_price' => $xlh_main_gift['gift_price'], + 'base_image' => $xlh_main_gift['base_image'], + ], + 'gift_list' => $gift_list, + ]; + return ['code' => 1, 'msg' => '获取成功', 'data' => $result_data]; + } + + /* + * 巡乐会抽奖 + */ + public function xlh_draw_gift($user_id,$num,$room_id){ + $gift_bag_id = 13; + //获取盲盒配置 + $bag_data = db::name("vs_gift_bag")->field('id,name,ext,periods')->where('id',$gift_bag_id)->find(); + $ext = json_decode($bag_data['ext'],true); + //判断是否有足够的金币 + $user_waller = db::name('user_wallet')->where(['user_id'=>$user_id])->find(); + if ($user_waller['coin'] < $ext['xlh_box_price'] * $num) { + return ['code' => 0, 'msg' => '用户金币不足', 'data' => null]; + } + $room = db::name('vs_room')->where(['id'=>$room_id])->find(); + if ($room['is_open_blind_box_turntable'] != 1) { + return ['code' => 0, 'msg' => '该房间未开启盲盒转盘', 'data' => null]; + } + //开始抽奖 + 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']){ + //中奖 + $box_turntable_log = db::name('fa_vs_room_pan_xlh')->insertGetId([ + 'user_id' => $user_id, + 'room_id' => $room_id, + 'gift_bag_id' => $gift_bag_id, + 'num' => $num, + 'room_id' => $room_id, + 'bag_price' => $bag_gift['gift_price'], + 'createtime' => time() + ]); + + } + //处理礼包发放记录表 + $data = []; + $data['user_id'] = $user_id; + $data['parent_id'] = 0; + $data['gift_bag_id'] = $gift_bag_id; + $data['gift_id'] = $gift_bag_detail['foreign_id']; + $data['periods'] = $room['blind_box_turntable_periods']; + $data['room_id'] = $room_id; + $data['gift_price'] = $gift['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' => []]; + } + //减去盲盒包礼物数量 + $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_gift_bag")->where('id',$gift_bag_id)->setInc('periods'); + db::name("vs_room")->where('id',$room_id)->setInc('blind_box_turntable_periods'); + 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' => []]; + } + } + // 添加活动记录 + $reslut = Db::name('vs_activities_receive')->insert([ + 'user_id' => $user_id, + 'activities_id' => 6, + 'room_id' => $room_id, + 'createtime' => time(), + 'updatetime' => time() + ]); + + $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'], + ]; + return ['code' => 1, 'msg' => '成功', 'data' => $result_data]; + } }