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($uid,$to_uid,$gid,$num,$from_type,$type,$from_id = 0,$pit_number = 0,$change_type = 0,$ext = []) { if(isset($ext['is_draw_gift']) && $ext['is_draw_gift'] == 1) { $return_pan = $this->give_gift_to_pan($uid, $to_uid, $gid, $num, $from_type, $type, $from_id, $pit_number, $change_type, $ext); return $return_pan; } //送的礼物信息 $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);//魅力图标 //送给一人礼物的总价格(扣除用户的数额) $gift_price = $gift_info['gift_price'] * $num; //送礼 开启事务 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]; } } }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)) { 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); if(!$gift_pack){ Db::rollback(); return ['code' => 0, 'msg' => '扣除用户背包礼物失败', 'data' => null]; } } //循环送礼 $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 = []; //查询礼物是否是盲盒 if($gift_info['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"); } } $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); if(!$give_gift){ Db::rollback(); 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){ Db::rollback(); return ['code' => 0, 'msg' => '收礼人收益配置有误', 'data' => null]; } //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){ Db::rollback(); return ['code' => 0, 'msg' => '收礼人收益失败', 'data' => null]; } //用户魅力等级更新 $user_level = model('Level')->user_level_data_update($to_id,$gift_price,2,$roomId); 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]; } } } }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]; } } } } } if($gift_info['label'] == 2){ foreach ($gift_box as $gv) { //记录送礼利率和各方收益 //收礼人是否加入公会 $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')->find(); //收益增加 加入工会的收益 if ($is_join_guild) { $ratiog = $configs['room_gift_guild_ratio']; } else { $ratiog = 0; } //未加入工会的收益 $ratiogr = $configs['room_gift_ratio']; //收礼人最终的收益比例 $ratio = $ratiogr + $ratiog; //房主收益大于0 就代表有收益 且在房间 if ($room_owner_earningsg > 0) { $guid_ratio = $configs['room_cp_guild_user_ratio']; } else { $guid_ratio = 0; } //平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益 $app_ratio = 100 - $ratio - $configs['room_author_ratio'] - $guid_ratio; $app_earning = coin_earning($gv['gift_price'], $app_ratio); $gift_rate = $this->change_give_gift_profit($gv['give_gift_id'], $ratio, $receiver_earnings, $configs['room_author_ratio'], $room_owner_earnings, $app_ratio, $app_earning); if (!$gift_rate) { Db::rollback(); return ['code' => 0, 'msg' => '礼物记录失败', 'data' => null]; } } }else{ //记录送礼利率和各方收益 //收礼人是否加入公会 $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')->find(); //收益增加 加入工会的收益 if ($is_join_guild) { $ratiog = $configs['room_gift_guild_ratio']; } else { $ratiog = 0; } //未加入工会的收益 $ratiogr = $configs['room_gift_ratio']; //收礼人最终的收益比例 $ratio = $ratiogr + $ratiog; //房主收益大于0 就代表有收益 且在房间 if ($room_owner_earningsg > 0) { $guid_ratio = $configs['room_cp_guild_user_ratio']; } else { $guid_ratio = 0; } //平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益 $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); if (!$gift_rate) { Db::rollback(); return ['code' => 0, '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); } } //推送礼物特效 if(!isset($ext['is_draw_gift']) || $ext['is_draw_gift'] != 1){// 非盲盒转盘 推送 if($gift_info['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; } // 推送文字消息 (格式: 张三 送给 李四 趣味礼物 礼物名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,$from_id,$textData); // 循环推送每个礼物的特效消息 foreach ($giftCount as $giftId => $giftData) { $gift_inf = $giftData['gift_info']; $count = $giftData['count']; // 推送礼物特效消息 $effectData = [ 'FromUserInfo' => $FromUserInfo, 'ToUserInfo' => $ToUserInfo, 'GiftInfo' => $gift_inf, 'GiftNum' => $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 = [ 'FromUserInfo' => $FromUserInfo, 'ToUserInfo' => $ToUserInfo, 'GiftInfo' => $gift_info, 'GiftNum' => $num, 'text' => $text ]; //聊天室推送系统消息 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('DailyTasks')->tasks_complete($uid,3); } } //增加房间火热值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); } } Db::commit(); return ['code' => 1, 'msg' => '送礼成功', 'data' => ['gift_total' => $gift_total,'gift_user_data' =>$gift_user_data]]; } /* * 送礼物-盲盒转盘专用 * @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);//魅力图标 //送给一人礼物的总价格(扣除用户的数额) $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]; } //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]; } } } } } if($gift_info['label'] == 2){ foreach ($gift_box as $gv) { //记录送礼利率和各方收益 //收礼人是否加入公会 $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')->find(); //收益增加 加入工会的收益 if ($is_join_guild) { $ratiog = $configs['room_gift_guild_ratio']; } else { $ratiog = 0; } //未加入工会的收益 $ratiogr = $configs['room_gift_ratio']; //收礼人最终的收益比例 $ratio = $ratiogr + $ratiog; //房主收益大于0 就代表有收益 且在房间 if ($room_owner_earningsg > 0) { $guid_ratio = $configs['room_cp_guild_user_ratio']; } else { $guid_ratio = 0; } //平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益 $app_ratio = 100 - $ratio - $configs['room_author_ratio'] - $guid_ratio; $app_earning = coin_earning($gv['gift_price'], $app_ratio); $gift_rate = $this->change_give_gift_profit($gv['give_gift_id'], $ratio, $receiver_earnings, $configs['room_author_ratio'], $room_owner_earnings, $app_ratio, $app_earning); if (!$gift_rate) { return ['code' => 0, 'msg' => '礼物记录失败', 'data' => null]; } } }else{ //记录送礼利率和各方收益 //收礼人是否加入公会 $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')->find(); //收益增加 加入工会的收益 if ($is_join_guild) { $ratiog = $configs['room_gift_guild_ratio']; } else { $ratiog = 0; } //未加入工会的收益 $ratiogr = $configs['room_gift_ratio']; //收礼人最终的收益比例 $ratio = $ratiogr + $ratiog; //房主收益大于0 就代表有收益 且在房间 if ($room_owner_earningsg > 0) { $guid_ratio = $configs['room_cp_guild_user_ratio']; } else { $guid_ratio = 0; } //平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益 $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); if (!$gift_rate) { return ['code' => 0, '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); } } //增加房间火热值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]]; } //送礼特效 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, 'GiftNum' => $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')->find(); //收益增加 加入工会的收益 if($is_join_guild){ $ratiog = $configs['room_gift_guild_ratio']; }else{ $ratiog = 0; } $ratiogr = $configs['room_gift_ratio']; $ratio = $ratiogr +$ratiog; }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']; } //计算收礼人收益 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.删除关系扣金币, if(in_array($change_type,[1,2,3,4,5,6,7,8,12,13,14,15,16,17,20])){ $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]; //减少用户金币类型 $out_types = [4,7,10,17,20]; 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]; //减少用户钻石类型 $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(), ]; $res = Db::name('vs_give_gift')->insertGetId($data); if(!$res){ return false; } return $res; } //记录用户赠送背包礼物日志 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) { $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, '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动态打赏' ]; $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]; } }