diff --git a/application/api/model/BlindBoxTurntableGiftDraw.php b/application/api/model/BlindBoxTurntableGiftDraw.php index 8ed1e57..f34878b 100644 --- a/application/api/model/BlindBoxTurntableGiftDraw.php +++ b/application/api/model/BlindBoxTurntableGiftDraw.php @@ -71,12 +71,6 @@ class BlindBoxTurntableGiftDraw extends Model $this->recordDrawErrorToRedis($expectedCount, count($precomputedResults), $room_id, $user_id, $gift_bag_id, $num, $gift_user_ids, $precomputedResults); return ['code' => 0, 'msg' => '抽奖结果数量与预期数量不一致,请重试! ', 'data' => null]; } - - //兼容送礼判断,主持人比例设置为100% 送礼方法里报错,快速解决,把送礼方法前置,送完礼再处理盲盒转盘记录 - $result = $this->sendGiftsToRecipients($precomputedResults, $room_id,$user_id); - if (isset($result['code']) && $result['code'] !== 1) { - return $result; - } // 4. 执行抽奖事务(核心操作) $transactionResult = $this->executeDrawTransaction( $bag_data, @@ -507,6 +501,12 @@ class BlindBoxTurntableGiftDraw extends Model // 4. 扣除用户金币 $this->deductUserCoins($user_id, $bagGiftPrice, $room_id); + //发送礼物 + $result = $this->sendGiftsToRecipients($precomputedResults, $room_id,$user_id); + if (isset($result['code']) && $result['code'] !== 1) { + throw new \Exception($result['msg']); + } + db::commit(); // 5. 统计礼物数量 @@ -550,7 +550,7 @@ class BlindBoxTurntableGiftDraw extends Model if (!$ret) { Log::record('巡乐会更新礼物剩余数量: ' . $room_id."【数据】".var_export($precomputedResults, true),"info"); -// throw new \Exception('更新礼物剩余数量失败'); + throw new \Exception('更新礼物剩余数量失败'); } } } @@ -725,11 +725,11 @@ class BlindBoxTurntableGiftDraw extends Model ); if (isset($res) && $res['code'] != 1) { - Log::record('发送礼物失败: ' . $res['msg'].$userGift['gift_user_id'],"info"); + Log::record('发送礼物失败: ' . $res['msg'] . $userGift['gift_user_id'], "info"); return ['code' => 0, 'msg' => $res['msg'], 'data' => null]; -// \think\facade\Log::error('发送礼物失败: ' . $res['msg']); } } + return ['code' => 1, 'msg' => '发送礼物成功', 'data' => null]; } /** diff --git a/application/api/model/GiveGift.php b/application/api/model/GiveGift.php index b887513..9b222c7 100644 --- a/application/api/model/GiveGift.php +++ b/application/api/model/GiveGift.php @@ -40,6 +40,10 @@ 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 = []) { + 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 = 0, $pit_number = 0, $change_type = 0, $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(); @@ -560,6 +564,299 @@ class GiveGift extends Model 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) {