@@ -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 ];
}
}