201, 'msg' => '功能关闭中', 'data' => null]; } $user_info = db::name('user')->find($uid); $device = $config['open_person_box_device']; $device = trim($device,','); $device_list = explode(',',$device); $uid_data = $config['open_person_box_uid']; $uid_data = trim($uid_data,','); $uid_list = explode(',',$uid_data); if($user_info['is_tester'] == 2){//测试号 $data = $this->open_common_box($uid,$rid,$type,$open_num); return $data; }else if(in_array($user_info['last_login_device'],$device_list)){//进入个池的设备号 $data = $this->open_person_box($uid,$rid,$type,$open_num); return $data; }else if(in_array($uid,$uid_list)){//进入个池的uid $data = $this->open_person_box($uid,$rid,$type,$open_num); return $data; }else{//公池及公池对应的个池 if($type == 3){//鬼修 $data = $this->open_common_box($uid,$rid,$type,$open_num); return $data; }else if($type == 1){//修魔池 open_person_common_box $data = $this->open_person_common_box($uid,$rid,$type,$open_num); return $data; }else{//修真池 $data = $this->open_person_common_box($uid,$rid,$type,$open_num); return $data; } } } //公池 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')->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 = []; //宝箱类型配置信息 $user_pay_amount = 0; //用户支付总额 $user_win_gift_total_value = 0; //抽中礼物总价值 $surplus_user_money = 0; //用户剩余资金 $now_time = time(); $tid = ''; $user_info = db::name('user')->find($uid); //获取用户信息 if(!$user_info){ return ['code' => 201, 'msg' => '用户信息不存在', 'data' => null]; } //用户消费所对应的宝箱类型 if ($type == 1) {//地阶魔法 // $gold_tid = [1,3,5,7,9,11,13]; // $map = []; // $map[] = ['tid','in',$gold_tid]; // $box_type_lists = db::name('box_type')->where($map)->order('consume desc')->select(); // foreach ($box_type_lists as $a => $b) { // if($user_info['gold_consume'] >= $b['consume']){ // $tid = $b['tid']; // break; // } // } $tid = $user_info['gold_box']; } else if($type == 2) {//天阶魔法 // $drill_tid = [2,4,6,8,10,12,14]; // $map = []; // $map[] = ['tid','in',$drill_tid]; // $box_type_lists = db::name('box_type')->where($map)->order('consume desc')->select(); // foreach ($box_type_lists as $a => $b) { // if($user_info['drill_consume'] >= $b['consume']){ // $tid = $b['tid']; // break; // } // } $tid = $user_info['drill_box']; } else { $silver_tid = [33,34,35]; $map = []; $map[] = ['tid','in',$silver_tid]; $box_type_lists = db::name('box_type')->where($map)->order('consume desc')->select(); foreach ($box_type_lists as $a => $b) { if($user_info['silver_consume'] >= $b['consume']){ $tid = $b['tid']; break; } } } //判断是否是虚拟用户 if($user_info['is_tester']==2){ if($type == 1){ $tid = 15; }else if($type == 2){ $tid = 16; }else{ $tid = 36; } } //该奖池是否配置礼物 $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(10)->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']; $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[] = ['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 (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; }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'] = $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['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', '=', 3]; $box_type = 3; }else if($type == 2){ $map[] = ['box_type', '=', 4]; $box_type = 4; }else{ $map[] = ['box_type', '=', 8]; $box_type = 8; } } else { if($type == 3){ $map[] = ['box_type', '=', 7]; $box_type = 7; }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]; } } //礼物放入背包 $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) { $date = []; $date['gold_box_consume'] = $user_info['gold_box_consume'] + $user_pay_amount; $gold_box_consume = $date['gold_box_consume']; //当前宝箱类型 $where = []; $tids = 13; if($tid != 13){ $tids = $tid + 2; $gold_box_consume = $user_info['gold_consume'] + $user_pay_amount; } $where[] = ['tid', '=', $tids]; $box_data = db::name('box_type')->where($where)->find(); if($gold_box_consume >= $box_data['consume']){ $date['gold_box_consume'] = 0; $box_type_rate = db::name('box_type')->where(['tid'=>$tid])->value('rate'); if($rate < $box_type_rate){ if($tid == 1){ $date['gold_box'] = 19; }else if($tid == 3){ $date['gold_box'] = 21; }else if($tid == 5){ $date['gold_box'] = 23; }else if($tid == 7){ $date['gold_box'] = 25; }else if($tid == 9){ $date['gold_box'] = 27; }else if($tid == 11){ $date['gold_box'] = 29; }else if($tid == 13){ $date['gold_box'] = 31; } }else{ $date['gold_box'] = $tids; } } $reslut = db::name('user')->where($map)->inc('gold_consume', $user_pay_amount)->update($date); } else if($type == 2){ $date = []; $date['drill_box_consume'] = $user_info['drill_box_consume'] + $user_pay_amount; $drill_box_consume = $date['drill_box_consume']; //当前宝箱类型 $where = []; $tids = 14; if($tid != 14){ $tids = $tid + 2; $drill_box_consume = $user_info['drill_consume'] + $user_pay_amount; } $where[] = ['tid', '=', $tids]; $box_data = db::name('box_type')->where($where)->find(); if($drill_box_consume >= $box_data['consume']){ $date['drill_box_consume'] = 0; $box_type_rate = db::name('box_type')->where(['tid'=>$tid])->value('rate'); if($rate < $box_type_rate){ if($tid == 2){ $date['drill_box'] = 20; }else if($tid == 4){ $date['drill_box'] = 22; }else if($tid == 6){ $date['drill_box'] = 24; }else if($tid == 8){ $date['drill_box'] = 26; }else if($tid == 10){ $date['drill_box'] = 28; }else if($tid == 12){ $date['drill_box'] = 30; }else if($tid == 14){ $date['drill_box'] = 32; } }else{ $date['drill_box'] = $tids; } } $reslut = db::name('user')->where($map)->inc('drill_consume', $user_pay_amount)->update($date); } else { $reslut = db::name('user')->where($map)->inc('silver_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(); //推送礼物信息 $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_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'); 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) { $push_all_gift_data['gift_list'][] = $v; } 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]; } } //返还用户抽中礼物到奖池 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]; } public function get_box_list($tid) { $map = []; if($tid == 1){ $map[] = ['tid', 'in',[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,38,40]]; }else if($tid == 2){ $map[] = ['tid', 'in',[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,39,41]]; }else{ $map[] = ['tid', 'in',[33,34,35,36,37]]; } // $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_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]; } // if($box_type==1){ $map[] = ['tid', 'in',[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]]; // }else{ // $map[] = ['tid', 'in',[3,4]]; // } $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,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37]]; // }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')->order('a.aid desc')->page($page, $page_limit)->select(); foreach ($list as $k => &$v) { $v['base_image'] = localpath_to_netpath($v['base_image']); } return ['code' => 200, 'msg' => '获取成功', 'data' => $list]; } //获取宝箱公告 public function get_box_note() { $box_note = get_system_config('box_note'); return ['code' => 200, 'msg' => '获取成功', 'data' => $box_note]; } //宝箱单价 public function box_type_price(){ $data = []; $map = []; $map[] = ['tid','=','1']; $data['gold_price'] = db::name('box_type')->where($map)->value('open_price'); $map = []; $map[] = ['tid','=','2']; $data['drill_price'] = db::name('box_type')->where($map)->value('open_price'); $map = []; $map[] = ['tid','=','33']; $data['silver_price'] = db::name('box_type')->where($map)->value('open_price'); return ['code' => 200, 'msg'=> '获取成功','data'=>$data]; } //个人奖池 public function open_person_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(); $gold_price = $config['box_unit_price']; $drill_price = $config['box_drill_price']; $silver_price = $config['box_silver_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; //用户剩余资金 $now_time = time(); if ($type == 1) { $user_pay_amount = $open_num * $gold_price; $tid = 17; } else if ($type == 2) { $user_pay_amount = $open_num * $drill_price; $tid = 18; } else { $user_pay_amount = $open_num * $silver_price; $tid = 37; } $user_info = db::name('user')->find($uid); //获取用户信息 if(!$user_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($list_len < 1000){ $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]; $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[] = ['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_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_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 == 1){ $box_type = 5; } else if($type == 2){ $box_type = 6; } else { $box_type = 9; } $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]; } } //礼物放入背包,计入背包日志 $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(); //推送礼物信息 $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_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'); 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']); if($type == 1){ $v['type_name'] = db::name('box_type')->where('tid',1)->value('show_name'); }else{ $v['type_name'] = db::name('box_type')->where('tid',2)->value('show_name'); } $v['box_type'] = $type; if ($v['is_public_server'] == 1) { $push_all_gift_data['gift_list'][] = $v; } 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 open_person_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(); $gold_price = $config['box_unit_price']; $drill_price = $config['box_drill_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; //用户剩余资金 $now_time = time(); $user_info = db::name('user')->find($uid); //获取用户信息 if(!$user_info){ return ['code' => 201, 'msg' => '用户信息错误', 'data' => null]; } if ($type == 1) { $user_pay_amount = $open_num * $gold_price; $tid = $tids = $user_info['gold_box']; if($tid == 17){ $tid = 19; } if($tid == 19){ $accumulate_tid = 38; }else{ $accumulate_tid = 40; } } else { $user_pay_amount = $open_num * $drill_price; $tid = $tids = $user_info['drill_box']; if($tid == 18){ $tid = 20; } if($tid == 20){ $accumulate_tid = 39; }else{ $accumulate_tid = 41; } } //个池数据是否充足 $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:type:" . $type . ':uid:' . $uid; $list_len = 0; $list_len = $redis->llen($keyname); // $redis->blpop($keyname, 2); // $list_lens = $redis->lrange($keyname,0,-1); // $redis->del($keyname); // dump($list_lens);exit; if($list_len < 120){ $insert_data = []; $total_gift_value = 0; if($type == 1){ if($tid != 31){ $tids += 2; } }else{ if($tid != 32){ $tids += 2; } } //获取0次开出的礼物 $where = []; $where[] = ['tid', '=', $tids]; $box_config_zero_list = db::name('box_config')->where($where)->select(); $where[] = ['open_num_obtain', '=', 0]; $box_config_zero_lists = db::name('box_config')->where($where)->select(); if(empty($box_config_zero_lists)){ return ['code' => 201, 'msg' => '4', 'data' => null]; } 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', '=', $tids]; $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', '=', $tids]; $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' => '3', 'data' => null]; } }else{ $data = []; $data['tid'] = $tids; $data['uid'] = $uid; $data['total_num'] = count($insert_data); $data['total_gift_value'] = $total_gift_value; $data['config_text'] = json_encode($box_config_zero_list); $data['add_time'] = time(); $data['update_time'] = time(); $bl_id = db::name('box_person_log')->insertGetId($data); if(!$bl_id){ return ['code' => 201, 'msg' => '2', 'data' => null]; } } $map = []; $map[] = ['uid', '=', $uid]; $user_update = 1; if($type == 1){ if($tid != 31){ $data = []; $data['gold_box'] = $tids; $user_update = db::name('user')->where($map)->update($data); } }else{ if($tid != 32){ $data = []; $data['drill_box'] = $tids; $user_update = db::name('user')->where($map)->update($data); } } if(!$user_update){ return ['code' => 201, 'msg' => '1', '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[] = ['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 }else{ //补积攒池礼物 $map = []; $map[] = ['uid', '=', $uid]; $map[] = ['tid', '=', $accumulate_tid]; $map[] = ['give_status', '=', 1]; $accumulate_box_gift_info = db::name('box_give_gift')->where($map)->find(); if(!empty($accumulate_box_gift_info)){ $data = []; $data['bl_id'] = -1; $data['gid'] = $accumulate_box_gift_info['gid']; $user_gift_id_list[] = $data; $need_open_num--; //核销该必中礼物数据 $map = []; $map[] = ['id', '=', $accumulate_box_gift_info['id']]; $da = []; $da['give_status'] = 2; $da['give_time'] = time(); $da['deduction_status'] = 2; $da['deduction_time'] = time(); $da['update_time'] = time(); $reslut = db::name('box_give_gift')->where($map)->update($da); if(!$reslut){ return ['code' => 201, 'msg' => '', 'data' => null]; } //减少积攒池金额 $map = []; $map[] = ['gid', '=', $accumulate_box_gift_info['gid']]; $give_gift_price = db::name('gift')->where($map)->value('gift_price'); $map = []; $map[] = ['tid', '=', $accumulate_tid]; $reslut = db::name('box_type')->where($map)->setDec('consume',$give_gift_price); if(!$reslut){ return ['code' => 201, 'msg' => '', 'data' => null]; } $map[] = ['gid', '=', $accumulate_box_gift_info['gid']]; $reslut = db::name('box_config')->where($map)->setDec('accumulate_price',$give_gift_price); if(!$reslut){ return ['code' => 201, 'msg' => '', 'data' => null]; } } } //获取待核销必中礼物数据 $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'); //每种礼物只核销第一个 //积攒池礼物 $map = []; $map[] = ['tid', '=', $accumulate_tid]; $accumulate_list = db::name('box_config')->where($map)->select();//->field('accumulate_price,accumulate_rate') foreach ($accumulate_list as $x => $y){ if($need_open_num > 0){ $accumulate = []; $accumulate[] = ['gid', '=', $y['gid']]; $y['gift_price'] = db::name('gift')->where($accumulate)->value('gift_price'); if($y['gift_price'] <= $y['accumulate_price']){ $data = []; $data['bl_id'] = -1; $data['gid'] = $y['gid']; $user_gift_id_list[] = $data; $need_open_num--; //减少积攒池金额 $map = []; $map[] = ['tid', '=', $accumulate_tid]; $reslut = db::name('box_type')->where($map)->setDec('consume',$y['gift_price']); if(!$reslut){ return ['code' => 201, 'msg' => '', 'data' => null]; } $map[] = ['gid', '=', $y['gid']]; $reslut = db::name('box_config')->where($map)->setDec('accumulate_price',$y['gift_price']); if(!$reslut){ 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)) { 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' => '请重试1', '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' => '请重试2', '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']; if($v['bl_id'] == -1){ $user_win_gift_data[$v['gid']]['is_public_screen'] = $box_config_list_data[$v['gid']][$accumulate_tid]['is_public_screen']; $user_win_gift_data[$v['gid']]['is_public_server'] = $box_config_list_data[$v['gid']][$accumulate_tid]['is_public_server']; }else 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_person_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']; } // $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']; } $user_win_gift_total_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' => '请重试1', '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) { if($k == 0 || $k == -1){ $map = []; $map[] = ['tid', '=', $tid]; $map[] = ['uid', '=', $uid]; $map[] = ['del_status', '=', 1]; $k = db::name('box_person_log')->where($map)->value('bl_id'); } //计入积攒池金额 $map = []; $map[] = ['bl_id', '=', $k]; $box_tid = db::name('box_person_log')->where($map)->value('tid'); $gold_box_tid = [21,23,25,27,29,31]; $drill_box_tid = [22,24,26,28,30,32]; if($box_tid == 19){ $accumulate_box_tid = 38; }else if($box_tid == 20){ $accumulate_box_tid = 39; }else if(in_array($box_tid, $gold_box_tid)){ $accumulate_box_tid = 40; }else if(in_array($box_tid, $drill_box_tid)){ $accumulate_box_tid = 41; }else{ Db::rollback(); $this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list); return ['code' => 201, 'msg' => '', 'data' => null]; } $map = []; $map[] = ['tid', '=', $accumulate_box_tid]; $accumulate_rate = db::name('box_type')->where($map)->value('rate'); //用户砸蛋日志 $accumulate_price = 0; $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; if($n['bl_id'] == 0){ $data['tid'] = $tid; }else if($n['bl_id'] == -1){ $data['tid'] = $accumulate_tid; }else{ $data['tid'] = db::name('box_person_log')->where(['bl_id'=>$n['bl_id']])->value('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['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]; } //计入积攒池金额 $accumulate_price = $user_pay_amount * $accumulate_rate; $map = []; $map[] = ['tid', '=', $accumulate_box_tid]; $da = []; $da['update_time'] = time(); $reslut = db::name('box_type')->where($map)->inc('consume', $accumulate_price)->update($da); if(!$reslut){ Db::rollback(); $this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list); return ['code' => 201, 'msg' => '', 'data' => null]; } //积攒池金额分发该奖池中的各个礼物 $accumulate_box_config = db::name('box_config')->where($map)->select(); foreach ($accumulate_box_config as $i => $j){ $where = []; $where[] = ['bid', '=', $j['bid']]; $dat = []; $dat['update_time'] = time(); $accumulate_gift_price = $accumulate_price * $j['accumulate_rate']; $reslut = db::name('box_config')->where($where)->inc('accumulate_price', $accumulate_gift_price)->update($dat); 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 == 1){ $box_type = 1; } else { $box_type = 2; } $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]; } } //礼物放入背包,计入背包日志 $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(); //推送礼物信息 $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_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'); 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']); if($type == 1){ $v['type_name'] = db::name('box_type')->where('tid',1)->value('show_name'); }else{ $v['type_name'] = db::name('box_type')->where('tid',2)->value('show_name'); } $v['box_type'] = $type; if ($v['is_public_server'] == 1) { $push_all_gift_data['gift_list'][] = $v; } 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]; } } }