diff --git a/application/api/controller/Room.php b/application/api/controller/Room.php index 4c57ec87..b24508e9 100644 --- a/application/api/controller/Room.php +++ b/application/api/controller/Room.php @@ -187,6 +187,7 @@ class Room extends BaseCom //直播间送礼 + // public function room_give_gift() { $key_name = "api:room:gift:" . $this->uid; @@ -236,7 +237,7 @@ class Room extends BaseCom public function room_online_list() { $room_id = input('room_id', 0); - if($room_id){ + if(!$room_id){ return V(0, '房间不存在'); } $page = input('page', 1); @@ -249,7 +250,7 @@ class Room extends BaseCom public function room_user_home() { $room_id = input('room_id', 0); - if($room_id){ + if(!$room_id){ return V(0, '房间不存在'); } $user_id = input('user_id', 0); @@ -352,7 +353,7 @@ class Room extends BaseCom public function room_info() { $room_id = input('room_id', 0); - if($room_id){ + if(!$room_id){ return V(0, '房间不存在'); } $reslut = model('Room')->room_info($this->uid, $room_id); diff --git a/application/api/controller/RoomAuction.php b/application/api/controller/RoomAuction.php index 9e576ace..23e29f24 100644 --- a/application/api/controller/RoomAuction.php +++ b/application/api/controller/RoomAuction.php @@ -68,11 +68,12 @@ class RoomAuction extends BaseCom $gift_id = input('gift_id'); $num = input('num'); $type = input('type',1);//1金币购买 2送背包礼物 + $gift_bag_id = input('gift_bag_id',0); $pool_gift_id = db::name('bb_lottery_config')->where(['key' => 'pool_gift_id'])->value('value'); if($gift_id == $pool_gift_id){ return V(0, '此礼物不能进行此操作'); } - $reslut = model('RoomAuction')->room_auction_join($auction_id,$user_id,$gift_id,$num,$type); + $reslut = model('RoomAuction')->room_auction_join($auction_id,$user_id,$gift_id,$num,$type,$gift_bag_id); return V($reslut['code'], $reslut['msg'], $reslut['data']); } diff --git a/application/api/controller/SendGift.php b/application/api/controller/SendGift.php index 7d6a2b19..18f30e5d 100644 --- a/application/api/controller/SendGift.php +++ b/application/api/controller/SendGift.php @@ -16,13 +16,19 @@ class SendGift extends BaseCom { $key_name = "api:send:gift:" . $this->uid; redis_lock_exits($key_name); - $room_id = input('room_id', 0);//房间ID - $gift_id = input('gift_id', 0);//礼物ID - $gift_num = (int)input('gift_num', 1);//礼物数量 + + $room_id = input('room_id/d', 0);//房间ID + $gift_id = input('gift_id/d', 0);//礼物ID + $gift_num = (int)input('gift_num/d', 1);//礼物数量 $to_uid = input('to_uid', 0);//收礼人ID,逗号隔开的字符串 - $type = input('type', 1);//1金币购买 2送背包礼物 - $pit_number = input('pit_number', 0); - $heart_id = input('heart_id', 0);//助力时的 ID + $type = input('type/d', 1);//1金币购买 2送背包礼物 + $heart_id = input('heart_id/d', 0);//助力时的 ID + $gift_bag_id = input('gift_bag_id/d', 0);//盲盒类型ID 7-初级,8-中级,9-高级 + + if($room_id <= 0 || $gift_id <= 0 || $to_uid <= 0 || $type <= 0){ + redis_unlocks($key_name); + return V(0, '参数错误'); + } //获取幸运币 $pool_gift_id = db::name('bb_lottery_config')->where(['key' => 'pool_gift_id'])->value('value'); @@ -34,13 +40,10 @@ class SendGift extends BaseCom //获取房间类型 1:交友/pk(二卡八),2:练歌房(声网点歌),3:亲密拍,4:真爱拍,6:私密房,7:互娱房,9:点唱/歌手房,10:签约房,11:酒吧房 $room_type = model('Room')->get_room_type($room_id); - //送礼 - $reslut = model('SendGift')->give_gift($this->uid, $to_uid, $gift_id, $gift_num,2,$type, $room_id,$pit_number,0,); - if($room_type == 1){ - redis_unlocks($key_name); - return V($reslut['code'], $reslut['msg'], $reslut['data']); - }elseif ($room_type == 2){ - $reslut = model('GiveGift')->give_gift($this->uid, $to_uid, $gift_id, $gift_num,2,$type, $room_id,$pit_number,0,$give_gift_ext); + //送礼 (送礼用户,收礼用户组,礼物ID,数量,礼物类型,房间ID ) + $reslut = model('SendGift')->send_gift($this->uid, $to_uid, $gift_id, $gift_num, $type, $room_id, $gift_bag_id, $heart_id); + + if($room_type == 2){//2:练歌房(声网点歌) if($reslut['code'] == 1){ $room_pits = model('RoomSong')->get_charm_rank($room_id); if($room_pits['code'] == 1){ @@ -54,11 +57,10 @@ class SendGift extends BaseCom } redis_unlocks($key_name); return V($reslut['code'], $reslut['msg'], $reslut['data']); - }else{ - redis_unlocks($key_name); - return V(1, '送礼成功'); } + redis_unlocks($key_name); + return V(1, '送礼成功'); } } } \ No newline at end of file diff --git a/application/api/model/Friend.php b/application/api/model/Friend.php index 1809622f..7f36fb84 100644 --- a/application/api/model/Friend.php +++ b/application/api/model/Friend.php @@ -321,16 +321,12 @@ class Friend extends Model * @param $room_id 房间id * @param $pit_number 坑位 */ - public function room_give_gift($uid, $to_uid, $gift_id, $gift_num, $from_type, $type, $room_id, $pit_number, $heart_id,$give_gift_ext) + public function room_give_gift($uid, $to_uid,$room_id,$res,$heart_id = 0) { - $res = model('GiveGift')->give_gift($uid, $to_uid, $gift_id, $gift_num, $from_type, $type, $room_id, $pit_number,0,$give_gift_ext); - if($res['code'] != 1){ - return $res; - } - //送礼成功后续操作 - //查看当前时间是否在交友表的创建时间和结束时间段内 用来区分是否要拉取心动值高的用户上麦 $friend = db::name('vs_user_friending')->where(['room_id' => $room_id,'status' => 1])->order('id desc')->find(); + + //查看当前时间是否在交友表的创建时间和结束时间段内 用来区分是否要拉取心动值高的用户上麦 if($friend && time() >= $friend['create_time'] && time() <= $friend['end_time']){ $heart_exp = get_system_config_value('coin_charm_exp');//金币与魅力值转换比 $sumPrice = $res['data']['gift_total'] * $heart_exp; @@ -338,7 +334,7 @@ class Friend extends Model if($heart_id){//有这个值就是助力 不参加抢麦操作 db::name('vs_user_friending_heart')->where(['id' => $heart_id])->setInc('heart_value', $sumPrice); - $this->pullHeartChange($room_id,$friend['id']);//聊天室心动值变化通知 +// $this->pullHeartChange($room_id,$friend['id']);//聊天室心动值变化通知 注释掉是因为下面那个函数会处理 //生成新排名 判断抱上麦 还是换麦 $this->pullUserPit($room_id,$friend['id']); }else{ @@ -346,7 +342,7 @@ class Friend extends Model $host = $this->is_host($uid,$to_uid,$room_id); $user_idd = explode(",", $user_idd); // 将字符串转换为数组 //判断是否是主持 - if($host['is_preside'] == 1){ + if($host && $host['is_preside'] == 1){ if(!in_array($uid,$host['is_preside_user'])){//主持不是当前送礼人,那就是在收礼人中 //从数组中剔除主持人 && $is_preside_user!= UID $user_idd = array_diff($user_idd, $host['is_preside_user']); // 从数组中移除 @@ -382,13 +378,13 @@ class Friend extends Model foreach ($user_ids as $value) { //判断收礼人是否是主持 if (in_array($value, $host)) { - $is_preside = 1; + $is_preside = 1;//是主持 $is_preside_user[] = $value; } } //送礼人是主持或嘉宾 if (in_array($uid, $host)) { - $is_preside = 1; + $is_preside = 1;//是嘉宾 $is_preside_user[] = $uid; } return ['is_preside' =>$is_preside,'is_preside_user' => $is_preside_user]; diff --git a/application/api/model/GiveGift.php b/application/api/model/GiveGift.php index 047a75c1..c22c18e5 100644 --- a/application/api/model/GiveGift.php +++ b/application/api/model/GiveGift.php @@ -1,11 +1,10 @@ redis = \think\Cache::store('redis')->handler(); } + /* - * 送礼物 + * 送礼物-盲盒转盘专用 + * @param int $uid 用户id + * @param int $from_id 来源id + * @param str $to_uid 接收礼物用户id字符串逗号分隔 + * @param int $gid 礼物id + * @param int $num 礼物数量 + * @param int $from_type 来源 1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务 6-cp房间送礼 + * @param int $type 金币购买 1金币购买 2送背包礼物 + * @param int $pit_number 坑位编号 + * @return array + * 用户,在房间中,给谁,送了什么礼物,多少个,来源 + */ + public function give_gift_to_pan($uid,$to_uid,$gid,$num,$from_type,$type,$from_id = 0,$pit_number = 0,$change_type = 0,$ext = []) + { + //送的礼物信息 + $gift_info = Db::name('vs_gift')->where(['gid'=>$gid]) + ->field('gid as gift_id,gift_name,gift_price,file_type,base_image,play_image,gift_type,label,is_public_server')->find(); + if(empty($gift_info)){ + return ['code' => 0, 'msg' => '礼物不存在', 'data' => null]; + } + if(!$to_uid){ + return ['code' => 0, 'msg' => '请选择收礼人', 'data' => null]; + } + $toarray = explode(',',$to_uid); + if(in_array($uid,$toarray)){ + return ['code' => 0, 'msg' => '收礼人不能包含自己', 'data' => null]; + } + if (ceil($num) != $num) { + return ['code' => 0, 'msg' => '打赏礼物数量必须为整数', 'data' => null]; + } + if ($num < 1) { + return ['code' => 0, 'msg' => '打赏礼物数量必须大于零', 'data' => null]; + } + $user_info = Db::name('user')->where(['id'=>$uid,'status'=>1])->find(); + if(empty($user_info)){ + return ['code' => 301, 'msg' => '当前用户登录失效', 'data' => null]; + } + + //获取送礼用户昵称 + $FromUserInfo = db::name('user')->where('id',$uid)->field('id as user_id,nickname,avatar,sex')->find(); + $FromUserInfo['icon'][0] = model('UserData')->user_wealth_icon($uid);//财富图标 + $FromUserInfo['icon'][1] = model('UserData')->user_charm_icon($uid);//魅力图标 + $FromUserInfo['chat_bubble'] = model('Decorate')->user_decorate_detail($uid,9);//聊天气泡 + + //送给一人礼物的总价格(扣除用户的数额) + $gift_price = $gift_info['gift_price'] * $num; + + $roomId = 0; + if($from_type == 2 || $from_type == 3 || $from_type == 6){ + $roomId = $from_id; + } + + //循环送礼 + $gift_total = 0; + $give_gift = 0; + $gift_user_data = []; + foreach ($toarray as $k => $to_id){ + $gift_user_data[]['user_id'] = $to_id; + $gift_box1 = []; + $gift_box = []; + $gift_total += $gift_price; + //收礼记录行为日志 + $give_gift = $this -> change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_id,$from_type,$type,$from_id,$pit_number); + if(!$give_gift){ + return ['code' => 0, 'msg' => '送礼失败', 'data' => null]; + } + $gift_user_data[$k]['gift_price'] = $gift_price; + + //计算收礼人得益 + $receiver_earnings = $this -> receiver_earnings($to_id,$gift_price,$from_type); + if($receiver_earnings < 0){ + return ['code' => 0, 'msg' => '收礼人收益配置有误', 'data' => null]; + } + + //收礼人认证歌手等级升级 + model('api/SingerSong')->singerLevelUp($to_id,$gift_price); + + //收礼人身价计算 这里的增长身价是收礼物的价值按比率产生的身价值 身价=收礼产生的身价+签约时的溢价 + $coin_market_values = explode(',', get_system_config_value('coin_market_value')); + $change_value = ceil($gift_price / ($coin_market_values[0] ?? 100) * ($coin_market_values[1] ?? 1)); + model('api/MarketValue')->change($to_id,$change_value,0); + + //收礼人是否被签约 给上级返佣 + model('api/Sign')->check_sign_gift($to_id,$gid,$num,$gift_price,$from_id); + + //1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务 6-cp房间送礼 + if($from_type == 1 || $from_type == 2 || $from_type == 3 ||$from_type == 4 || $from_type == 6){ + //增加收益并记录日志 + $receiver = $this -> change_user_cion_or_earnings_log($to_id,$receiver_earnings,$from_id,2,11,'收礼增加收益'); + }elseif($from_type == 5){ + //增加收益并记录日志 + $receiver = $this -> change_user_cion_or_earnings_log($to_id,$receiver_earnings,$from_id,1,$change_type,'活动增加金币'); + }else{ + $receiver = false; + } + if(!$receiver){ + return ['code' => 0, 'msg' => '收礼人收益失败', 'data' => null]; + } + //用户魅力等级更新 + $user_level = model('Level')->user_level_data_update($to_id,$gift_price,2,$roomId); + if(!$user_level){ + return ['code' => 0, 'msg' => '用户等级更新失败', 'data' => null]; + } + + $room_owner_earnings = 0;//房主收益 + $room_owner_earningsg = 0;//公会会长收益 + //是否在房间 + if(isset($from_id) && ($from_type == 2 || $from_type == 6)){ + if($from_type == 6){ //cp电影房 + //房主有收益 + if(get_system_config_value('room_cp_room_user_ratio') > 0){ + $room_owner = Db::name('vs_room')->where(['id'=>$from_id,'apply_status'=>2])->value('user_id'); + //计算房主收益//room_author_ratio + $room_owner_earnings = $this -> receiver_earnings($room_owner,$gift_price,699); + if($room_owner_earnings > 0){ + //增加收益并记录日志 + $room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益'); + if(!$room_owner_earning){ + return ['code' => 0, 'msg' => '房主收益失败', 'data' => null]; + } + } + } + //公会长收益 + if(get_system_config_value('room_cp_guild_user_ratio') > 0){ + $guild_id = Db::name('vs_guild_user')->where(['user_id'=>$to_uid,'status'=>1])->value('guild_id'); + if($guild_id){ + $room_guild = Db::name('vs_guild')->where(['id'=>$guild_id])->value('user_id'); + //计算会长收益 + $room_owner_earningsg = $this -> receiver_earnings($room_guild,$gift_price,698); + //增加收益并记录日志 + $room_owner_earningg = $this -> change_user_cion_or_earnings_log($room_guild,$room_owner_earningsg,$from_id,2,21,'工会长收益'); + if(!$room_owner_earningg){ + return ['code' => 0, 'msg' => '工会长收益失败', 'data' => null]; + } + } + } + + }else{ + $room_owner = Db::name('vs_room')->where(['id'=>$from_id,'apply_status'=>2])->value('user_id'); + //计算房主收益//room_author_ratio + $room_owner_earnings = $this -> receiver_earnings($room_owner,$gift_price,99);//结果是钻石 + if($room_owner_earnings > 0){ + //主持人收益 + //在主持位的主持人 + $host_id = Db::name('vs_room_pit')->where(['room_id'=>$from_id,'pit_number'=>9])->value('user_id'); + if($host_id){ + //计算主持人收益 + $host_earnings = $this -> receiver_earnings($host_id,$room_owner_earnings*get_system_config_value('rmb_coin_ratio'),98,$from_id); + if($host_earnings > 0){ + //增加主持人收益并记录日志 + $host_earnings_earning = $this -> change_user_cion_or_earnings_log($host_id,$host_earnings,$from_id,2,19,'主持人收益'); + if(!$host_earnings_earning){ + return ['code' => 0, 'msg' => '主持人收益失败', 'data' => null]; + } + //增加房主收益并记录日志 + $room_owner_earningss = $room_owner_earnings - $host_earnings; + if($room_owner_earningss > 0){ + $room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earningss,$from_id,2,18,'房主收益'); + if(!$room_owner_earning){ + return ['code' => 0, 'msg' => '房主收益失败', 'data' => null]; + } + } + + }else{ + //增加房主收益并记录日志 + $room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益'); + if(!$room_owner_earning){ + return ['code' => 0, 'msg' => '房主收益失败', 'data' => null]; + } + } + }else{ + //增加房主收益并记录日志 + $room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益'); + if(!$room_owner_earning){ + return ['code' => 0, 'msg' => '房主收益失败', 'data' => null]; + } + } + } + } + if($gift_info['label'] == 2){ + foreach ($gift_box as $gv) { + //记录送礼利率和各方收益 + //收礼人是否加入公会 + $receiver_earningss = $this -> receiver_earnings($to_id,$gv['gift_price'],$from_type); + $room_owner_earningss = $this -> receiver_earnings($room_owner,$gv['gift_price'],99);//结果是钻石 + $ext_give_data = [ + 'FromUserInfo' => $FromUserInfo, + 'GiftInfo' => $gift_info, + 'GiftType' => 3, + ]; + $gift_rate = $this->record_gift_profit($to_uid,$room_owner_earningsg,$gv['gift_price'],$gv['give_gift_id'],$receiver_earningss,$room_owner_earningss,$from_id,$ext_give_data); + if ($gift_rate['code']==0) { + Db::rollback(); + return ['code' => 0, 'msg' => $gift_rate['msg'], 'data' => null]; + } + } + }else{ + //记录送礼利率和各方收益 + //收礼人是否加入公会 + $ext_give_data = [ + 'FromUserInfo' => $FromUserInfo, + 'GiftInfo' => $gift_info, + 'GiftType' => 3, + ]; + $gift_rate = $this->record_gift_profit($to_uid,$room_owner_earningsg,$gift_price,$give_gift,$receiver_earnings,$room_owner_earnings,$from_id,$ext_give_data + ); + if ($gift_rate['code']==0) { + Db::rollback(); + return ['code' => 0, 'msg' => $gift_rate['msg'], 'data' => null]; + } + } + } + + $ToUserInfo = Db::name('user')->where(['id' => $to_id])->field('id as user_id,nickname,avatar,sex')->find(); + $ToUserInfo['icon'][0] = model('UserData')->user_wealth_icon($to_id);//财富图标 + $ToUserInfo['icon'][1] = model('UserData')->user_charm_icon($to_id);//魅力图标 + $ToUserInfo['charm'] = db::name('vs_room_user_charm')->where(['user_id' => $to_id,'room_id' => $from_id])->value('charm');//魅力 + + if(isset($from_id) && ($from_type == 2 || $from_type == 6)){ + //查询房间是否在PK中 是fa_vs_room_pk 表中的 room_id_a,还是room_id_b + $room_pk = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_a' => $from_id])->field('pk_id')->find(); + if (!empty($room_pk)) { + // 当前 room_id 是 room_id_a 修改create_value_a + $rooma = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->setInc('create_value_a', $gift_price * 10); + $roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->find(); + //推送变化 + $text = [ + 'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id + 'create_value_a' => $roomPKinfo['create_value_a'],//发起者房间值 + 'room_id_b' => $roomPKinfo['room_id_b'],//接受者房间id + 'receive_value_b' => $roomPKinfo['receive_value_b'],//接受者房间值 + 'text' => '' + ]; + model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text); + model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text); + } else { + // 当前 room_id 不是 room_id_a,可能是 room_id_b 或者不存在 + $room_pk_b = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_b' => $from_id])->field('pk_id')->find(); + if (!empty($room_pk_b)) { + // 当前 room_id 是 room_id_b + $roomb = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->setInc('receive_value_b', $gift_price * 10); + $roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->find(); + //推送变化 + $text = [ + 'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id + 'create_value_a' => $roomPKinfo['create_value_a'],//发起者房间值 + 'room_id_b' => $roomPKinfo['room_id_b'],//接受者房间id + 'receive_value_b' => $roomPKinfo['receive_value_b'],//接受者房间值 + 'text' => '' + ]; + model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text); + model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text); + } + } + //直播间送礼物 每日任务 + model('DailyTasks')->tasks_complete($uid,3); + } + //cp检测 + model('api/UserCp')->checkGift($uid, $gid, $to_id, $from_id,$num,$gift_price); + } + + //增加房间火热值hot_value + $gift_totalaa = $gift_total * get_system_config_value('coin_charm_exp'); + db::name('vs_room')->where(['id' => $from_id])->inc('hot_value', $gift_totalaa)->inc('today_hot_value', $gift_totalaa)->update(); + + $roomtype = Db::name('vs_room')->where(['id' => $from_id])->value('type_id'); + if($roomtype == 6){ + //推送消息 交友房创建的私密房 倒计时增加 + $value = db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1) + ->value('time_day'); + if($value){ + db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1) + ->setInc('time_day', $gift_total); + $text111 = [ + 'room_id' => $from_id, + 'time_day' => db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1)->value('time_day'), + 'text' => '房间结束时间变化' + ]; + //聊天室推送系统消息 + model('Chat')->sendMsg(1052,$from_id,$text111); + } + } + + return ['code' => 1, 'msg' => '送礼成功', 'data' => ['gift_total' => $gift_total,'gift_user_data' =>$gift_user_data,'cp_type' => ['cp_type' => 0,'text' => '','text1' => '','gift_id' => $gid]]]; + } + + + + //计算收礼人得到的收益 + public function receiver_earnings($to_uid,$all_gift_price,$from_type,$room_id = 0) + { + if($from_type == 1){//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 99房主收益 98主持人收益 + $ratio = get_system_config_value('gift_chat_earning'); + }elseif ($from_type == 2 || $from_type == 3){ + //收礼人是否加入公会 + $is_join_guild = Db::name('vs_guild_user')->where(['user_id'=>$to_uid,'status'=>1,'quit_time' => 0])->field('guild_id,settlement_ratio')->find(); + //收益增加 加入工会的收益 + if($is_join_guild){ + $ratio = $is_join_guild['settlement_ratio']; + }else{ + $ratio = get_system_config_value('room_gift_ratio'); + } + }elseif ($from_type == 4){ + $ratio = get_system_config_value('gift_zone_earnings'); + }elseif ($from_type == 99){ + $ratio = get_system_config_value('room_author_ratio'); + }elseif ($from_type == 98){ + $ratio = db::name('vs_room_host')->where(['room_id'=>$room_id,'user_id'=>$to_uid,'delete_time'=>null,'type'=>1])->value('ratio'); + if(!$ratio){ + $ratio = 0; + } + }elseif ($from_type == 6){//Cp电影房 + $ratio = get_system_config_value('room_cp_user_ratio'); + }elseif ($from_type == 699){//计算cp房主收益 + $ratio = get_system_config_value('room_cp_room_user_ratio'); + }elseif ($from_type == 698){//计算cp房工会收益 + $ratio = get_system_config_value('room_cp_guild_user_ratio'); + }else{ + $ratio = 0; + } + + //计算收礼人收益 + return coin_earning($all_gift_price,$ratio); + } + + + //送礼回调处理任务 + public function change_user_give_gift_log_callback($give_gift_id,$data) + { + $from_id = $data['from_id']; + $uid = $data['user_id']; + $to_id = $data['gift_user']; + $gift_price = $data['total_price']; + $gid = $data['gift_id']; + $num = $data['number']; + + //收礼人认证歌手等级升级 + model('api/SingerSong')->singerLevelUp($to_id,$gift_price); + + //收礼人身价计算 这里的增长身价是收礼物的价值按比率产生的身价值 身价=收礼产生的身价+签约时的溢价 + $coin_market_value = get_system_config_value('coin_market_value'); + if(!$coin_market_value){ + $coin_market_value = '100,1'; + } + $coin_market_values = explode(',', $coin_market_value); + $change_value = ceil($gift_price / ($coin_market_values[0] ?? 100) * ($coin_market_values[1] ?? 1)); + model('api/MarketValue')->change($to_id,$change_value,0); + + //收礼人是否被签约 给上级返佣 + model('api/Sign')->check_sign_gift($to_id,$gid,$num,$gift_price,$from_id); + + //记录公会流水 + if($from_id > 0){ + model('api/Guild')->guild_flow($from_id,$gift_price,$give_gift_id); + } + //查询是否第一次送礼 + $is_first_gift = db::name('vs_give_gift')->where(['user_id'=>$uid])->count(); + if($is_first_gift == 1){ + //任务:7-第一次送礼 + model('api/Tasks')->tasks_complete($uid,7); + } + //查询是否第一次收礼 + $is_first_receive_gift = db::name('vs_give_gift')->where(['gift_user'=>$to_id])->count(); + if($is_first_receive_gift == 1){ + //任务:8-第一次收礼 + model('api/Tasks')->tasks_complete($to_id,8); + } + + //查询收礼人和送礼人的师徒关系 + //获取系统配置的特殊礼物 + $special_gift = explode(',',get_system_config_value('master_special_gift')); + //收礼人是否是送礼人的师父 + $is_master = db::name('vs_user_sign')->where(['parent_user_id'=>$to_id,'sign_user_id'=>$uid,'end_time' => ['>=',time()]])->find(); + if($is_master){ + if(in_array($gid,$special_gift)){ + //任务:14-每日给师傅送一个特定的礼物 + model('api/Tasks')->tasks_complete($uid,14); + //查询今天是否送过礼物了 + $is_today_gift = db::name('vs_give_gift') + ->where(['user_id'=>$uid,'gift_user'=>$to_id,'createtime' => ['>=',strtotime(date('Y-m-d'))],'gift_id' => ['in',$special_gift]])->count(); + if($is_today_gift <= 1){ + //任务:13-每日收到至少3个徒弟的特殊徐礼物 + model('api/Tasks')->tasks_complete($to_id,13); + } + } + } + //收礼人是否是送礼人的徒弟 + $is_student = db::name('vs_user_sign')->where(['parent_user_id'=>$uid,'sign_user_id'=>$to_id,'end_time' => ['>=',time()]])->find(); + if($is_student){ + if(in_array($gid,$special_gift)){ + //查询徒弟是否是首签的徒弟 sign_user_type:被签用户的类型:0-首次被签,1-签约过期,2-违约签 + $is_students = db::name('vs_user_sign') + ->where(['parent_user_id' => $uid,'sign_user_id' => $to_id,'sign_user_type' => 0,'end_time' => ['>',time()]])->value('id'); + if($is_students){ + //获取房间的类型 + $room_type = db::name('vs_room')->where(['id' => $from_id])->value('type_id'); + if($room_type == 2){ + //任务:21-邀请徒弟在拍卖房停留(0/5)分钟,并送给徒弟(0/1 ,特殊礼物) + model('api/Tasks')->tasks_complete($uid,21,2,$to_id); + } + if($room_type == 9){ + //任务:22-邀请徒弟在点唱房点歌(0/1)首,并送给徒弟(0/1 ,特殊礼物) + model('api/Tasks')->tasks_complete($uid,22,2,$to_id); + } + if($room_type == 7) { + //任务:23-邀请徒弟在交友房停留(0/5)分钟,并送给徒弟(0/1 ,特殊礼物) + model('api/Tasks')->tasks_complete($uid, 23, 2,$to_id); + } + } + } + } + } + + + + /* + * 聊天送礼物 (音信) + * @param int $user_id 用户id + * @param int $gid 礼物id + * @param int $num 礼物数量 + * @param int $to_uid 接收礼物用户id + * + * @return array + * + */ + public function chat_give_gift($user_id,$gid,$num,$to_uid,$gift_type=1) + { + $gift_info = Db::name('vs_gift')->where(['gid'=>$gid])->find(); + if(empty($gift_info)){ + return ['code' => 0, 'msg' => '礼物不存在', 'data' => null]; + } + if($user_id == $to_uid){ + return ['code' => 0, 'msg' => '不能给自己送礼物', 'data' => null]; + } + if (ceil($num) != $num) { + return ['code' => 0, 'msg' => '打赏礼物数量必须为整数', 'data' => null]; + } + if ($num < 1) { + return ['code' => 0, 'msg' => '打赏礼物数量必须大于零', 'data' => null]; + } + + $user_info = Db::name('user')->where(['id'=>$user_id])->find(); + if(empty($user_info)){ + return ['code' => 0, 'msg' => '送礼用户不存在', 'data' => null]; + } + $to_user_info = Db::name('user')->where(['id'=>$to_uid])->find(); + if(empty($to_user_info)){ + return ['code' => 0, 'msg' => '收礼用户不存在', 'data' => null]; + } + //查询收益比例 + $all_gift_price = $gift_info['gift_price'] * $num; //总礼物价格 + $configs = get_system_config(); + $gift_chat_earning = $configs['gift_chat_earning'];//聊天打赏礼物收益比例 + $gift_earning = coin_earning($all_gift_price,$gift_chat_earning); + if($gift_type == 1){ + //操作送礼人金币 + $res = model('common/UserWallet')->change_user_money($user_id, $all_gift_price, model('common/UserWallet')::MONEYTYPECOIN, model('common/UserWallet')::OPERATION_GIFT,model('common/UserWallet')::ChangeTypeLable(model('common/UserWallet')::OPERATION_GIFT),0,$to_uid,0); + if($res['code'] == 1){ + //操作收礼人收益 + $res = model('common/UserWallet')->change_user_money($to_uid, $gift_earning, model('common/UserWallet')::MONEYTYPEARNINGS, model('common/UserWallet')::GIVE_GIFT_EARNING,model('common/UserWallet')::ChangeTypeLable(model('common/UserWallet')::GIVE_GIFT_EARNING),0,$to_uid,0); + if($res['code'] == 1){ + //插入送礼记录 + $data = [ + 'user_id' => $user_id, + 'gift_user' => $to_uid, + 'gift_id' => $gid, + 'number' => $num, + 'from_id' => 0, + 'total_price' => $all_gift_price, + 'type' => 1, + 'from' => 1, + 'createtime' => time(), + 'updatetime' => time() + ]; + $re = Db::name('vs_give_gift')->insertGetId($data); + if($re){ + $app_ratio = 100 - $gift_chat_earning; + $app_earning = coin_earning($all_gift_price,$app_ratio); + $this->change_give_gift_profit($re,$gift_chat_earning,$gift_earning,0,0,$app_ratio,$app_earning); + return ['code' => 1, 'msg' => '送礼成功', 'data' => null]; + }else{ + return ['code' => 0, 'msg' => '送礼失败', 'data' => null]; + } + } + } + }else{//背包礼物 + $remarks = "赠送 ".$to_user_info['nickname']." 背包礼物 "; + $res = model('UserGiftPack')->change_user_gift_pack($user_id,$gid,$num * -1,model('UserGiftPack')::GIFT_USE,$remarks); + if($res['code'] == 1){ + //操作收礼人收益 + $res = model('common/UserWallet')->change_user_money($to_uid, $gift_earning, model('common/UserWallet')::MONEYTYPEARNINGS, model('common/UserWallet')::GIVE_GIFT_EARNING,model('common/UserWallet')::ChangeTypeLable(model('common/UserWallet')::GIVE_GIFT_EARNING),0,$to_uid,0); + //插入送礼记录 + $data = [ + 'user_id' => $user_id, + 'gift_user' => $to_uid, + 'gift_id' => $gid, + 'number' => $num, + 'from_id' => 0, + 'total_price' => $all_gift_price, + 'type' => 2, + 'from' => 1, + 'createtime' => time(), + 'updatetime' => time() + ]; + $re = Db::name('vs_give_gift')->insertGetId($data); + if($re){ + $app_ratio = 100 - $gift_chat_earning; + $app_earning = coin_earning($all_gift_price,$app_ratio); + $this->change_give_gift_profit($re,$gift_chat_earning,$gift_earning,0,0,$app_ratio,$app_earning); + return ['code' => 1, 'msg' => '送礼成功', 'data' => null]; + }else{ + return ['code' => 0, 'msg' => '送礼失败', 'data' => null]; + } + } + } + return ['code' => $res['code'], 'msg' => $res['msg'], 'data' => null]; + } + + + //动态打赏 + public function reward_zone($uid,$zid,$gift_id,$num,$is_pack) + { + $zone = Db::name('user_zone')->where('id',$zid)->find(); + if(!$zone){ + return ['code'=>0,'msg'=>'动态不存在','data'=>null]; + } + if($uid == $zone['user_id']){ + return ['code'=>0,'msg'=>'不能给自己打赏','data'=>null]; + } + //礼物金额 + $gift_price = Db::name('vs_gift')->where('gid',$gift_id)->value('gift_price'); + //总金额 + $total_gift_price = $gift_price * $num; + //数据库配置 + $config = get_system_config(); + + //开启事务 + Db::startTrans(); + if($is_pack == 2){ + //背包礼物 + $pack_give_gift = $this->give_pack_gift($uid,$gift_id,$num); + if($pack_give_gift['code'] != 1){ + Db::rollback(); + return ['code'=>$pack_give_gift['code'],'msg'=>$pack_give_gift['msg'],'data'=>null]; + } + }else{ + //金币礼物 + $coin_give_gift = $this->give_coin_buy_gift($uid,$total_gift_price,$zid); + if($coin_give_gift['code'] != 1){ + Db::rollback(); + return ['code'=>$coin_give_gift['code'],'msg'=>$coin_give_gift['msg'],'data'=>null]; + } + } + + //增加用户的收益并记录日志 + $earnings = coin_earning($total_gift_price,$config['gift_zone_earnings']); + $user = Db::name('user_wallet')->where('user_id',$zone['user_id'])->setInc('earnings',$earnings); + if(!$user){ + Db::rollback(); + return ['code'=>0,'msg'=>'打赏礼物失败!!','data'=>null]; + } + + //记录打赏 + $reward_data = [ + 'user_id'=>$uid, + 'zone_id'=>$zid, + 'gift_id'=>$gift_id, + 'gift_price'=>$gift_price, + 'number'=>$num, + 'gift_price_total'=> $total_gift_price, + 'createtime' => time() + ]; + $reward_res = Db::name('user_zone_rewards')->insert($reward_data); + if(!$reward_res){ + Db::rollback(); + return ['code'=>0,'msg'=>'打赏礼物失败!!!','data'=>null]; + } + + //送礼日志 + $give_gift_data = [ + 'gift_user'=>$zone['user_id'], + 'gift_id'=>$gift_id, + 'from_id'=>$zid, + 'number'=>$num, + 'user_id'=>$uid, + 'total_price'=>$total_gift_price, + 'type'=>$is_pack, + 'from'=>4,//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏' + 'createtime'=>time(), + ]; + $give_gift_res = Db::name('vs_give_gift')->insertGetId($give_gift_data); + if(!$give_gift_res){ + Db::rollback(); + return ['code'=>0,'msg'=>'打赏礼物失败','data'=>null]; + } + + //用户收益日志 + $user_earnings_data = [ + 'user_id'=>$zone['user_id'], + 'from_id'=>$zid, + 'change_type'=>11,//收礼增加收益 + 'money_type'=>2, + 'change_value'=>$earnings, + 'remarks'=>'动态打赏增加收益', + 'createtime'=>time() + ]; + $user_earnings_res = Db::name('vs_user_money_log')->insert($user_earnings_data); + if(!$user_earnings_res){ + Db::rollback(); + return ['code'=>0,'msg'=>'打赏礼物失败!','data'=>null]; + } + $app_ratio = 100 - $config['gift_zone_earnings']; + $app_earning = coin_earning($total_gift_price,$app_ratio); + $this->change_give_gift_profit($give_gift_res,$config['gift_zone_earnings'],$earnings,0,0,$app_ratio,$app_earning); + Db::commit(); + return ['code'=>1,'msg'=>'赠送成功','data'=>null]; + } + + + //动态打赏背包礼物 赠送背包礼物 + public function give_pack_gift($uid,$gift_id,$num) + { + //背包礼物数量 + $pack_num = Db::name('vs_user_gift_pack')->where('user_id',$uid)->where('gid',$gift_id)->value('num'); + if($pack_num < $num){ + return ['code'=>0,'msg'=>'背包礼物不足','data'=>null]; + } + + //扣除背包礼物数量 + $resel = Db::name('vs_user_gift_pack')->where('user_id',$uid)->where('gid',$gift_id)->setDec('num',$num); + if(!$resel){ + return ['code'=>0,'msg'=>'扣除背包礼物失败','data'=>null]; + } + + //背包礼物日志 + $data = []; + $data['user_id'] = $uid; + $data['type'] = 5; + $data['gid'] = $gift_id; + $data['change_num'] = $num; + $data['remarks'] = '动态打赏背包礼物'; + $data['createtime'] = time(); + $data['updatetime'] = time(); + $reslut = db::name('vs_user_gift_pack_log')->insert($data); + if (!$reslut) { + Db::rollback(); + return ['code'=>0,'msg'=>'打赏礼物失败!','data'=>null]; + } + + return ['code'=>1,'msg'=>'扣除背包礼物成功','data'=>null]; + } + + + //赠送金币购买礼物 动态打赏 + public function give_coin_buy_gift($uid,$total_gift_price,$zid) + { + //用户金额 + $user_coin = Db::name('user_wallet')->where('user_id',$uid)->value('coin'); + + if($user_coin < $total_gift_price){ + return ['code'=>0,'msg'=>'余额不足','data'=>null]; + } + + //扣除用户金额 + $re = Db::name('user_wallet')->where('user_id',$uid)->setDec('coin',$total_gift_price); + if(!$re){ + return ['code'=>0,'msg'=>'扣除用户金额失败','data'=>null]; + } + + //用户资金日志 + $user_earnings_data = [ + 'user_id'=>$uid, + 'from_id'=>$zid, + 'change_type'=>10,//购买礼物 + 'money_type'=>1, + 'change_value'=>$total_gift_price, + 'remarks'=>'动态打赏', + 'createtime'=>time() + ]; + $user_earnings_res = Db::name('vs_user_money_log')->insert($user_earnings_data); + if(!$user_earnings_res){ + Db::rollback(); + return ['code'=>0,'msg'=>'打赏礼物失败!','data'=>null]; + } + + return ['code'=>1,'msg'=>'扣除用户金额成功','data'=>null]; + } + + + //动态打赏列表 + public function zone_reward_list($uid, $zid, $page, $page_limit){ + $list = Db::name('vs_give_gift')->alias('a') + ->join('user b','a.user_id = b.id') + ->field('a.user_id,sum(a.total_price) total_price,b.nickname,b.avatar,b.user_code') + ->where('a.from',4) + ->where('a.from_id',$zid) + ->order('total_price desc') + ->page($page,$page_limit) + ->group('a.user_id') + ->select(); + foreach ($list as &$v){ + //用户是否在线 + $v['is_online'] = $this->redis->get('user_online_' . $v['user_id']) ? 1: 0;//是否在线 在redis里获取 + } + return $list; + } + + +//================================================================================================================================ + + + //记录收礼各方收益 【1.6废弃】 + public function record_gift_profit($to_uid,$room_owner_earningsg,$gift_price,$give_gift,$receiver_earnings,$room_owner_earnings,$room_id,$ext_give_data){ + //记录送礼利率和各方收益 + //收礼人是否加入公会 + $configs = get_system_config(); + $is_join_guild = Db::name('vs_guild_user')->where(['user_id' => $to_uid, 'status' => 1, 'quit_time' => 0])->field('guild_id,settlement_ratio')->find(); + //收益增加 加入工会的收益 + if ($is_join_guild) {//加入工会的收益 + $max_settlement_ratio = $configs['room_gift_ratio'] + $configs['room_gift_guild_ratio']; + $ratio = $is_join_guild['settlement_ratio'] ?? 0; + $guid_ratio = $max_settlement_ratio - $ratio; + } else {//未加入工会的收益 + $ratio = $configs['room_gift_ratio']; + $guid_ratio = 0; + } + //房主收益大于0 就代表有收益 且在房间 + $guild_earning = 0; + if ($room_owner_earningsg > 0) { + $guid_ratio = $configs['room_cp_guild_user_ratio']; + $guild_earning = coin_earning($gift_price,$guid_ratio); + }else{ + if($guid_ratio > 0){ + //增加收益并记录日志 + $guild = db::name('vs_guild')->where(['id' => $is_join_guild['guild_id']])->find(); + $guild_earning = coin_earning($gift_price,$guid_ratio); + $to_uid_nickname = db::name('user')->where(['id' => $to_uid])->value('nickname'); + $room_name = db::name('vs_room')->where(['id' => $room_id])->value('room_name'); + $gift_type_str = '普通礼物'; + if($ext_give_data['GiftType'] ==2){ + $gift_type_str = '盲盒礼物'; + }elseif($ext_give_data['GiftType'] ==3){ + $gift_type_str = '盲盒转盘礼物'; + } + $remarks = $ext_give_data['FromUserInfo']['nickname'].'在'.$room_name.'房间送给'.$to_uid_nickname.$gift_type_str.' 价值'.$gift_price.'金币,收礼人收益'.$receiver_earnings.'钻石,工会长收益'.$guild_earning.'钻石'; + $this->change_user_cion_or_earnings_log($guild['user_id'],$guild_earning,$room_id,2,21,$remarks); + } + } + + //平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益 + $app_ratio = 100 - $ratio - $configs['room_author_ratio'] - $guid_ratio; + $app_earning = coin_earning($gift_price, $app_ratio); + $gift_rate = $this->change_give_gift_profit($give_gift, $ratio, $receiver_earnings, $configs['room_author_ratio'], $room_owner_earnings, $app_ratio, $app_earning,$guid_ratio,$guild_earning); + if (!$gift_rate) { + return ['code' => 0, 'msg' => '礼物记录失败', 'data' => null]; + }else { + return ['code' => 1, 'msg' => '礼物记录成功', 'data' => $gift_rate]; + } + } + + //送礼特效【1.6废弃】 + public function give_gift_effect($to_id,$FromUserInfo,$gift_info,$num,$from_id) + { + //推送礼物特效 + $ToUserInfo = Db::name('user')->where(['id' => $to_id])->field('id as user_id,nickname,avatar,sex')->find(); + $ToUserInfo['icon'][0] = model('UserData')->user_wealth_icon($to_id);//财富图标 + $ToUserInfo['icon'][1] = model('UserData')->user_charm_icon($to_id);//魅力图标 + $text = $FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 礼物 ' .$gift_info['gift_name'].' x ' .$num; + $text = [ + 'FromUserInfo' => $FromUserInfo, + 'ToUserInfo' => $ToUserInfo, + 'GiftInfo' => $gift_info, + 'gift_num' => $num, + 'text' => $text + ]; + //聊天室推送系统消息 + model('Chat')->sendMsg(1005,$from_id,$text); + + } + + /* + * 开盲盒 【1.6废弃】 + */ + public function open_box($gift_id,$user_id,$gift_user_id,$room_id=0,$gift_bag_id=0){ + //获取盲盒配置 + $bag_list = db::name("vs_gift_bag")->field('id,name,ext,periods')->where(['activities_id'=>4,'status'=>1])->select(); + $gift_bag_id = 0; + foreach ($bag_list as $k=>$v){ + $ext = json_decode($v['ext'],true); + if($ext){ + if($ext['gift_id'] == $gift_id){ + $gift_bag_id = $v['id']; + $periods = $v['periods']; + break; + } + } + } + if($gift_bag_id){ + $bag_gift = db::name("vs_gift")->where(['gid'=>$gift_id])->find();// 获取盲盒信息 + //随机获取一个礼物 + $where = [ + 'gift_bag_id' => $gift_bag_id, + 'quantity' => ['>',0], + 'remaining_number' => ['>',0] + ]; +// $gift_bag_detail = db::name("vs_gift_bag_detail")->where($where)->orderRaw('rand()')->find(); + // 优化:基于剩余数量的加权随机选择 + $gift_bag_details = db::name("vs_gift_bag_detail")->where($where)->select(); + if (empty($gift_bag_details)) { + return ['code' => 0, 'msg' => '当前盲盒无可用礼物', 'data' => []]; + } + // 实现加权随机算法:剩余数量越多,被抽中的概率越大 + $total_remaining = 0; + foreach ($gift_bag_details as $gift) { + $total_remaining += $gift['remaining_number']; + } + $rand_value = mt_rand(1, $total_remaining); + $current_sum = 0; + $gift_bag_detail = null; + foreach ($gift_bag_details as $gift) { + if($gift['remaining_number'] <= 0){ + continue; + } + $current_sum += $gift['remaining_number']; + if ($rand_value <= $current_sum) { + $gift_bag_detail = $gift; + break; + } + + } + if($gift_bag_detail){ + //获取开出礼物的信息 + $gift = db::name("vs_gift")->where(['gid'=>$gift_bag_detail['foreign_id']])->find(); + //处理礼包发放记录表 + $data = []; + $data['user_id'] = $user_id; + $data['gift_user_id'] = $gift_user_id; + $data['gift_bag_id'] = $gift_bag_id; + $data['gift_id'] = $gift_bag_detail['foreign_id']; + $data['periods'] = $periods; + $data['room_id'] = $room_id; + $data['gift_price'] = $gift['gift_price']; + $data['bag_price'] = $bag_gift['gift_price']; + $data['createtime'] = time(); + $result = db::name("vs_gift_bag_receive_log")->insert($data); + if(!$result){ + return ['code' => 0, 'msg' => '失败,', 'data' => []]; + } + //减去盲盒包礼物数量 + $ret = db::name("vs_gift_bag_detail")->where('id',$gift_bag_detail['id'])->setDec('remaining_number'); + if(!$ret){ + return ['code' => 0, 'msg' => '失败.', 'data' => []]; + } + //判断剩余数量是否为0 为0重置,进入下一期 + $gift_bag_num = db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->sum('remaining_number'); + if($gift_bag_num <= 0){ + db::name("vs_gift_bag")->where('id',$gift_bag_id)->setInc('periods'); + db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->update(['remaining_number'=>db::raw('quantity')]); + } + }else{ + return ['code' => 0, 'msg' => '失败!', 'data' => []]; + } + }else{ + return ['code' => 0, 'msg' => '失败!!', 'data' => []]; + } + $result_data = [ + 'gift_id'=>$gift_bag_detail['foreign_id'], + 'gift_price'=>$gift['gift_price'], + 'is_public_screen'=>$gift['is_public_screen'], + ]; + return ['code' => 1, 'msg' => '成功', 'data' => $result_data]; + } + + /* + * 送礼利率收益等具体记录 【1.6废弃】 + * `give_gift_id` int(11) NOT NULL DEFAULT '0' COMMENT '送礼记录表ID', + `gift_user_ratio` varchar(255) NOT NULL DEFAULT '0' COMMENT '收礼人 收礼时的收益率(单位%)', + `gift_user_earning` decimal(10,0) DEFAULT '0' COMMENT '收礼人的收益', + `room_owner_ratio` varchar(255) DEFAULT '0' COMMENT '房主收益率(单位 %)', + `room_owner_earning` decimal(10,0) DEFAULT '0' COMMENT '房主收益', + `app_ratio` varchar(255) DEFAULT '0' COMMENT '平台收益率(单位 %)', + `app_earning` decimal(10,0) DEFAULT '0' COMMENT '平台收益', + */ + + public function change_give_gift_profit($give_gift_id,$gift_user_ratio,$gift_user_earning,$room_owner_ratio = 0,$room_owner_earning = 0,$app_ratio = 0,$app_earning = 0,$guid_ratio=0,$guild_earning=0) + { + $data = [ + 'give_gift_id' => $give_gift_id, + 'gift_user_ratio' => $gift_user_ratio, + 'gift_user_earning' => $gift_user_earning, + 'room_owner_ratio' => $room_owner_ratio, + 'room_owner_earning' => $room_owner_earning, + 'app_ratio' => $app_ratio, + 'app_earning' => $app_earning, + 'guid_ratio' => $guid_ratio, + 'guid_ratio_earning' => $guild_earning, + 'createtime' => time(), + ]; + $res = Db::name('vs_give_gift_ratio_log')->insert($data); + if(!$res){ + return false; + } + return true; + } + + + //记录用户赠送背包礼物日志 【1.6废弃】 + public function change_user_gift_pack_log($packType,$uid,$gid,$num,$remark) + { + $user_gift_pack = db::name('vs_user_gift_pack')->where(['user_id'=>$uid,'gid'=>$gid])->find(); + $user_gift_packs['num'] = $user_gift_pack['num'] - $num; + $user_gift_packs['updatetime'] = time(); + $gift_pack_update = db::name('vs_user_gift_pack')->where(['user_id'=>$uid,'gid'=>$gid])->update($user_gift_packs); + if(!$gift_pack_update){ + return false; + } + $data = [ + 'user_id' => $uid, + 'gid' => $gid, + 'change_num' => $num, + 'type' => $packType, + 'remarks' => $remark, + 'createtime' => time(), + ]; + $res = Db::name('vs_user_gift_pack_log')->insert($data); + if(!$res){ + return false; + } + return true; + } + + //操作用户金币和收益并记录日志【1.6废弃】 + public function change_user_cion_or_earnings_log($user_id,$money,$room_id,$money_type,$change_type,$remarks) + { //change_type + // 1.系统调节 2.充值 3.提现 4.金币转增(送出) 5.每日任务奖励 6.充值返利 7.购买装扮 + // 8.礼盒奖励 9.房间补贴 10.购买礼物 11.收礼增加收益 12.工会补贴 13.转赠金币(接收) 14.收益兑换 + // 15.首充 16.天降好礼充值 17.退出工会扣款 18.房主收益 19.主持人收益 20.抢头条 21.公会长收益,22.提现驳回或提现失败返还,23.财富等级奖励金币领取,24.删除关系扣金币, + //50-签约,51-签约失败退回,52-首次被签约收入,54-叛徒补偿,55-徒弟收礼返佣,56-续约,57-签到,58-爆币 + if(in_array($change_type,[1,2,3,4,5,6,7,8,12,13,14,15,16,17,20,57])){ + $room_ids = 0; + }else{ + $room_ids = $room_id; + } + $data = [ + 'user_id' => $user_id, + 'change_value' => $money, + 'room_id' => $room_ids, + 'money_type' => $money_type, + 'change_type' => $change_type, + 'from_id' => $room_id, + 'remarks' => $remarks, + 'createtime' => time() + ]; + + $res = Db::name('vs_user_money_log')->insert($data); + if(!$res){ + return false; + } + + //根据类型判断是操作金币还是钻石得增加或减少 + if($money_type == 1){//1金币 + //增加用户金币类型 + $in_types = [2,5,6,8,13,14,15,16,51,58]; + //减少用户金币类型 + $out_types = [4,7,10,17,20,50,56]; + if(in_array($change_type,$in_types)){ + //增加用户金币 + $res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setInc('coin',$money); +// if(!$res1){ +// return false; +// } + }elseif(in_array($change_type,$out_types)){ + //减少用户金币 + $res1 = Db::name('user_wallet')->where(['user_id'=>$user_id,'coin'=>['>=',$money]])->setDec('coin',$money); +// if(!$res1){ +// return false; +// } + } + }elseif ($money_type == 2){//2钻石 + //增加用户钻石类型 + $in_types = [9,11,12,18,19,21,52,54,55]; + //减少用户钻石类型 + $out_types = [3,14]; + if(in_array($change_type,$in_types)){ + //增加用户 + $res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setInc('earnings',$money); +// if(!$res1){ +// return false; +// } + }elseif(in_array($change_type,$out_types)){ + //减少用户 + $res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setDec('earnings',$money); +// if(!$res1){ +// return false; +// } + } + } + return true; + } + + + //记录用户送礼日志【1.6废弃】 + public function change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_id,$from_type,$type,$from_id,$pit_number = 0,$gitf_type =1) + { + $data = [ + 'user_id' => $uid, + 'gift_id' => $gid, + 'gift_type' => $gitf_type, + 'number' => $num, + 'gift_user' => $to_id, + 'pit_number' => $pit_number, + 'from_id' => $from_id,//来源ID,(房间ID或动态ID) + 'total_price' => $gift_price, + 'from' => $from_type,//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 6Cp电影房 + 'type' => $type,//1金币购买 2送背包礼物 + 'createtime' => time(), + ]; + + GiftQueue::push($data); + + return true; + } + + /* + * 送礼物 【1.6废弃】 * @param int $uid 用户id * @param int $from_id 来源id * @param str $to_uid 接收礼物用户id字符串逗号分隔 @@ -41,6 +1065,9 @@ class GiveGift extends Model */ public function give_gift($uid,$to_uid,$gid,$num,$from_type,$type,$from_id = 0,$pit_number = 0,$change_type = 0,$ext = []) { + return ['code' => 0, 'msg' => '送礼失败,请更新APP!', 'data' => null]; + + if(isset($ext['is_draw_gift']) && $ext['is_draw_gift'] == 1) { return $this->give_gift_to_pan($uid, $to_uid, $gid, $num, $from_type, $type, $from_id, $pit_number, $change_type, $ext); } @@ -584,1012 +1611,5 @@ class GiveGift extends Model return ['code' => 1, 'msg' => '送礼成功', 'data' => ['gift_total' => $gift_total,'gift_user_data' =>$gift_user_data,'cp_type' => ['cp_type' => $cp_type,'text' => $textt,'text1' => $textt1,'gift_id' => $gid]]]; } - /* - * 送礼物-盲盒转盘专用 - * @param int $uid 用户id - * @param int $from_id 来源id - * @param str $to_uid 接收礼物用户id字符串逗号分隔 - * @param int $gid 礼物id - * @param int $num 礼物数量 - * @param int $from_type 来源 1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务 6-cp房间送礼 - * @param int $type 金币购买 1金币购买 2送背包礼物 - * @param int $pit_number 坑位编号 - * @return array - * 用户,在房间中,给谁,送了什么礼物,多少个,来源 - */ - public function give_gift_to_pan($uid,$to_uid,$gid,$num,$from_type,$type,$from_id = 0,$pit_number = 0,$change_type = 0,$ext = []) - { - //送的礼物信息 - $gift_info = Db::name('vs_gift')->where(['gid'=>$gid]) - ->field('gid as gift_id,gift_name,gift_price,file_type,base_image,play_image,gift_type,label,is_public_server')->find(); - if(empty($gift_info)){ - return ['code' => 0, 'msg' => '礼物不存在', 'data' => null]; - } - if(!$to_uid){ - return ['code' => 0, 'msg' => '请选择收礼人', 'data' => null]; - } - $toarray = explode(',',$to_uid); - if(in_array($uid,$toarray)){ - return ['code' => 0, 'msg' => '收礼人不能包含自己', 'data' => null]; - } - if (ceil($num) != $num) { - return ['code' => 0, 'msg' => '打赏礼物数量必须为整数', 'data' => null]; - } - if ($num < 1) { - return ['code' => 0, 'msg' => '打赏礼物数量必须大于零', 'data' => null]; - } - $user_info = Db::name('user')->where(['id'=>$uid,'status'=>1])->find(); - if(empty($user_info)){ - return ['code' => 301, 'msg' => '当前用户登录失效', 'data' => null]; - } - - //获取送礼用户昵称 - $FromUserInfo = db::name('user')->where('id',$uid)->field('id as user_id,nickname,avatar,sex')->find(); - $FromUserInfo['icon'][0] = model('UserData')->user_wealth_icon($uid);//财富图标 - $FromUserInfo['icon'][1] = model('UserData')->user_charm_icon($uid);//魅力图标 - $FromUserInfo['chat_bubble'] = model('Decorate')->user_decorate_detail($uid,9);//聊天气泡 - - //送给一人礼物的总价格(扣除用户的数额) - $gift_price = $gift_info['gift_price'] * $num; - - $roomId = 0; - if($from_type == 2 || $from_type == 3 || $from_type == 6){ - $roomId = $from_id; - } - - //循环送礼 - $gift_total = 0; - $give_gift = 0; - $gift_user_data = []; - foreach ($toarray as $k => $to_id){ - $gift_user_data[]['user_id'] = $to_id; - $gift_box1 = []; - $gift_box = []; - $gift_total += $gift_price; - //收礼记录行为日志 - $give_gift = $this -> change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_id,$from_type,$type,$from_id,$pit_number); - if(!$give_gift){ - return ['code' => 0, 'msg' => '送礼失败', 'data' => null]; - } - $gift_user_data[$k]['gift_price'] = $gift_price; - - //计算收礼人得益 - $receiver_earnings = $this -> receiver_earnings($to_id,$gift_price,$from_type); - if($receiver_earnings < 0){ - return ['code' => 0, 'msg' => '收礼人收益配置有误', 'data' => null]; - } - - //收礼人认证歌手等级升级 - model('api/SingerSong')->singerLevelUp($to_id,$gift_price); - - //收礼人身价计算 这里的增长身价是收礼物的价值按比率产生的身价值 身价=收礼产生的身价+签约时的溢价 - $coin_market_values = explode(',', get_system_config_value('coin_market_value')); - $change_value = ceil($gift_price / ($coin_market_values[0] ?? 100) * ($coin_market_values[1] ?? 1)); - model('api/MarketValue')->change($to_id,$change_value,0); - - //收礼人是否被签约 给上级返佣 - model('api/Sign')->check_sign_gift($to_id,$gid,$num,$gift_price,$from_id); - - //1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务 6-cp房间送礼 - if($from_type == 1 || $from_type == 2 || $from_type == 3 ||$from_type == 4 || $from_type == 6){ - //增加收益并记录日志 - $receiver = $this -> change_user_cion_or_earnings_log($to_id,$receiver_earnings,$from_id,2,11,'收礼增加收益'); - }elseif($from_type == 5){ - //增加收益并记录日志 - $receiver = $this -> change_user_cion_or_earnings_log($to_id,$receiver_earnings,$from_id,1,$change_type,'活动增加金币'); - }else{ - $receiver = false; - } - if(!$receiver){ - return ['code' => 0, 'msg' => '收礼人收益失败', 'data' => null]; - } - //用户魅力等级更新 - $user_level = model('Level')->user_level_data_update($to_id,$gift_price,2,$roomId); - if(!$user_level){ - return ['code' => 0, 'msg' => '用户等级更新失败', 'data' => null]; - } - - $room_owner_earnings = 0;//房主收益 - $room_owner_earningsg = 0;//公会会长收益 - //是否在房间 - if(isset($from_id) && ($from_type == 2 || $from_type == 6)){ - if($from_type == 6){ //cp电影房 - //房主有收益 - if(get_system_config_value('room_cp_room_user_ratio') > 0){ - $room_owner = Db::name('vs_room')->where(['id'=>$from_id,'apply_status'=>2])->value('user_id'); - //计算房主收益//room_author_ratio - $room_owner_earnings = $this -> receiver_earnings($room_owner,$gift_price,699); - if($room_owner_earnings > 0){ - //增加收益并记录日志 - $room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益'); - if(!$room_owner_earning){ - return ['code' => 0, 'msg' => '房主收益失败', 'data' => null]; - } - } - } - //公会长收益 - if(get_system_config_value('room_cp_guild_user_ratio') > 0){ - $guild_id = Db::name('vs_guild_user')->where(['user_id'=>$to_uid,'status'=>1])->value('guild_id'); - if($guild_id){ - $room_guild = Db::name('vs_guild')->where(['id'=>$guild_id])->value('user_id'); - //计算会长收益 - $room_owner_earningsg = $this -> receiver_earnings($room_guild,$gift_price,698); - //增加收益并记录日志 - $room_owner_earningg = $this -> change_user_cion_or_earnings_log($room_guild,$room_owner_earningsg,$from_id,2,21,'工会长收益'); - if(!$room_owner_earningg){ - return ['code' => 0, 'msg' => '工会长收益失败', 'data' => null]; - } - } - } - - }else{ - $room_owner = Db::name('vs_room')->where(['id'=>$from_id,'apply_status'=>2])->value('user_id'); - //计算房主收益//room_author_ratio - $room_owner_earnings = $this -> receiver_earnings($room_owner,$gift_price,99);//结果是钻石 - if($room_owner_earnings > 0){ - //主持人收益 - //在主持位的主持人 - $host_id = Db::name('vs_room_pit')->where(['room_id'=>$from_id,'pit_number'=>9])->value('user_id'); - if($host_id){ - //计算主持人收益 - $host_earnings = $this -> receiver_earnings($host_id,$room_owner_earnings*get_system_config_value('rmb_coin_ratio'),98,$from_id); - if($host_earnings > 0){ - //增加主持人收益并记录日志 - $host_earnings_earning = $this -> change_user_cion_or_earnings_log($host_id,$host_earnings,$from_id,2,19,'主持人收益'); - if(!$host_earnings_earning){ - return ['code' => 0, 'msg' => '主持人收益失败', 'data' => null]; - } - //增加房主收益并记录日志 - $room_owner_earningss = $room_owner_earnings - $host_earnings; - if($room_owner_earningss > 0){ - $room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earningss,$from_id,2,18,'房主收益'); - if(!$room_owner_earning){ - return ['code' => 0, 'msg' => '房主收益失败', 'data' => null]; - } - } - - }else{ - //增加房主收益并记录日志 - $room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益'); - if(!$room_owner_earning){ - return ['code' => 0, 'msg' => '房主收益失败', 'data' => null]; - } - } - }else{ - //增加房主收益并记录日志 - $room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益'); - if(!$room_owner_earning){ - return ['code' => 0, 'msg' => '房主收益失败', 'data' => null]; - } - } - } - } - if($gift_info['label'] == 2){ - foreach ($gift_box as $gv) { - //记录送礼利率和各方收益 - //收礼人是否加入公会 - $receiver_earningss = $this -> receiver_earnings($to_id,$gv['gift_price'],$from_type); - $room_owner_earningss = $this -> receiver_earnings($room_owner,$gv['gift_price'],99);//结果是钻石 - $ext_give_data = [ - 'FromUserInfo' => $FromUserInfo, - 'GiftInfo' => $gift_info, - 'GiftType' => 3, - ]; - $gift_rate = $this->record_gift_profit($to_uid,$room_owner_earningsg,$gv['gift_price'],$gv['give_gift_id'],$receiver_earningss,$room_owner_earningss,$from_id,$ext_give_data); - if ($gift_rate['code']==0) { - Db::rollback(); - return ['code' => 0, 'msg' => $gift_rate['msg'], 'data' => null]; - } - } - }else{ - //记录送礼利率和各方收益 - //收礼人是否加入公会 - $ext_give_data = [ - 'FromUserInfo' => $FromUserInfo, - 'GiftInfo' => $gift_info, - 'GiftType' => 3, - ]; - $gift_rate = $this->record_gift_profit($to_uid,$room_owner_earningsg,$gift_price,$give_gift,$receiver_earnings,$room_owner_earnings,$from_id,$ext_give_data - ); - if ($gift_rate['code']==0) { - Db::rollback(); - return ['code' => 0, 'msg' => $gift_rate['msg'], 'data' => null]; - } - } - } - - $ToUserInfo = Db::name('user')->where(['id' => $to_id])->field('id as user_id,nickname,avatar,sex')->find(); - $ToUserInfo['icon'][0] = model('UserData')->user_wealth_icon($to_id);//财富图标 - $ToUserInfo['icon'][1] = model('UserData')->user_charm_icon($to_id);//魅力图标 - $ToUserInfo['charm'] = db::name('vs_room_user_charm')->where(['user_id' => $to_id,'room_id' => $from_id])->value('charm');//魅力 - - if(isset($from_id) && ($from_type == 2 || $from_type == 6)){ - //查询房间是否在PK中 是fa_vs_room_pk 表中的 room_id_a,还是room_id_b - $room_pk = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_a' => $from_id])->field('pk_id')->find(); - if (!empty($room_pk)) { - // 当前 room_id 是 room_id_a 修改create_value_a - $rooma = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->setInc('create_value_a', $gift_price * 10); - $roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->find(); - //推送变化 - $text = [ - 'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id - 'create_value_a' => $roomPKinfo['create_value_a'],//发起者房间值 - 'room_id_b' => $roomPKinfo['room_id_b'],//接受者房间id - 'receive_value_b' => $roomPKinfo['receive_value_b'],//接受者房间值 - 'text' => '' - ]; - model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text); - model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text); - } else { - // 当前 room_id 不是 room_id_a,可能是 room_id_b 或者不存在 - $room_pk_b = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_b' => $from_id])->field('pk_id')->find(); - if (!empty($room_pk_b)) { - // 当前 room_id 是 room_id_b - $roomb = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->setInc('receive_value_b', $gift_price * 10); - $roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->find(); - //推送变化 - $text = [ - 'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id - 'create_value_a' => $roomPKinfo['create_value_a'],//发起者房间值 - 'room_id_b' => $roomPKinfo['room_id_b'],//接受者房间id - 'receive_value_b' => $roomPKinfo['receive_value_b'],//接受者房间值 - 'text' => '' - ]; - model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text); - model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text); - } - } - //直播间送礼物 每日任务 - model('DailyTasks')->tasks_complete($uid,3); - } - //cp检测 - model('api/UserCp')->checkGift($uid, $gid, $to_id, $from_id,$num,$gift_price); - } - - //增加房间火热值hot_value - $gift_totalaa = $gift_total * get_system_config_value('coin_charm_exp'); - db::name('vs_room')->where(['id' => $from_id])->inc('hot_value', $gift_totalaa)->inc('today_hot_value', $gift_totalaa)->update(); - - $roomtype = Db::name('vs_room')->where(['id' => $from_id])->value('type_id'); - if($roomtype == 6){ - //推送消息 交友房创建的私密房 倒计时增加 - $value = db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1) - ->value('time_day'); - if($value){ - db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1) - ->setInc('time_day', $gift_total); - $text111 = [ - 'room_id' => $from_id, - 'time_day' => db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1)->value('time_day'), - 'text' => '房间结束时间变化' - ]; - //聊天室推送系统消息 - model('Chat')->sendMsg(1052,$from_id,$text111); - } - } - - return ['code' => 1, 'msg' => '送礼成功', 'data' => ['gift_total' => $gift_total,'gift_user_data' =>$gift_user_data,'cp_type' => ['cp_type' => 0,'text' => '','text1' => '','gift_id' => $gid]]]; - } - - //送礼特效 - public function give_gift_effect($to_id,$FromUserInfo,$gift_info,$num,$from_id) - { - //推送礼物特效 - $ToUserInfo = Db::name('user')->where(['id' => $to_id])->field('id as user_id,nickname,avatar,sex')->find(); - $ToUserInfo['icon'][0] = model('UserData')->user_wealth_icon($to_id);//财富图标 - $ToUserInfo['icon'][1] = model('UserData')->user_charm_icon($to_id);//魅力图标 - $text = $FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 礼物 ' .$gift_info['gift_name'].' x ' .$num; - $text = [ - 'FromUserInfo' => $FromUserInfo, - 'ToUserInfo' => $ToUserInfo, - 'GiftInfo' => $gift_info, - 'gift_num' => $num, - 'text' => $text - ]; - //聊天室推送系统消息 - model('Chat')->sendMsg(1005,$from_id,$text); - - } - - - //计算收礼人得到的收益 - public function receiver_earnings($to_uid,$all_gift_price,$from_type,$room_id = 0) - { - $configs = get_system_config(); - if($from_type == 1){//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 99房主收益 98主持人收益 - $ratio = $configs['gift_chat_earning']; - }elseif ($from_type == 2 || $from_type == 3){ - //收礼人是否加入公会 - $is_join_guild = Db::name('vs_guild_user')->where(['user_id'=>$to_uid,'status'=>1,'quit_time' => 0])->field('guild_id,settlement_ratio')->find(); - //收益增加 加入工会的收益 - if($is_join_guild){ - $ratio = $is_join_guild['settlement_ratio']; - }else{ - $ratio = $configs['room_gift_ratio']; - } - }elseif ($from_type == 4){ - $ratio = $configs['gift_zone_earnings']; - }elseif ($from_type == 99){ - $ratio = $configs['room_author_ratio']; - }elseif ($from_type == 98){ - $ratio = db::name('vs_room_host')->where(['room_id'=>$room_id,'user_id'=>$to_uid,'delete_time'=>null,'type'=>1])->value('ratio'); - if(!$ratio){ - $ratio = 0; - } - }elseif ($from_type == 6){//Cp电影房 - $ratio = $configs['room_cp_user_ratio']; - }elseif ($from_type == 699){ - $ratio = $configs['room_cp_room_user_ratio']; - }elseif ($from_type == 698){ - $ratio = $configs['room_cp_guild_user_ratio']; - }else{ - $ratio = 0; - } - - //计算收礼人收益 - return coin_earning($all_gift_price,$ratio); - } - - - //操作用户金币和收益并记录日志 - public function change_user_cion_or_earnings_log($user_id,$money,$room_id,$money_type,$change_type,$remarks) - { //change_type - // 1.系统调节 2.充值 3.提现 4.金币转增(送出) 5.每日任务奖励 6.充值返利 7.购买装扮 - // 8.礼盒奖励 9.房间补贴 10.购买礼物 11.收礼增加收益 12.工会补贴 13.转赠金币(接收) 14.收益兑换 - // 15.首充 16.天降好礼充值 17.退出工会扣款 18.房主收益 19.主持人收益 20.抢头条 21.公会长收益,22.提现驳回或提现失败返还,23.财富等级奖励金币领取,24.删除关系扣金币, - //50-签约,51-签约失败退回,52-首次被签约收入,54-叛徒补偿,55-徒弟收礼返佣,56-续约,57-签到,58-爆币 - if(in_array($change_type,[1,2,3,4,5,6,7,8,12,13,14,15,16,17,20,57])){ - $room_ids = 0; - }else{ - $room_ids = $room_id; - } - $data = [ - 'user_id' => $user_id, - 'change_value' => $money, - 'room_id' => $room_ids, - 'money_type' => $money_type, - 'change_type' => $change_type, - 'from_id' => $room_id, - 'remarks' => $remarks, - 'createtime' => time() - ]; - - $res = Db::name('vs_user_money_log')->insert($data); - if(!$res){ - return false; - } - - //根据类型判断是操作金币还是钻石得增加或减少 - if($money_type == 1){//1金币 - //增加用户金币类型 - $in_types = [2,5,6,8,13,14,15,16,51,58]; - //减少用户金币类型 - $out_types = [4,7,10,17,20,50,56]; - if(in_array($change_type,$in_types)){ - //增加用户金币 - $res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setInc('coin',$money); -// if(!$res1){ -// return false; -// } - }elseif(in_array($change_type,$out_types)){ - //减少用户金币 - $res1 = Db::name('user_wallet')->where(['user_id'=>$user_id,'coin'=>['>=',$money]])->setDec('coin',$money); -// if(!$res1){ -// return false; -// } - } - }elseif ($money_type == 2){//2钻石 - //增加用户钻石类型 - $in_types = [9,11,12,18,19,21,52,54,55]; - //减少用户钻石类型 - $out_types = [3,14]; - if(in_array($change_type,$in_types)){ - //增加用户 - $res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setInc('earnings',$money); -// if(!$res1){ -// return false; -// } - }elseif(in_array($change_type,$out_types)){ - //减少用户 - $res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setDec('earnings',$money); -// if(!$res1){ -// return false; -// } - } - } - return true; - } - - - //记录用户送礼日志 - public function change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_id,$from_type,$type,$from_id,$pit_number = 0,$gitf_type =1) - { - $data = [ - 'user_id' => $uid, - 'gift_id' => $gid, - 'gift_type' => $gitf_type, - 'number' => $num, - 'gift_user' => $to_id, - 'pit_number' => $pit_number, - 'from_id' => $from_id,//来源ID,(房间ID或动态ID) - 'total_price' => $gift_price, - 'from' => $from_type,//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 6Cp电影房 - 'type' => $type,//1金币购买 2送背包礼物 - 'createtime' => time(), - ]; - - GiftQueue::push($data); - - return true; - } - - //送礼回调处理任务 - public function change_user_give_gift_log_callback($give_gift_id,$data) - { - $from_id = $data['from_id']; - $uid = $data['user_id']; - $to_id = $data['gift_user']; - $gift_price = $data['total_price']; - $gid = $data['gift_id']; - //记录公会流水 - if($from_id > 0){ - model('api/Guild')->guild_flow($from_id,$gift_price,$give_gift_id); - } - //查询是否第一次送礼 - $is_first_gift = db::name('vs_give_gift')->where(['user_id'=>$uid])->count(); - if($is_first_gift == 1){ - //任务:7-第一次送礼 - model('api/Tasks')->tasks_complete($uid,7); - } - //查询是否第一次收礼 - $is_first_receive_gift = db::name('vs_give_gift')->where(['gift_user'=>$to_id])->count(); - if($is_first_receive_gift == 1){ - //任务:8-第一次收礼 - model('api/Tasks')->tasks_complete($to_id,8); - } - - //查询收礼人和送礼人的师徒关系 - //获取系统配置的特殊礼物 - $special_gift = explode(',',get_system_config_value('master_special_gift')); - //收礼人是否是送礼人的师父 - $is_master = db::name('vs_user_sign')->where(['parent_user_id'=>$to_id,'sign_user_id'=>$uid,'end_time' => ['>=',time()]])->find(); - if($is_master){ - if(in_array($gid,$special_gift)){ - //任务:14-每日给师傅送一个特定的礼物 - model('api/Tasks')->tasks_complete($uid,14); - //查询今天是否送过礼物了 - $is_today_gift = db::name('vs_give_gift') - ->where(['user_id'=>$uid,'gift_user'=>$to_id,'createtime' => ['>=',strtotime(date('Y-m-d'))],'gift_id' => ['in',$special_gift]])->count(); - if($is_today_gift <= 1){ - //任务:13-每日收到至少3个徒弟的特殊徐礼物 - model('api/Tasks')->tasks_complete($to_id,13); - } - } - } - //收礼人是否是送礼人的徒弟 - $is_student = db::name('vs_user_sign')->where(['parent_user_id'=>$uid,'sign_user_id'=>$to_id,'end_time' => ['>=',time()]])->find(); - if($is_student){ - if(in_array($gid,$special_gift)){ - //查询今天是否送过礼物了 - $is_today_gift = db::name('vs_give_gift') - ->where(['user_id'=>$uid,'gift_user'=>$to_id,'createtime' => ['>=',strtotime(date('Y-m-d'))],'gift_id' => ['in',$special_gift]])->count(); -// if($is_today_gift <= 2){ - //查询徒弟是否是首签的徒弟 sign_user_type:被签用户的类型:0-首次被签,1-签约过期,2-违约签 - $is_students = db::name('vs_user_sign') - ->where(['parent_user_id' => $uid,'sign_user_id' => $to_id,'sign_user_type' => 0,'end_time' => ['>',time()]])->value('id'); - if($is_students){ - //获取房间的类型 - $room_type = db::name('vs_room')->where(['id' => $from_id])->value('type_id'); - if($room_type == 2){ - //任务:21-邀请徒弟在拍卖房停留(0/5)分钟,并送给徒弟(0/1 ,特殊礼物) - model('api/Tasks')->tasks_complete($uid,21,2,$to_id); - } - if($room_type == 9){ - //任务:22-邀请徒弟在点唱房点歌(0/1)首,并送给徒弟(0/1 ,特殊礼物) - model('api/Tasks')->tasks_complete($uid,22,2,$to_id); - } - if($room_type == 7) { - //任务:23-邀请徒弟在交友房停留(0/5)分钟,并送给徒弟(0/1 ,特殊礼物) - model('api/Tasks')->tasks_complete($uid, 23, 2,$to_id); - } - } -// } - } - } - } - - - //记录用户赠送背包礼物日志 - public function change_user_gift_pack_log($packType,$uid,$gid,$num,$remark) - { - $user_gift_pack = db::name('vs_user_gift_pack')->where(['user_id'=>$uid,'gid'=>$gid])->find(); - $user_gift_packs['num'] = $user_gift_pack['num'] - $num; - $user_gift_packs['updatetime'] = time(); - $gift_pack_update = db::name('vs_user_gift_pack')->where(['user_id'=>$uid,'gid'=>$gid])->update($user_gift_packs); - if(!$gift_pack_update){ - return false; - } - $data = [ - 'user_id' => $uid, - 'gid' => $gid, - 'change_num' => $num, - 'type' => $packType, - 'remarks' => $remark, - 'createtime' => time(), - ]; - $res = Db::name('vs_user_gift_pack_log')->insert($data); - if(!$res){ - return false; - } - return true; - } - - - /* - * 送礼利率收益等具体记录 - * `give_gift_id` int(11) NOT NULL DEFAULT '0' COMMENT '送礼记录表ID', - `gift_user_ratio` varchar(255) NOT NULL DEFAULT '0' COMMENT '收礼人 收礼时的收益率(单位%)', - `gift_user_earning` decimal(10,0) DEFAULT '0' COMMENT '收礼人的收益', - `room_owner_ratio` varchar(255) DEFAULT '0' COMMENT '房主收益率(单位 %)', - `room_owner_earning` decimal(10,0) DEFAULT '0' COMMENT '房主收益', - `app_ratio` varchar(255) DEFAULT '0' COMMENT '平台收益率(单位 %)', - `app_earning` decimal(10,0) DEFAULT '0' COMMENT '平台收益', - */ - - public function change_give_gift_profit($give_gift_id,$gift_user_ratio,$gift_user_earning,$room_owner_ratio = 0,$room_owner_earning = 0,$app_ratio = 0,$app_earning = 0,$guid_ratio=0,$guild_earning=0) - { - $data = [ - 'give_gift_id' => $give_gift_id, - 'gift_user_ratio' => $gift_user_ratio, - 'gift_user_earning' => $gift_user_earning, - 'room_owner_ratio' => $room_owner_ratio, - 'room_owner_earning' => $room_owner_earning, - 'app_ratio' => $app_ratio, - 'app_earning' => $app_earning, - 'guid_ratio' => $guid_ratio, - 'guid_ratio_earning' => $guild_earning, - 'createtime' => time(), - ]; - $res = Db::name('vs_give_gift_ratio_log')->insert($data); - if(!$res){ - return false; - } - return true; - } - - - /* - * 聊天送礼物 (音信) - * @param int $user_id 用户id - * @param int $gid 礼物id - * @param int $num 礼物数量 - * @param int $to_uid 接收礼物用户id - * - * @return array - * - */ - public function chat_give_gift($user_id,$gid,$num,$to_uid,$gift_type=1) - { - $gift_info = Db::name('vs_gift')->where(['gid'=>$gid])->find(); - if(empty($gift_info)){ - return ['code' => 0, 'msg' => '礼物不存在', 'data' => null]; - } - if($user_id == $to_uid){ - return ['code' => 0, 'msg' => '不能给自己送礼物', 'data' => null]; - } - if (ceil($num) != $num) { - return ['code' => 0, 'msg' => '打赏礼物数量必须为整数', 'data' => null]; - } - if ($num < 1) { - return ['code' => 0, 'msg' => '打赏礼物数量必须大于零', 'data' => null]; - } - - $user_info = Db::name('user')->where(['id'=>$user_id])->find(); - if(empty($user_info)){ - return ['code' => 0, 'msg' => '送礼用户不存在', 'data' => null]; - } - $to_user_info = Db::name('user')->where(['id'=>$to_uid])->find(); - if(empty($to_user_info)){ - return ['code' => 0, 'msg' => '收礼用户不存在', 'data' => null]; - } - //查询收益比例 - $all_gift_price = $gift_info['gift_price'] * $num; //总礼物价格 - $configs = get_system_config(); - $gift_chat_earning = $configs['gift_chat_earning'];//聊天打赏礼物收益比例 - $gift_earning = coin_earning($all_gift_price,$gift_chat_earning); - if($gift_type == 1){ - //操作送礼人金币 - $res = model('common/UserWallet')->change_user_money($user_id, $all_gift_price, model('common/UserWallet')::MONEYTYPECOIN, model('common/UserWallet')::OPERATION_GIFT,model('common/UserWallet')::ChangeTypeLable(model('common/UserWallet')::OPERATION_GIFT),0,$to_uid,0); - if($res['code'] == 1){ - //操作收礼人收益 - $res = model('common/UserWallet')->change_user_money($to_uid, $gift_earning, model('common/UserWallet')::MONEYTYPEARNINGS, model('common/UserWallet')::GIVE_GIFT_EARNING,model('common/UserWallet')::ChangeTypeLable(model('common/UserWallet')::GIVE_GIFT_EARNING),0,$to_uid,0); - if($res['code'] == 1){ - //插入送礼记录 - $data = [ - 'user_id' => $user_id, - 'gift_user' => $to_uid, - 'gift_id' => $gid, - 'number' => $num, - 'from_id' => 0, - 'total_price' => $all_gift_price, - 'type' => 1, - 'from' => 1, - 'createtime' => time(), - 'updatetime' => time() - ]; - $re = Db::name('vs_give_gift')->insertGetId($data); - if($re){ - $app_ratio = 100 - $gift_chat_earning; - $app_earning = coin_earning($all_gift_price,$app_ratio); - $this->change_give_gift_profit($re,$gift_chat_earning,$gift_earning,0,0,$app_ratio,$app_earning); - return ['code' => 1, 'msg' => '送礼成功', 'data' => null]; - }else{ - return ['code' => 0, 'msg' => '送礼失败', 'data' => null]; - } - } - } - }else{//背包礼物 - $remarks = "赠送 ".$to_user_info['nickname']." 背包礼物 "; - $res = model('UserGiftPack')->change_user_gift_pack($user_id,$gid,$num * -1,model('UserGiftPack')::GIFT_USE,$remarks); - if($res['code'] == 1){ - //操作收礼人收益 - $res = model('common/UserWallet')->change_user_money($to_uid, $gift_earning, model('common/UserWallet')::MONEYTYPEARNINGS, model('common/UserWallet')::GIVE_GIFT_EARNING,model('common/UserWallet')::ChangeTypeLable(model('common/UserWallet')::GIVE_GIFT_EARNING),0,$to_uid,0); - //插入送礼记录 - $data = [ - 'user_id' => $user_id, - 'gift_user' => $to_uid, - 'gift_id' => $gid, - 'number' => $num, - 'from_id' => 0, - 'total_price' => $all_gift_price, - 'type' => 2, - 'from' => 1, - 'createtime' => time(), - 'updatetime' => time() - ]; - $re = Db::name('vs_give_gift')->insertGetId($data); - if($re){ - $app_ratio = 100 - $gift_chat_earning; - $app_earning = coin_earning($all_gift_price,$app_ratio); - $this->change_give_gift_profit($re,$gift_chat_earning,$gift_earning,0,0,$app_ratio,$app_earning); - return ['code' => 1, 'msg' => '送礼成功', 'data' => null]; - }else{ - return ['code' => 0, 'msg' => '送礼失败', 'data' => null]; - } - } - } - return ['code' => $res['code'], 'msg' => $res['msg'], 'data' => null]; - } - - - //动态打赏 - public function reward_zone($uid,$zid,$gift_id,$num,$is_pack) - { - $zone = Db::name('user_zone')->where('id',$zid)->find(); - if(!$zone){ - return ['code'=>0,'msg'=>'动态不存在','data'=>null]; - } - if($uid == $zone['user_id']){ - return ['code'=>0,'msg'=>'不能给自己打赏','data'=>null]; - } - //礼物金额 - $gift_price = Db::name('vs_gift')->where('gid',$gift_id)->value('gift_price'); - //总金额 - $total_gift_price = $gift_price * $num; - //数据库配置 - $config = get_system_config(); - - //开启事务 - Db::startTrans(); - if($is_pack == 2){ - //背包礼物 - $pack_give_gift = $this->give_pack_gift($uid,$gift_id,$num); - if($pack_give_gift['code'] != 1){ - Db::rollback(); - return ['code'=>$pack_give_gift['code'],'msg'=>$pack_give_gift['msg'],'data'=>null]; - } - }else{ - //金币礼物 - $coin_give_gift = $this->give_coin_buy_gift($uid,$total_gift_price,$zid); - if($coin_give_gift['code'] != 1){ - Db::rollback(); - return ['code'=>$coin_give_gift['code'],'msg'=>$coin_give_gift['msg'],'data'=>null]; - } - } - - //增加用户的收益并记录日志 - $earnings = coin_earning($total_gift_price,$config['gift_zone_earnings']); - $user = Db::name('user_wallet')->where('user_id',$zone['user_id'])->setInc('earnings',$earnings); - if(!$user){ - Db::rollback(); - return ['code'=>0,'msg'=>'打赏礼物失败!!','data'=>null]; - } - - //记录打赏 - $reward_data = [ - 'user_id'=>$uid, - 'zone_id'=>$zid, - 'gift_id'=>$gift_id, - 'gift_price'=>$gift_price, - 'number'=>$num, - 'gift_price_total'=> $total_gift_price, - 'createtime' => time() - ]; - $reward_res = Db::name('user_zone_rewards')->insert($reward_data); - if(!$reward_res){ - Db::rollback(); - return ['code'=>0,'msg'=>'打赏礼物失败!!!','data'=>null]; - } - - //送礼日志 - $give_gift_data = [ - 'gift_user'=>$zone['user_id'], - 'gift_id'=>$gift_id, - 'from_id'=>$zid, - 'number'=>$num, - 'user_id'=>$uid, - 'total_price'=>$total_gift_price, - 'type'=>$is_pack, - 'from'=>4,//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏' - 'createtime'=>time(), - ]; - $give_gift_res = Db::name('vs_give_gift')->insertGetId($give_gift_data); - if(!$give_gift_res){ - Db::rollback(); - return ['code'=>0,'msg'=>'打赏礼物失败','data'=>null]; - } - - //用户收益日志 - $user_earnings_data = [ - 'user_id'=>$zone['user_id'], - 'from_id'=>$zid, - 'change_type'=>11,//收礼增加收益 - 'money_type'=>2, - 'change_value'=>$earnings, - 'remarks'=>'动态打赏增加收益', - 'createtime'=>time() - ]; - $user_earnings_res = Db::name('vs_user_money_log')->insert($user_earnings_data); - if(!$user_earnings_res){ - Db::rollback(); - return ['code'=>0,'msg'=>'打赏礼物失败!','data'=>null]; - } - $app_ratio = 100 - $config['gift_zone_earnings']; - $app_earning = coin_earning($total_gift_price,$app_ratio); - $this->change_give_gift_profit($give_gift_res,$config['gift_zone_earnings'],$earnings,0,0,$app_ratio,$app_earning); - Db::commit(); - return ['code'=>1,'msg'=>'赠送成功','data'=>null]; - } - - - //赠送背包礼物 - public function give_pack_gift($uid,$gift_id,$num) - { - //背包礼物数量 - $pack_num = Db::name('vs_user_gift_pack')->where('user_id',$uid)->where('gid',$gift_id)->value('num'); - if($pack_num < $num){ - return ['code'=>0,'msg'=>'背包礼物不足','data'=>null]; - } - - //扣除背包礼物数量 - $resel = Db::name('vs_user_gift_pack')->where('user_id',$uid)->where('gid',$gift_id)->setDec('num',$num); - if(!$resel){ - return ['code'=>0,'msg'=>'扣除背包礼物失败','data'=>null]; - } - - //背包礼物日志 - $data = []; - $data['user_id'] = $uid; - $data['type'] = 5; - $data['gid'] = $gift_id; - $data['change_num'] = $num; - $data['remarks'] = '动态打赏背包礼物'; - $data['createtime'] = time(); - $data['updatetime'] = time(); - $reslut = db::name('vs_user_gift_pack_log')->insert($data); - if (!$reslut) { - Db::rollback(); - return ['code'=>0,'msg'=>'打赏礼物失败!','data'=>null]; - } - - return ['code'=>1,'msg'=>'扣除背包礼物成功','data'=>null]; - } - - - //赠送金币购买礼物 - public function give_coin_buy_gift($uid,$total_gift_price,$zid) - { - //用户金额 - $user_coin = Db::name('user_wallet')->where('user_id',$uid)->value('coin'); - - if($user_coin < $total_gift_price){ - return ['code'=>0,'msg'=>'余额不足','data'=>null]; - } - - //扣除用户金额 - $re = Db::name('user_wallet')->where('user_id',$uid)->setDec('coin',$total_gift_price); - if(!$re){ - return ['code'=>0,'msg'=>'扣除用户金额失败','data'=>null]; - } - - //用户资金日志 - $user_earnings_data = [ - 'user_id'=>$uid, - 'from_id'=>$zid, - 'change_type'=>10,//购买礼物 - 'money_type'=>1, - 'change_value'=>$total_gift_price, - 'remarks'=>'动态打赏', - 'createtime'=>time() - ]; - $user_earnings_res = Db::name('vs_user_money_log')->insert($user_earnings_data); - if(!$user_earnings_res){ - Db::rollback(); - return ['code'=>0,'msg'=>'打赏礼物失败!','data'=>null]; - } - - return ['code'=>1,'msg'=>'扣除用户金额成功','data'=>null]; - } - - - //动态打赏列表 - public function zone_reward_list($uid, $zid, $page, $page_limit){ - $list = Db::name('vs_give_gift')->alias('a') - ->join('user b','a.user_id = b.id') - ->field('a.user_id,sum(a.total_price) total_price,b.nickname,b.avatar,b.user_code') - ->where('a.from',4) - ->where('a.from_id',$zid) - ->order('total_price desc') - ->page($page,$page_limit) - ->group('a.user_id') - ->select(); - foreach ($list as &$v){ - //用户是否在线 - $v['is_online'] = $this->redis->get('user_online_' . $v['user_id']) ? 1: 0;//是否在线 在redis里获取 - } - return $list; - } - - /* - * 开盲盒 - */ - public function open_box($gift_id,$user_id,$gift_user_id,$room_id=0,$gift_bag_id=0){ - //获取盲盒配置 - $bag_list = db::name("vs_gift_bag")->field('id,name,ext,periods')->where(['activities_id'=>4,'status'=>1])->select(); - $gift_bag_id = 0; - foreach ($bag_list as $k=>$v){ - $ext = json_decode($v['ext'],true); - if($ext){ - if($ext['gift_id'] == $gift_id){ - $gift_bag_id = $v['id']; - $periods = $v['periods']; - break; - } - } - } - if($gift_bag_id){ - $bag_gift = db::name("vs_gift")->where(['gid'=>$gift_id])->find();// 获取盲盒信息 - //随机获取一个礼物 - $where = [ - 'gift_bag_id' => $gift_bag_id, - 'quantity' => ['>',0], - 'remaining_number' => ['>',0] - ]; -// $gift_bag_detail = db::name("vs_gift_bag_detail")->where($where)->orderRaw('rand()')->find(); - // 优化:基于剩余数量的加权随机选择 - $gift_bag_details = db::name("vs_gift_bag_detail")->where($where)->select(); - if (empty($gift_bag_details)) { - return ['code' => 0, 'msg' => '当前盲盒无可用礼物', 'data' => []]; - } - // 实现加权随机算法:剩余数量越多,被抽中的概率越大 - $total_remaining = 0; - foreach ($gift_bag_details as $gift) { - $total_remaining += $gift['remaining_number']; - } - $rand_value = mt_rand(1, $total_remaining); - $current_sum = 0; - $gift_bag_detail = null; - foreach ($gift_bag_details as $gift) { - if($gift['remaining_number'] <= 0){ - continue; - } - $current_sum += $gift['remaining_number']; - if ($rand_value <= $current_sum) { - $gift_bag_detail = $gift; - break; - } - - } - if($gift_bag_detail){ - //获取开出礼物的信息 - $gift = db::name("vs_gift")->where(['gid'=>$gift_bag_detail['foreign_id']])->find(); - //处理礼包发放记录表 - $data = []; - $data['user_id'] = $user_id; - $data['gift_user_id'] = $gift_user_id; - $data['gift_bag_id'] = $gift_bag_id; - $data['gift_id'] = $gift_bag_detail['foreign_id']; - $data['periods'] = $periods; - $data['room_id'] = $room_id; - $data['gift_price'] = $gift['gift_price']; - $data['bag_price'] = $bag_gift['gift_price']; - $data['createtime'] = time(); - $result = db::name("vs_gift_bag_receive_log")->insert($data); - if(!$result){ - return ['code' => 0, 'msg' => '失败,', 'data' => []]; - } - //减去盲盒包礼物数量 - $ret = db::name("vs_gift_bag_detail")->where('id',$gift_bag_detail['id'])->setDec('remaining_number'); - if(!$ret){ - return ['code' => 0, 'msg' => '失败.', 'data' => []]; - } - //判断剩余数量是否为0 为0重置,进入下一期 - $gift_bag_num = db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->sum('remaining_number'); - if($gift_bag_num <= 0){ - db::name("vs_gift_bag")->where('id',$gift_bag_id)->setInc('periods'); - db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->update(['remaining_number'=>db::raw('quantity')]); - } - }else{ - return ['code' => 0, 'msg' => '失败!', 'data' => []]; - } - }else{ - return ['code' => 0, 'msg' => '失败!!', 'data' => []]; - } - $result_data = [ - 'gift_id'=>$gift_bag_detail['foreign_id'], - 'gift_price'=>$gift['gift_price'], - 'is_public_screen'=>$gift['is_public_screen'], - ]; - return ['code' => 1, 'msg' => '成功', 'data' => $result_data]; - } - - //记录收礼各方收益 - public function record_gift_profit($to_uid,$room_owner_earningsg,$gift_price,$give_gift,$receiver_earnings,$room_owner_earnings,$room_id,$ext_give_data){ - //记录送礼利率和各方收益 - //收礼人是否加入公会 - $configs = get_system_config(); - $is_join_guild = Db::name('vs_guild_user')->where(['user_id' => $to_uid, 'status' => 1, 'quit_time' => 0])->field('guild_id,settlement_ratio')->find(); - //收益增加 加入工会的收益 - if ($is_join_guild) {//加入工会的收益 - $max_settlement_ratio = $configs['room_gift_ratio'] + $configs['room_gift_guild_ratio']; - $ratio = $is_join_guild['settlement_ratio'] ?? 0; - $guid_ratio = $max_settlement_ratio - $ratio; - } else {//未加入工会的收益 - $ratio = $configs['room_gift_ratio']; - $guid_ratio = 0; - } - //房主收益大于0 就代表有收益 且在房间 - $guild_earning = 0; - if ($room_owner_earningsg > 0) { - $guid_ratio = $configs['room_cp_guild_user_ratio']; - $guild_earning = coin_earning($gift_price,$guid_ratio); - }else{ - if($guid_ratio > 0){ - //增加收益并记录日志 - $guild = db::name('vs_guild')->where(['id' => $is_join_guild['guild_id']])->find(); - $guild_earning = coin_earning($gift_price,$guid_ratio); - $to_uid_nickname = db::name('user')->where(['id' => $to_uid])->value('nickname'); - $room_name = db::name('vs_room')->where(['id' => $room_id])->value('room_name'); - $gift_type_str = '普通礼物'; - if($ext_give_data['GiftType'] ==2){ - $gift_type_str = '盲盒礼物'; - }elseif($ext_give_data['GiftType'] ==3){ - $gift_type_str = '盲盒转盘礼物'; - } - $remarks = $ext_give_data['FromUserInfo']['nickname'].'在'.$room_name.'房间送给'.$to_uid_nickname.$gift_type_str.' 价值'.$gift_price.'金币,收礼人收益'.$receiver_earnings.'钻石,工会长收益'.$guild_earning.'钻石'; - $this->change_user_cion_or_earnings_log($guild['user_id'],$guild_earning,$room_id,2,21,$remarks); - } - } - - //平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益 - $app_ratio = 100 - $ratio - $configs['room_author_ratio'] - $guid_ratio; - $app_earning = coin_earning($gift_price, $app_ratio); - $gift_rate = $this->change_give_gift_profit($give_gift, $ratio, $receiver_earnings, $configs['room_author_ratio'], $room_owner_earnings, $app_ratio, $app_earning,$guid_ratio,$guild_earning); - if (!$gift_rate) { - return ['code' => 0, 'msg' => '礼物记录失败', 'data' => null]; - }else { - return ['code' => 1, 'msg' => '礼物记录成功', 'data' => $gift_rate]; - } - } } diff --git a/application/api/model/Lottery.php b/application/api/model/Lottery.php index fa390e34..cb0afad5 100644 --- a/application/api/model/Lottery.php +++ b/application/api/model/Lottery.php @@ -47,7 +47,8 @@ class Lottery extends Model //送礼 开启事务 Db::startTrans(); //扣除用户金币并记录日志 - $wallet_update = model('api/GiveGift')->change_user_cion_or_earnings_log($send_uid,$all_gift_price,$room_id,1,10,'用户金币购买礼物'); +// $wallet_update = model('api/GiveGift')->change_user_cion_or_earnings_log($send_uid,$all_gift_price,$room_id,1,10,'用户金币购买幸运币礼物'); + $wallet_update = model('api/UserWallet')->change_user_cion_log($send_uid, $all_gift_price, $room_id, 10, '用户金币购买幸运币礼物'); if(!$wallet_update){ Db::rollback(); return ['code' => 0, 'msg' => '扣除用户金币失败', 'data' => null]; @@ -84,7 +85,8 @@ class Lottery extends Model //计算收礼人得益 $receiver_earnings = $gift_price /2/get_system_config_value('rmb_coin_ratio'); //增加收益并记录日志 - $receiver = model('api/GiveGift') -> change_user_cion_or_earnings_log($to_id,$receiver_earnings,$room_id,2,11,'收礼增加收益'); +// $receiver = model('api/GiveGift') -> change_user_cion_or_earnings_log($to_id,$receiver_earnings,$room_id,2,11,'收幸运币礼增加收益'); + $receiver = model('api/UserWallet')->change_user_earnings_log($to_id,$receiver_earnings,$room_id,11,'收幸运币礼增加收益'); // //用户魅力等级更新 // $user_level = model('api/Level')->user_level_data_update($to_id,$gift_price,2,$room_id); @@ -151,7 +153,8 @@ class Lottery extends Model // 大奖 if ($result['is_big_prize'] == 1) {//$result['big_prize_amount'],//中奖金额 $beilv = floor($result['big_prize_amount'] / $gift_price); - $wallet_update = model('api/GiveGift')->change_user_cion_or_earnings_log($send_uid,$result['big_prize_amount'],$room_id,1,58,'参与幸运币活动获得'.$beilv.'倍'); +// $wallet_update = model('api/GiveGift')->change_user_cion_or_earnings_log($send_uid,$result['big_prize_amount'],$room_id,1,58,'参与幸运币活动获得'.$beilv.'倍'); + $wallet_update = model('api/UserWallet')->change_user_earnings_log($send_uid,$result['big_prize_amount'],$room_id,58,'参与幸运币活动获得'.$beilv.'倍'); if(!$wallet_update){ return ['code' => 0, 'msg' => '流水记录失败', 'data' => null]; } @@ -162,7 +165,8 @@ class Lottery extends Model $tet['play_image'] = $big_prize_play_image; } else { // 小奖 $result['small_prize_amount'],//中奖金额 $beilv = floor($result['small_prize_amount'] / $gift_price); - $wallet_update = model('api/GiveGift')->change_user_cion_or_earnings_log($send_uid,$result['small_prize_amount'],$room_id,1,58,'参与幸运币活动获得'.$beilv.'倍'); +// $wallet_update = model('api/GiveGift')->change_user_cion_or_earnings_log($send_uid,$result['small_prize_amount'],$room_id,1,58,'参与幸运币活动获得'.$beilv.'倍'); + $wallet_update = model('api/UserWallet')->change_user_earnings_log($send_uid,$result['small_prize_amount'],$room_id,58,'参与幸运币活动获得'.$beilv.'倍'); if(!$wallet_update){ return ['code' => 0, 'msg' => '流水记录失败', 'data' => null]; } diff --git a/application/api/model/Room.php b/application/api/model/Room.php index 173aa253..90a4eba9 100644 --- a/application/api/model/Room.php +++ b/application/api/model/Room.php @@ -577,7 +577,7 @@ class Room extends Model return ['code' => 0, 'msg' => '房间不存在了', 'data' => '']; } - $black = db::name('vs_room_black')->where(['room_id' => $room_id, 'black_id' => $user_id])->find(); + $black = db::name('vs_room_black')->where(['room_id' => $room_id, 'black_id' => $user_id])->order('id desc')->find(); //判断用户是被拉入黑名单 if (isset($black) && $black['type'] == 2) { return ['code' => 0, 'msg' => '您被拉入黑名单,请联系房主', 'data' => '']; @@ -1912,7 +1912,7 @@ class Room extends Model } - //房间送礼 + //房间送礼【1.6废弃】 public function room_gift($uid, $to_uid, $gift_id, $gift_num,$type, $room_id, $pit_number, $heart_id,$give_gift_ext="") { $label_type = model('Room')->get_room_label($room_id); @@ -1954,6 +1954,7 @@ class Room extends Model } } + //背包礼物一键全清 public function room_gift_all_clear($uid, $room_id, $user_id,$heart_id,$auction_id = 0) { @@ -1965,14 +1966,14 @@ class Room extends Model if($auction_id){//竞拍 model('RoomAuction')->room_auction_join($auction_id,$uid,$v['gid'],$v['num'],2); }else{ - $this->room_gift($uid, $user_id, $v['gid'], $v['num'],2,$room_id, 0,$heart_id); + model('api/SendGift')->send_gift($uid, $user_id, $v['gid'], $v['num'],2,$room_id,0,$heart_id); } } return ['code' => 1, 'msg' => '成功', 'data' => null]; } - //房间在线列表 + //房间在线列表【1.6废弃】 public function room_online_lists($room_id, $page, $limit) { $lists['on_pit'] = []; @@ -2093,7 +2094,7 @@ class Room extends Model } - //房间在线列表 + //房间在线列表【1.6废弃】 public function room_online_list1($room_id, $page, $limit) { if (!$room_id) { @@ -2885,7 +2886,7 @@ class Room extends Model } - //房间的类型 + //房间的类型(同意上麦和退出房间 在使用 ,其他已经修改了) public function get_room_label($room_id) { $room_info = db::name('vs_room')->where(['id' => $room_id])->field('id,label_id,type_id')->find(); @@ -2911,7 +2912,7 @@ class Room extends Model } - //房间信息 + //房间信息【1.6废弃】 public function room_infos($user_id, $room_id) { if(!$room_id){ @@ -3931,9 +3932,6 @@ class Room extends Model } //用户重连 - - - //用户在房间内切后台保留机制 diff --git a/application/api/model/RoomAuction.php b/application/api/model/RoomAuction.php index 11348e04..b5562d2b 100644 --- a/application/api/model/RoomAuction.php +++ b/application/api/model/RoomAuction.php @@ -110,7 +110,7 @@ class RoomAuction extends Model //参与竞拍 - public function room_auction_join($auction_id,$user_id,$gift_id,$num,$type,$ext=[]) + public function room_auction_join($auction_id,$user_id,$gift_id,$num,$type,$gift_bag_id=0) { if(!$auction_id){ return ['code' => 0, 'msg' => '拍卖已经结束','data' => null]; @@ -122,13 +122,13 @@ class RoomAuction extends Model return ['code' => 0, 'msg' => '礼物ID不能为空','data' => null]; } $auction = db::name('vs_room_auction')->where('auction_id',$auction_id)->field('room_id,gift_price,user_id,status')->find(); - $gift_price = db::name('vs_gift')->where('gid',$gift_id)->value('gift_price') ?? 0; +// $gift_price = db::name('vs_gift')->where('gid',$gift_id)->value('gift_price') ?? 0; if($user_id == $auction['user_id']){ return ['code' => 0, 'msg' => '不能参与自己的竞拍!','data' => null]; } //走送礼流程 - $ree = model('GiveGift')->give_gift($user_id,$auction['user_id'],$gift_id,$num,2,$type,$auction['room_id'],0,0,$ext); + $ree = model('api/SendGift')->send_gift($user_id,$auction['user_id'],$gift_id,$num,$type,$auction['room_id'],$gift_bag_id); if($ree['code'] != 1){ return ['code' => $ree['code'], 'msg' => $ree['msg'],'data' => null]; } diff --git a/application/api/model/SendGift.php b/application/api/model/SendGift.php index 3b3a6782..0a4a0bd8 100644 --- a/application/api/model/SendGift.php +++ b/application/api/model/SendGift.php @@ -3,6 +3,8 @@ namespace app\api\model; use app\common\controller\Push; +use app\common\library\GiftQueue; +use app\common\library\Snowflake; use think\Log; use think\Model; use think\Db; @@ -11,346 +13,743 @@ class SendGift extends Model { /* - * 送礼物 + * 送礼物 :送礼用户,收礼用户组,礼物ID,数量,礼物类型,房间ID * @param int $uid 用户id - * @param int $from_id 来源id - * @param str $to_uid 接收礼物用户id字符串逗号分隔 + * @param str $to_uid 接收礼物用户组 (逗号分隔 id字符串) * @param int $gid 礼物id * @param int $num 礼物数量 - * @param int $from_type 来源 1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务 6-cp房间送礼 * @param int $type 金币购买 1金币购买 2送背包礼物 - * @param int $pit_number 坑位编号 + * @param int $room_id + * @param int $gift_bag_id 背包礼物类型:7-初级,8-中级,9-高级 + * @param int $heart_id 助力ID * @return array - * 用户,在房间中,给谁,送了什么礼物,多少个,来源 */ - public function give_gift($uid,$to_uid,$gid,$num,$from_type,$type,$from_id = 0,$pit_number = 0,$change_type = 0,$ext = []) + public function send_gift($uid, $to_uid, $gid, $num, $type, $room_id, $gift_bag_id = 0, $heart_id = 0) { - if(isset($ext['is_draw_gift']) && $ext['is_draw_gift'] == 1) { - return $this->give_gift_to_pan($uid, $to_uid, $gid, $num, $from_type, $type, $from_id, $pit_number, $change_type, $ext); - } - //送的礼物信息 - $gift_info = Db::name('vs_gift')->where(['gid'=>$gid]) - ->field('gid as gift_id,gift_name,gift_price,file_type,base_image,play_image,gift_type,label,is_public_server')->find(); - if(empty($gift_info)){ - return ['code' => 0, 'msg' => '礼物不存在', 'data' => null]; - } - if(!$to_uid){ - return ['code' => 0, 'msg' => '请选择收礼人', 'data' => null]; - } $toarray = explode(',',$to_uid); + if(in_array($uid,$toarray)){ return ['code' => 0, 'msg' => '收礼人不能包含自己', 'data' => null]; } - if (ceil($num) != $num) { - return ['code' => 0, 'msg' => '打赏礼物数量必须为整数', 'data' => null]; - } - if ($num < 1) { - return ['code' => 0, 'msg' => '打赏礼物数量必须大于零', 'data' => null]; - } - $user_info = Db::name('user')->where(['id'=>$uid,'status'=>1])->find(); - if(empty($user_info)){ - return ['code' => 301, 'msg' => '当前用户登录失效', 'data' => null]; + + if(count($toarray) <= 1){ + $res = $this->single_send_gift($uid,$to_uid,$gid,$num,$type,$room_id,$gift_bag_id,$heart_id); + }else{ + $res = $this->send_gift_to_users($uid,$toarray,$gid,$num,$type,$room_id,$gift_bag_id,$heart_id); } - //循环查询用户是否实名 - foreach ($toarray as $key => $value){ - $mobile = Db::name('user')->where(['id'=>$value])->value('mobile'); - $is_real = db::name('user_auth')->where('mobile' , $mobile)->field('id,is_real')->find(); - if($is_real){ - if($is_real['is_real'] != 1){ - return ['code' => 0, 'msg' => '该用户未实名,暂不支持收礼', 'data' => null]; - } - }else{ - return ['code' => 0, 'msg' => '该用户未实名,暂不支持收礼', 'data' => null]; - } + return $res; + } + + + //送一个人的礼物 + public function single_send_gift($uid,$to_uid,$gid,$num,$type,$room_id,$gift_bag_id,$heart_id) + { + //送的礼物信息 + $gift_info = Db::name('vs_gift')->where(['gid'=>$gid]) + ->field('gid as gift_id,gift_name,gift_price,file_type,base_image,play_image,gift_type,label,is_public_server')->find(); + + if(empty($gift_info)){ + return ['code' => 0, 'msg' => '礼物已下架,请重新选择!', 'data' => null]; } - //获取送礼用户昵称 - $FromUserInfo = db::name('user')->where('id',$uid)->field('id as user_id,nickname,avatar,sex')->find(); - $FromUserInfo['icon'][0] = model('UserData')->user_wealth_icon($uid);//财富图标 - $FromUserInfo['icon'][1] = model('UserData')->user_charm_icon($uid);//魅力图标 - $FromUserInfo['chat_bubble'] = model('Decorate')->user_decorate_detail($uid,9);//聊天气泡 + $mobile = Db::name('user')->where(['id'=>$to_uid])->value('mobile'); + $is_real = db::name('user_auth')->where('mobile' , $mobile)->value('is_real'); + if($is_real != 1){ + return ['code' => 0, 'msg' => '该用户未实名,暂不支持收礼', 'data' => null]; + } - //送给一人礼物的总价格(扣除用户的数额) + $room_type = model('Room')->get_room_type($room_id); + + //获取送礼用户信息 + $FromUserInfo = model('User')->get_user_base_info($uid); + + //送给一人礼物的总价格 $gift_price = $gift_info['gift_price'] * $num; + + //送礼人的金币 + $user_coin = db::name('user_wallet_coin')->where(['user_id'=>$uid])->value('coin'); + //送礼 开启事务 Db::startTrans(); - $roomId = 0; - if($from_type == 2 || $from_type == 3 || $from_type == 6){ - $roomId = $from_id; - } + //金币购买送礼 1金币购买 2送背包礼物 - if ($type == 1) { - if(!isset($ext['is_draw_gift']) || $ext['is_draw_gift'] != 1){// 非盲盒转盘 - //送给所有人的总价格 - $all_gift_price = $gift_info['gift_price'] * $num * count($toarray); - //判断是否有足够的金币 - $user_waller = db::name('user_wallet')->where(['user_id'=>$uid])->find(); - if ($user_waller['coin'] < $all_gift_price) { - return ['code' => 0, 'msg' => '用户金币不足', 'data' => null]; - } - //扣除用户金币并记录日志 - $wallet_update = $this -> change_user_cion_or_earnings_log($uid,$all_gift_price,$from_id,1,10,'用户金币购买礼物'); - if(!$wallet_update){ - Db::rollback(); - return ['code' => 0, 'msg' => '扣除用户金币失败', 'data' => null]; - } - //用户财富等级更新 - $user_level = model('Level')->user_level_data_update($uid,$all_gift_price,1,$roomId); - if(!$user_level){ - Db::rollback(); - return ['code' => 0, 'msg' => '用户等级更新失败', 'data' => null]; - } + if($type == 1){ + //送给所有人的总价格 + $all_gift_price = $gift_price; + + //判断是否有足够的金币 + if ($user_coin < $all_gift_price) { + return ['code' => 0, 'msg' => '金币不足,请充值购买!', 'data' => null]; } + + //扣除用户金币并记录日志 + $wallet_update = model('api/UserWallet')->change_user_cion_log($uid,$all_gift_price,$room_id,10,'购买礼物'); + if(!$wallet_update){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-1', 'data' => null]; + } + }else{ //背包礼物是否充足 $user_gift_pack = db::name('vs_user_gift_pack')->where(['user_id'=>$uid,'gid'=>$gid])->find(); if (empty($user_gift_pack)) { return ['code' => 0, 'msg' => '用户背包礼物不足', 'data' => null]; } - if ($user_gift_pack['num'] < $num * count($toarray)) { + if ($user_gift_pack['num'] < $num) { return ['code' => 0, 'msg' => '用户背包礼物不足', 'data' => null]; } + //扣除背包礼物并记录日志 - if($from_type == 1 || $from_type == 2 || $from_type == 3 || $from_type == 6){//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务 - $packType = 3;//1系统赠送2礼包获得3礼物赠送4系统扣除,5动态打赏 - $remark = '聊天或房间礼物赠送'; - }elseif ($from_type == 4){ - $packType = 5; - $remark = '动态打赏'; - }else{ - $packType = -1; - } - $gift_pack = $this -> change_user_gift_pack_log($packType,$uid,$gid,$num * count($toarray),$remark); + $gift_pack = $this -> change_user_gift_pack_log(3,$uid,$gid,$num,'房间送礼'); if(!$gift_pack){ Db::rollback(); - return ['code' => 0, 'msg' => '扣除用户背包礼物失败', 'data' => null]; + return ['code' => 0, 'msg' => '网络错误-2', 'data' => null]; } } - //循环送礼 - $gift_total = 0; - $give_gift = 0; - $gift_user_data = []; - $cp_type = 0; - $textt = ''; - $textt1 = ''; - foreach ($toarray as $k => $to_id){ - $gift_user_data[]['user_id'] = $to_id; - $gift_box1 = []; - $gift_box = []; - //查询礼物是否是盲盒 - $gift_info_label = Db::name('vs_gift')->where(['gid'=>$gid]) - ->field('label')->find(); - if($gift_info_label['label'] == 2){//趣味礼物(盲盒) - $gift_price_box = 0; - if(isset($ext['is_draw_gift']) && $ext['is_draw_gift'] == 1){ - //收礼记录行为日志 - $give_gift = $this -> change_user_give_gift_log($uid,$ext['gift_id'],$ext['all_gift_price'],$ext['count'],$to_id,$from_type,$type,$from_id,$pit_number,2); - if(!$give_gift){ - Db::rollback(); - return ['code' => 0, 'msg' => '送礼失败', 'data' => null]; - } - $gift_price_box = $ext['all_gift_price']; - $gift_box[0]['gift_id'] = $ext['gift_id']; - $gift_box[0]['gift_price'] = $ext['all_gift_price']; - $gift_box[0]['give_gift_id'] = $give_gift; - }else{ - for($i = 0; $i < $num; $i++){ - $gift_box1[$i] = $this -> open_box($gid,$uid,$to_id,$from_id); - if($gift_box1[$i]['code'] != 1){ - Db::rollback(); - return ['code' => 0, 'msg' => '盲盒配置有误请联系管理员'.$gift_box1[$i]['msg'], 'data' => null]; - } - $gift_box[$i] = $gift_box1[$i]['data']; - //记录一下收礼记录 - $give_gift = $this -> change_user_give_gift_log($uid,$gift_box[$i]['gift_id'],$gift_box[$i]['gift_price'],1,$to_id,$from_type,$type,$from_id,$pit_number,2); - if(!$give_gift){ - Db::rollback(); - return ['code' => 0, 'msg' => '送礼失败', 'data' => null]; - } - $gift_box[$i]['give_gift_id'] = $give_gift; - $gift_price_box += $gift_box[$i]['gift_price']; - Log::record("盲盒礼物".json_encode($gift_box1),"info"); - } + $receive_gift_total = 0;//收礼人收到的礼物总值 + $give_gift = 0;//送礼记录表ID(雪花ID) + $gift_box = [];//开出的盲盒 + + //查询礼物是否是盲盒 + if($gift_info['label'] == 2){//趣味礼物(盲盒) + for($i = 0; $i < $num; $i++){ + //开盲盒 + $gift_box1[$i] = $this -> open_box($gid,$uid,$to_uid,$room_id,$gift_bag_id); + if($gift_box1[$i]['code'] != 1){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-3', 'data' => null]; } - $gift_total += $gift_price_box; - $gift_price = $gift_price_box; - }else{ - $gift_total += $gift_price; - //收礼记录行为日志 - $give_gift = $this -> change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_id,$from_type,$type,$from_id,$pit_number); + $gift_box[$i] = $gift_box1[$i]['data']; + //开出的礼物价值 + $receive_gift_total += $gift_box[$i]['gift_price']; + //记录一下收礼记录 + $give_gift = $this -> change_user_give_gift_log($uid,$gift_box[$i]['gift_id'],$gift_box[$i]['gift_price'],1,$to_uid,2,$type,$room_id,0,2); if(!$give_gift){ Db::rollback(); - return ['code' => 0, 'msg' => '送礼失败', 'data' => null]; + return ['code' => 0, 'msg' => '送礼失败,请重试!!', 'data' => null]; } + Log::record("送礼开出盲盒礼物信息:".json_encode($gift_box1),"info"); } - $gift_user_data[$k]['gift_price'] = $gift_price; - - //计算收礼人得益 - $receiver_earnings = $this -> receiver_earnings($to_id,$gift_price,$from_type); - if($receiver_earnings < 0){ + }else{ + //收礼记录行为日志 + $give_gift = $this -> change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_uid,2,$type,$room_id); + if(!$give_gift){ Db::rollback(); - return ['code' => 0, 'msg' => '收礼人收益配置有误', 'data' => null]; + return ['code' => 0, 'msg' => '送礼失败,请重试!', 'data' => null]; } - //收礼人认证歌手等级升级 - model('api/SingerSong')->singerLevelUp($to_id,$gift_price); + } - //收礼人身价计算 这里的增长身价是收礼物的价值按比率产生的身价值 身价=收礼产生的身价+签约时的溢价 - $coin_market_values = explode(',', get_system_config_value('coin_market_value')); - $change_value = ceil($gift_price / ($coin_market_values[0] ?? 100) * ($coin_market_values[1] ?? 1)); - model('api/MarketValue')->change($to_id,$change_value,0); - - //收礼人是否被签约 给上级返佣 - model('api/Sign')->check_sign_gift($to_id,$gid,$num,$gift_price,$from_id); - - //1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务 6-cp房间送礼 - if($from_type == 1 || $from_type == 2 || $from_type == 3 ||$from_type == 4 || $from_type == 6){ - //增加收益并记录日志 - $receiver = $this -> change_user_cion_or_earnings_log($to_id,$receiver_earnings,$from_id,2,11,'收礼增加收益'); - }elseif($from_type == 5){ - //增加收益并记录日志 - $receiver = $this -> change_user_cion_or_earnings_log($to_id,$receiver_earnings,$from_id,1,$change_type,'活动增加金币'); - }else{ - $receiver = false; - } + //计算收礼人得益 //1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 99房主收益 98主持人收益 + $receiver_earnings = model('GiveGift') -> receiver_earnings($to_uid,$receive_gift_total,2); + if($receiver_earnings > 0){ + //增加收益并记录日志 + $receiver = model('api/UserWallet')->change_user_earnings_log($to_uid,$receiver_earnings,$room_id,11,'收礼增加收益'); if(!$receiver){ Db::rollback(); - return ['code' => 0, 'msg' => '收礼人收益失败', 'data' => null]; + return ['code' => 0, 'msg' => '网络错误-4', 'data' => null]; } + } + + //用户魅力等级更新 + $user_level = model('Level')->user_level_data_update($to_uid,$receive_gift_total,2,$room_id); + if(!$user_level){ + Db::rollback(); + return ['code' => 0, 'msg' => '用户等级更新失败', 'data' => null]; + } + + $room_owner_earnings = 0;//房主收益 + $guild_earnings = 0;//公会会长收益 + $guid_ratio = 0;//公会长收益率 + $receive_ratio = get_system_config_value('room_gift_ratio');//房间收礼人收益 + + if($room_type == 6){ //cp电影房 + //房主有收益 room_cp_room_user_ratio + if(get_system_config_value('room_cp_room_user_ratio') > 0){ + $room_owner = Db::name('vs_room')->where(['id'=>$room_id,'apply_status'=>2])->value('user_id'); + //计算房主收益//room_author_ratio //1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 99房主收益 98主持人收益 699-cp房房主收益 + $room_owner_earnings = model('GiveGift') -> receiver_earnings($room_owner,$receive_gift_total,699); + if($room_owner_earnings > 0){ + //增加收益并记录日志 + $room_owner_earning = model('api/UserWallet') + ->change_user_earnings_log($room_owner,$room_owner_earnings,$room_id,18,'私密房主收益'); + if(!$room_owner_earning){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-5', 'data' => null]; + } + } + } + //公会长收益 + if(get_system_config_value('room_cp_guild_user_ratio') > 0){ + $guild_id = Db::name('vs_guild_user')->where(['user_id'=>$to_uid,'status'=>1])->value('guild_id'); + if($guild_id){ + $room_guild = Db::name('vs_guild')->where(['id'=>$guild_id])->value('user_id'); + //计算会长收益 //1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 99房主收益 98主持人收益 699-cp房房主收益 698 - cp房里面收益 公会长收益 + $guild_earnings = model('GiveGift') -> receiver_earnings($room_guild,$receive_gift_total,698); + if($guild_earnings > 0){ + //增加收益并记录日志 + $guild_earnings_in = model('api/UserWallet') + ->change_user_earnings_log($room_guild,$guild_earnings,$room_id,21,'私密房工会长收益'); + if(!$guild_earnings_in){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-6', 'data' => null]; + } + } + } + } + + }else{ + $room_owner = Db::name('vs_room')->where(['id'=>$room_id,'apply_status'=>2])->value('user_id'); + //计算房主收益//room_author_ratio + $room_owner_earnings = model('GiveGift') -> receiver_earnings($room_owner,$receive_gift_total,99);//结果是钻石 + if($room_owner_earnings > 0){ + //在主持位的主持人 + $host_id = Db::name('vs_room_pit')->where(['room_id'=>$room_id,'pit_number'=>9])->value('user_id'); + if($host_id){ + //计算主持人收益 + $ratio = db::name('vs_room_host')->where(['room_id'=>$room_id,'user_id'=>$to_uid,'delete_time'=>null,'type'=>1])->value('ratio'); + if(!$ratio){ + $ratio = 0; + } + $host_earnings = round($room_owner_earnings * $ratio / 100,4); + if($host_earnings > 0){ + //增加主持人收益并记录日志 + $host_earnings_earning = model('api/UserWallet')->change_user_earnings_log($host_id,$host_earnings,$room_id,19,'主持人收益'); + if(!$host_earnings_earning){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-7', 'data' => null]; + } + //增加房主收益并记录日志 + $room_owner_earningss = $room_owner_earnings - $host_earnings; + if($room_owner_earningss > 0){ + $room_owner_earning = model('api/UserWallet')->change_user_earnings_log($room_owner,$room_owner_earningss,$room_id,18,'房主收益'); + if(!$room_owner_earning){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-8', 'data' => null]; + } + } + + }else{ + //增加房主收益并记录日志 + $room_owner_earning = model('api/UserWallet')->change_user_earnings_log($room_owner,$room_owner_earnings,$room_id,18,'房主收益'); + if(!$room_owner_earning){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-9', 'data' => null]; + } + } + }else{ + //增加房主收益并记录日志 + $room_owner_earning = model('api/UserWallet')->change_user_earnings_log($room_owner,$room_owner_earnings,$room_id,18,'房主收益'); + if(!$room_owner_earning){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-10', 'data' => null]; + } + } + } + + //收礼人是否加入公会 + $is_join_guild = Db::name('vs_guild_user')->where(['user_id'=>$to_uid,'status'=>1,'quit_time' => 0])->field('guild_id,settlement_ratio')->find(); + if($is_join_guild){ + //公会长收益 房间收礼人收益+房间收礼人加入公会后增加收益 + $max_settlement_ratio = get_system_config_value('room_gift_ratio') + get_system_config_value('room_gift_guild_ratio'); + $receive_ratio = $is_join_guild['settlement_ratio'] ?? 0;//加入公会后 公会长设置的收益 + $guid_ratio = $max_settlement_ratio - $receive_ratio; + if($guid_ratio > 0){ + //公会长收益 + $guild_earnings = coin_earning($receive_gift_total,$guid_ratio); + if($guild_earnings > 0){ + $guild_user = db::name('vs_guild')->where(['id' => $is_join_guild['guild_id']])->value('user_id'); + $guild_earnings_in = model('api/UserWallet') + ->change_user_earnings_log($guild_user,$guild_earnings,$room_id,21,'工会长收益'); + if(!$guild_earnings_in){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-11', 'data' => null]; + } + } + } + } + } + + //记录送礼利率和各方收益 + //平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益 + $room_owner_ratio = get_system_config_value('room_author_ratio'); + $app_ratio = 100 - $receive_ratio - $room_owner_ratio - $guid_ratio; + $app_earning = coin_earning($gift_price, $app_ratio); + + $gift_rate = $this->change_give_gift_profit($give_gift, $receive_ratio, $receiver_earnings, $room_owner_ratio, $room_owner_earnings, $app_ratio, $app_earning,$guid_ratio,$guild_earnings); + if(!$gift_rate){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-12', 'data' => null]; + } + + //增加房间火热值hot_value + $gift_totalaa = $receive_gift_total * get_system_config_value('coin_charm_exp'); + db::name('vs_room')->where(['id' => $room_id])->inc('hot_value', $gift_totalaa)->inc('today_hot_value', $gift_totalaa)->update(); + + Db::commit(); + + //各种需要的及时推送 + $room_pk = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_a' => $room_id])->field('pk_id')->find(); + if (!empty($room_pk)) { + // 当前 room_id 是 room_id_a 修改create_value_a + $rooma = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->setInc('create_value_a', $receive_gift_total * 10); + $roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->find(); + //推送变化 + $text = [ + 'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id + 'create_value_a' => $roomPKinfo['create_value_a'],//发起者房间值 + 'room_id_b' => $roomPKinfo['room_id_b'],//接受者房间id + 'receive_value_b' => $roomPKinfo['receive_value_b'],//接受者房间值 + 'text' => '' + ]; + model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text); + model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text); + } else { + // 当前 room_id 不是 room_id_a,可能是 room_id_b 或者不存在 + $room_pk_b = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_b' => $room_id])->field('pk_id')->find(); + if (!empty($room_pk_b)) { + // 当前 room_id 是 room_id_b + $roomb = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->setInc('receive_value_b', $receive_gift_total * 10); + $roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->find(); + //推送变化 + $text = [ + 'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id + 'create_value_a' => $roomPKinfo['create_value_a'],//发起者房间值 + 'room_id_b' => $roomPKinfo['room_id_b'],//接受者房间id + 'receive_value_b' => $roomPKinfo['receive_value_b'],//接受者房间值 + 'text' => '' + ]; + model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text); + model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text); + } + } + + if($room_type == 6){ + //推送消息 交友房创建的私密房 倒计时增加 + $value = db::name('vs_room_cp_movie')->where('room_id', $room_id)->where('type',1) + ->value('time_day'); + if($value){ + db::name('vs_room_cp_movie')->where('room_id', $room_id)->where('type',1) + ->setInc('time_day', $receive_gift_total);//1金币加1秒 + $text111 = [ + 'room_id' => $room_id, + 'time_day' => db::name('vs_room_cp_movie')->where('room_id', $room_id)->where('type',1)->value('time_day'), + 'text' => '房间结束时间变化' + ]; + //聊天室推送系统消息 + model('Chat')->sendMsg(1052,$room_id,$text111); + } + } + + $ToUserInfo = model('User')->get_user_base_info($to_uid); + $ToUserInfo['charm'] = db::name('vs_room_user_charm')->where(['user_id' => $to_uid,'room_id' => $room_id])->value('charm');//魅力 + + //推送其他时刻需要的信息 其他放到异步回调里 + if($gift_info['label'] == 2){ + //循环开出来的盲盒,相同的礼物只推送一次,消息推送为$FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 趣味礼物 ' .$gift_inf['gift_name'].' x 多少'; + if($gift_box){ + // 统计相同礼物的数量 + $giftCount = []; + foreach ($gift_box as $key=>$gv) { + if (isset($giftCount[$gv['gift_id']])) { + $giftCount[$gv['gift_id']]['count']++; + } else { + $giftCount[$gv['gift_id']] = [ + 'gift_info' => $gift_info, + 'count' => 1 + ]; + } + $gift_box[$key]['gift_name'] = $gift_info['gift_name']; + } + + // 构建文字消息内容 + $giftTextList = []; + foreach ($giftCount as $giftData) { + $gift_inf = $giftData['gift_info']; + $count = $giftData['count']; + $giftTextList[] = $gift_inf['gift_name'].' X'.$count; + } + + // 推送文字消息 (格式: 张三 送给 李四 趣味礼物 礼物名1 X2,礼物2 X4) + $textMessage = $FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 趣味礼物 ' . implode(',', $giftTextList); + $textData = [ + 'FromUserInfo' => $FromUserInfo, + 'ToUserInfo' => $ToUserInfo, + 'GiftInfos' => array_values($gift_box), + 'GiftNum' => $num, + 'text' => $textMessage + ]; + // 聊天室推送文字消息 + model('Chat')->sendMsg(1038,$room_id,$textData); + + // 循环推送每个礼物的特效消息 + foreach ($giftCount as $giftId => $giftData) { + $gift_inf = $giftData['gift_info']; + $count = $giftData['count']; + + // 推送礼物特效消息 + $effectData = [ + 'FromUserInfo' => $FromUserInfo, + 'ToUserInfo' => $ToUserInfo, + 'GiftInfo' => $gift_inf, + 'gift_num' => $count, + 'text' => null + ]; + + // 聊天室推送礼物特效消息 + model('Chat')->sendMsg(1005,$room_id,$effectData); + + if($room_type == 6){ + //推送消息 + $hot_value = db::name('vs_room')->where('id', $room_id)->value('hot_value'); + $text1 = [ + 'room_id' => $room_id, + 'hot_value' => $hot_value, + 'text' => '房间心动值变化' + ]; + //聊天室推送系统消息 + model('Chat')->sendMsg(1028,$room_id,$text1); + }else{ + if($gift_inf['is_public_server'] == 1){ + //推送礼物横幅 + $push = new Push(UID, $room_id); + $room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name'); + $bannerText = $FromUserInfo['nickname'] . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $gift_inf['gift_name'] . 'X' . $count; + $text_list_new[] = [ + 'text' => $bannerText, + 'gift_picture' => $gift_inf['base_image'], + 'room_id' => $room_id, + 'fromUserName' => $FromUserInfo['nickname'], + 'toUserName' => $ToUserInfo['nickname'], + 'giftName' => $gift_inf['gift_name'], + 'roomId' => $room_id, + 'number' => $count, + ]; + $push->giftBanner($text_list_new); + } + } + } + } + }else{ + $text = $FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 礼物 ' .$gift_info['gift_name'].' x ' .$num; + $text = [ + 'FromUserInfo' => $FromUserInfo, + 'ToUserInfo' => $ToUserInfo, + 'GiftInfo' => $gift_info, + 'gift_num' => $num, + 'text' => $text + ]; + //聊天室推送系统消息 + model('Chat')->sendMsg(1005,$room_id,$text); + if($room_type == 6){ + //推送消息 + $hot_value = db::name('vs_room')->where('id', $room_id)->value('hot_value'); + $text1 = [ + 'room_id' => $room_id, + 'hot_value' => $hot_value, + 'text' => '房间心动值变化' + ]; + //聊天室推送系统消息 + model('Chat')->sendMsg(1028,$room_id,$text1); + }else{ + if($gift_info['is_public_server'] == 1){ + //推送礼物横幅 + $push = new Push($uid, $room_id); + $room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name'); + $text = $FromUserInfo['nickname'] . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $gift_info['gift_name'] . 'X' . $num; + $text_list_new[] = [ + 'text' => $text, + 'gift_picture' => $gift_info['base_image'], + 'room_id' => $room_id, + 'fromUserName' => $FromUserInfo['nickname'], + 'toUserName' => $ToUserInfo['nickname'], + 'giftName' => $gift_info['gift_name'], + 'roomId' => $room_id, + 'number' => $num, + ]; + $push->giftBanner($text_list_new); + } + + } + } + + $textt = ''; + $textt1 = ''; + //cp检测且处理升级事宜 + $cp_type = model('api/UserCp')->checkGift($uid, $gid, $to_uid, $room_id, $num,$receive_gift_total);//0-不处理,1-表明心意,2-组成Cp + if($cp_type == 1){ + $textt1 = "亲爱的用户,您好!\n".$FromUserInfo['nickname'] . ' 的 【' .$gift_info['gift_name'].' 】 已送达,这是他的心动信号。回赠一个,即可锁定这份缘分!'; + $textt = ''; + }elseif ($cp_type == 2){ + //接受方弹起的 信息 + $textt1 = "恭喜你!". $FromUserInfo['nickname'] ."也向您回赠了【" .$gift_info['gift_name']."】,并接受了你的心动信号。\n从现在起,你们正式成为彼此的专属CP,共同开启一段甜蜜的旅程。\n【心动空间】已为你们敞开大门!这里将记录你们在一起的点滴,见证所有心动与陪伴。快去心动空间,开启你们的CP升级之旅吧!"; + $textt = '【心动空间】已为你们敞开大门!这里将记录你们在一起的点滴,见证所有心动与陪伴。快去心动空间,开启你们的CP升级之旅吧!';//发送方弹起的信息 + } + $gift_user_data = [];//收礼人信息和收到的金币 交友和参与拍卖使用 + if($cp_type != 0){ + $gift_user_data[] = [ + 'user_id' => $to_uid, + 'gift_price' => $receive_gift_total, + ]; + } + if($room_type == 7){ + $reslut = [ + 'data' => ['gift_total' => $receive_gift_total,'gift_user_data' =>$gift_user_data,] + ]; + model('api/Friend')->room_give_gift($uid, $to_uid,$room_id,$reslut,$heart_id); + } + + //gift_total:收礼人收礼金币总和,交友和参与拍卖使用;cp_type:cp交友使用,gift_user_data:cp交友使用, + return ['code' => 1, 'msg' => '送礼成功', 'data' => ['gift_total' => $receive_gift_total,'gift_user_data' =>$gift_user_data,'cp_type' => ['cp_type' => $cp_type,'text' => $textt,'text1' => $textt1,'gift_id' => $gid]]]; + } + + + //送多人礼物 + public function send_gift_to_users($uid,$to_array,$gid,$num,$type,$room_id,$gift_bag_id,$heart_id){ + //送的礼物信息 + $gift_info = Db::name('vs_gift')->where(['gid'=>$gid]) + ->field('gid as gift_id,gift_name,gift_price,file_type,base_image,play_image,gift_type,label,is_public_server')->find(); + + if(empty($gift_info)){ + return ['code' => 0, 'msg' => '礼物已下架,请重新选择!', 'data' => null]; + } + + //循环查询用户是否实名 + foreach ($to_array as $key => $value){ + $mobile = Db::name('user')->where(['id'=>$value])->value('mobile'); + $is_real = db::name('user_auth')->where('mobile' , $mobile)->field('id,is_real')->find(); + if($is_real){ + if($is_real['is_real'] != 1){ + return ['code' => 0, 'msg' => '收礼用户中有未实名,暂不支持收礼', 'data' => null]; + } + }else{ + return ['code' => 0, 'msg' => '收礼用户中有未实名,暂不支持收礼', 'data' => null]; + } + } + + $room_type = model('Room')->get_room_type($room_id); + $room_owner = Db::name('vs_room')->where(['id'=>$room_id,'apply_status'=>2])->value('user_id'); + + //获取送礼用户信息 + $FromUserInfo = model('User')->get_user_base_info($uid); + + //送给一人礼物的总价格 + $gift_price = $gift_info['gift_price'] * $num; + + //送礼人的金币 + $user_coin = db::name('user_wallet_coin')->where(['user_id'=>$uid])->value('coin'); + + //金币购买送礼 1金币购买 2送背包礼物 + if($type == 1){ + //送给所有人的总价格 + $all_gift_price = $gift_price * count($to_array); + + //判断是否有足够的金币 + if ($user_coin < $all_gift_price) { + return ['code' => 0, 'msg' => '金币不足,请充值购买!', 'data' => null]; + } + + }else{ + //背包礼物是否充足 + $user_gift_pack = db::name('vs_user_gift_pack')->where(['user_id'=>$uid,'gid'=>$gid])->find(); + if (empty($user_gift_pack)) { + return ['code' => 0, 'msg' => '用户背包礼物不足', 'data' => null]; + } + if ($user_gift_pack['num'] < $num * count($to_array)) { + return ['code' => 0, 'msg' => '用户背包礼物不足', 'data' => null]; + } + + } + + + $give_gift = 0;//送礼记录表ID(雪花ID) + $gift_box = [];//开出的盲盒 + $room_hotvalue = 0;//房间热度(所有收礼人的礼物总值) + $gift_user_data = [];//收礼人收礼金币总和,交友和参与拍卖使用; + + foreach ($to_array as $k => $to_uid){ + $gift_user_data[]['user_id'] = $to_uid; + $receive_gift_total = 0;//收礼人收到的礼物总值 + //送礼 开启事务 + Db::startTrans(); + + if($type == 1) { + //扣除用户金币并记录日志 + $wallet_update = model('api/UserWallet')->change_user_cion_log($uid, $gift_price, $room_id, 10, '购买礼物'); + if (!$wallet_update) { + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-1', 'data' => null]; + } + }else{ + //扣除背包礼物并记录日志 + $gift_pack = $this -> change_user_gift_pack_log(3,$uid,$gid,$num,'房间送礼'); + if(!$gift_pack){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-2', 'data' => null]; + } + } + + //查询礼物是否是盲盒 + if($gift_info['label'] == 2){//趣味礼物(盲盒) + for($i = 0; $i < $num; $i++){ + //开盲盒 + $gift_box1[$i] = $this -> open_box($gid,$uid,$to_uid,$room_id,$gift_bag_id); + if($gift_box1[$i]['code'] != 1){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-3', 'data' => null]; + } + $gift_box[$i] = $gift_box1[$i]['data']; + //开出的礼物价值 + $receive_gift_total += $gift_box[$i]['gift_price']; + //记录一下收礼记录 + $give_gift = $this -> change_user_give_gift_log($uid,$gift_box[$i]['gift_id'],$gift_box[$i]['gift_price'],1,$to_uid,2,$type,$room_id,0,2); + if(!$give_gift){ + Db::rollback(); + return ['code' => 0, 'msg' => '送礼失败,请重试!!', 'data' => null]; + } + Log::record("送礼开出盲盒礼物信息:".json_encode($gift_box1),"info"); + } + }else{ + $receive_gift_total = $gift_price; + //收礼记录行为日志 + $give_gift = $this -> change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_uid,2,$type,$room_id); + if(!$give_gift){ + Db::rollback(); + return ['code' => 0, 'msg' => '送礼失败,请重试!', 'data' => null]; + } + } + $gift_user_data[$k]['gift_price'] = $receive_gift_total; + + //计算收礼人得益 //1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 99房主收益 98主持人收益 + $receiver_earnings = model('GiveGift') -> receiver_earnings($to_uid,$receive_gift_total,2); + if($receiver_earnings > 0){ + //增加收益并记录日志 + $receiver = model('api/UserWallet')->change_user_earnings_log($to_uid,$receiver_earnings,$room_id,11,'收礼增加收益'); + if(!$receiver){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-4', 'data' => null]; + } + } + //用户魅力等级更新 - $user_level = model('Level')->user_level_data_update($to_id,$gift_price,2,$roomId); + $user_level = model('Level')->user_level_data_update($to_uid,$receive_gift_total,2,$room_id); if(!$user_level){ Db::rollback(); return ['code' => 0, 'msg' => '用户等级更新失败', 'data' => null]; } $room_owner_earnings = 0;//房主收益 - $room_owner_earningsg = 0;//公会会长收益 - //是否在房间 - if(isset($from_id) && ($from_type == 2 || $from_type == 6)){ - if($from_type == 6){ //cp电影房 - //房主有收益 - if(get_system_config_value('room_cp_room_user_ratio') > 0){ - $room_owner = Db::name('vs_room')->where(['id'=>$from_id,'apply_status'=>2])->value('user_id'); - //计算房主收益//room_author_ratio - $room_owner_earnings = $this -> receiver_earnings($room_owner,$gift_price,699); - if($room_owner_earnings > 0){ - //增加收益并记录日志 - $room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益'); - if(!$room_owner_earning){ - Db::rollback(); - return ['code' => 0, 'msg' => '房主收益失败', 'data' => null]; - } - } - } - //公会长收益 - if(get_system_config_value('room_cp_guild_user_ratio') > 0){ - $guild_id = Db::name('vs_guild_user')->where(['user_id'=>$to_uid,'status'=>1])->value('guild_id'); - if($guild_id){ - $room_guild = Db::name('vs_guild')->where(['id'=>$guild_id])->value('user_id'); - //计算会长收益 - $room_owner_earningsg = $this -> receiver_earnings($room_guild,$gift_price,698); - //增加收益并记录日志 - $room_owner_earningg = $this -> change_user_cion_or_earnings_log($room_guild,$room_owner_earningsg,$from_id,2,21,'工会长收益'); - if(!$room_owner_earningg){ - Db::rollback(); - return ['code' => 0, 'msg' => '工会长收益失败', 'data' => null]; - } - } - } + $guild_earnings = 0;//公会会长收益 + $guid_ratio = 0;//公会长收益率 + $receive_ratio = get_system_config_value('room_gift_ratio');//房间收礼人收益 - }else{ - $room_owner = Db::name('vs_room')->where(['id'=>$from_id,'apply_status'=>2])->value('user_id'); - //计算房主收益//room_author_ratio - $room_owner_earnings = $this -> receiver_earnings($room_owner,$gift_price,99);//结果是钻石 - if($room_owner_earnings > 0){ - //主持人收益 - //在主持位的主持人 - $host_id = Db::name('vs_room_pit')->where(['room_id'=>$from_id,'pit_number'=>9])->value('user_id'); - if($host_id){ - //计算主持人收益 - $host_earnings = $this -> receiver_earnings($host_id,$room_owner_earnings*get_system_config_value('rmb_coin_ratio'),98,$from_id); - if($host_earnings > 0){ - //增加主持人收益并记录日志 - $host_earnings_earning = $this -> change_user_cion_or_earnings_log($host_id,$host_earnings,$from_id,2,19,'主持人收益'); - if(!$host_earnings_earning){ - Db::rollback(); - return ['code' => 0, 'msg' => '主持人收益失败', 'data' => null]; - } - //增加房主收益并记录日志 - $room_owner_earningss = $room_owner_earnings - $host_earnings; - if($room_owner_earningss > 0){ - $room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earningss,$from_id,2,18,'房主收益'); - if(!$room_owner_earning){ - Db::rollback(); - return ['code' => 0, 'msg' => '房主收益失败', 'data' => null]; - } - } - - }else{ - //增加房主收益并记录日志 - $room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益'); - if(!$room_owner_earning){ - Db::rollback(); - return ['code' => 0, 'msg' => '房主收益失败', 'data' => null]; - } - } - }else{ - //增加房主收益并记录日志 - $room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益'); - if(!$room_owner_earning){ - Db::rollback(); - return ['code' => 0, 'msg' => '房主收益失败', 'data' => null]; - } - } + //计算房主收益//room_author_ratio + $room_owner_earnings = model('GiveGift') -> receiver_earnings($room_owner,$receive_gift_total,99);//结果是钻石 + if($room_owner_earnings > 0){ + //在主持位的主持人 + $host_id = Db::name('vs_room_pit')->where(['room_id'=>$room_id,'pit_number'=>9])->value('user_id'); + if($host_id){ + //计算主持人收益 + $ratio = db::name('vs_room_host')->where(['room_id'=>$room_id,'user_id'=>$to_uid,'delete_time'=>null,'type'=>1])->value('ratio'); + if(!$ratio){ + $ratio = 0; } - } - if($gift_info_label['label'] == 2){ - foreach ($gift_box as $gv) { - //记录送礼利率和各方收益 - //收礼人是否加入公会 - $receiver_earningss = $this -> receiver_earnings($to_id,$gv['gift_price'],$from_type); - $room_owner_earningss = $this -> receiver_earnings($room_owner,$gv['gift_price'],99);//结果是钻石 - $ext_give_data = [ - 'FromUserInfo' => $FromUserInfo, - 'GiftInfo' => $gift_info, - 'GiftType' => 2, - ]; - $gift_rate = $this->record_gift_profit($to_uid,$room_owner_earningsg,$gv['gift_price'],$gv['give_gift_id'],$receiver_earningss,$room_owner_earningss,$from_id,$ext_give_data); - if ($gift_rate['code']==0) { + $host_earnings = round($room_owner_earnings * $ratio / 100,4); + if($host_earnings > 0){ + //增加主持人收益并记录日志 + $host_earnings_earning = model('api/UserWallet')->change_user_earnings_log($host_id,$host_earnings,$room_id,19,'主持人收益'); + if(!$host_earnings_earning){ Db::rollback(); - return ['code' => 0, 'msg' => $gift_rate['msg'], 'data' => null]; + return ['code' => 0, 'msg' => '网络错误-7', 'data' => null]; + } + //增加房主收益并记录日志 + $room_owner_earningss = $room_owner_earnings - $host_earnings; + if($room_owner_earningss > 0){ + $room_owner_earning = model('api/UserWallet')->change_user_earnings_log($room_owner,$room_owner_earningss,$room_id,18,'房主收益'); + if(!$room_owner_earning){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-8', 'data' => null]; + } + } + + }else{ + //增加房主收益并记录日志 + $room_owner_earning = model('api/UserWallet')->change_user_earnings_log($room_owner,$room_owner_earnings,$room_id,18,'房主收益'); + if(!$room_owner_earning){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-9', 'data' => null]; } } }else{ - //记录送礼利率和各方收益 - //收礼人是否加入公会 - $ext_give_data = [ - 'FromUserInfo' => $FromUserInfo, - 'GiftInfo' => $gift_info, - 'GiftType' => 1, - ]; - $gift_rate = $this->record_gift_profit($to_uid,$room_owner_earningsg,$gift_price,$give_gift,$receiver_earnings,$room_owner_earnings,$from_id,$ext_give_data); - if ($gift_rate['code']==0) { + //增加房主收益并记录日志 + $room_owner_earning = model('api/UserWallet')->change_user_earnings_log($room_owner,$room_owner_earnings,$room_id,18,'房主收益'); + if(!$room_owner_earning){ Db::rollback(); - return ['code' => 0, 'msg' => $gift_rate['msg'], 'data' => null]; + return ['code' => 0, 'msg' => '网络错误-10', 'data' => null]; } } } - $ToUserInfo = Db::name('user')->where(['id' => $to_id])->field('id as user_id,nickname,avatar,sex')->find(); - $ToUserInfo['icon'][0] = model('UserData')->user_wealth_icon($to_id);//财富图标 - $ToUserInfo['icon'][1] = model('UserData')->user_charm_icon($to_id);//魅力图标 - $ToUserInfo['charm'] = db::name('vs_room_user_charm')->where(['user_id' => $to_id,'room_id' => $from_id])->value('charm');//魅力 + //收礼人是否加入公会 + $is_join_guild = Db::name('vs_guild_user')->where(['user_id'=>$to_uid,'status'=>1,'quit_time' => 0])->field('guild_id,settlement_ratio')->find(); + if($is_join_guild){ + //公会长收益 房间收礼人收益+房间收礼人加入公会后增加收益 + $max_settlement_ratio = get_system_config_value('room_gift_ratio') + get_system_config_value('room_gift_guild_ratio'); + $receive_ratio = $is_join_guild['settlement_ratio'] ?? 0;//加入公会后 公会长设置的收益 + $guid_ratio = $max_settlement_ratio - $receive_ratio; + if($guid_ratio > 0){ + //公会长收益 + $guild_earnings = coin_earning($receive_gift_total,$guid_ratio); + if($guild_earnings > 0){ + $guild_user = db::name('vs_guild')->where(['id' => $is_join_guild['guild_id']])->value('user_id'); + $guild_earnings_in = model('api/UserWallet') + ->change_user_earnings_log($guild_user,$guild_earnings,$room_id,21,'工会长收益'); + if(!$guild_earnings_in){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-11', 'data' => null]; + } + } + } + } - if(isset($from_id) && ($from_type == 2 || $from_type == 6)){ - //查询房间是否在PK中 是fa_vs_room_pk 表中的 room_id_a,还是room_id_b - $room_pk = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_a' => $from_id])->field('pk_id')->find(); - if (!empty($room_pk)) { - // 当前 room_id 是 room_id_a 修改create_value_a - $rooma = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->setInc('create_value_a', $gift_price * 10); - $roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->find(); + //记录送礼利率和各方收益 + //平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益 + $room_owner_ratio = get_system_config_value('room_author_ratio'); + $app_ratio = 100 - $receive_ratio - $room_owner_ratio - $guid_ratio; + $app_earning = coin_earning($gift_price, $app_ratio); + + $gift_rate = $this->change_give_gift_profit($give_gift, $receive_ratio, $receiver_earnings, $room_owner_ratio, $room_owner_earnings, $app_ratio, $app_earning,$guid_ratio,$guild_earnings); + if(!$gift_rate){ + Db::rollback(); + return ['code' => 0, 'msg' => '网络错误-12', 'data' => null]; + } + $room_hotvalue += $receive_gift_total; + Db::commit(); + + //各种需要的及时推送 + $room_pk = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_a' => $room_id])->field('pk_id')->find(); + if (!empty($room_pk)) { + // 当前 room_id 是 room_id_a 修改create_value_a + $rooma = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->setInc('create_value_a', $receive_gift_total * 10); + $roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->find(); + //推送变化 + $text = [ + 'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id + 'create_value_a' => $roomPKinfo['create_value_a'],//发起者房间值 + 'room_id_b' => $roomPKinfo['room_id_b'],//接受者房间id + 'receive_value_b' => $roomPKinfo['receive_value_b'],//接受者房间值 + 'text' => '' + ]; + model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text); + model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text); + } else { + // 当前 room_id 不是 room_id_a,可能是 room_id_b 或者不存在 + $room_pk_b = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_b' => $room_id])->field('pk_id')->find(); + if (!empty($room_pk_b)) { + // 当前 room_id 是 room_id_b + $roomb = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->setInc('receive_value_b', $receive_gift_total * 10); + $roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->find(); //推送变化 $text = [ 'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id @@ -361,207 +760,296 @@ class SendGift extends Model ]; model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text); model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text); - } else { - // 当前 room_id 不是 room_id_a,可能是 room_id_b 或者不存在 - $room_pk_b = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_b' => $from_id])->field('pk_id')->find(); - if (!empty($room_pk_b)) { - // 当前 room_id 是 room_id_b - $roomb = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->setInc('receive_value_b', $gift_price * 10); - $roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->find(); - //推送变化 - $text = [ - 'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id - 'create_value_a' => $roomPKinfo['create_value_a'],//发起者房间值 - 'room_id_b' => $roomPKinfo['room_id_b'],//接受者房间id - 'receive_value_b' => $roomPKinfo['receive_value_b'],//接受者房间值 - 'text' => '' - ]; - model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text); - model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text); - } } - //推送礼物特效 - if(!isset($ext['is_draw_gift']) || $ext['is_draw_gift'] != 1){// 非盲盒转盘 推送 - if($gift_info_label['label'] == 2){ - //循环开出来的盲盒,相同的礼物只推送一次,消息推送为$FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 趣味礼物 ' .$gift_inf['gift_name'].' x 多少'; - if($gift_box){ - // 统计相同礼物的数量 - $giftCount = []; - foreach ($gift_box as $key=>$gv) { - $gift_info = Db::name('vs_gift')->where(['gid'=>$gv['gift_id']]) - ->field('gid as gift_id,gift_name,gift_price,file_type,base_image,play_image,gift_type,label,is_public_server')->find(); - if (isset($giftCount[$gv['gift_id']])) { - $giftCount[$gv['gift_id']]['count']++; - } else { - $giftCount[$gv['gift_id']] = [ - 'gift_info' => $gift_info, - 'count' => 1 - ]; - } - $gift_box[$key]['gift_name'] = $gift_info['gift_name']; - } + } - // 构建文字消息内容 - $giftTextList = []; - foreach ($giftCount as $giftData) { - $gift_inf = $giftData['gift_info']; - $count = $giftData['count']; - $giftTextList[] = $gift_inf['gift_name'].' X'.$count; - } + $ToUserInfo = model('User')->get_user_base_info($to_uid); + $ToUserInfo['charm'] = db::name('vs_room_user_charm')->where(['user_id' => $to_uid,'room_id' => $room_id])->value('charm');//魅力 - // 推送文字消息 (格式: 张三 送给 李四 趣味礼物 礼物名1 X2,礼物2 X4) - $textMessage = $FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 趣味礼物 ' . implode(',', $giftTextList); - $textData = [ - 'FromUserInfo' => $FromUserInfo, - 'ToUserInfo' => $ToUserInfo, - 'GiftInfos' => array_values($gift_box), - 'GiftNum' => $num, - 'text' => $textMessage + //推送其他时刻需要的信息 其他放到异步回调里 + if($gift_info['label'] == 2){ + //循环开出来的盲盒,相同的礼物只推送一次,消息推送为$FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 趣味礼物 ' .$gift_inf['gift_name'].' x 多少'; + if($gift_box){ + // 统计相同礼物的数量 + $giftCount = []; + foreach ($gift_box as $key=>$gv) { + if (isset($giftCount[$gv['gift_id']])) { + $giftCount[$gv['gift_id']]['count']++; + } else { + $giftCount[$gv['gift_id']] = [ + 'gift_info' => $gift_info, + 'count' => 1 ]; - // 聊天室推送文字消息 - model('Chat')->sendMsg(1038,$from_id,$textData); - - // 循环推送每个礼物的特效消息 - foreach ($giftCount as $giftId => $giftData) { - $gift_inf = $giftData['gift_info']; - $count = $giftData['count']; - - // 推送礼物特效消息 - $effectData = [ - 'FromUserInfo' => $FromUserInfo, - 'ToUserInfo' => $ToUserInfo, - 'GiftInfo' => $gift_inf, - 'gift_num' => $count, - 'text' => null - ]; - - // 聊天室推送礼物特效消息 - model('Chat')->sendMsg(1005,$from_id,$effectData); - - $roomtype = Db::name('vs_room')->where(['id' => $from_id])->value('type_id'); - if($roomtype == 6){ - //推送消息 - $hot_value = db::name('vs_give_gift')->where('from_id', $from_id)->where('from',6) - ->sum('total_price'); - $text1 = [ - 'room_id' => $from_id, - 'hot_value' => $hot_value * 10, - 'text' => '房间心动值变化' - ]; - //聊天室推送系统消息 - model('Chat')->sendMsg(1028,$from_id,$text1); - - //电影房推送结束时间点 - $text2 = [ - 'room_id' => $from_id, - 'end_time' => time() + 60 * 60 * 24 * 7, - 'text' => '房间结束时间点' - ]; - model('Chat')->sendMsg(1042,$from_id,$text2); - }else{ - if($gift_inf['is_public_server'] == 1){ - //推送礼物横幅 - $push = new Push(UID, $from_id); - $room_name = Db::name('vs_room')->where(['id' => $from_id, 'apply_status' => 2])->value('room_name'); - $bannerText = $FromUserInfo['nickname'] . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $gift_inf['gift_name'] . 'X' . $count; - $text_list_new[] = [ - 'text' => $bannerText, - 'gift_picture' => $gift_inf['base_image'], - 'room_id' => $from_id, - 'fromUserName' => $FromUserInfo['nickname'], - 'toUserName' => $ToUserInfo['nickname'], - 'giftName' => $gift_inf['gift_name'], - 'roomId' => $from_id, - 'number' => $count, - ]; - $push->giftBanner($text_list_new); - } - } - } } - }else{ - $text = $FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 礼物 ' .$gift_info['gift_name'].' x ' .$num; - $text = [ + $gift_box[$key]['gift_name'] = $gift_info['gift_name']; + } + + // 构建文字消息内容 + $giftTextList = []; + foreach ($giftCount as $giftData) { + $gift_inf = $giftData['gift_info']; + $count = $giftData['count']; + $giftTextList[] = $gift_inf['gift_name'].' X'.$count; + } + + // 推送文字消息 (格式: 张三 送给 李四 趣味礼物 礼物名1 X2,礼物2 X4) + $textMessage = $FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 趣味礼物 ' . implode(',', $giftTextList); + $textData = [ + 'FromUserInfo' => $FromUserInfo, + 'ToUserInfo' => $ToUserInfo, + 'GiftInfos' => array_values($gift_box), + 'GiftNum' => $num, + 'text' => $textMessage + ]; + // 聊天室推送文字消息 + model('Chat')->sendMsg(1038,$room_id,$textData); + + // 循环推送每个礼物的特效消息 + foreach ($giftCount as $giftId => $giftData) { + $gift_inf = $giftData['gift_info']; + $count = $giftData['count']; + + // 推送礼物特效消息 + $effectData = [ 'FromUserInfo' => $FromUserInfo, 'ToUserInfo' => $ToUserInfo, - 'GiftInfo' => $gift_info, - 'gift_num' => $num, - 'text' => $text + 'GiftInfo' => $gift_inf, + 'gift_num' => $count, + 'text' => null ]; - //聊天室推送系统消息 - model('Chat')->sendMsg(1005,$from_id,$text); - $roomtype = Db::name('vs_room')->where(['id' => $from_id])->value('type_id'); - if($roomtype == 6){ - //推送消息 - $hot_value = db::name('vs_give_gift')->where('from_id', $from_id)->where('from',6) - ->sum('total_price'); - $text1 = [ - 'room_id' => $from_id, - 'hot_value' => $hot_value * 10, - 'text' => '房间心动值变化' - ]; - //聊天室推送系统消息 - model('Chat')->sendMsg(1028,$from_id,$text1); - }else{ - if($gift_info['is_public_server'] == 1){ - //推送礼物横幅 - $push = new Push($uid, $from_id); - $room_name = Db::name('vs_room')->where(['id' => $from_id, 'apply_status' => 2])->value('room_name'); - $text = $FromUserInfo['nickname'] . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $gift_info['gift_name'] . 'X' . $num; - $text_list_new[] = [ - 'text' => $text, - 'gift_picture' => $gift_info['base_image'], - 'room_id' => $from_id, - 'fromUserName' => $FromUserInfo['nickname'], - 'toUserName' => $ToUserInfo['nickname'], - 'giftName' => $gift_info['gift_name'], - 'roomId' => $from_id, - 'number' => $num, - ]; - $push->giftBanner($text_list_new); - } + // 聊天室推送礼物特效消息 + model('Chat')->sendMsg(1005,$room_id,$effectData); + + if($gift_inf['is_public_server'] == 1){ + //推送礼物横幅 + $push = new Push(UID, $room_id); + $room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name'); + $bannerText = $FromUserInfo['nickname'] . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $gift_inf['gift_name'] . 'X' . $count; + $text_list_new[] = [ + 'text' => $bannerText, + 'gift_picture' => $gift_inf['base_image'], + 'room_id' => $room_id, + 'fromUserName' => $FromUserInfo['nickname'], + 'toUserName' => $ToUserInfo['nickname'], + 'giftName' => $gift_inf['gift_name'], + 'roomId' => $room_id, + 'number' => $count, + ]; + $push->giftBanner($text_list_new); } } } - //直播间送礼物 每日任务 - model('DailyTasks')->tasks_complete($uid,3); - } - //cp检测且处理升级事宜 - $cp_type = model('api/UserCp')->checkGift($uid, $gid, $to_id, $from_id, $num,$gift_price);//0-不处理,1-表明心意,2-组成Cp - if($cp_type == 1){ - $textt1 = "亲爱的用户,您好!\n".$FromUserInfo['nickname'] . ' 的 【' .$gift_info['gift_name'].' 】 已送达,这是他的心动信号。回赠一个,即可锁定这份缘分!'; - $textt = ''; - }elseif ($cp_type == 2){ - //接受方弹起的 信息 - $textt1 = "恭喜你!". $FromUserInfo['nickname'] ."也向您回赠了【" .$gift_info['gift_name']."】,并接受了你的心动信号。\n从现在起,你们正式成为彼此的专属CP,共同开启一段甜蜜的旅程。\n【心动空间】已为你们敞开大门!这里将记录你们在一起的点滴,见证所有心动与陪伴。快去心动空间,开启你们的CP升级之旅吧!"; - $textt = '【心动空间】已为你们敞开大门!这里将记录你们在一起的点滴,见证所有心动与陪伴。快去心动空间,开启你们的CP升级之旅吧!';//发送方弹起的信息 + }else{ + $text = $FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 礼物 ' .$gift_info['gift_name'].' x ' .$num; + $text = [ + 'FromUserInfo' => $FromUserInfo, + 'ToUserInfo' => $ToUserInfo, + 'GiftInfo' => $gift_info, + 'gift_num' => $num, + 'text' => $text + ]; + //聊天室推送系统消息 + model('Chat')->sendMsg(1005,$room_id,$text); + + if($gift_info['is_public_server'] == 1){ + //推送礼物横幅 + $push = new Push($uid, $room_id); + $room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name'); + $text = $FromUserInfo['nickname'] . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $gift_info['gift_name'] . 'X' . $num; + $text_list_new[] = [ + 'text' => $text, + 'gift_picture' => $gift_info['base_image'], + 'room_id' => $room_id, + 'fromUserName' => $FromUserInfo['nickname'], + 'toUserName' => $ToUserInfo['nickname'], + 'giftName' => $gift_info['gift_name'], + 'roomId' => $room_id, + 'number' => $num, + ]; + $push->giftBanner($text_list_new); + } } } //增加房间火热值hot_value - $gift_totalaa = $gift_total * get_system_config_value('coin_charm_exp'); - db::name('vs_room')->where(['id' => $from_id])->inc('hot_value', $gift_totalaa)->inc('today_hot_value', $gift_totalaa)->update(); + $gift_totalaa = $room_hotvalue * get_system_config_value('coin_charm_exp'); + db::name('vs_room')->where(['id' => $room_id])->inc('hot_value', $gift_totalaa)->inc('today_hot_value', $gift_totalaa)->update(); - $roomtype = Db::name('vs_room')->where(['id' => $from_id])->value('type_id'); - if($roomtype == 6){ - //推送消息 交友房创建的私密房 倒计时增加 - $value = db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1) - ->value('time_day'); - if($value){ - db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1) - ->setInc('time_day', $gift_total); - $text111 = [ - 'room_id' => $from_id, - 'time_day' => db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1)->value('time_day'), - 'text' => '房间结束时间变化' - ]; - //聊天室推送系统消息 - model('Chat')->sendMsg(1052,$from_id,$text111); - } + if($room_type == 7){ + $reslut = [ + 'data' => ['gift_total' => $gift_totalaa,'gift_user_data' =>$gift_user_data,] + ]; + model('api/Friend')->room_give_gift($uid, $to_array,$room_id,$reslut,$heart_id); } + //gift_total:收礼人收礼金币总和,交友和参与拍卖使用;cp_type:cp交友使用,gift_user_data:cp交友使用, + return ['code' => 1, 'msg' => '送礼成功', 'data' => ['gift_total' => $room_hotvalue,'gift_user_data' =>null,'cp_type' => null]]; + } - Db::commit(); - return ['code' => 1, 'msg' => '送礼成功', 'data' => ['gift_total' => $gift_total,'gift_user_data' =>$gift_user_data,'cp_type' => ['cp_type' => $cp_type,'text' => $textt,'text1' => $textt1,'gift_id' => $gid]]]; + + //记录用户赠送背包礼物日志 + public function change_user_gift_pack_log($packType,$uid,$gid,$num,$remark) + { + $user_gift_pack = db::name('vs_user_gift_pack')->where(['user_id'=>$uid,'gid'=>$gid])->find(); + $user_gift_packs['num'] = $user_gift_pack['num'] - $num; + $user_gift_packs['updatetime'] = time(); + $gift_pack_update = db::name('vs_user_gift_pack')->where(['user_id'=>$uid,'gid'=>$gid])->update($user_gift_packs); + if(!$gift_pack_update){ + return false; + } + $data = [ + 'user_id' => $uid, + 'gid' => $gid, + 'change_num' => $num, + 'type' => $packType, + 'remarks' => $remark, + 'createtime' => time(), + ]; + $res = Db::name('vs_user_gift_pack_log')->insert($data); + if(!$res){ + return false; + } + return true; + } + + + /* + * 开盲盒 + */ + public function open_box($gift_id,$user_id,$gift_user_id,$room_id,$gift_bag_id){ + //获取盲盒配置 + if($gift_bag_id){ + $bag_gift = db::name("vs_gift")->where(['gid'=>$gift_id])->find();// 获取盲盒信息 + //随机获取一个礼物 + $where = [ + 'gift_bag_id' => $gift_bag_id, + 'quantity' => ['>',0], + 'remaining_number' => ['>',0] + ]; + + // 优化:基于剩余数量的加权随机选择 + $gift_bag_details = db::name("vs_gift_bag_detail")->where($where)->select(); + if (empty($gift_bag_details)) { + return ['code' => 0, 'msg' => '当前盲盒无可用礼物', 'data' => []]; + } + // 实现加权随机算法:剩余数量越多,被抽中的概率越大 + $total_remaining = 0; + foreach ($gift_bag_details as $gift) { + $total_remaining += $gift['remaining_number']; + } + $rand_value = mt_rand(1, $total_remaining); + $current_sum = 0; + $gift_bag_detail = null; + foreach ($gift_bag_details as $gift) { + if($gift['remaining_number'] <= 0){ + continue; + } + $current_sum += $gift['remaining_number']; + if ($rand_value <= $current_sum) { + $gift_bag_detail = $gift; + break; + } + + } + if($gift_bag_detail){ + //获取开出礼物的信息 + $gift = db::name("vs_gift")->where(['gid'=>$gift_bag_detail['foreign_id']])->find(); + //处理礼包发放记录表 + $data = []; + $data['user_id'] = $user_id; + $data['gift_user_id'] = $gift_user_id; + $data['gift_bag_id'] = $gift_bag_id; + $data['gift_id'] = $gift_bag_detail['foreign_id']; + $data['periods'] = 0;//$periods; + $data['room_id'] = $room_id; + $data['gift_price'] = $gift['gift_price']; + $data['bag_price'] = $bag_gift['gift_price']; + $data['createtime'] = time(); + $result = db::name("vs_gift_bag_receive_log")->insert($data); + if(!$result){ + return ['code' => 0, 'msg' => '失败,', 'data' => []]; + } + //减去盲盒包礼物数量 + $ret = db::name("vs_gift_bag_detail")->where('id',$gift_bag_detail['id'])->setDec('remaining_number'); + if(!$ret){ + return ['code' => 0, 'msg' => '失败.', 'data' => []]; + } + //判断剩余数量是否为0 为0重置,进入下一期 + $gift_bag_num = db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->sum('remaining_number'); + if($gift_bag_num <= 0){ + db::name("vs_gift_bag")->where('id',$gift_bag_id)->setInc('periods'); + db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->update(['remaining_number'=>db::raw('quantity')]); + } + }else{ + return ['code' => 0, 'msg' => '失败!', 'data' => []]; + } + }else{ + return ['code' => 0, 'msg' => '失败!!', 'data' => []]; + } + $result_data = [ + 'gift_id'=>$gift_bag_detail['foreign_id'], + 'gift_price'=>$gift['gift_price'], + 'is_public_screen'=>$gift['is_public_screen'], + ]; + return ['code' => 1, 'msg' => '成功', 'data' => $result_data]; + } + + + + //记录用户送礼日志 + public function change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_id,$from_type,$type,$from_id,$pit_number = 0,$gitf_type =1) + { + $data = [ + 'id' => Snowflake::generate(),// 生成雪花ID + 'user_id' => $uid, + 'gift_id' => $gid, + 'gift_type' => $gitf_type, + 'number' => $num, + 'gift_user' => $to_id, + 'pit_number' => $pit_number, + 'from_id' => $from_id,//来源ID,(房间ID或动态ID) + 'total_price' => $gift_price, + 'from' => $from_type,//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 6Cp电影房 + 'type' => $type,//1金币购买 2送背包礼物 + 'createtime' => time(), + ]; + + GiftQueue::push($data); + return $data['id']; + } + + + /* + * 送礼利率收益等具体记录 + * @param $give_gift_id 送礼记录表ID + * @param $gift_user_ratio 收礼人 收礼时的收益率(单位%) + * @param $gift_user_earning 收礼人的收益 + * @param $room_owner_ratio 房主收益率(单位 %) + * @param $room_owner_earning 房主收益 + * @param $app_ratio 平台收益率(单位 %) + * @param $app_earning 平台收益 + * @param $guid_ratio 公会收益率(单位 %) + * @param $guild_earning 公会收益 + * @return bool + */ + public function change_give_gift_profit($give_gift_id,$gift_user_ratio,$gift_user_earning = 0,$room_owner_ratio = 0,$room_owner_earning = 0,$app_ratio = 0,$app_earning = 0,$guid_ratio=0,$guild_earning=0) + { + $data = [ + 'give_gift_id' => $give_gift_id, + 'gift_user_ratio' => $gift_user_ratio, + 'gift_user_earning' => $gift_user_earning, + 'room_owner_ratio' => $room_owner_ratio, + 'room_owner_earning' => $room_owner_earning, + 'app_ratio' => $app_ratio, + 'app_earning' => $app_earning, + 'guid_ratio' => $guid_ratio, + 'guid_ratio_earning' => $guild_earning, + 'createtime' => time(), + ]; + $res = Db::name('vs_give_gift_ratio_log')->insert($data); + if(!$res){ + return false; + } + return true; } } \ No newline at end of file diff --git a/application/api/model/UserCp.php b/application/api/model/UserCp.php index a68f13cb..522f60a8 100644 --- a/application/api/model/UserCp.php +++ b/application/api/model/UserCp.php @@ -288,13 +288,14 @@ class UserCp extends Model * @param $gift_id 礼物ID * @param $room_id 房间ID * @param $cp_zone_id Cp空间ID + * @param $gift_price 收礼总金币 */ public function addCpLevel($from_user_id, $to_user_id, $room_id, $gift_id, $cp_zone_id, $num,$gift_price) { $jinbi_arr = explode(',', get_system_config_value('cp_exp_rate')); $jinbi = $jinbi_arr[0]; $jinyan = $jinbi_arr[1]; - $exp = round($gift_price * $num / $jinbi * $jinyan, 2); + $exp = round($gift_price / $jinbi * $jinyan, 2); $yuan_exp = Db::name('user_cp_zone')->where(['id' => $cp_zone_id])->value('exp'); $zone_level = Db::name('user_cp_zone')->where(['id' => $cp_zone_id])->value('level'); $toUserNickname =db::name('user')->where(['id' => $to_user_id])->value('nickname')??'未知用户'; diff --git a/application/api/model/UserWallet.php b/application/api/model/UserWallet.php index a1c62cc4..9dff99c2 100644 --- a/application/api/model/UserWallet.php +++ b/application/api/model/UserWallet.php @@ -204,4 +204,127 @@ class UserWallet extends Model return ['code' => 0, 'msg' => '转赠失败', 'data' => null]; } } + + + /* + *操作用户金币并记录日志 + * @param int $user_id 用户id + * @param int $money 金币数量 + * @param int $change_type 变动类型 + * @param int $room_id 房间 + * @param str $remarks 备注 + */ + //change_type + // 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-爵位购买赠送金币(金币), + //50-签约,51-签约失败退回,52-首次被签约收入,53.签约师傅每日返还,54-叛徒补偿,55-徒弟收礼返佣,56-续约,57-签到,58-爆币,59-红包手续费 + //资金操作 + public function change_user_cion_log($user_id,$money,$room_id,$change_type,$remarks) + { + //增加用户金币类型 + $in_types = [1,2,5,6,8,13,14,15,16,23,26,27,28,30,33,35,51,57,58]; + //减少用户金币类型 + $out_types = [4,7,10,17,20,24,25,32,50,56,59]; + + $user_coin = Db::name('user_wallet_coin')->where(['user_id' => $user_id])->value('coin'); + if(in_array($change_type,$in_types)){ + $update_coin = $user_coin + $money; + }elseif(in_array($change_type,$out_types)){ + if($user_coin < $money){ + return false; + } + $update_coin = $user_coin - $money; + }else{ + $update_coin = $user_coin; + } + $res1 = Db::name('user_wallet_coin')->where(['user_id' => $user_id])->update(['coin' => $update_coin,'updatetime' => time()]); + if(!$res1){ + return false; + } + + $data = [ + 'user_id' => $user_id, + 'room_id' => $room_id, + 'coin' => $money, + 'before' => $user_coin, + 'after' => $user_coin - $money, + 'change_type' => $change_type, + 'remarks' => $remarks, + 'createtime' => time() + ]; + + $res = Db::name('user_coin_log')->insert($data); + if(!$res){ + return false; + } + + return true; + } + + + /* + *操作用户收益(钻石)并记录日志 + * @param int $user_id 用户id + * @param int $money 数量 + * @param int $change_type 变动类型 + * @param int $room_id 房间 + * @param str $remarks 备注 + */ + //change_type + // 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-爵位购买赠送金币(金币), + //50-签约,51-签约失败退回,52-首次被签约收入,53.签约师傅每日返还,54-叛徒补偿,55-徒弟收礼返佣,56-续约,57-签到,58-爆币,59-红包手续费 + + //bcadd: 加法运算 + //bcsub: 减法运算 + //bcmul: 乘法运算 + //bcdiv: 除法运算 + public function change_user_earnings_log($user_id,$money,$room_id,$change_type,$remarks) + { + //增加用户钻石类型 + $in_types = [9,11,12,18,19,21,22,31,34,52,54,55]; + + //减少用户钻石类型 + $out_types = [3,14,29]; + $user_earnings = Db::name('user_wallet_earnings')->where(['user_id' => $user_id])->value('earnings'); + + if(in_array($change_type,$in_types)){ + $update_coin = bcadd($user_earnings , $money,4); + }elseif(in_array($change_type,$out_types)){ + if($user_earnings < $money){ + return false; + } + $update_coin = bcsub($user_earnings , $money,4); + }else{ + $update_coin = $user_earnings; + } + $res1 = Db::name('user_wallet_earnings')->where(['user_id' => $user_id])->update(['earnings' => $update_coin,'updatetime' => time()]); + if(!$res1){ + return false; + } + + $data = [ + 'user_id' => $user_id, + 'room_id' => $room_id, + 'earnings' => $money, + 'before' => $user_earnings, + 'after' => $user_earnings - $money, + 'change_type' => $change_type, + 'remarks' => $remarks, + 'createtime' => time() + ]; + + $res = Db::name('user_earnings_log')->insert($data); + if(!$res){ + return false; + } + + return true; + } } \ No newline at end of file diff --git a/application/common.php b/application/common.php index 0f1958ea..5dcd7f2f 100644 --- a/application/common.php +++ b/application/common.php @@ -1244,16 +1244,23 @@ function handelCharge($where,$data){ } } -//计算收益 10% 因为金币10 = 1元 收益 1钻石 = 1元 + // @param $all_gift_price 礼物总价单位金币 -// @param $ratio 收益比例 -// @return int 收益单位钻石 +// @param $ratio 收益比例 +// @return float 收益(单位钻石) +//bcadd: 加法运算 +//bcsub: 减法运算 +//bcmul: 乘法运算 +//bcdiv: 除法运算 function coin_earning($all_gift_price,$ratio){ - //rmb_coin_ratio 人民币转换金币的比例 - //金币转换人民币 - //小数点保留4位 - $result = $all_gift_price * $ratio / 100 / get_system_config_value('rmb_coin_ratio'); - return round($result, 4); + //百分比转换为小数 + $ratio = $ratio / 100; + //应得金币 + $coin_earning = bcmul($all_gift_price, $ratio, 3); + //金币转为钻石的比例 + $c_e_ratio = get_system_config_value('rmb_coin_ratio'); + //转化为钻石(小数点保留4位) + return bcdiv($coin_earning, $c_e_ratio, 4); } /** diff --git a/application/common/model/GiveGiftBase.php b/application/common/model/GiveGiftBase.php index 1d680b87..0b82385b 100644 --- a/application/common/model/GiveGiftBase.php +++ b/application/common/model/GiveGiftBase.php @@ -45,7 +45,7 @@ class GiveGiftBase extends Model { try { // 生成雪花ID - $data['id'] = Snowflake::generate(); +// $data['id'] = Snowflake::generate(); // 设置时间 if (empty($data['createtime'])) {