2025-08-08 14:45:40 +08:00
< ? php
namespace app\api\model ;
use think\Model ;
use think\db ;
class Box extends Model
{
//开奖池
public function open_box ( $uid , $rid , $type , $open_num ){
$config = get_uncache_system_config ();
//宝箱是否关闭
if ( $config [ 'open_box_status' ] != 1 ){
return [ 'code' => 201 , 'msg' => '功能关闭中' , 'data' => null ];
}
if ( $type == 1 ){ //银蛋是否关闭
if ( $config [ 'open_silver_box_status' ] != 1 ){
return [ 'code' => 201 , 'msg' => '功能关闭中' , 'data' => null ];
}
} else if ( $type == 3 ){ //钻蛋是否关闭
if ( $config [ 'open_drill_box_status' ] != 1 ){
return [ 'code' => 201 , 'msg' => '功能关闭中' , 'data' => null ];
}
} else if ( $type == 2 ){ //金蛋是否关闭
if ( $config [ 'open_gold_box_status' ] != 1 ){
return [ 'code' => 201 , 'msg' => '功能关闭中' , 'data' => null ];
}
} else {
return [ 'code' => 201 , 'msg' => '参数错误' , 'data' => null ];
}
$user_info = db :: name ( 'user' ) -> find ( $uid );
if ( $user_info [ 'is_teenager' ] == 1 ){
return [ 'code' => 201 , 'msg' => '已开启青少年模式' , 'data' => null ];
}
// dump($config);die;
//禁止该设备号砸蛋
$forbid_open_box = $config [ 'forbid_device_open_box' ];
if ( ! empty ( $forbid_open_box )){
$forbid_open_box_list = explode ( ',' , trim ( $forbid_open_box , ',' ));
if ( in_array ( $user_info [ 'last_login_device' ], $forbid_open_box_list )){
return [ 'code' => 201 , 'msg' => '账号异常,请联系客服' , 'data' => null ];
}
}
//禁止该用户砸蛋
$forbid_user_open_box = $config [ 'forbid_uid_open_box' ];
if ( ! empty ( $forbid_user_open_box )){
$forbid_user_open_box_list = explode ( ',' , trim ( $forbid_user_open_box , ',' ));
if ( in_array ( $uid , $forbid_user_open_box_list )){
return [ 'code' => 201 , 'msg' => '账号异常,请联系客服' , 'data' => null ];
}
}
// $person_box = [4,5];
$common_boxs = [ 1 , 2 , 3 ];
if ( $user_info [ 'is_tester' ] == 2 ){ //测试号
$data = $this -> open_common_box ( $uid , $rid , $type , $open_num );
return $data ;
} else if ( in_array ( $type , $common_boxs )){ //公池
if ( $type == 1 ){ //银蛋
$silver_tid = [ 1 ];
$common_box = [ 1 ];
$person_box = [];
$map = [];
$map [] = [ 'tid' , 'in' , $silver_tid ];
$box_type_lists = db :: name ( 'box_type' ) -> where ( $map ) -> field ( 'tid,consume' ) -> order ( 'consume desc' ) -> select ();
foreach ( $box_type_lists as $a => $b ) {
if ( $user_info [ 'silver_consume' ] >= $b [ 'consume' ]){
$tid = $b [ 'tid' ];
break ;
}
}
if ( in_array ( $tid , $common_box )){
$data = $this -> open_common_box ( $uid , $rid , $type , $open_num );
return $data ;
}
} else if ( $type == 2 ){ //金蛋
$silver_tid = [ 11 ];
$common_box = [ 11 ];
$person_box = [];
$map = [];
$map [] = [ 'tid' , 'in' , $silver_tid ];
$box_type_lists = db :: name ( 'box_type' ) -> where ( $map ) -> field ( 'tid,consume' ) -> order ( 'consume desc' ) -> select ();
foreach ( $box_type_lists as $a => $b ) {
if ( $user_info [ 'gold_consume' ] >= $b [ 'consume' ]){
$tid = $b [ 'tid' ];
break ;
}
}
if ( in_array ( $tid , $common_box )){
$data = $this -> open_common_box ( $uid , $rid , $type , $open_num );
return $data ;
}
} else if ( $type == 3 ){ //钻蛋
$drill_tid = [ 21 ];
$common_box = [ 21 ];
$person_box = [];
$map = [];
$map [] = [ 'tid' , 'in' , $drill_tid ];
$box_type_lists = db :: name ( 'box_type' ) -> where ( $map ) -> field ( 'tid,consume' ) -> order ( 'consume desc' ) -> select ();
foreach ( $box_type_lists as $a => $b ) {
if ( $user_info [ 'drill_consume' ] >= $b [ 'consume' ]){
$tid = $b [ 'tid' ];
break ;
}
}
if ( in_array ( $tid , $common_box )){
$data = $this -> open_common_box ( $uid , $rid , $type , $open_num );
return $data ;
}
} else {
return [ 'code' => 201 , 'msg' => '参数错误' , 'data' => null ];
}
} else {
return [ 'code' => 201 , 'msg' => '参数错误' , 'data' => null ];
}
}
//公池
public function open_common_box ( $uid , $rid , $type , $open_num )
{
$open_num = input ( 'open_num' , 0 );
if ( ! in_array ( $open_num , [ 1 , 10 , 100 ])) {
return [ 'code' => 201 , 'msg' => '开奖次数参数非法' , 'data' => null ];
}
$config = get_system_config ();
$map = [];
$map [ 'rid' ] = $rid ;
$map [ 'is_delete' ] = 1 ;
$room_info = db :: name ( 'room' ) -> field ( 'rid,is_auto_accumulate,room_owner_uid' ) -> where ( $map ) -> find ();
if ( empty ( $room_info )) {
return [ 'code' => 201 , 'msg' => '房间信息不存在' , 'data' => null ];
}
$redis = connectionRedis ();
$user_gift_id_list = []; //用户抽中礼物id集合
$user_gift_id_redis_list = []; //用户抽中redis礼物id集合
$user_win_gift_data = []; //抽中礼物列表
$box_log_data = []; //抽中礼物期数数据
$box_type_data = []; //宝箱类型配置信息
$box_logs_data = [];
$user_pay_amount = 0 ; //用户支付总额
$user_win_gift_total_value = 0 ; //抽中礼物总价值
$surplus_user_money = 0 ; //用户剩余资金
$europe_key = 0 ; //用户所得皇钥匙
$now_time = time ();
$tid = '' ;
$user_info = db :: name ( 'user' ) -> find ( $uid ); //获取用户信息
if ( ! $user_info ){
return [ 'code' => 201 , 'msg' => '用户信息不存在' , 'data' => null ];
}
$ress = model ( 'api/UserWallet' ) -> get_user_wallet ( $uid , $user_info [ 'money' ], $user_info [ 'integral' ]);
if ( $ress [ 'code' ] != 200 ) {
return $ress ;
}
//不同宝箱类型
//判断是否是虚拟用户
if ( $user_info [ 'is_tester' ] == 2 ){
if ( $type == 1 ){
$tid = 61 ;
} else if ( $type == 2 ){
$tid = 62 ;
} else if ( $type == 3 ){
$tid = 63 ;
}
} else {
if ( $type == 1 ){
$silver_tid = [ 1 ];
$map = [];
$map [] = [ 'tid' , 'in' , $silver_tid ];
$box_type_lists = db :: name ( 'box_type' ) -> where ( $map ) -> field ( 'tid,consume' ) -> order ( 'consume desc' ) -> select ();
foreach ( $box_type_lists as $a => $b ) {
if ( $user_info [ 'silver_consume' ] >= $b [ 'consume' ]){
$tid = $b [ 'tid' ];
break ;
}
}
} else if ( $type == 2 ){
$gold_tid = [ 11 ];
$map = [];
$map [] = [ 'tid' , 'in' , $gold_tid ];
$box_type_lists = db :: name ( 'box_type' ) -> where ( $map ) -> field ( 'tid,consume' ) -> order ( 'consume desc' ) -> select ();
foreach ( $box_type_lists as $a => $b ) {
if ( $user_info [ 'gold_consume' ] >= $b [ 'consume' ]){
$tid = $b [ 'tid' ];
break ;
}
}
} else if ( $type == 3 ){
$drill_tid = [ 21 ];
$map = [];
$map [] = [ 'tid' , 'in' , $drill_tid ];
$box_type_lists = db :: name ( 'box_type' ) -> where ( $map ) -> field ( 'tid,consume' ) -> order ( 'consume desc' ) -> select ();
foreach ( $box_type_lists as $a => $b ) {
if ( $user_info [ 'drill_consume' ] >= $b [ 'consume' ]){
$tid = $b [ 'tid' ];
break ;
}
}
}
}
//该奖池是否配置礼物
$map = [];
$map [] = [ 'tid' , '=' , $tid ];
$is_box_config = db ( 'box_config' ) -> where ( $map ) -> select ();
if ( ! $is_box_config ){
2025-11-10 14:25:26 +08:00
return [ 'code' => 201 , 'msg' => '奖池数量不足!' , 'data' => null ];
2025-08-08 14:45:40 +08:00
}
//获取宝箱类型配置信息
$box_type_list = db :: name ( 'box_type' ) -> field ( 'tid,open_price,open_status,show_name,consume' ) -> select ();
foreach ( $box_type_list as $k => & $v ) {
$box_type_data [ $v [ 'tid' ]] = $v ;
}
if ( empty ( $box_type_data [ $tid ])) {
return [ 'code' => 201 , 'msg' => '开奖类型非法参数' , 'data' => null ];
}
if ( $box_type_data [ $tid ][ 'open_status' ] != 1 ) {
return [ 'code' => 201 , 'msg' => '该开奖类型暂时已关闭' , 'data' => null ];
}
$user_pay_amount = $open_num * $box_type_data [ $tid ][ 'open_price' ];
//当前用户金额是否可以开宝箱
$user_auction_price = model ( 'NewRoom' ) -> get_user_auction_price ( $uid );
if ( $user_info [ 'integral' ] < ( $user_auction_price + $user_pay_amount )){
return [ 'code' => 201 , 'msg' => '金币不足' , 'data' => null ];
}
$tid_box_price = $box_type_data [ $tid ][ 'open_price' ];
$tid_box_consume = $box_type_data [ $tid ][ 'consume' ];
$keyname = " box:list:tid: " . $tid ;
if ( $keyname == " box:list:tid: " ) {
return [ 'code' => 201 , 'msg' => '开奖类型非法参数' , 'data' => null ];
}
// dump($tid);
// 启动事务
Db :: startTrans ();
try {
//获取用户必中信息 (每次补发一个)
$map = [];
$map [] = [ 'uid' , '=' , $uid ];
$map [] = [ 'tid' , '=' , $tid ];
$map [] = [ 'is_admin' , '=' , 1 ];
$map [] = [ 'give_status' , '=' , 1 ];
$box_give_gift_info = db :: name ( 'box_give_gift' ) -> where ( $map ) -> find ();
//插入用户必中
$need_open_num = $open_num ;
if ( ! empty ( $box_give_gift_info )) {
$data = [];
$data [ 'bl_id' ] = 0 ;
$data [ 'bl_id_tid' ] = $box_give_gift_info [ 'tid' ];
$data [ 'gid' ] = $box_give_gift_info [ 'gid' ];
$user_gift_id_list [] = $data ;
$need_open_num -- ; //待取礼物总数-1
}
//获取待核销必中礼物数据
$map = [];
$map [] = [ 'tid' , '=' , $tid ];
$map [] = [ 'give_status' , '=' , 2 ];
$map [] = [ 'deduction_status' , '=' , 1 ];
// $box_un_deduction_give_gift_list = db::name('box_give_gift')->where($map)->order('id asc')->column('id', 'gid'); //每种礼物只核销第一个
$box_un_deduction_give_gift_arr = db :: name ( 'box_give_gift' ) -> field ( 'id,gid' ) -> where ( $map ) -> order ( 'id asc' ) -> select ();
//每种礼物只核销第一个
$box_un_deduction_give_gift_list = [];
foreach ( $box_un_deduction_give_gift_arr as $val ) {
if ( ! isset ( $box_un_deduction_give_gift_list [ $val [ 'gid' ]])) {
$box_un_deduction_give_gift_list [ $val [ 'gid' ]] = $val [ 'id' ];
}
}
//每日砸蛋次数限制
$now_date = date ( 'Y-m-d' );
$map = [];
$map [] = [ 'uid' , '=' , $user_info [ 'uid' ]];
$map [] = [ 'box_date' , '=' , $now_date ];
$data = [];
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'user_box_statics' ) -> where ( $map ) -> inc ( 'box_times' , $open_num ) -> update ( $data );
if ( ! $reslut ) {
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'box_date' ] = $now_date ;
$data [ 'box_times' ] = $open_num ;
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'user_box_statics' ) -> insert ( $data );
if ( ! $reslut ) {
Db :: rollback ();
return [ 'code' => 201 , 'msg' => '请重试tj1' , 'data' => null ];
}
}
$user_box_times = db :: name ( 'user_box_statics' ) -> where ([ 'uid' => $uid , 'box_date' => date ( 'Y-m-d' )]) -> value ( 'box_times' );
//限制次数
$box_limit_times = $config [ 'user_day_box_limit_times' ];
if ( $user_box_times > $box_limit_times ){
Db :: rollback ();
return [ 'code' => 201 , 'msg' => '超过每日最大次数!' , 'data' => null ];
}
//获取待开奖池礼物
for ( $i = 0 ; $i < $need_open_num ; $i ++ ) {
$gift_data = $redis -> blpop ( $keyname , 2 ); //1s 超时
if ( empty ( $gift_data )) {
2025-11-10 14:25:26 +08:00
return [ 'code' => 201 , 'msg' => '奖池数量不足!!' , 'data' => null ];
2025-08-08 14:45:40 +08:00
} else {
//获取是否有待核销必中
$gift_data_data = explode ( '-' , $gift_data [ 1 ]);
$bl_id = $gift_data_data [ 0 ];
$gid = $gift_data_data [ 1 ];
if ( ! empty ( $box_un_deduction_give_gift_list [ $gid ])) {
$id = $box_un_deduction_give_gift_list [ $gid ];
unset ( $box_un_deduction_give_gift_list [ $gid ]);
$data = [];
$data [ 'bl_id' ] = $bl_id ;
$data [ 'gid' ] = $gid ;
$user_gift_id_redis_list [] = $data ;
//更新对应数据
//补偿表 更新
$map = [];
$map [] = [ 'id' , '=' , $id ];
$map [] = [ 'tid' , '=' , $tid ];
$map [] = [ 'gid' , '=' , $gid ];
$map [] = [ 'deduction_status' , '=' , 1 ];
$data = [];
$data [ 'deduction_bl_id' ] = $bl_id ;
$data [ 'deduction_status' ] = 2 ;
$data [ 'deduction_time' ] = time ();
$data [ 'update_time' ] = time ();
$reslut = db :: name ( 'box_give_gift' ) -> where ( $map ) -> order ( 'id asc' ) -> limit ( 1 ) -> update ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
//开宝箱记录表更新
// $map = [];
// $map[] = ['tid', '=', $tid];
// $map[] = ['gid', '=', $gid];
// $map[] = ['num', '=', 1];
// $map[] = ['bl_id', '=', 0];
// $data = [];
// $data['bl_id'] = $bl_id;
// $data['update_time'] = time();
// $reslut = db::name('user_box_log')->where($map)->order('aid asc')->limit(1)->update($data);
// if (!$reslut) {
// Db::rollback();
// $this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
// return ['code' => 201, 'msg' => '请重试', 'data' => null];
// }
//重新从队列获取一个礼物信息
$gift_data = $redis -> blpop ( $keyname , 2 ); //1s 超时
if ( empty ( $gift_data )) {
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
2025-11-10 14:25:26 +08:00
return [ 'code' => 201 , 'msg' => '奖池数量不足!!!' , 'data' => null ];
2025-08-08 14:45:40 +08:00
}
$gift_data_data = explode ( '-' , $gift_data [ 1 ]);
$bl_id = $gift_data_data [ 0 ];
$gid = $gift_data_data [ 1 ];
}
$data = [];
$data [ 'bl_id' ] = $bl_id ;
$data [ 'gid' ] = $gid ;
$data [ 'bl_id_tid' ] = $tid ;
$user_gift_id_redis_list [] = $data ;
$user_gift_id_list [] = $data ;
}
}
if ( count ( $user_gift_id_list ) != $open_num ) {
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
2025-11-10 14:25:26 +08:00
return [ 'code' => 201 , 'msg' => '奖池数量不足.' , 'data' => null ];
2025-08-08 14:45:40 +08:00
}
//取出所有礼物数据
$gift_list = db :: name ( 'gift' ) -> field ( 'gid,gift_name,gift_price,base_image,play_image,gift_type' ) -> select ();
$gift_list_data = [];
foreach ( $gift_list as $k => & $v ) {
$v [ 'base_image' ] = localpath_to_netpath ( $v [ 'base_image' ]);
$v [ 'play_image' ] = localpath_to_netpath ( $v [ 'play_image' ]);
$gift_list_data [ $v [ 'gid' ]] = $v ;
}
//获取宝箱礼物配置信息
$box_config_list = db :: name ( 'box_config' ) -> field ( 'gid,tid,is_public_screen,is_public_server' ) -> select ();
$box_config_list_data = [];
foreach ( $box_config_list as $k => $v ) {
$box_config_list_data [ $v [ 'gid' ]][ $v [ 'tid' ]] = $v ;
}
//整理用户抽中礼物数量
foreach ( $user_gift_id_list as $k => $v ) {
if ( empty ( $gift_list_data [ $v [ 'gid' ]])) {
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '礼物信息不存在' , 'data' => null ];
}
if ( empty ( $box_config_list_data [ $v [ 'gid' ]])) {
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '宝箱礼物信息不存在' , 'data' => null ];
}
if ( empty ( $user_win_gift_data [ $v [ 'gid' ]])) {
$user_win_gift_data [ $v [ 'gid' ]] = $gift_list_data [ $v [ 'gid' ]];
$user_win_gift_data [ $v [ 'gid' ]][ 'open_num' ] = 1 ;
} else {
$user_win_gift_data [ $v [ 'gid' ]][ 'open_num' ] ++ ;
}
$user_win_gift_data [ $v [ 'gid' ]][ 'bl_id' ] = $v [ 'bl_id' ];
$user_win_gift_data [ $v [ 'gid' ]][ 'bl_id_tid' ] = $v [ 'bl_id_tid' ];
// $user_win_gift_data[$v['gid']]['is_public_screen'] = $box_config_list_data[$v['gid']][$tid]['is_public_screen'];
// $user_win_gift_data[$v['gid']]['is_public_server'] = $box_config_list_data[$v['gid']][$tid]['is_public_server'];
if ( $v [ 'bl_id' ] == 0 ){
$user_win_gift_data [ $v [ 'gid' ]][ 'is_public_screen' ] = $box_config_list_data [ $v [ 'gid' ]][ $v [ 'bl_id_tid' ]][ 'is_public_screen' ];
$user_win_gift_data [ $v [ 'gid' ]][ 'is_public_server' ] = $box_config_list_data [ $v [ 'gid' ]][ $v [ 'bl_id_tid' ]][ 'is_public_server' ];
} else {
$map = [];
$map [] = [ 'bl_id' , '=' , $v [ 'bl_id' ]];
$bl_tid = db :: name ( 'box_log' ) -> where ( $map ) -> value ( 'tid' );
$user_win_gift_data [ $v [ 'gid' ]][ 'is_public_screen' ] = $box_config_list_data [ $v [ 'gid' ]][ $bl_tid ][ 'is_public_screen' ];
$user_win_gift_data [ $v [ 'gid' ]][ 'is_public_server' ] = $box_config_list_data [ $v [ 'gid' ]][ $bl_tid ][ 'is_public_server' ];
}
if ( empty ( $box_log_data [ $v [ 'bl_id' ]])) {
$box_log_data [ $v [ 'bl_id' ]][ 'open_num' ] = 1 ;
$box_log_data [ $v [ 'bl_id' ]][ 'open_gift_value' ] = $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ];
} else {
$box_log_data [ $v [ 'bl_id' ]][ 'open_num' ] ++ ;
$box_log_data [ $v [ 'bl_id' ]][ 'open_gift_value' ] += $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ];
}
$user_win_gift_total_value += $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ];
}
if ( $user_info [ 'is_tester' ] == 1 ){
//扣除账户积分
$reslut = model ( 'admin/User' ) -> change_user_money_by_user_info ( $user_info , - $user_pay_amount , 2 , 16 , " 开宝箱抽礼物 " , $user_info [ 'uid' ], 0 );
if ( $reslut [ 'code' ] != 200 ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => $reslut [ 'msg' ], 'data' => null ];
}
$surplus_user_money = $user_info [ 'integral' ] - $user_pay_amount ;
//消费爵位处理
// $nobility_info = model('Nobility')->user_gain_nobility_value($uid, $user_pay_amount);
// if($nobility_info['code'] == 201){
// Db::rollback();
// $this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
// return ['code' => 201, 'msg' => $nobility_info['msg'], 'data' => null];
// }
} else {
$surplus_user_money = $user_info [ 'integral' ];
}
foreach ( $box_log_data as $k => $v ) {
if ( $k > 0 ) {
$map = [];
$map [] = [ 'bl_id' , '=' , $k ];
$reslut = db :: name ( 'box_log' ) -> where ( $map ) -> inc ( 'open_num' , $v [ 'open_num' ]) -> inc ( 'open_gift_value' , $v [ 'open_gift_value' ]) -> update ();
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
}
//用户必中礼物状态更新
if ( ! empty ( $box_give_gift_info )) {
$map = [];
$map [] = [ 'id' , '=' , $box_give_gift_info [ 'id' ]];
$data = [];
$data [ 'give_time' ] = $now_time ;
$data [ 'give_status' ] = 2 ;
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'box_give_gift' ) -> where ( $map ) -> update ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
//添加用户开宝箱日志 可能存在2期奖情况 特殊处理
$user_box_data_by_bl_id = [];
foreach ( $user_gift_id_list as $k => $v ) {
if ( empty ( $user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]])) {
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'bl_id_tid' ] = $v [ 'bl_id_tid' ];
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'bl_id' ] = $v [ 'bl_id' ];
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'gid' ] = $v [ 'gid' ];
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'open_num' ] = 1 ;
} else {
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'open_num' ] ++ ;
}
}
foreach ( $user_box_data_by_bl_id as $k => $v ) {
$insert_user_box_data = [];
foreach ( $v as $m => $n ) {
$gift_info = $gift_list_data [ $n [ 'gid' ]];
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'rid' ] = $rid ;
$data [ 'tid' ] = $tid ;
$data [ 'bl_id' ] = $n [ 'bl_id' ];
$data [ 'gid' ] = $n [ 'gid' ];
$data [ 'num' ] = $n [ 'open_num' ];
$data [ 'gift_price' ] = $gift_info [ 'gift_price' ];
$data [ 'total_price' ] = $n [ 'open_num' ] * $gift_info [ 'gift_price' ];
$data [ 'total_open_num' ] = $open_num ;
$data [ 'total_pay_price' ] = $n [ 'open_num' ] * $tid_box_price ;
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$insert_user_box_data [] = $data ;
}
$reslut = db :: name ( 'user_box_log' ) -> insertAll ( $insert_user_box_data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
//添加用户开宝箱统计数据
$time = strtotime ( date ( " Y-m-d " ));
$box_type = 0 ;
$map = [];
$map [] = [ 'uid' , '=' , $user_info [ 'uid' ]];
if ( $user_info [ 'is_tester' ] == 2 ) {
if ( $type == 1 ){
$map [] = [ 'box_type' , '=' , 11 ];
$box_type = 11 ;
} else if ( $type == 2 ){
$map [] = [ 'box_type' , '=' , 12 ];
$box_type = 12 ;
} else if ( $type == 3 ){
$map [] = [ 'box_type' , '=' , 13 ];
$box_type = 13 ;
}
} else {
$map [] = [ 'box_type' , '=' , $type ];
$box_type = $type ;
}
$map [] = [ 'add_time' , '>' , $time ];
$user_box_count_info = db :: name ( 'user_box_count' ) -> where ( $map ) -> find ();
if ( ! empty ( $user_box_count_info )) {
$rate = 0 ; //支收比
$rate = round (( $user_win_gift_total_value + $user_box_count_info [ 'in_amount' ]) / ( $user_box_count_info [ 'out_amount' ] + $user_pay_amount ), 4 );
$map = [];
$map [] = [ 'sid' , '=' , $user_box_count_info [ 'sid' ]];
// $map[] = ['uid', '=', $user_info['uid']];
// $map[] = ['box_type', '=', $box_type];
$data = [];
$data [ 'rate' ] = $rate ;
$data [ 'update_time' ] = $now_time ;
$profit = $user_win_gift_total_value - $user_pay_amount ;
$reslut = db :: name ( 'user_box_count' ) -> where ( $map ) -> inc ( 'out_amount' , $user_pay_amount ) -> inc ( 'in_amount' , $user_win_gift_total_value ) -> inc ( 'profit' , $profit ) -> update ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
} else {
$rate = round ( $user_win_gift_total_value / $user_pay_amount , 4 );
$profit = $user_win_gift_total_value - $user_pay_amount ;
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'out_amount' ] = $user_pay_amount ;
$data [ 'in_amount' ] = $user_win_gift_total_value ;
$data [ 'profit' ] = $profit ;
$data [ 'rate' ] = $rate ;
$data [ 'box_type' ] = $box_type ;
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'user_box_count' ) -> insert ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
//添加房间开宝箱统计数据
$time = strtotime ( date ( " Y-m-d " ));
$box_type = 0 ;
$map = [];
$map [] = [ 'rid' , '=' , $rid ];
if ( $user_info [ 'is_tester' ] == 2 ) {
if ( $type == 1 ){
$map [] = [ 'box_type' , '=' , 11 ];
$box_type = 11 ;
} else if ( $type == 2 ){
$map [] = [ 'box_type' , '=' , 12 ];
$box_type = 12 ;
} else if ( $type == 3 ){
$map [] = [ 'box_type' , '=' , 13 ];
$box_type = 13 ;
}
} else {
$map [] = [ 'box_type' , '=' , $type ];
$box_type = $type ;
}
$map [] = [ 'add_time' , '>' , $time ];
$room_box_count_info = db :: name ( 'room_box_count' ) -> where ( $map ) -> find ();
if ( ! empty ( $room_box_count_info )) {
$rate = 0 ; //支收比
$rate = round (( $user_win_gift_total_value + $room_box_count_info [ 'in_amount' ]) / ( $room_box_count_info [ 'out_amount' ] + $user_pay_amount ), 4 );
$map = [];
$map [] = [ 'sid' , '=' , $room_box_count_info [ 'sid' ]];
// $map[] = ['uid', '=', $user_info['uid']];
// $map[] = ['box_type', '=', $box_type];
$data = [];
$data [ 'rate' ] = $rate ;
$data [ 'update_time' ] = $now_time ;
$profit = $user_win_gift_total_value - $user_pay_amount ;
$reslut = db :: name ( 'room_box_count' ) -> where ( $map ) -> inc ( 'out_amount' , $user_pay_amount ) -> inc ( 'in_amount' , $user_win_gift_total_value ) -> inc ( 'profit' , $profit ) -> update ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
} else {
$rate = round ( $user_win_gift_total_value / $user_pay_amount , 4 );
$profit = $user_win_gift_total_value - $user_pay_amount ;
$data = [];
$data [ 'rid' ] = $rid ;
$data [ 'out_amount' ] = $user_pay_amount ;
$data [ 'in_amount' ] = $user_win_gift_total_value ;
$data [ 'profit' ] = $profit ;
$data [ 'rate' ] = $rate ;
$data [ 'box_type' ] = $box_type ;
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'room_box_count' ) -> insert ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
//礼物放入背包
$insert_user_gift_pack_log_data = [];
foreach ( $user_win_gift_data as $k => $v ) {
$map = [];
$map [] = [ 'uid' , '=' , $user_info [ 'uid' ]];
$map [] = [ 'gid' , '=' , $v [ 'gid' ]];
$data = [];
$data [ 'gid' ] = $v [ 'gid' ];
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'user_gift_pack' ) -> where ( $map ) -> inc ( 'num' , $v [ 'open_num' ]) -> inc ( 'total_num' , $v [ 'open_num' ]) -> update ( $data );
if ( ! $reslut ) {
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'gid' ] = $v [ 'gid' ];
$data [ 'total_num' ] = $v [ 'open_num' ];
$data [ 'num' ] = $v [ 'open_num' ];
$data [ 'is_tester' ] = $user_info [ 'is_tester' ];
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'user_gift_pack' ) -> insert ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'type' ] = 2 ;
$data [ 'bl_id' ] = $v [ 'bl_id' ];
$data [ 'gid' ] = $v [ 'gid' ];
$data [ 'gift_price' ] = $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ];
$data [ 'change_num' ] = $v [ 'open_num' ];
$data [ 'total_gift_price' ] = $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ] * $v [ 'open_num' ];
$data [ 'after_num' ] = 0 ;
$data [ 'is_tester' ] = $user_info [ 'is_tester' ];
$data [ 'remarks' ] = " 开宝箱获得 " ;
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$insert_user_gift_pack_log_data [] = $data ;
}
if ( ! empty ( $insert_user_gift_pack_log_data )) {
$reslut = db :: name ( 'user_gift_pack_log' ) -> insertAll ( $insert_user_gift_pack_log_data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
//用户消费累计
if ( $user_info [ 'is_tester' ] != 2 ){
$map = [];
$map [] = [ 'uid' , '=' , $user_info [ 'uid' ]];
if ( $type == 1 ) {
$reslut = db :: name ( 'user' ) -> where ( $map ) -> inc ( 'silver_consume' , $user_pay_amount ) -> update ();
} else if ( $type == 2 ){
$reslut = db :: name ( 'user' ) -> where ( $map ) -> inc ( 'gold_consume' , $user_pay_amount ) -> update ();
} else if ( $type == 3 ) {
$reslut = db :: name ( 'user' ) -> where ( $map ) -> inc ( 'drill_consume' , $user_pay_amount ) -> update ();
}
if ( ! $reslut ){
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
// 提交事务
Db :: commit ();
//推送礼物信息
$user_charm_info = model ( 'User' ) -> get_user_charm_contribution_info ( $user_info [ 'uid' ]);
$push_all_gift_data = [];
$push_group_gift_data = [];
$push_sqb_gift_data = [];
$push_all_gift_data [ 'rid' ] = $rid ;
$push_all_gift_data [ 'user_info' ][ 'uid' ] = $user_info [ 'uid' ];
$push_all_gift_data [ 'user_info' ][ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $user_info [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$push_all_gift_data [ 'user_info' ][ 'head_pic' ] = localpath_to_netpath ( $user_info [ 'head_pic' ]);
$push_all_gift_data [ 'user_info' ][ 'contribution_level_image' ] = $user_charm_info [ 'data' ][ 'contribution_level_image' ];
$push_group_gift_data [ 'rid' ] = $rid ;
$push_group_gift_data [ 'user_info' ][ 'uid' ] = $user_info [ 'uid' ];
$push_group_gift_data [ 'user_info' ][ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $user_info [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$push_group_gift_data [ 'user_info' ][ 'head_pic' ] = localpath_to_netpath ( $user_info [ 'head_pic' ]);
$push_group_gift_data [ 'user_info' ][ 'contribution_level_image' ] = $user_charm_info [ 'data' ][ 'contribution_level_image' ];
// dump($user_win_gift_data);
foreach ( $user_win_gift_data as $k => & $v ) {
//是否大礼物展示
$v [ 'surprise' ] = 0 ;
if ( $v [ 'gift_price' ] > $config [ 'big_gift_price' ]){
$v [ 'surprise' ] = 1 ;
}
unset ( $v [ 'bl_id' ]);
$v [ 'type_name' ] = $box_type_data [ $v [ 'bl_id_tid' ]][ 'show_name' ];
$v [ 'box_type' ] = $v [ 'bl_id_tid' ];
if ( $v [ 'is_public_server' ] == 1 ) {
if ( $v [ 'gift_price' ] > $config [ 'sqb_limit_gift_price' ]){
$sqb_gift_info = $v ;
$sqb_gift_info [ 'uid' ] = $user_info [ 'uid' ];
$sqb_gift_info [ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $user_info [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$sqb_gift_info [ 'head_pic' ] = localpath_to_netpath ( $user_info [ 'head_pic' ]);
$sqb_gift_info [ 'num' ] = $v [ 'open_num' ];
$sqb_gift_info [ 'total_open_num' ] = $open_num ;
$sqb_gift_info [ 'box_type_name' ] = $v [ 'type_name' ];
$push_all_gift_data [ 'gift_list' ][] = $sqb_gift_info ;
}
}
if ( $v [ 'is_public_screen' ] == 1 ) {
$push_group_gift_data [ 'gift_list' ][] = $v ;
}
// if($v['gift_price'] > $config['sqb_limit_gift_price']){
// $sqb_gift_info = $v;
// $sqb_gift_info['uid'] = $user_info['uid'];
// $sqb_gift_info['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
// $sqb_gift_info['head_pic'] = localpath_to_netpath($user_info['head_pic']);
// $sqb_gift_info['num'] = $v['open_num'];
// $sqb_gift_info['total_open_num'] = $open_num;
// $sqb_gift_info['box_type_name'] = $v['type_name'];
// $push_sqb_gift_data['gift_list'][] = $sqb_gift_info;
// }
}
//sqb_limit_gift_price
if ( ! empty ( $push_all_gift_data [ 'gift_list' ])) {
$push_data = [];
$push_data [ 'code' ] = 304 ;
$push_data [ 'msg' ] = " 开宝箱全服播报数据 " ;
$push_data [ 'data' ] = $push_all_gift_data ;
model ( 'api/WebSocketPush' ) -> send_to_all ( $push_data );
} else if ( ! empty ( $push_group_gift_data [ 'gift_list' ])) {
$push_data = [];
$push_data [ 'code' ] = 303 ;
$push_data [ 'msg' ] = " 开宝箱房间播报数据 " ;
$push_data [ 'data' ] = $push_group_gift_data ;
model ( 'api/WebSocketPush' ) -> send_to_group ( $rid , $push_data );
}
$data = [];
$data [ 'win_gift_list' ] = array_values ( $user_win_gift_data );
$data [ 'user_win_gift_total_value' ] = $user_win_gift_total_value ;
$data [ 'user_money' ] = $surplus_user_money ;
$data [ 'user_box_times' ] = $box_limit_times - $user_box_times ;
return [ 'code' => 200 , 'msg' => '开启成功' , 'data' => $data ];
//推送礼物
} catch ( \Exception $e ) {
// 回滚事务
dump ( $e );
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
Db :: rollback ();
return [ 'code' => 201 , 'msg' => '开启失败' , 'data' => null ];
}
}
//返还用户抽中礼物到奖池
private function redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_list )
{
$insert_data = [];
foreach ( $user_gift_id_list as $k => $v ) {
$insert_data [] = $v [ 'bl_id' ] . '-' . $v [ 'gid' ];
}
if ( ! empty ( $insert_data )) {
array_unshift ( $insert_data , $keyname );
//右侧取 右侧插入
call_user_func_array ([ $redis , 'lPush' ], $insert_data );
}
return [ 'code' => 200 , 'msg' => '返还成功' , 'data' => null ];
}
/**
* 幸运树暴条数据
* @ param $uid
* @ return array
* @ throws \think\exception\DbException
* @ throws db\exception\DataNotFoundException
* @ throws db\exception\ModelNotFoundException
*/
public function box_store_consume ( $uid , $type ){
$config = get_system_config ();
$data1 = Db :: table ( 'yy_room_bt' ) -> where ([ 'type' => $type ]) -> order ([ 'id' => 'desc' ]) -> field ( 'consume' ) -> find ();
if ( $type == 4 ){
$xxs_box_consume = $config [ 'xys_bt_bufa_consume_limit1' ]; //补发消费限制 初级
} elseif ( $type == 5 ){
$xxs_box_consume = $config [ 'xys_bt_bufa_consume_limit2' ]; //补发消费限制 高级
} elseif ( $type == 6 ){
$xxs_box_consume = $config [ 'xys_bt_bufa_consume_limit3' ]; //补发消费限制 中级
}
// $xxs_box_consume = $config['xys_bt_bufa_consume_limit'];
$xys_bt_bili_man = $config [ 'xys_bt_bili_man' ];
if ( $data1 ){
$user_consume = $data1 [ 'consume' ] ? : 0 ;
//实际百分比
// $fact_per = sprintf("%.2f", substr(sprintf("%." . (2 + 1) . "f", ($user_consume/$xxs_box_consume)), 0, -1));
// $show_per = ($fact_per>=0.8)?1:$fact_per;
} else {
$user_consume = 0 ;
// $fact_per = 0;
// $show_per = 0;
}
$data3 = [ 'type' => $type , 'xxs_box_consume' => $xxs_box_consume , 'xxs_dis_box_consume' => $xxs_box_consume * $xys_bt_bili_man , 'xxs_user_consume' => $user_consume ];
return [ 'code' => 200 , 'msg' => '开启成功' , 'data' => $data3 ];
}
public function get_box_list ( $tid )
{
$map = [];
// if($tid == 1){
// $map[] = ['tid', 'in',[1,61]];
// }else if($tid == 2){
// $map[] = ['tid', 'in',[11,62]];
// }else if($tid == 3){
// $map[] = ['tid', 'in',[21,63]];
// }else if($tid == 4){
// $map[] = ['tid', 'in',[31,64]];
// }else if($tid == 5){
// $map[] = ['tid', 'in',[41,65]];
// }else if($tid == 6){
// $map[] = ['tid', 'in',[51,66]];
// }
if ( $tid == 1 ){
$map [] = [ 'tid' , 'in' ,[ 1 ]];
} else if ( $tid == 2 ){
$map [] = [ 'tid' , 'in' ,[ 11 ]];
} else if ( $tid == 3 ){
$map [] = [ 'tid' , 'in' ,[ 21 ]];
}
// $map[] = ['tid', '=', $tid];
$box_config_gid_arr = db :: name ( 'box_config' ) -> where ( $map ) -> column ( 'gid' );
$map = [];
$map [] = [ 'gid' , 'in' , $box_config_gid_arr ];
$gift_list = db :: name ( 'gift' ) -> where ( $map ) -> field ( 'gid,gift_name,gift_price,base_image,play_image' ) -> order ( 'gift_price asc' ) -> cache ( 600 ) -> select ();
foreach ( $gift_list as $k => & $v ) {
$v [ 'base_image' ] = localpath_to_netpath ( $v [ 'base_image' ]);
$v [ 'play_image' ] = localpath_to_netpath ( $v [ 'play_image' ]);
}
return [ 'code' => 200 , 'msg' => '获取成功' , 'data' => $gift_list ];
}
public function get_box_lists ( $tid )
{
$gift_list = [];
$gift_list [ 'one' ] = [];
$gift_list [ 'two' ] = [];
$gift_list [ 'three' ] = [];
$map = [];
$map [] = [ 'tid' , 'in' ,[ 31 ]];
// $map[] = ['tid', '=', $tid];
$box_config_gid_arr = db :: name ( 'box_config' ) -> where ( $map ) -> column ( 'gid' );
$map = [];
$map [] = [ 'gid' , 'in' , $box_config_gid_arr ];
$gift_list [ 'one' ] = db :: name ( 'gift' ) -> where ( $map ) -> field ( 'gid,gift_name,gift_price,base_image,play_image' ) -> order ( 'gift_price asc' ) -> cache ( 600 ) -> select ();
foreach ( $gift_list [ 'one' ] as $k => & $v ) {
$v [ 'base_image' ] = localpath_to_netpath ( $v [ 'base_image' ]);
$v [ 'play_image' ] = localpath_to_netpath ( $v [ 'play_image' ]);
}
$map = [];
$map [] = [ 'tid' , 'in' ,[ 41 ]];
$box_config_gid_arr = db :: name ( 'box_config' ) -> where ( $map ) -> column ( 'gid' );
$map = [];
$map [] = [ 'gid' , 'in' , $box_config_gid_arr ];
$gift_list [ 'two' ] = db :: name ( 'gift' ) -> where ( $map ) -> field ( 'gid,gift_name,gift_price,base_image,play_image' ) -> order ( 'gift_price asc' ) -> cache ( 600 ) -> select ();
foreach ( $gift_list [ 'two' ] as $k => & $v ) {
$v [ 'base_image' ] = localpath_to_netpath ( $v [ 'base_image' ]);
$v [ 'play_image' ] = localpath_to_netpath ( $v [ 'play_image' ]);
}
$map = [];
$map [] = [ 'tid' , 'in' ,[ 51 ]];
$box_config_gid_arr = db :: name ( 'box_config' ) -> where ( $map ) -> column ( 'gid' );
$map = [];
$map [] = [ 'gid' , 'in' , $box_config_gid_arr ];
$gift_list [ 'three' ] = db :: name ( 'gift' ) -> where ( $map ) -> field ( 'gid,gift_name,gift_price,base_image,play_image' ) -> order ( 'gift_price asc' ) -> cache ( 600 ) -> select ();
foreach ( $gift_list [ 'three' ] as $k => & $v ) {
$v [ 'base_image' ] = localpath_to_netpath ( $v [ 'base_image' ]);
$v [ 'play_image' ] = localpath_to_netpath ( $v [ 'play_image' ]);
}
return [ 'code' => 200 , 'msg' => '获取成功' , 'data' => $gift_list ];
}
//获取开宝箱手气榜
public function get_box_user_out_amount_rank ( $box_type , $time_type )
{
$start_time = 0 ;
$end_time = 0 ;
$date_time = strtotime ( date ( 'Ymd' ));
if ( $time_type == 1 ) {
$start_time = $date_time ;
$end_time = $date_time + 86400 ;
} elseif ( $time_type == 2 ) {
$start_time = $date_time - 86400 ;
$end_time = $date_time ;
} elseif ( $time_type == 3 ) {
$wn = date ( 'w' , $date_time );
if ( $wn == 0 ) {
$n = 6 ;
} else {
$n = $wn - 1 ;
}
$start_time = $date_time - $n * 86400 ;
$end_time = time ();
} else {
return [ 'code' => 201 , 'msg' => '参数错误' , 'data' => []];
}
$map = [];
$box_type_arr = [];
// if($box_type == 1) {
// $box_type_arr = [1,11];
// } elseif ($box_type == 2) {
// $box_type_arr = [2,12];
// }elseif ($box_type == 3) {
// $box_type_arr = [3,13];
// }elseif ($box_type == 4) {
// $box_type_arr = [4,14];
// }elseif ($box_type == 5) {
// $box_type_arr = [5,15];
// }elseif ($box_type == 6) {
// $box_type_arr = [6,16];
// }
if ( $box_type == 1 ) {
$box_type_arr = [ 1 ];
} elseif ( $box_type == 2 ) {
$box_type_arr = [ 2 ];
} elseif ( $box_type == 3 ) {
$box_type_arr = [ 3 ];
}
$map [] = [ 'box_type' , 'in' , $box_type_arr ];
$map [] = [ 'add_time' , 'between' , [ $start_time , $end_time ]];
$list = Db :: name ( 'user_box_count' ) -> where ( $map ) -> field ( 'uid,SUM(out_amount) as out_amount' ) -> group ( 'uid' ) -> order ( 'out_amount' , 'desc' ) -> limit ( 10 ) -> select ();
$uid_list = array_column ( $list , 'uid' );
$map = [];
$map [] = [ 'uid' , 'in' , $uid_list ];
$user_list = db :: name ( 'user' ) -> field ( 'uid,head_pic,base64_nick_name' ) -> where ( $map ) -> select ();
$user_list_data = [];
foreach ( $user_list as $k => $v ) {
$user_list_data [ $v [ 'uid' ]][ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $v [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$user_list_data [ $v [ 'uid' ]][ 'head_pic' ] = localpath_to_netpath ( $v [ 'head_pic' ]);
}
foreach ( $list as $k => & $v ) {
$v [ 'nick_name' ] = $user_list_data [ $v [ 'uid' ]][ 'nick_name' ];
$v [ 'head_pic' ] = $user_list_data [ $v [ 'uid' ]][ 'head_pic' ];
}
return [ 'code' => 200 , 'msg' => '获取成功' , 'data' => $list ];
}
//获取开宝箱手气榜
public function get_box_user_sqb_rank ( $rid , $box_type , $page , $page_limit )
{
$page_limit = $page_limit < 30 ? $page_limit : 30 ;
$page = intval (( $page - 1 ) * $page_limit );
if ( ! empty ( $rid )) {
$map = [];
$map [] = [ 'rid' , '=' , $rid ];
$map [] = [ 'is_delete' , '=' , 1 ];
$room_info = db :: name ( 'room' ) -> where ( $map ) -> find ();
if ( empty ( $room_info )) {
return [ 'code' => 201 , 'msg' => '房间信息不存在' , 'data' => null ];
}
}
$sqb_limit_gift_price = get_system_config ( 'sqb_limit_gift_price' );
$map = [];
if ( ! empty ( $rid )) {
$map [] = [ 'rid' , '=' , $rid ];
}
// $map[] = ['tid', 'in', [1,2,11,12,21,22,31,41,51,61,62,63,64,65,66]];
$map [] = [ 'tid' , 'in' , [ 1 , 11 , 21 ]];
// if($box_type==1){
// $map[] = ['tid', 'in',[1,2,3,4,31,32,33,34]];
// }elseif($box_type == 2){
// $map[] = ['tid', 'in',[11,12,13,14,33,34]];
// }elseif($box_type == 3){
// $map[] = ['tid', 'in',[21,22,35,36]];
// }
$map [] = [ 'gift_price' , '>' , $sqb_limit_gift_price ];
$user_box_log_list = db :: name ( 'user_box_log' ) -> field ( 'uid,gid,rid,tid,num,total_open_num,gift_price,total_price,add_time' ) -> where ( $map ) -> whereTime ( 'add_time' , 'today' ) -> limit ( $page , $page_limit ) -> order ( 'aid desc' ) -> select ();
// dump($user_box_log_list);exit;
$map = [];
$gift_list = db :: name ( 'gift' ) -> cache ( 60 ) -> where ( $map ) -> select ();
$gift_data = [];
foreach ( $gift_list as $k => $v ) {
$gift_data [ $v [ 'gid' ]][ 'gift_name' ] = $v [ 'gift_name' ];
$gift_data [ $v [ 'gid' ]][ 'base_image' ] = localpath_to_netpath ( $v [ 'base_image' ]);
}
$uid_list = array_column ( $user_box_log_list , 'uid' );
$map = [];
$map [] = [ 'uid' , 'in' , $uid_list ];
$user_list = db :: name ( 'user' ) -> field ( 'uid,head_pic,base64_nick_name' ) -> where ( $map ) -> select ();
$user_list_data = [];
foreach ( $user_list as $k => $v ) {
$user_list_data [ $v [ 'uid' ]][ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $v [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$user_list_data [ $v [ 'uid' ]][ 'head_pic' ] = localpath_to_netpath ( $v [ 'head_pic' ]);
}
$box_type_data = db :: name ( 'box_type' ) -> cache ( 60 ) -> column ( 'show_name' , 'tid' );
foreach ( $user_box_log_list as $k => & $v ) {
$v [ 'nick_name' ] = $user_list_data [ $v [ 'uid' ]][ 'nick_name' ];
$v [ 'head_pic' ] = $user_list_data [ $v [ 'uid' ]][ 'head_pic' ];
$v [ 'gift_name' ] = $gift_data [ $v [ 'gid' ]][ 'gift_name' ];
$v [ 'base_image' ] = $gift_data [ $v [ 'gid' ]][ 'base_image' ];
$v [ 'box_type_name' ] = $box_type_data [ $v [ 'tid' ]];
}
return [ 'code' => 200 , 'msg' => '获取成功' , 'data' => $user_box_log_list ];
}
//获取开宝箱手气榜
public function get_box_user_gift_rank ( $page , $page_limit )
{
if ( $page > 1 ) {
return [ 'code' => 200 , 'msg' => '获取成功' , 'data' => []];
}
// $page_limit = $page_limit < 30 ? $page_limit : 30;
// $page = intval(($page-1)*$page_limit);
$page_limit = 20 ;
$page = 0 ;
$sqb_limit_gift_price = get_system_config ( 'sqb_limit_gift_price' );
$map = [];
// $map[] = ['tid', 'in',[1,2,11,12,21,22,31,41,51,61,62,63,64,65,66]];
$map [] = [ 'tid' , 'in' , [ 1 , 11 , 21 ]];
$map [] = [ 'gift_price' , '>' , $sqb_limit_gift_price ];
$user_box_log_list = db :: name ( 'user_box_log' ) -> field ( 'uid,gid,rid,tid,num,total_open_num,gift_price,total_price,add_time' ) -> where ( $map ) -> limit ( $page , $page_limit ) -> order ( 'aid desc' ) -> select ();
// dump($user_box_log_list);exit;
$map = [];
$gift_list = db :: name ( 'gift' ) -> cache ( 60 ) -> where ( $map ) -> select ();
$gift_data = [];
foreach ( $gift_list as $k => $v ) {
$gift_data [ $v [ 'gid' ]][ 'gift_name' ] = $v [ 'gift_name' ];
$gift_data [ $v [ 'gid' ]][ 'base_image' ] = localpath_to_netpath ( $v [ 'base_image' ]);
}
$uid_list = array_column ( $user_box_log_list , 'uid' );
$map = [];
$map [] = [ 'uid' , 'in' , $uid_list ];
$user_list = db :: name ( 'user' ) -> field ( 'uid,head_pic,base64_nick_name' ) -> where ( $map ) -> select ();
$user_list_data = [];
foreach ( $user_list as $k => $v ) {
$user_list_data [ $v [ 'uid' ]][ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $v [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$user_list_data [ $v [ 'uid' ]][ 'head_pic' ] = localpath_to_netpath ( $v [ 'head_pic' ]);
}
$box_type_data = db :: name ( 'box_type' ) -> cache ( 60 ) -> column ( 'show_name' , 'tid' );
foreach ( $user_box_log_list as $k => & $v ) {
$v [ 'nick_name' ] = $user_list_data [ $v [ 'uid' ]][ 'nick_name' ];
$v [ 'head_pic' ] = $user_list_data [ $v [ 'uid' ]][ 'head_pic' ];
$v [ 'gift_name' ] = $gift_data [ $v [ 'gid' ]][ 'gift_name' ];
$v [ 'base_image' ] = $gift_data [ $v [ 'gid' ]][ 'base_image' ];
$v [ 'box_type_name' ] = $box_type_data [ $v [ 'tid' ]];
}
return [ 'code' => 200 , 'msg' => '获取成功' , 'data' => $user_box_log_list ];
}
//获取用户开出礼物列表
public function get_user_box_gift_list ( $uid , $box_type , $page , $page_limit )
{
$page = intval ( $page );
$page_limit = $page_limit < 30 ? $page_limit : 30 ;
$map = [];
// $map['a.uid'] = $uid;
$map [] = [ 'a.uid' , '=' , $uid ];
// if($box_type==1){
// $map[] = ['a.tid', 'in',[1,2,11,12,21,22,31,41,51,61,62,63,64,65,66]];
$map [] = [ 'tid' , 'in' , [ 1 , 11 , 21 ]];
// }else{
// $map[] = ['a.tid', 'in',[3,4]];
// }
$model = Db :: name ( 'user_box_log' ) -> alias ( 'a' ) -> join ( 'yy_gift b' , 'a.gid = b.gid' );
$model = $model -> where ( $map );
$list = $model -> field ( 'a.num,b.gid,b.gift_name,b.base_image,a.add_time,a.uid,a.tid,a.total_open_num' ) -> order ( 'a.aid desc' ) -> page ( $page , $page_limit ) -> select ();
$uid_list = array_column ( $list , 'uid' );
$map = [];
$map [] = [ 'uid' , 'in' , $uid_list ];
$user_list = db :: name ( 'user' ) -> field ( 'uid,head_pic,base64_nick_name' ) -> where ( $map ) -> select ();
$user_list_data = [];
foreach ( $user_list as $k => $v ) {
$user_list_data [ $v [ 'uid' ]][ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $v [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$user_list_data [ $v [ 'uid' ]][ 'head_pic' ] = localpath_to_netpath ( $v [ 'head_pic' ]);
}
$map = [];
$gift_list = db :: name ( 'gift' ) -> cache ( 60 ) -> where ( $map ) -> select ();
$gift_data = [];
foreach ( $gift_list as $k => $v ) {
$gift_data [ $v [ 'gid' ]][ 'gift_name' ] = $v [ 'gift_name' ];
$gift_data [ $v [ 'gid' ]][ 'base_image' ] = localpath_to_netpath ( $v [ 'base_image' ]);
}
$box_type_data = db :: name ( 'box_type' ) -> cache ( 60 ) -> column ( 'show_name' , 'tid' );
foreach ( $list as $k => & $v ) {
$v [ 'base_image' ] = localpath_to_netpath ( $v [ 'base_image' ]);
$v [ 'head_pic' ] = $user_list_data [ $v [ 'uid' ]][ 'head_pic' ];
$v [ 'gift_name' ] = $gift_data [ $v [ 'gid' ]][ 'gift_name' ];
$v [ 'base_image' ] = $gift_data [ $v [ 'gid' ]][ 'base_image' ];
$v [ 'box_type_name' ] = $box_type_data [ $v [ 'tid' ]];
$v [ 'nick_name' ] = $user_list_data [ $v [ 'uid' ]][ 'nick_name' ];
}
return [ 'code' => 200 , 'msg' => '获取成功' , 'data' => $list ];
}
//获取宝箱公告
public function get_box_note ( $type )
{
// if(in_array($type,[4,5,6])){
// $box_note = get_system_config('box_note1');
// }else{
// $box_note = get_system_config('box_note');
// }
$box_note = get_system_config ( 'box_note' );
return [ 'code' => 200 , 'msg' => '获取成功' , 'data' => $box_note ];
}
public function open_affiliate_box ( $uid , $rid , $type , $open_num , $tid )
{
if ( ! in_array ( $open_num , [ 1 , 10 , 100 ])) {
return [ 'code' => 201 , 'msg' => '开奖次数参数非法' , 'data' => null ];
}
$config = get_system_config ();
$gold_price = $config [ 'box_unit_price' ];
$drill_price = $config [ 'box_drill_price' ];
$silver_price = $config [ 'box_silver_price' ];
$platina_price = $config [ 'box_platina_price' ];
$user_gift_id_list = []; //用户抽中礼物id集合
$user_gift_id_redis_list = []; //用户抽中redis礼物id集合
$user_win_gift_data = []; //抽中礼物列表
$box_log_data = []; //抽中礼物期数数据
$box_type_data = []; //宝箱类型配置信息
$user_pay_amount = 0 ; //用户支付总额
$user_win_gift_total_value = 0 ; //抽中礼物总价值
$surplus_user_money = 0 ; //用户剩余资金
$europe_key = 0 ; //用户所得欧皇钥匙
$now_time = time ();
// $tid = $tid;
$user_info = db :: name ( 'user' ) -> find ( $uid ); //获取用户信息
if ( ! $user_info ){
return [ 'code' => 201 , 'msg' => '用户信息错误' , 'data' => null ];
}
if ( $type == 1 ){
// $tid = 25;
$tid_box_price = $silver_price ;
} else if ( $type == 2 ){
// $tid = 26;
$tid_box_price = $gold_price ;
} else if ( $type == 3 ){
// $tid = 27;
$tid_box_price = $drill_price ;
} else if ( $type == 4 ){
// $tid = 28;
$tid_box_price = $platina_price ;
} else {
return [ 'code' => 201 , 'msg' => '参数错误' , 'data' => null ];
}
$user_pay_amount = $open_num * $tid_box_price ;
$map = [];
$map [ 'rid' ] = $rid ;
$map [ 'is_delete' ] = 1 ;
$room_info = db :: name ( 'room' ) -> field ( 'rid,is_auto_accumulate' ) -> where ( $map ) -> find ();
if ( empty ( $room_info )) {
return [ 'code' => 201 , 'msg' => '房间信息不存在' , 'data' => null ];
}
//个池数据是否充足
$redis = connectionRedis ();
$gift_price_data = db :: name ( 'gift' ) -> column ( 'gift_price' , 'gid' ); //礼物价值
$map = [];
$map [] = [ 'tid' , '=' , $tid ];
$box_config_lists = Db :: name ( 'box_config' ) -> where ( $map ) -> select ();
if ( empty ( $box_config_lists )){
return [ 'code' => 201 , 'msg' => '奖池数量不足' , 'data' => null ];
}
$keyname = " box:list:tid: " . $tid . ':uid:' . $uid ;
$list_len = 0 ;
// $del = $redis->del($keyname);
$list_len = $redis -> llen ( $keyname );
// $list_lens = $redis->lrange($keyname,0,-1);
// dump($list_lens);
// dump($list_len);exit;
if ( $tid == 35 || $tid == 36 ) {
$len = 15 ;
} else {
$len = 150 ;
}
if ( $list_len < $len ){
$insert_data = [];
$total_gift_value = 0 ;
//获取0次开出的礼物
$where = [];
$where [] = [ 'tid' , '=' , $tid ];
$where [] = [ 'open_num_obtain' , '=' , 0 ];
$box_config_zero_lists = db :: name ( 'box_config' ) -> where ( $where ) -> select ();
foreach ( $box_config_zero_lists as $a => $b ) {
//更新添加次数
for ( $q = 0 ; $q < $b [ 'num' ]; $q ++ ) {
$insert_data [] = $b [ 'gid' ];
}
if ( empty ( $gift_price_data [ $b [ 'gid' ]]) && $gift_price_data [ $b [ 'gid' ]] != 0 ) {
return [ 'code' => 201 , 'msg' => '礼物id:' . $b [ 'gid' ] . '不存在' , 'data' => '' ];
}
$total_gift_value += $gift_price_data [ $b [ 'gid' ]] * $b [ 'num' ];
}
shuffle ( $insert_data );
//获取0次以上开出的礼物
$where = [];
$where [] = [ 'tid' , '=' , $tid ];
$where [] = [ 'open_num_obtain' , '>' , 0 ];
$box_config_unzero_lists = db :: name ( 'box_config' ) -> where ( $where ) -> order ( 'open_num_obtain asc' ) -> select ();
foreach ( $box_config_unzero_lists as $c => $d ){
$da = [];
for ( $i = 0 ; $i < $d [ 'num' ]; $i ++ ) {
$da [] = $d [ 'gid' ];
}
$total_gift_value += $gift_price_data [ $d [ 'gid' ]] * $d [ 'num' ];
$data_count = count ( $insert_data );
$box_open_num = $data_count - $d [ 'open_num_obtain' ];
$box_array = array_slice ( $insert_data , 0 , $d [ 'open_num_obtain' ]);
$box_array_1 = array_slice ( $insert_data , - $box_open_num , $box_open_num );
$insert_data = array_merge ( $box_array_1 , $da );
shuffle ( $insert_data );
$insert_data = array_merge ( $box_array , $insert_data );
}
$map = [];
$map [] = [ 'tid' , '=' , $tid ];
$map [] = [ 'uid' , '=' , $uid ];
$map [] = [ 'del_status' , '=' , 1 ];
$box_person_log = db :: name ( 'box_person_log' ) -> where ( $map ) -> field ( 'bl_id,total_num,total_gift_value' ) -> find ();
//插入期日志表
if ( ! empty ( $box_person_log )){
$bl_id = $box_person_log [ 'bl_id' ];
$data = [];
$data [ 'total_num' ] = count ( $insert_data ) + $box_person_log [ 'total_num' ];
$data [ 'total_gift_value' ] = $total_gift_value + $box_person_log [ 'total_gift_value' ];
$data [ 'update_time' ] = time ();
$reslut = db :: name ( 'box_person_log' ) -> where ([ 'bl_id' => $box_person_log [ 'bl_id' ]]) -> inc ( 'term' , 1 ) -> update ( $data );
if ( ! $reslut ){
return [ 'code' => 201 , 'msg' => '' , 'data' => null ];
}
} else {
$data = [];
$data [ 'tid' ] = $tid ;
$data [ 'uid' ] = $uid ;
$data [ 'total_num' ] = count ( $insert_data );
$data [ 'total_gift_value' ] = $total_gift_value ;
$data [ 'config_text' ] = json_encode ( $box_config_lists );
$data [ 'add_time' ] = time ();
$data [ 'update_time' ] = time ();
$bl_id = db :: name ( 'box_person_log' ) -> insertGetId ( $data );
if ( ! $bl_id ){
return [ 'code' => 201 , 'msg' => '' , 'data' => null ];
}
}
foreach ( $insert_data as $p => $q ) {
$insert_data [ $p ] = $bl_id . '-' . $insert_data [ $p ];
}
// shuffle($insert_data);
array_unshift ( $insert_data , $keyname );
call_user_func_array ([ $redis , 'rPush' ], $insert_data );
}
Db :: startTrans ();
try {
//获取用户必中信息 (每次补发一个)
$map = [];
$map [] = [ 'uid' , '=' , $uid ];
$map [] = [ 'tid' , '=' , $tid ];
$map [] = [ 'is_admin' , '=' , 1 ];
$map [] = [ 'give_status' , '=' , 1 ];
$box_give_gift_info = db :: name ( 'box_give_gift' ) -> where ( $map ) -> find ();
//插入用户必中
$need_open_num = $open_num ;
if ( ! empty ( $box_give_gift_info )) {
$data = [];
$data [ 'bl_id' ] = 0 ;
$data [ 'gid' ] = $box_give_gift_info [ 'gid' ];
$user_gift_id_list [] = $data ;
$need_open_num -- ; //待取礼物总数-1
}
//获取待核销必中礼物数据
$map = [];
$map [] = [ 'uid' , '=' , $uid ];
$map [] = [ 'tid' , '=' , $tid ];
$map [] = [ 'give_status' , '=' , 2 ];
$map [] = [ 'deduction_status' , '=' , 1 ];
$box_un_deduction_give_gift_list = db :: name ( 'box_give_gift' ) -> where ( $map ) -> order ( 'id asc' ) -> column ( 'id' , 'gid' ); //每种礼物只核销第一个
//获取待开奖池礼物
for ( $i = 0 ; $i < $need_open_num ; $i ++ ) {
$gift_data = $redis -> blpop ( $keyname , 2 ); //1s 超时
if ( empty ( $gift_data )) {
// $this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_list);
return [ 'code' => 201 , 'msg' => '奖池数量不足' , 'data' => null ];
} else {
//获取是否有待核销必中
$gift_data_data = explode ( '-' , $gift_data [ 1 ]);
$bl_id = $gift_data_data [ 0 ];
$gid = $gift_data_data [ 1 ];
if ( ! empty ( $box_un_deduction_give_gift_list [ $gid ])) {
$id = $box_un_deduction_give_gift_list [ $gid ];
unset ( $box_un_deduction_give_gift_list [ $gid ]);
$data = [];
$data [ 'bl_id' ] = $bl_id ;
$data [ 'gid' ] = $gid ;
$user_gift_id_redis_list [] = $data ;
//更新对应数据
//补偿表 更新
$map = [];
$map [] = [ 'id' , '=' , $id ];
$map [] = [ 'tid' , '=' , $tid ];
$map [] = [ 'gid' , '=' , $gid ];
$map [] = [ 'deduction_status' , '=' , 1 ];
$data = [];
$data [ 'deduction_bl_id' ] = $bl_id ;
$data [ 'deduction_status' ] = 2 ;
$data [ 'deduction_time' ] = time ();
$data [ 'update_time' ] = time ();
$reslut = db :: name ( 'box_give_gift' ) -> where ( $map ) -> order ( 'id asc' ) -> limit ( 1 ) -> update ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
//开宝箱记录表更新
// $map = [];
// $map[] = ['uid', '=', $uid];
// $map[] = ['tid', '=', $tid];
// $map[] = ['gid', '=', $gid];
// $map[] = ['num', '=', 1];
// $map[] = ['bl_id', '=', 0];
// $data = [];
// $data['bl_id'] = $bl_id;
// $data['update_time'] = time();
// $reslut = db::name('user_box_log')->where($map)->order('aid asc')->limit(1)->update($data);
// if (!$reslut) {
// Db::rollback();
// $this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
// return ['code' => 201, 'msg' => '请重试', 'data' => null];
// }
//重新从队列获取一个礼物信息
$gift_data = $redis -> blpop ( $keyname , 2 ); //1s 超时
if ( empty ( $gift_data )) {
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '奖池数量不足' , 'data' => null ];
}
$gift_data_data = explode ( '-' , $gift_data [ 1 ]);
$bl_id = $gift_data_data [ 0 ];
$gid = $gift_data_data [ 1 ];
}
$data = [];
$data [ 'bl_id' ] = $bl_id ;
$data [ 'gid' ] = $gid ;
$user_gift_id_redis_list [] = $data ;
$user_gift_id_list [] = $data ;
}
}
if ( count ( $user_gift_id_list ) != $open_num ) {
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '奖池数量不足' , 'data' => null ];
}
//取出所有礼物数据
$gift_list = db :: name ( 'gift' ) -> field ( 'gid,gift_name,gift_price,base_image,play_image,gift_type' ) -> cache ( 10 ) -> select ();
$gift_list_data = [];
foreach ( $gift_list as $k => & $v ) {
$v [ 'base_image' ] = localpath_to_netpath ( $v [ 'base_image' ]);
$v [ 'play_image' ] = localpath_to_netpath ( $v [ 'play_image' ]);
$gift_list_data [ $v [ 'gid' ]] = $v ;
}
//获取宝箱礼物配置信息
$box_config_list = db :: name ( 'box_config' ) -> field ( 'gid,tid,is_public_screen,is_public_server' ) -> cache ( 10 ) -> select ();
$box_config_list_data = [];
foreach ( $box_config_list as $k => $v ) {
$box_config_list_data [ $v [ 'gid' ]][ $v [ 'tid' ]] = $v ;
}
//整理用户抽中礼物数量
foreach ( $user_gift_id_list as $k => $v ) {
if ( empty ( $gift_list_data [ $v [ 'gid' ]])) {
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '礼物信息不存在' , 'data' => null ];
}
if ( empty ( $box_config_list_data [ $v [ 'gid' ]])) {
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '宝箱礼物信息不存在' , 'data' => null ];
}
if ( empty ( $user_win_gift_data [ $v [ 'gid' ]])) {
$user_win_gift_data [ $v [ 'gid' ]] = $gift_list_data [ $v [ 'gid' ]];
$user_win_gift_data [ $v [ 'gid' ]][ 'open_num' ] = 1 ;
} else {
$user_win_gift_data [ $v [ 'gid' ]][ 'open_num' ] ++ ;
}
$user_win_gift_data [ $v [ 'gid' ]][ 'bl_id' ] = $v [ 'bl_id' ];
$user_win_gift_data [ $v [ 'gid' ]][ 'is_public_screen' ] = $box_config_list_data [ $v [ 'gid' ]][ $tid ][ 'is_public_screen' ];
$user_win_gift_data [ $v [ 'gid' ]][ 'is_public_server' ] = $box_config_list_data [ $v [ 'gid' ]][ $tid ][ 'is_public_server' ];
$user_win_gift_total_value += $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ];
if ( empty ( $box_log_data [ $v [ 'bl_id' ]])) {
$box_log_data [ $v [ 'bl_id' ]][ 'open_num' ] = 1 ;
$box_log_data [ $v [ 'bl_id' ]][ 'open_gift_value' ] = $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ];
} else {
$box_log_data [ $v [ 'bl_id' ]][ 'open_num' ] ++ ;
$box_log_data [ $v [ 'bl_id' ]][ 'open_gift_value' ] += $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ];
}
}
//扣除账户积分
$reslut = model ( 'admin/User' ) -> change_user_money_by_user_info ( $user_info , - $user_pay_amount , 2 , 16 , " 开宝箱抽礼物 " , $user_info [ 'uid' ], 0 );
if ( $reslut [ 'code' ] != 200 ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => $reslut [ 'msg' ], 'data' => null ];
}
$surplus_user_money = $user_info [ 'integral' ] - $user_pay_amount ;
foreach ( $box_log_data as $k => $v ) {
if ( $k > 0 ) {
$map = [];
$map [] = [ 'bl_id' , '=' , $k ];
$reslut = db :: name ( 'box_person_log' ) -> where ( $map ) -> inc ( 'open_num' , $v [ 'open_num' ]) -> inc ( 'open_gift_value' , $v [ 'open_gift_value' ]) -> update ();
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
}
//用户必中礼物状态更新
if ( ! empty ( $box_give_gift_info )) {
$map = [];
$map [] = [ 'id' , '=' , $box_give_gift_info [ 'id' ]];
$data = [];
$data [ 'give_time' ] = $now_time ;
$data [ 'give_status' ] = 2 ;
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'box_give_gift' ) -> where ( $map ) -> update ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '' , 'data' => null ];
}
}
//添加用户开宝箱日志
$user_box_data_by_bl_id = [];
foreach ( $user_gift_id_list as $k => $v ) {
if ( empty ( $user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]])) {
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'bl_id' ] = $v [ 'bl_id' ];
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'gid' ] = $v [ 'gid' ];
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'open_num' ] = 1 ;
} else {
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'open_num' ] ++ ;
}
}
foreach ( $user_box_data_by_bl_id as $k => $v ) {
$insert_user_box_data = [];
foreach ( $v as $m => $n ) {
$gift_info = $gift_list_data [ $n [ 'gid' ]];
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'rid' ] = $rid ;
$data [ 'tid' ] = $tid ;
$data [ 'bl_id' ] = $n [ 'bl_id' ];
$data [ 'gid' ] = $n [ 'gid' ];
$data [ 'num' ] = $n [ 'open_num' ];
$data [ 'gift_price' ] = $gift_info [ 'gift_price' ];
$data [ 'total_price' ] = $n [ 'open_num' ] * $gift_info [ 'gift_price' ];
$data [ 'total_pay_price' ] = $n [ 'open_num' ] * $tid_box_price ;
$data [ 'total_open_num' ] = $open_num ;
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$insert_user_box_data [] = $data ;
}
$reslut = db :: name ( 'user_box_log' ) -> insertAll ( $insert_user_box_data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '' , 'data' => null ];
}
}
//添加用户开宝箱数据统计
$time = strtotime ( date ( " Y-m-d " ));
$map = [];
$map [] = [ 'uid' , '=' , $user_info [ 'uid' ]];
// if($type == 2){
// $box_type = 5;
// $map[] = ['box_type', '=', 5];
// }else{
$box_type = $type ;
$map [] = [ 'box_type' , '=' , $box_type ];
// }
$map [] = [ 'add_time' , '>' , $time ];
$user_box_count_info = db :: name ( 'user_box_count' ) -> where ( $map ) -> find ();
if ( ! empty ( $user_box_count_info )) {
$rate = 0 ; //支收比
$rate = round (( $user_win_gift_total_value + $user_box_count_info [ 'in_amount' ]) / ( $user_box_count_info [ 'out_amount' ] + $user_pay_amount ), 4 );
$map = [];
$map [] = [ 'sid' , '=' , $user_box_count_info [ 'sid' ]];
// $map[] = ['uid', '=', $user_info['uid']];
// $map[] = ['box_type', '=', $box_type];
$data = [];
$data [ 'rate' ] = $rate ;
$data [ 'update_time' ] = $now_time ;
$profit = $user_win_gift_total_value - $user_pay_amount ;
$reslut = db :: name ( 'user_box_count' ) -> where ( $map ) -> inc ( 'out_amount' , $user_pay_amount ) -> inc ( 'in_amount' , $user_win_gift_total_value ) -> inc ( 'profit' , $profit ) -> update ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '' , 'data' => null ];
}
} else {
$rate = round ( $user_win_gift_total_value / $user_pay_amount , 4 );
$profit = $user_win_gift_total_value - $user_pay_amount ;
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'box_type' ] = $box_type ;
$data [ 'out_amount' ] = $user_pay_amount ;
$data [ 'in_amount' ] = $user_win_gift_total_value ;
$data [ 'profit' ] = $profit ;
$data [ 'rate' ] = $rate ;
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'user_box_count' ) -> insert ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '' , 'data' => null ];
}
}
//添加房间开宝箱数据统计
$time = strtotime ( date ( " Y-m-d " ));
$map = [];
$map [] = [ 'rid' , '=' , $rid ];
// if($type == 2){
// $box_type = 5;
// $map[] = ['box_type', '=', 5];
// }else{
$box_type = $type ;
$map [] = [ 'box_type' , '=' , $box_type ];
// }
// $box_type = $type;
// $map[] = ['box_type', '=', $box_type];
$map [] = [ 'add_time' , '>' , $time ];
$room_box_count_info = db :: name ( 'room_box_count' ) -> where ( $map ) -> find ();
if ( ! empty ( $room_box_count_info )) {
$rate = 0 ; //支收比
$rate = round (( $user_win_gift_total_value + $room_box_count_info [ 'in_amount' ]) / ( $room_box_count_info [ 'out_amount' ] + $user_pay_amount ), 4 );
$map = [];
$map [] = [ 'sid' , '=' , $room_box_count_info [ 'sid' ]];
// $map[] = ['uid', '=', $user_info['uid']];
// $map[] = ['box_type', '=', $box_type];
$data = [];
$data [ 'rate' ] = $rate ;
$data [ 'update_time' ] = $now_time ;
$profit = $user_win_gift_total_value - $user_pay_amount ;
$reslut = db :: name ( 'room_box_count' ) -> where ( $map ) -> inc ( 'out_amount' , $user_pay_amount ) -> inc ( 'in_amount' , $user_win_gift_total_value ) -> inc ( 'profit' , $profit ) -> update ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '' , 'data' => null ];
}
} else {
$rate = round ( $user_win_gift_total_value / $user_pay_amount , 4 );
$profit = $user_win_gift_total_value - $user_pay_amount ;
$data = [];
$data [ 'rid' ] = $rid ;
$data [ 'box_type' ] = $box_type ;
$data [ 'out_amount' ] = $user_pay_amount ;
$data [ 'in_amount' ] = $user_win_gift_total_value ;
$data [ 'profit' ] = $profit ;
$data [ 'rate' ] = $rate ;
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'room_box_count' ) -> insert ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '' , 'data' => null ];
}
}
//礼物放入背包,计入背包日志
$insert_user_gift_pack_log_data = [];
foreach ( $user_win_gift_data as $k => $v ) {
$map = [];
$map [] = [ 'uid' , '=' , $user_info [ 'uid' ]];
$map [] = [ 'gid' , '=' , $v [ 'gid' ]];
$data = [];
$data [ 'gid' ] = $v [ 'gid' ];
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'user_gift_pack' ) -> where ( $map ) -> inc ( 'num' , $v [ 'open_num' ]) -> inc ( 'total_num' , $v [ 'open_num' ]) -> update ( $data );
if ( ! $reslut ) {
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'gid' ] = $v [ 'gid' ];
$data [ 'total_num' ] = $v [ 'open_num' ];
$data [ 'num' ] = $v [ 'open_num' ];
$data [ 'is_tester' ] = $user_info [ 'is_tester' ];
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'user_gift_pack' ) -> insert ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '' , 'data' => null ];
}
}
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'type' ] = 2 ;
$data [ 'bl_id' ] = $v [ 'bl_id' ];
$data [ 'gid' ] = $v [ 'gid' ];
$data [ 'gift_price' ] = $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ];
$data [ 'change_num' ] = $v [ 'open_num' ];
$data [ 'total_gift_price' ] = $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ] * $v [ 'open_num' ];
$data [ 'after_num' ] = 0 ;
$data [ 'is_tester' ] = $user_info [ 'is_tester' ];
$data [ 'remarks' ] = " 开宝箱获得 " ;
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$insert_user_gift_pack_log_data [] = $data ;
}
if ( ! empty ( $insert_user_gift_pack_log_data )) {
$reslut = db :: name ( 'user_gift_pack_log' ) -> insertAll ( $insert_user_gift_pack_log_data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '' , 'data' => null ];
}
}
//用户消费累计
if ( $user_info [ 'is_tester' ] != 2 ){
$map = [];
$map [] = [ 'uid' , '=' , $user_info [ 'uid' ]];
if ( $type == 1 ) {
$reslut = db :: name ( 'user' ) -> where ( $map ) -> inc ( 'silver_consume' , $user_pay_amount ) -> update ();
} else if ( $type == 2 ){
$reslut = db :: name ( 'user' ) -> where ( $map ) -> inc ( 'gold_consume' , $user_pay_amount ) -> update ();
} else if ( $type == 3 ){
$reslut = db :: name ( 'user' ) -> where ( $map ) -> inc ( 'drill_consume' , $user_pay_amount ) -> update ();
} else if ( $type == 4 ){
$reslut = db :: name ( 'user' ) -> where ( $map ) -> inc ( 'platina_consume' , $user_pay_amount ) -> update ();
}
if ( ! $reslut ){
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
//赠送礼物增加财富值 贡献值
// $reslut = model('User')->change_user_contribution_value($uid, $user_pay_amount);
// if ($reslut['code'] == 201) {
// Db::rollback();
// return ['code' => 201, 'msg' => '请重试1', 'data' => null];
// }
Db :: commit ();
//推送礼物信息
$user_charm_info = model ( 'User' ) -> get_user_charm_contribution_info ( $user_info [ 'uid' ]);
$push_all_gift_data = [];
$push_group_gift_data = [];
$push_sqb_gift_data = [];
$push_all_gift_data [ 'user_info' ][ 'uid' ] = $user_info [ 'uid' ];
$push_all_gift_data [ 'user_info' ][ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $user_info [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$push_all_gift_data [ 'user_info' ][ 'head_pic' ] = localpath_to_netpath ( $user_info [ 'head_pic' ]);
$push_all_gift_data [ 'user_info' ][ 'contribution_level_image' ] = $user_charm_info [ 'data' ][ 'contribution_level_image' ];
$push_group_gift_data [ 'user_info' ][ 'uid' ] = $user_info [ 'uid' ];
$push_group_gift_data [ 'user_info' ][ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $user_info [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$push_group_gift_data [ 'user_info' ][ 'head_pic' ] = localpath_to_netpath ( $user_info [ 'head_pic' ]);
$push_group_gift_data [ 'user_info' ][ 'contribution_level_image' ] = $user_charm_info [ 'data' ][ 'contribution_level_image' ];
foreach ( $user_win_gift_data as $k => & $v ) {
$v [ 'surprise' ] = 0 ;
if ( $v [ 'gift_price' ] > $config [ 'big_gift_price' ]){
$v [ 'surprise' ] = 1 ;
}
unset ( $v [ 'id' ]);
$v [ 'type_name' ] = db :: name ( 'box_type' ) -> where ( 'tid' , $tid ) -> value ( 'show_name' );
$v [ 'box_type' ] = $tid ;
if ( $v [ 'is_public_server' ] == 1 ) {
if ( $v [ 'gift_price' ] > $config [ 'sqb_limit_gift_price' ]){
$sqb_gift_info = $v ;
$sqb_gift_info [ 'uid' ] = $user_info [ 'uid' ];
$sqb_gift_info [ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $user_info [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$sqb_gift_info [ 'head_pic' ] = localpath_to_netpath ( $user_info [ 'head_pic' ]);
$sqb_gift_info [ 'num' ] = $v [ 'open_num' ];
$sqb_gift_info [ 'total_open_num' ] = $open_num ;
$sqb_gift_info [ 'box_type_name' ] = $v [ 'type_name' ];
$push_all_gift_data [ 'gift_list' ][] = $sqb_gift_info ;
}
}
if ( $v [ 'is_public_screen' ] == 1 ) {
$push_group_gift_data [ 'gift_list' ][] = $v ;
}
}
if ( ! empty ( $push_all_gift_data [ 'gift_list' ])) {
$push_data = [];
$push_data [ 'code' ] = 304 ;
$push_data [ 'msg' ] = " 开宝箱全服播报数据 " ;
$push_data [ 'data' ] = $push_all_gift_data ;
model ( 'api/WebSocketPush' ) -> send_to_all ( $push_data );
} else if ( ! empty ( $push_group_gift_data [ 'gift_list' ])) {
$push_data = [];
$push_data [ 'code' ] = 303 ;
$push_data [ 'msg' ] = " 开宝箱房间播报数据 " ;
$push_data [ 'data' ] = $push_group_gift_data ;
model ( 'api/WebSocketPush' ) -> send_to_group ( $rid , $push_data );
}
$data = [];
$data [ 'win_gift_list' ] = array_values ( $user_win_gift_data );
$data [ 'user_win_gift_total_value' ] = $user_win_gift_total_value ;
// $data['user_money'] = $surplus_user_money;
$data [ 'user_money' ] = db :: name ( 'user' ) -> where ( 'uid' , $uid ) -> value ( 'integral' );
return [ 'code' => 200 , 'msg' => '开奖成功' , 'data' => $data ];
} catch ( \Exception $e ) {
//回滚事务
dump ( $e );
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
Db :: rollback ();
return [ 'code' => 201 , 'msg' => '开奖失败' , 'data' => null ];
}
}
public function auto_open_virtual_box ()
{
//功能开关
$config = get_uncache_system_config ();
if ( $config [ 'open_virtual_report' ] != 1 ){
return [ 'code' => 201 , 'msg' => '该功能未开放' , 'data' => null ];
}
//随机虚拟用户
$virtual_user_array = db :: name ( 'user' ) -> where ( 'is_tester' , 2 ) -> order ( 'uid asc' ) -> cache ( 60 ) -> column ( 'uid' );
if ( ! empty ( $virtual_user_array )){
$a = array_rand ( $virtual_user_array , 1 );
$uid = $virtual_user_array [ $a ];
} else {
return [ 'code' => 201 , 'msg' => '暂未设置虚拟号' , 'data' => null ];
}
//随机宝箱类型
$virtual_box_type_list = [];
if ( $config [ 'open_silver_box_status' ] == 1 ){
$virtual_box_type_list [] = 1 ;
}
if ( $config [ 'open_gold_box_status' ] == 1 ){
$virtual_box_type_list [] = 2 ;
}
if ( $config [ 'open_drill_box_status' ] == 1 ){
$virtual_box_type_list [] = 3 ;
}
if ( empty ( $virtual_box_type_list )){
return [ 'code' => 201 , 'msg' => '暂未开放' , 'data' => null ];
}
$cz = array_rand ( $virtual_box_type_list , 1 );
$type = $virtual_box_type_list [ $cz ];
// $type = rand(1,3);
//随机次数
// $open_num_list = [10];
// $b = array_rand($open_num_list,1);
// $open_num = $open_num_list[$b];
// if (!in_array($open_num, [1, 10])) {
// return ['code' => 201, 'msg' => '开奖次数参数非法', 'data' => null];
// }
if ( in_array ( $type ,[ 3 ])){
$open_num_list = [ 1 , 10 ];
} else {
$open_num_list = [ 10 , 100 ];
}
$b = array_rand ( $open_num_list , 1 );
$open_num = $open_num_list [ $b ];
if ( ! in_array ( $open_num , [ 1 , 10 , 100 ])) {
return [ 'code' => 201 , 'msg' => '开奖次数参数非法' , 'data' => null ];
}
$map = [];
$map [] = [ 'b.is_tester' , '=' , 2 ];
$map [] = [ 'a.is_delete' , '=' , 1 ];
$room_info = db :: name ( 'room' ) -> alias ( 'a' ) -> join ( 'yy_user b' , 'b.uid = a.room_owner_uid' ) -> field ( 'a.rid,a.is_auto_accumulate,a.room_owner_uid' ) -> where ( $map ) -> find ();
if ( empty ( $room_info )) {
return [ 'code' => 201 , 'msg' => '房间信息不存在' , 'data' => null ];
}
$rid = $room_info [ 'rid' ];
$redis = connectionRedis ();
$user_gift_id_list = []; //用户抽中礼物id集合
$user_gift_id_redis_list = []; //用户抽中redis礼物id集合
$user_win_gift_data = []; //抽中礼物列表
$box_log_data = []; //抽中礼物期数数据
$box_type_data = []; //宝箱类型配置信息
$user_pay_amount = 0 ; //用户支付总额
$user_win_gift_total_value = 0 ; //抽中礼物总价值
$surplus_user_money = 0 ; //用户剩余资金
$europe_key = 0 ; //用户所得皇钥匙
$now_time = time ();
$tid = '' ;
$user_info = db :: name ( 'user' ) -> find ( $uid ); //获取用户信息
if ( ! $user_info ){
return [ 'code' => 201 , 'msg' => '用户信息不存在' , 'data' => null ];
}
//不同宝箱类型
//判断是否是虚拟用户
if ( $user_info [ 'is_tester' ] == 2 ){
if ( $type == 1 ){
$tid = 61 ;
} else if ( $type == 2 ){
$tid = 62 ;
} else if ( $type == 3 ){
$tid = 63 ;
}
} else {
return [ 'code' => 201 , 'msg' => '参数错误' , 'data' => null ];
}
//该奖池是否配置礼物
$map = [];
$map [] = [ 'tid' , '=' , $tid ];
$is_box_config = db ( 'box_config' ) -> where ( $map ) -> select ();
if ( ! $is_box_config ){
return [ 'code' => 201 , 'msg' => '奖池数量不足' , 'data' => null ];
}
//获取宝箱类型配置信息
$box_type_list = db :: name ( 'box_type' ) -> field ( 'tid,open_price,open_status,show_name' ) -> cache ( 60 ) -> select ();
foreach ( $box_type_list as $k => & $v ) {
$box_type_data [ $v [ 'tid' ]] = $v ;
}
if ( empty ( $box_type_data [ $tid ])) {
return [ 'code' => 201 , 'msg' => '开奖类型非法参数' , 'data' => null ];
}
if ( $box_type_data [ $tid ][ 'open_status' ] != 1 ) {
return [ 'code' => 201 , 'msg' => '该开奖类型暂时已关闭' , 'data' => null ];
}
$user_pay_amount = $open_num * $box_type_data [ $tid ][ 'open_price' ];
$tid_box_price = $box_type_data [ $tid ][ 'open_price' ];
$keyname = " box:list:tid: " . $tid ;
if ( $keyname == " box:list:tid: " ) {
return [ 'code' => 201 , 'msg' => '开奖类型非法参数' , 'data' => null ];
}
// 启动事务
Db :: startTrans ();
try {
//获取用户必中信息 (每次补发一个)
$map = [];
$map [] = [ 'uid' , '=' , $uid ];
$map [] = [ 'tid' , '=' , $tid ];
$map [] = [ 'is_admin' , '=' , 1 ];
$map [] = [ 'give_status' , '=' , 1 ];
$box_give_gift_info = db :: name ( 'box_give_gift' ) -> where ( $map ) -> find ();
//插入用户必中
$need_open_num = $open_num ;
if ( ! empty ( $box_give_gift_info )) {
$data = [];
$data [ 'bl_id' ] = 0 ;
$data [ 'gid' ] = $box_give_gift_info [ 'gid' ];
$user_gift_id_list [] = $data ;
$need_open_num -- ; //待取礼物总数-1
}
//获取待核销必中礼物数据
$map = [];
$map [] = [ 'tid' , '=' , $tid ];
$map [] = [ 'give_status' , '=' , 2 ];
$map [] = [ 'deduction_status' , '=' , 1 ];
$box_un_deduction_give_gift_list = db :: name ( 'box_give_gift' ) -> where ( $map ) -> order ( 'id asc' ) -> column ( 'id' , 'gid' ); //每种礼物只核销第一个
//获取待开奖池礼物
for ( $i = 0 ; $i < $need_open_num ; $i ++ ) {
$gift_data = $redis -> blpop ( $keyname , 2 ); //1s 超时
if ( empty ( $gift_data )) {
return [ 'code' => 201 , 'msg' => '奖池数量不足' , 'data' => null ];
} else {
//获取是否有待核销必中
$gift_data_data = explode ( '-' , $gift_data [ 1 ]);
$bl_id = $gift_data_data [ 0 ];
$gid = $gift_data_data [ 1 ];
if ( ! empty ( $box_un_deduction_give_gift_list [ $gid ])) {
$id = $box_un_deduction_give_gift_list [ $gid ];
unset ( $box_un_deduction_give_gift_list [ $gid ]);
$data = [];
$data [ 'bl_id' ] = $bl_id ;
$data [ 'gid' ] = $gid ;
$user_gift_id_redis_list [] = $data ;
//更新对应数据
//补偿表 更新
$map = [];
$map [] = [ 'id' , '=' , $id ];
$map [] = [ 'tid' , '=' , $tid ];
$map [] = [ 'gid' , '=' , $gid ];
$map [] = [ 'deduction_status' , '=' , 1 ];
$data = [];
$data [ 'deduction_bl_id' ] = $bl_id ;
$data [ 'deduction_status' ] = 2 ;
$data [ 'deduction_time' ] = time ();
$data [ 'update_time' ] = time ();
$reslut = db :: name ( 'box_give_gift' ) -> where ( $map ) -> order ( 'id asc' ) -> limit ( 1 ) -> update ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
//开宝箱记录表更新
// $map = [];
// $map[] = ['tid', '=', $tid];
// $map[] = ['gid', '=', $gid];
// $map[] = ['num', '=', 1];
// $map[] = ['bl_id', '=', 0];
// $data = [];
// $data['bl_id'] = $bl_id;
// $data['update_time'] = time();
// $reslut = db::name('user_box_log')->where($map)->order('aid asc')->limit(1)->update($data);
// if (!$reslut) {
// Db::rollback();
// $this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
// return ['code' => 201, 'msg' => '请重试', 'data' => null];
// }
//重新从队列获取一个礼物信息
$gift_data = $redis -> blpop ( $keyname , 2 ); //1s 超时
if ( empty ( $gift_data )) {
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '奖池数量不足' , 'data' => null ];
}
$gift_data_data = explode ( '-' , $gift_data [ 1 ]);
$bl_id = $gift_data_data [ 0 ];
$gid = $gift_data_data [ 1 ];
}
$data = [];
$data [ 'bl_id' ] = $bl_id ;
$data [ 'gid' ] = $gid ;
$user_gift_id_redis_list [] = $data ;
$user_gift_id_list [] = $data ;
}
}
if ( count ( $user_gift_id_list ) != $open_num ) {
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '奖池数量不足' , 'data' => null ];
}
//取出所有礼物数据
$gift_list = db :: name ( 'gift' ) -> field ( 'gid,gift_name,gift_price,base_image,play_image,gift_type' ) -> cache ( 10 ) -> select ();
$gift_list_data = [];
foreach ( $gift_list as $k => & $v ) {
$v [ 'base_image' ] = localpath_to_netpath ( $v [ 'base_image' ]);
$v [ 'play_image' ] = localpath_to_netpath ( $v [ 'play_image' ]);
$gift_list_data [ $v [ 'gid' ]] = $v ;
}
//获取宝箱礼物配置信息
$box_config_list = db :: name ( 'box_config' ) -> field ( 'gid,tid,is_public_screen,is_public_server' ) -> cache ( 10 ) -> select ();
$box_config_list_data = [];
foreach ( $box_config_list as $k => $v ) {
$box_config_list_data [ $v [ 'gid' ]][ $v [ 'tid' ]] = $v ;
}
//整理用户抽中礼物数量
foreach ( $user_gift_id_list as $k => $v ) {
if ( empty ( $gift_list_data [ $v [ 'gid' ]])) {
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '礼物信息不存在' , 'data' => null ];
}
if ( empty ( $box_config_list_data [ $v [ 'gid' ]])) {
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '宝箱礼物信息不存在' , 'data' => null ];
}
if ( empty ( $user_win_gift_data [ $v [ 'gid' ]])) {
$user_win_gift_data [ $v [ 'gid' ]] = $gift_list_data [ $v [ 'gid' ]];
$user_win_gift_data [ $v [ 'gid' ]][ 'open_num' ] = 1 ;
} else {
$user_win_gift_data [ $v [ 'gid' ]][ 'open_num' ] ++ ;
}
$user_win_gift_data [ $v [ 'gid' ]][ 'bl_id' ] = $v [ 'bl_id' ];
// $user_win_gift_data[$v['gid']]['is_public_screen'] = $box_config_list_data[$v['gid']][$tid]['is_public_screen'];
// $user_win_gift_data[$v['gid']]['is_public_server'] = $box_config_list_data[$v['gid']][$tid]['is_public_server'];
if ( $v [ 'bl_id' ] == 0 ){
$user_win_gift_data [ $v [ 'gid' ]][ 'is_public_screen' ] = $box_config_list_data [ $v [ 'gid' ]][ $tid ][ 'is_public_screen' ];
$user_win_gift_data [ $v [ 'gid' ]][ 'is_public_server' ] = $box_config_list_data [ $v [ 'gid' ]][ $tid ][ 'is_public_server' ];
} else {
$map = [];
$map [] = [ 'bl_id' , '=' , $v [ 'bl_id' ]];
$bl_tid = db :: name ( 'box_log' ) -> where ( $map ) -> value ( 'tid' );
$user_win_gift_data [ $v [ 'gid' ]][ 'is_public_screen' ] = $box_config_list_data [ $v [ 'gid' ]][ $bl_tid ][ 'is_public_screen' ];
$user_win_gift_data [ $v [ 'gid' ]][ 'is_public_server' ] = $box_config_list_data [ $v [ 'gid' ]][ $bl_tid ][ 'is_public_server' ];
}
if ( empty ( $box_log_data [ $v [ 'bl_id' ]])) {
$box_log_data [ $v [ 'bl_id' ]][ 'open_num' ] = 1 ;
$box_log_data [ $v [ 'bl_id' ]][ 'open_gift_value' ] = $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ];
} else {
$box_log_data [ $v [ 'bl_id' ]][ 'open_num' ] ++ ;
$box_log_data [ $v [ 'bl_id' ]][ 'open_gift_value' ] += $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ];
}
$user_win_gift_total_value += $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ];
}
$surplus_user_money = $user_info [ 'integral' ];
foreach ( $box_log_data as $k => $v ) {
if ( $k > 0 ) {
$map = [];
$map [] = [ 'bl_id' , '=' , $k ];
$reslut = db :: name ( 'box_log' ) -> where ( $map ) -> inc ( 'open_num' , $v [ 'open_num' ]) -> inc ( 'open_gift_value' , $v [ 'open_gift_value' ]) -> update ();
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
}
//用户必中礼物状态更新
if ( ! empty ( $box_give_gift_info )) {
$map = [];
$map [] = [ 'id' , '=' , $box_give_gift_info [ 'id' ]];
$data = [];
$data [ 'give_time' ] = $now_time ;
$data [ 'give_status' ] = 2 ;
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'box_give_gift' ) -> where ( $map ) -> update ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
//添加用户开宝箱日志 可能存在2期奖情况 特殊处理
$user_box_data_by_bl_id = [];
foreach ( $user_gift_id_list as $k => $v ) {
if ( empty ( $user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]])) {
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'bl_id' ] = $v [ 'bl_id' ];
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'gid' ] = $v [ 'gid' ];
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'open_num' ] = 1 ;
} else {
$user_box_data_by_bl_id [ $v [ 'bl_id' ]][ $v [ 'gid' ]][ 'open_num' ] ++ ;
}
}
foreach ( $user_box_data_by_bl_id as $k => $v ) {
$insert_user_box_data = [];
foreach ( $v as $m => $n ) {
$gift_info = $gift_list_data [ $n [ 'gid' ]];
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'rid' ] = $rid ;
$data [ 'tid' ] = $tid ;
$data [ 'bl_id' ] = $n [ 'bl_id' ];
$data [ 'gid' ] = $n [ 'gid' ];
$data [ 'num' ] = $n [ 'open_num' ];
$data [ 'gift_price' ] = $gift_info [ 'gift_price' ];
$data [ 'total_price' ] = $n [ 'open_num' ] * $gift_info [ 'gift_price' ];
$data [ 'total_open_num' ] = $open_num ;
$data [ 'total_pay_price' ] = $n [ 'open_num' ] * $tid_box_price ;
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$insert_user_box_data [] = $data ;
}
$reslut = db :: name ( 'user_box_log' ) -> insertAll ( $insert_user_box_data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
//添加用户开宝箱统计数据
$time = strtotime ( date ( " Y-m-d " ));
$box_type = 0 ;
$map = [];
$map [] = [ 'uid' , '=' , $user_info [ 'uid' ]];
if ( $user_info [ 'is_tester' ] == 2 ) {
if ( $type == 1 ){
$map [] = [ 'box_type' , '=' , 6 ];
$box_type = 6 ;
} else if ( $type == 2 ){
$map [] = [ 'box_type' , '=' , 7 ];
$box_type = 7 ;
} else if ( $type == 3 ){
$map [] = [ 'box_type' , '=' , 8 ];
$box_type = 8 ;
}
}
$map [] = [ 'add_time' , '>' , $time ];
$user_box_count_info = db :: name ( 'user_box_count' ) -> where ( $map ) -> find ();
if ( ! empty ( $user_box_count_info )) {
$rate = 0 ; //支收比
$rate = round (( $user_win_gift_total_value + $user_box_count_info [ 'in_amount' ]) / ( $user_box_count_info [ 'out_amount' ] + $user_pay_amount ), 4 );
$map = [];
$map [] = [ 'sid' , '=' , $user_box_count_info [ 'sid' ]];
// $map[] = ['uid', '=', $user_info['uid']];
// $map[] = ['box_type', '=', $box_type];
$data = [];
$data [ 'rate' ] = $rate ;
$data [ 'update_time' ] = $now_time ;
$profit = $user_win_gift_total_value - $user_pay_amount ;
$reslut = db :: name ( 'user_box_count' ) -> where ( $map ) -> inc ( 'out_amount' , $user_pay_amount ) -> inc ( 'in_amount' , $user_win_gift_total_value ) -> inc ( 'profit' , $profit ) -> update ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
} else {
$rate = round ( $user_win_gift_total_value / $user_pay_amount , 4 );
$profit = $user_win_gift_total_value - $user_pay_amount ;
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'out_amount' ] = $user_pay_amount ;
$data [ 'in_amount' ] = $user_win_gift_total_value ;
$data [ 'profit' ] = $profit ;
$data [ 'rate' ] = $rate ;
$data [ 'box_type' ] = $box_type ;
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'user_box_count' ) -> insert ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
//礼物放入背包
$insert_user_gift_pack_log_data = [];
foreach ( $user_win_gift_data as $k => $v ) {
$map = [];
$map [] = [ 'uid' , '=' , $user_info [ 'uid' ]];
$map [] = [ 'gid' , '=' , $v [ 'gid' ]];
$data = [];
$data [ 'gid' ] = $v [ 'gid' ];
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'user_gift_pack' ) -> where ( $map ) -> inc ( 'num' , $v [ 'open_num' ]) -> inc ( 'total_num' , $v [ 'open_num' ]) -> update ( $data );
if ( ! $reslut ) {
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'gid' ] = $v [ 'gid' ];
$data [ 'total_num' ] = $v [ 'open_num' ];
$data [ 'num' ] = $v [ 'open_num' ];
$data [ 'is_tester' ] = $user_info [ 'is_tester' ];
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$reslut = db :: name ( 'user_gift_pack' ) -> insert ( $data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
$data = [];
$data [ 'uid' ] = $user_info [ 'uid' ];
$data [ 'type' ] = 2 ;
$data [ 'bl_id' ] = $v [ 'bl_id' ];
$data [ 'gid' ] = $v [ 'gid' ];
$data [ 'gift_price' ] = $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ];
$data [ 'change_num' ] = $v [ 'open_num' ];
$data [ 'total_gift_price' ] = $gift_list_data [ $v [ 'gid' ]][ 'gift_price' ] * $v [ 'open_num' ];
$data [ 'after_num' ] = 0 ;
$data [ 'is_tester' ] = $user_info [ 'is_tester' ];
$data [ 'remarks' ] = " 开宝箱获得 " ;
$data [ 'add_time' ] = $now_time ;
$data [ 'update_time' ] = $now_time ;
$insert_user_gift_pack_log_data [] = $data ;
}
if ( ! empty ( $insert_user_gift_pack_log_data )) {
$reslut = db :: name ( 'user_gift_pack_log' ) -> insertAll ( $insert_user_gift_pack_log_data );
if ( ! $reslut ) {
Db :: rollback ();
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
return [ 'code' => 201 , 'msg' => '请重试' , 'data' => null ];
}
}
// 提交事务
Db :: commit ();
//推送礼物信息
$user_charm_info = model ( 'User' ) -> get_user_charm_contribution_info ( $user_info [ 'uid' ]);
$push_all_gift_data = [];
$push_group_gift_data = [];
$push_all_gift_data [ 'user_info' ][ 'uid' ] = $user_info [ 'uid' ];
$push_all_gift_data [ 'user_info' ][ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $user_info [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$push_all_gift_data [ 'user_info' ][ 'head_pic' ] = localpath_to_netpath ( $user_info [ 'head_pic' ]);
$push_all_gift_data [ 'user_info' ][ 'contribution_level_image' ] = $user_charm_info [ 'data' ][ 'contribution_level_image' ];
$push_group_gift_data [ 'user_info' ][ 'uid' ] = $user_info [ 'uid' ];
$push_group_gift_data [ 'user_info' ][ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $user_info [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$push_group_gift_data [ 'user_info' ][ 'head_pic' ] = localpath_to_netpath ( $user_info [ 'head_pic' ]);
$push_group_gift_data [ 'user_info' ][ 'contribution_level_image' ] = $user_charm_info [ 'data' ][ 'contribution_level_image' ];
foreach ( $user_win_gift_data as $k => & $v ) {
//是否大礼物展示
$v [ 'surprise' ] = 0 ;
if ( $v [ 'gift_price' ] > $config [ 'big_gift_price' ]){
$v [ 'surprise' ] = 1 ;
}
unset ( $v [ 'bl_id' ]);
$v [ 'type_name' ] = $box_type_data [ $tid ][ 'show_name' ];
$v [ 'box_type' ] = $tid ;
if ( $v [ 'is_public_server' ] == 1 ) {
$sqb_gift_info = $v ;
$sqb_gift_info [ 'uid' ] = $user_info [ 'uid' ];
$sqb_gift_info [ 'nick_name' ] = mb_convert_encoding ( base64_decode ( $user_info [ 'base64_nick_name' ]), 'UTF-8' , 'UTF-8' );
$sqb_gift_info [ 'head_pic' ] = localpath_to_netpath ( $user_info [ 'head_pic' ]);
$sqb_gift_info [ 'num' ] = $v [ 'open_num' ];
$sqb_gift_info [ 'total_open_num' ] = $open_num ;
$sqb_gift_info [ 'box_type_name' ] = $v [ 'type_name' ];
$push_all_gift_data [ 'gift_list' ][] = $sqb_gift_info ;
}
if ( $v [ 'is_public_screen' ] == 1 ) {
$push_group_gift_data [ 'gift_list' ][] = $v ;
}
}
if ( ! empty ( $push_all_gift_data [ 'gift_list' ])) {
$push_data = [];
$push_data [ 'code' ] = 304 ;
$push_data [ 'msg' ] = " 开宝箱全服播报数据 " ;
$push_data [ 'data' ] = $push_all_gift_data ;
model ( 'api/WebSocketPush' ) -> send_to_all ( $push_data );
} else if ( ! empty ( $push_group_gift_data [ 'gift_list' ])) {
$push_data = [];
$push_data [ 'code' ] = 303 ;
$push_data [ 'msg' ] = " 开宝箱房间播报数据 " ;
$push_data [ 'data' ] = $push_group_gift_data ;
model ( 'api/WebSocketPush' ) -> send_to_group ( $rid , $push_data );
}
$data = [];
$data [ 'win_gift_list' ] = array_values ( $user_win_gift_data );
$data [ 'user_win_gift_total_value' ] = $user_win_gift_total_value ;
$data [ 'user_money' ] = $surplus_user_money ;
return [ 'code' => 200 , 'msg' => '开启成功' , 'data' => $data ];
//推送礼物
} catch ( \Exception $e ) {
// 回滚事务
dump ( $e );
$this -> redis_gift_data_rollback ( $redis , $keyname , $user_gift_id_redis_list );
Db :: rollback ();
return [ 'code' => 201 , 'msg' => '开启失败' , 'data' => null ];
}
}
//用户投入爆率产出
public function get_user_box_count ( $uid , $type ){
$user_info = db :: name ( 'user' ) -> find ( $uid );
if ( $user_info [ 'is_tester' ] == 2 ){
if ( $type == 1 ){
$type = 11 ;
} else if ( $type == 2 ){
$type = 12 ;
} else if ( $type == 3 ){
$type = 13 ;
}
}
$time = strtotime ( date ( 'Y-m-d' ));
$map = [];
$map [] = [ 'uid' , '=' , $uid ];
$map [] = [ 'box_type' , '=' , $type ];
$map [] = [ 'add_time' , '>' , $time ];
// dump($map);exit;
$user_box_count = db :: name ( 'user_box_count' ) -> where ( $map ) -> field ( 'out_amount,in_amount' ) -> find ();
if ( $user_box_count ){
$data = [];
$data [ 'out_amount' ] = $user_box_count [ 'out_amount' ];
$data [ 'in_amount' ] = $user_box_count [ 'in_amount' ];
$data [ 'rate' ] = round (( $data [ 'in_amount' ] / $data [ 'out_amount' ]), 4 ) * 100 ;
$data [ 'rate' ] .= '%' ;
} else {
$data = [];
$data [ 'out_amount' ] = 0 ;
$data [ 'in_amount' ] = 0 ;
$data [ 'rate' ] = '0%' ;
}
return [ 'code' => 200 , 'msg' => '获取成功' , 'data' => $data ];
}
public function get_user_box_times ( $uid )
{
$config = get_uncache_system_config ();
$user_box_times = db :: name ( 'user_box_statics' ) -> where ([ 'uid' => $uid , 'box_date' => date ( 'Y-m-d' )]) -> value ( 'box_times' );
if ( $config [ 'user_day_box_limit_times' ] >= $user_box_times ) {
$user_box_times = $config [ 'user_day_box_limit_times' ] - $user_box_times ;
} else {
$user_box_times = 0 ;
}
return [ 'code' => 200 , 'msg' => '获取数据成功' , 'data' => [ 'user_box_times' => $user_box_times ]];
}
}