1){ $config['lucky_gift_earnings_rate'] = 0.05; } $map = []; $map[] = ['gid', '=', $gid]; $map[] = ['is_delete', '=', 1]; $gift_info = db::name('gift')->where($map)->find(); if (empty($gift_info)) { return ['code' => 201, 'msg' => '打赏礼物信息不存在', 'data' => null]; } $gift_info['play_image'] = localpath_to_netpath($gift_info['play_image']); $gift_info['base_image'] = localpath_to_netpath($gift_info['base_image']); if (ceil($num) != $num) { return ['code' => 201, 'msg' => '打赏礼物数量必须为整数', 'data' => null]; } if ($num < 1) { return ['code' => 201, 'msg' => '打赏礼物数量必须大于零', 'data' => null]; } if(empty($gift_info['mid'])){ return ['code' => 201, 'msg' => '该礼物尚未设置倍率', 'data' => null]; } $gift_multiple_type = db::name('gift_multiple_type')->where('id', $gift_info['mid'])->where('is_delete', 1)->find(); if(!$gift_multiple_type){ return ['code' => 201, 'msg' => '该礼物尚未设置倍率', 'data' => null]; } $gift_multiple_rate_list = db::name('gift_multiple_rate')->where('pid', $gift_info['mid'])->where('is_delete', 1)->select(); if(empty($gift_multiple_rate_list)){ return ['code' => 201, 'msg' => '该礼物尚未设置倍率', 'data' => null]; } $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]; } $room_owner_info = db::name('user')->where('uid', $room_info['room_owner_uid'])->find(); $to_uid_data = explode(',', $to_uid_list); $to_uid_data = array_values(array_unique($to_uid_data)); if (in_array($uid, $to_uid_data)) { return ['code' => 201, 'msg' => '不能给自己打赏', 'data' => null]; } $map = []; $map[] = ['uid', 'in', $to_uid_data]; $user_list = db::name('user')->field('uid,is_tester,money,integral,nick_name,base64_nick_name,head_pic,europe_key,airship')->where($map)->select(); if (empty($user_list)) { return ['code' => 201, 'msg' => '打赏礼物对象不能为空', 'data' => null]; } if (count($to_uid_data) != count($user_list)) { return ['code' => 201, 'msg' => '打赏礼物对象不存在', 'data' => null]; } $send_count = count($user_list); //赠送总人数 $total_send_num = $num * $send_count; //赠送礼物总数量 $total_send_amount = $gift_info['gift_price'] * $num * $send_count; //赠送礼物总价值 $now_time = time(); $user_info = db::name('user')->where('uid', $uid)->find(); if ($send_type == 1) { //直接购买 if($user_info['is_teenager'] == 1){ return ['code' => 201, 'msg' => '青少年模式已开启', 'data' => null]; } //扣款时进行用户资金是否充足判断 $user_auction_price = model('NewRoom')->get_user_auction_price($uid); if ($user_info['integral'] < ($total_send_amount + $user_auction_price)) { return ['code' => 201, 'msg' => '账户资金不足', 'data' => null]; } } else { return ['code' => 201, 'msg' => '参数非法', 'data' => null]; } // $redis = connectionRedis(); // $user_gift_multiple_redis_list = []; // $keyname = "multiple:list:type:".$gift_info['mid']; //当前主持比例 $room_host_commission = 0; if($room_info['room_owner_uid'] != $room_info['room_host_uid']){ $room_host_info = db::name('room_host')->where('rid', $rid)->where('uid', $room_info['room_host_uid'])->find(); if(!empty($room_host_info)){ $room_host_commission = $room_host_info['ratio']; } } Db::startTrans(); try { if ($user_info['is_tester'] == 1) { //测试用户只推送赠送礼物信息 if ($send_type == 1) { //直接购买 //计算赠送礼物总资金 $reslut = model('admin/User')->change_user_money_by_uid($uid, -$total_send_amount, 2, 29, "打赏幸运礼物", $uid, 0, $rid); if ($reslut['code'] == 201) { Db::rollback(); return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null]; } }else { return ['code' => 201, 'msg' => '参数非法', 'data' => null]; } //赠送礼物增加财富值 贡献值 $reslut = model('User')->change_user_contribution_value($uid, $total_send_amount); if ($reslut['code'] == 201) { Db::rollback(); return ['code' => 201, 'msg' => '请重试1', 'data' => null]; } //赠送者增加房间贡献值 $reslut = model('User')->change_user_room_contribution_value($uid, $rid, $total_send_amount); if ($reslut['code'] == 201) { Db::rollback(); return ['code' => 201, 'msg' => '请重试4', 'data' => null]; } //日贡献 model('Statistics')->day_contribution($uid, $rid, $total_send_amount, 2); //房间礼物墙 $reslut = model('GiftWall')->room_gift_wall($rid, $gid, $total_send_num, $total_send_amount); if($reslut['code'] == 201){ Db::rollback(); return ['code' => 201, 'msg' => '请重试5', 'data' => null]; } db::name('room')->where('rid', $rid)->inc('hot_value', $total_send_amount)->inc('today_hot_value', $total_send_amount)->update(); //当前礼物倍率配置 $gift_multiple_rate_data = ''; $total_num = 0; $win_multiple_data = []; foreach ($gift_multiple_rate_list as $a => $b){ $da = $b['id'].'-'.$b['multiple'].'-'.$b['rate_num'].';'; $gift_multiple_rate_data .= $da; $total_num += $b['rate_num']; for($i = 0; $i < $b['rate_num']; $i++){ $win_multiple_data[] = $b['id']; } } shuffle($win_multiple_data); // $room_guild_info = model('Guild')->user_guild_info($room_info['room_owner_uid']); $total_win_price = 0; $user_win_multiple = []; foreach ($user_list as $k => $v) { //该用户是否有公会及公会收益 // $user_guild_info = model('Guild')->user_guild_info($v['uid']); $gift_total_price = $gift_info['gift_price'] * $num; // $win_multiple_data = $redis->blpop($keyname, 2); // if(empty($win_multiple_data)){ // return ['code' => 201, 'msg' => '', 'data' => null]; // }else{ // $win_multiple_data_data = explode('-', $win_multiple_data[1]); // $bl_id = $win_multiple_data_data[0]; // $win_multiple = $win_multiple_data_data[1]; // $data = []; // $data['bl_id'] = $bl_id; // $data['multiple'] = $win_multiple; // $user_gift_multiple_redis_list[] = $data; // } //增加当期开启数量 // $reslut = db::name('gift_multiple_log')->where('bl_id', $bl_id)->inc('open_num', 1)->update(); // if(!$reslut){ // Db::rollback(); // $this->redis_gift_multiple_data_rollback($redis, $keyname, $user_gift_multiple_redis_list); // return ['code' => 201, 'msg' => '请重试', 'data' => null]; // } //多次数量累计倍率 $win_multiple = 0; for($i = 1; $i <= $num; $i++){ //随机抽取倍率id $win_key = array_rand($win_multiple_data); $win_gift_multiple_rate_id = $win_multiple_data[$win_key]; $multiple = db::name('gift_multiple_rate')->where('id', $win_gift_multiple_rate_id)->value('multiple'); $win_multiple += $multiple; } //获取金币数 // $win_price = $gift_total_price * $win_multiple; $win_price = $gift_info['gift_price'] * $win_multiple; $total_win_price += $win_price; // $room_owner_profits = $gift_total_price * $room_owner_info['room_owner_lucky_commission']; // $room_owner_profit = $room_owner_profits * (1 - $room_host_commission); // $room_host_profit = $room_owner_profits * $room_host_commission; if($room_info['is_earnings'] == 1){ $room_owner_profits = $gift_total_price * 0.02; $room_owner_profit = $room_owner_profits * 1; $room_host_profit = $room_owner_profits * 0; }else{ $room_owner_profits = 0; $room_owner_profit = 0; $room_host_profit = 0; } // $room_host_profit = $gift_total_price * 0.01; // $receiver_profit = $gift_total_price * $config['lucky_gift_earnings_rate']; $receiver_profit = $gift_total_price * 0.002; // $platform_profit = $gift_total_price - $room_owner_profit - $room_host_profit - $receiver_profit; $platform_profit = $gift_total_price - $room_owner_profits - $receiver_profit; $data = []; // $data['bl_id'] = $bl_id; $data['uid'] = $uid; $data['rid'] = $rid; // $data['guild_id'] = $user_guild_info['guild_id']; // $data['room_guild_id'] = $room_guild_info['guild_id']; $data['room_uid'] = $room_info['room_owner_uid']; $data['room_host_uid'] = $room_info['room_host_uid']; $data['receive_uid'] = $v['uid']; $data['gid'] = $gid; $data['gift_name'] = $gift_info['gift_name']; $data['gift_price'] = $gift_info['gift_price']; $data['gift_num'] = $num; $data['gift_total_price'] = $gift_total_price; $data['platform_profit'] = $platform_profit; $data['receiver_profit'] = $receiver_profit; $data['room_owner_profit'] = $room_owner_profit; $data['room_host_profit'] = $room_host_profit; $data['win_multiple'] = $win_multiple; $data['win_price'] = $win_price; // $data['config_text'] = $gift_multiple_rate_data; // $data['total_multiple_num'] = $total_num; $data['gift_from_type'] = $send_type; $data['is_tester'] = $user_info['is_tester']; $data['add_time'] = $now_time; $data['update_time'] = $now_time; $sid = db::name('user_send_gift_rate')->insertGetId($data); if (empty($sid)) { Db::rollback(); // $this->redis_gift_multiple_data_rollback($redis, $keyname, $user_gift_multiple_redis_list); return ['code' => 201, 'msg' => "请重试3", 'data' => null]; } //发送数据开始 $message_data_temp = [ 'from_uid' => $uid, 'to_uid' => $v['uid'], 'gift_name' => $gift_info['gift_name'], 'gift_price' => $gift_info['gift_price'], 'gift_num' => $num, 'rid' => $rid, ]; $message_data[] = $message_data_temp; //增加厅主收益记录 if ($room_owner_profit > 0) { $change_value = $room_owner_profit / $config['exchange_rate']; $reslut = model('admin/User')->change_user_money_by_uid($room_info['room_owner_uid'], $change_value, 1, 32, "打赏厅主流水收益", $uid, $sid, $rid); if ($reslut['code'] == 201) { Db::rollback(); // $this->redis_gift_multiple_data_rollback($redis, $keyname, $user_gift_multiple_redis_list); return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null]; } //收益记录 model('Statistics')->day_room_profit($room_info['room_owner_uid'], $rid, $change_value, 1); } // if($room_host_profit > 0 && !empty($room_info['room_host_uid'])){ if($room_host_profit > 0 && $room_info['room_host_uid'] > 0){ $change_value = $room_host_profit / $config['exchange_rate']; $reslut = model('admin/User')->change_user_money_by_uid($room_info['room_host_uid'], $change_value, 1, 33, "打赏主持流水收益", $uid, $sid, $rid); if ($reslut['code'] == 201) { Db::rollback(); // $this->redis_gift_multiple_data_rollback($redis, $keyname, $user_gift_multiple_redis_list); return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null]; } //收益记录 model('Statistics')->day_room_profit($room_info['room_host_uid'], $rid, $change_value, 2); } //礼物接收者收益 if ($receiver_profit > 0) { $change_value = $receiver_profit / $config['exchange_rate']; $reslut = model('admin/User')->change_user_money_by_user_info($v, $change_value, 1, 31, "礼物收入", $uid, $sid, $rid); if ($reslut['code'] == 201) { Db::rollback(); // $this->redis_gift_multiple_data_rollback($redis, $keyname, $user_gift_multiple_redis_list); return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null]; } } //收礼物增加魅力值 // $reslut = model('User')->change_user_charm_value($v['uid'], $gift_total_price); // if ($reslut['code'] == 201) { // Db::rollback(); // // $this->redis_gift_multiple_data_rollback($redis, $keyname, $user_gift_multiple_redis_list); // return ['code' => 201, 'msg' => '请重试4', 'data' => null]; // } //接受者增加房间魅力值 // $reslut = model('User')->change_user_room_charm_value($v['uid'], $rid, $gift_total_price,$uid); // if ($reslut['code'] == 201) { // Db::rollback(); // // $this->redis_gift_multiple_data_rollback($redis, $keyname, $user_gift_multiple_redis_list); // return ['code' => 201, 'msg' => '请重试4', 'data' => null]; // } //日收益 model('Statistics')->day_charm($v['uid'], $rid, $gift_total_price, 2); //收礼物墙 $reslut = model('GiftWall')->user_receive_gift_wall($v['uid'], $gid, $num, $uid); if($reslut['code'] == 201){ Db::rollback(); return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null]; } if($gift_total_price > 0){ if($room_info['cate_id'] == 29){ $reslut = model('DatingRoom')->user_send_gift_heartbeat_line($uid, $v['uid'], $rid, $gift_total_price, $help_uid); if($reslut['code'] == 201){ Db::rollback(); return ['code' => 201, 'msg' => '请重试7', 'data' => null]; } } if($room_info['cate_id'] == 28 && $uid != $v['uid']){ $reslut = model('AuctionRoom')->record_user_auction_info($uid, $v['uid'], $rid, $gid, $gift_info['gift_price'], $num, $room_info['room_host_uid']); if($reslut['code'] == 201){ Db::rollback(); return ['code' => 201, 'msg' => '请重试7', 'data' => null]; } } if($room_info['cate_id'] == 27){ $reslut = model('KtvRoom')->send_gift_add_song_time($uid, $v['uid'], $rid, $gid, $num, $gift_total_price); if($reslut['code'] == 201){ Db::rollback(); return ['code' => 201, 'msg' => '请重试7', 'data' => null]; } } } if($win_multiple > 0){ $to_uid_win_multiple = []; $to_uid_win_multiple['recived_uid'] = $v['uid']; $to_uid_win_multiple['head_pic'] = $v['head_pic']; $to_uid_win_multiple['base64_nick_name'] = $v['base64_nick_name']; $to_uid_win_multiple['win_multiple'] = $win_multiple; $user_win_multiple[] = $to_uid_win_multiple; } $user_list[$k]['win_multiple'] = $win_multiple; } //计算返币资金 if($total_win_price > 0){ $reslut = model('admin/User')->change_user_money_by_uid($uid, $total_win_price, 2, 30, "幸运礼物爆币获取", $uid, 0, $rid); if ($reslut['code'] == 201) { Db::rollback(); // $this->redis_gift_multiple_data_rollback($redis, $keyname, $user_gift_multiple_redis_list); return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null]; } } //更新房间在线用户财富值 if(in_array($room_info['cate_id'], [27,28])){ $reslut = model('RoomBossMicro')->update_room_visitor_value($uid, $rid, $total_send_amount); if($reslut['code'] != 200){ Db::rollback(); return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null]; } } //发送开始 // if($message_data) { // model('api/AsyncPushMessage')->store_message($message_data, 2); // } } else{ return ['code' => 201, 'msg' => '参数错误', 'data' => null]; } Db::commit(); model('Room')->push_room_micro_data($rid); //推送最新房间麦位信息 // $user_decorate_info = model('api/room')->get_room_user_vip($uid, 0); // $push_room_pendant_data = []; // $push_is_open = ''; $room_push_data = []; $server_push_data = []; $gift_list = []; $gift_list[] = $gift_info; foreach ($user_list as $k => $v) { foreach ($gift_list as $m => $n) { $ls_data = []; $ls_data['rid'] = $rid; $ls_data['send_user_info']['uid'] = $uid; $ls_data['send_user_info']['head_pic'] = localpath_to_netpath($user_info['head_pic']); $ls_data['send_user_info']['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8'); $ls_data['recived_user_info']['uid'] = $v['uid']; $ls_data['recived_user_info']['head_pic'] = localpath_to_netpath($v['head_pic']); $ls_data['recived_user_info']['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8'); // $ls_data['lwtp_base_image'] = $user_decorate_info['data']['lwtp_base_image']; $ls_data['gift_price'] = $n['gift_price']; $ls_data['gift_name'] = $n['gift_name']; $ls_data['play_image'] = $n['play_image']; $ls_data['base_image'] = $n['base_image']; $ls_data['is_multiple_gift'] = 1; $ls_data['num'] = $num; $ls_data['win_multiple'] = $v['win_multiple']; $ls_data['is_public_screen'] = $n['is_public_screen']; $ls_data['is_public_server'] = $n['is_public_server']; if ($ls_data['is_public_server'] == 1) { $server_push_data[] = $ls_data; } $room_push_data[] = $ls_data; } } // if (!empty($server_push_data)) { // $pust_data = []; // $pust_data['code'] = 306; // $pust_data['msg'] = '打赏礼物'; // // $pust_data['data'] = $server_push_data; // $pust_data['data']['room_info']['rid'] = $room_info['rid']; // $pust_data['data']['room_info']['room_name'] = mb_convert_encoding(base64_decode($room_info['base64_room_name']), 'UTF-8', 'UTF-8'); // $pust_data['data']['gift_list'] = $server_push_data; // model('api/WebSocketPush')->send_to_all($pust_data); // } if (!empty($room_push_data)) { $pust_data = []; $pust_data['code'] = 302; $pust_data['msg'] = '打赏礼物'; $pust_data['data'] = $room_push_data; model('api/WebSocketPush')->send_to_group($room_info['rid'], $pust_data); } if(!empty($user_win_multiple)){ foreach ($user_win_multiple as $k => $v){ // dump($v); $push_user_multiple = []; $push_user_multiple['send_user_info']['uid'] = $uid; $push_user_multiple['send_user_info']['head_pic'] = localpath_to_netpath($user_info['head_pic']); $push_user_multiple['send_user_info']['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8'); $push_user_multiple['recived_user_info']['uid'] = $v['recived_uid']; $push_user_multiple['recived_user_info']['head_pic'] = localpath_to_netpath($v['head_pic']); $push_user_multiple['recived_user_info']['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8'); $push_user_multiple['gift_name'] = $gift_info['gift_name']; $push_user_multiple['gift_price'] = $gift_info['gift_price']; $push_user_multiple['base_image'] = localpath_to_netpath($gift_info['base_image']); $push_user_multiple['num'] = $num; $push_user_multiple['win_multiple'] = $v['win_multiple']; $push_data = []; $push_data['code'] = 357; $push_data['msg'] = '爆币推送'; $push_data['data'] = $push_user_multiple; $reslut = model('api/WebSocketPush')->send_to_group($room_info['rid'], $push_data); // dump($reslut); } } $data = []; $data['integral'] = db::name('user')->where('uid', $uid)->value('integral'); $data['integral'] = (int)$data['integral']; $data['data'] = $room_push_data; return ['code' => 200, 'msg' => "打赏成功", 'data' => $data]; } catch (\Exception $e) { dump($e); // $this->redis_gift_multiple_data_rollback($redis, $keyname, $user_gift_multiple_redis_list); //回滚事务 Db::rollback(); return ['code' => 201, 'msg' => "请重试5", 'data' => null]; } } //返还用户抽中礼物到奖池 private function redis_gift_multiple_data_rollback($redis, $keyname, $user_gift_multiple_list) { $insert_data = []; foreach ($user_gift_multiple_list as $k => $v) { $insert_data[] = $v['bl_id'] . '-' . $v['multiple']; } 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 txt(){ $num = input('num', 0); for($i=1; $i <= $num; $i++){ dump($i); } } }