diff --git a/application/api/model/Chat.php b/application/api/model/Chat.php index 3b9ae5d..f682ea1 100644 --- a/application/api/model/Chat.php +++ b/application/api/model/Chat.php @@ -97,6 +97,8 @@ class Chat extends Model // FriendRoomDelay = 1040, //交友结束推送是否创建小房间 // FriendRoomEnd = 1041, + //交友房 私密小屋送礼增加结束时间 + // FriendRoomGiftBlindBox = 1042, diff --git a/application/api/model/Friend.php b/application/api/model/Friend.php index cd09171..3bf4778 100644 --- a/application/api/model/Friend.php +++ b/application/api/model/Friend.php @@ -187,7 +187,7 @@ class Friend extends Model $text['text'] = '交友结束'; $text['step'] = 1;//1 等待邂逅 2 心动连线 3 牵手良缘 model('api/Chat')->sendMsg(1039,$room_id,$text); - return ['code' => 1, 'msg' => '创建关系成功', 'data' => ['id' => $id,'end_time' =>get_system_config_value('friend_room_timea')]]; + return ['code' => 1, 'msg' => '创建关系成功', 'data' => ['id' => $room_id['data'],'end_time' =>get_system_config_value('friend_room_timea')]]; } else { return ['code' => 0, 'msg' => '创建关系失败!', 'data' => null]; } @@ -225,14 +225,456 @@ 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) + public function room_give_gift($uid, $to_uid, $gift_id, $gift_num, $from_type, $type, $room_id, $pit_number, $heart_id) { - $res = model('GiveGift')->give_gift($uid, $to_uid, $gift_id, $gift_num,$from_type,$type, $room_id,$pit_number); + $res = model('GiveGift')->give_gift($uid, $to_uid, $gift_id, $gift_num, $from_type, $type, $room_id, $pit_number); if($res['code'] != 1){ return $res; } //送礼成功后续操作 - // + //查看当前时间是否在交友表的创建时间和结束时间段内 用来区分是否要拉取心动值高的用户上麦 + $friend = db::name('vs_user_friending')->where(['room_id' => $room_id])->find(); + if(time() >= $friend['create_time'] && time() <= $friend['end_time']){ + $heart_exp = get_system_config_value('coin_charm_exp');//金币与魅力值转换比 + $sumPrice = $res['data']['gift_total'] * $heart_exp; + $user_idd = $to_uid; + + if($heart_id){//有这个值就是助力 不参加抢麦操作 + db::name('user_friending_heart')->where(['id' => $heart_id])->setInc('heart_value', $sumPrice); + $this->pullHeartChange($room_id,$friend['id']);//聊天室心动值变化通知 + //生成新排名 判断抱上麦 还是换麦 + $this->pullUserPit($room_id,$friend['id']); + }else{ + //判断送礼人或收礼人里面有主持和嘉宾 + $host = $this->is_host($uid,$to_uid,$room_id); + + //判断是否是主持 + if($host['is_preside'] == 1){ + if(!in_array($uid,$host['is_preside_user'])){//主持不是当前送礼人,那就是在收礼人中 + //从数组中剔除主持人 && $is_preside_user!= UID + $user_idd = explode(",", $user_idd); // 将字符串转换为数组 + $user_idd = array_diff($user_idd, $host['is_preside_user']); // 从数组中移除 + if($user_idd){ + //插入/更新心动表 + $this->addUserHeart($to_uid,$friend['id'],$sumPrice,$room_id); + //送礼产生心动值并计算 判断拉取用户上麦还是换麦 + //生成新排名 判断抱上麦 还是换麦 + $this->pullUserPit($room_id,$friend['id']); + } + } + }else{ + //插入/更新心动表 + $this->addUserHeart($user_idd,$friend['id'],$sumPrice,$room_id); + //送礼产生心动值并计算 判断拉取用户上麦还是换麦 + //生成新排名 判断抱上麦 还是换麦 + $this->pullUserPit($room_id,$friend['id']); + } + } + } + return ['code' => 1, 'msg' => '送礼成功', 'data' => null]; + } + + //是否主持 + public function is_host($uid,$to_uid,$room_id){ + //获取当前主持人和嘉宾 + $host[] = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number' => 9])->value('user_id'); + $host[] = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number' => 10])->value('user_id'); + + $is_preside_user = null; + $is_preside = 0; + $user_ids = explode(",", $to_uid); + foreach ($user_ids as $value) { + //判断收礼人是否是主持 + if (in_array($value, $host)) { + $is_preside = 1; + $is_preside_user[] = $value; + } + } + //送礼人是主持或嘉宾 + if (in_array($uid, $host)) { + $is_preside = 1; + $is_preside_user[] = $uid; + } + return [$is_preside,$is_preside_user]; + } + + function pullHeartChange($room_id,$friend_id){ + //聊天室心动值变化通知 + $newRanking = $this->getRanking($room_id,$friend_id); + //心动值和心动表id + if(!isset($newRanking[0]['heart_value']) || $newRanking[0]['heart_value'] <= 0){ + $heart1 = -1; + $heartId1 = -1; + }else{ + $heart1 = $newRanking[0]['heart_value']; + $heartId1 = $newRanking[0]['id']; + } + if(!isset($newRanking[1]['heart_value']) || $newRanking[1]['heart_value'] <= 0){ + $heart2 = -1; + $heartId2 = -1; + }else{ + $heart2 = $newRanking[1]['heart_value']; + $heartId2 = $newRanking[1]['id']; + } + if(!isset($newRanking[2]['heart_value']) || $newRanking[2]['heart_value'] <= 0){ + $heart3 = -1; + $heartId3 = -1; + }else{ + $heart3 = $newRanking[2]['heart_value']; + $heartId3 = $newRanking[2]['id']; + } + $heart[0] = [ + "heartNum" => $heart1, + "heartId" => $heartId1, + ]; + $heart[1] = [ + "heartNum" => $heart2, + "heartId" => $heartId2, + ]; + $heart[2] = [ + "heartNum" => $heart3, + "heartId" => $heartId3, + ]; + +// $push = new Push(0, $this->room_id); //实例化推送类 +// $push->heartChatRoom($heart); + //推送给前端消息 + $text['text'] = '心动值变化通知'; + $text['list'] = $heart; + model('api/Chat')->sendMsg(5061,$room_id,$text); + } + + // 获取心跳值排行 + public function getRanking($room_id,$friend_id) { + // 获取有心动值的用户对且不重复 + $originalPairs = db::name('user_friending_heart') + ->where(array('room_id'=>$room_id,'friend_id'=>$friend_id)) + ->order('heart_value DESC')->select(); + // 初始化排名数组和已使用用户数组 + $ranking = []; + $usedUsers = []; + // 优先选择高价值且无重复用户的对 + $heart_ids = []; + foreach ($originalPairs as $rel) { + // 检查当前用户对是否包含已使用的用户ID + if (!in_array($rel['user1_id'], $usedUsers) && + !in_array($rel['user2_id'], $usedUsers)) { + // 将符合条件的用户对添加到排名列表中 + $ranking[] = [ +// 'left' => $rel['user1_id'], +// 'right' => $rel['user2_id'], + 'heart_value' => $rel['heart_value'], + 'id' => $rel['id'], + 'user1_id' => $rel['user1_id'], + 'user2_id' => $rel['user2_id'], + ]; + // 更新已使用用户列表 + $usedUsers = array_merge($usedUsers, [$rel['user1_id'], $rel['user2_id']]); + $heart_ids[] = $rel['id']; + // 如果排名列表达到3对用户,则停止循环 + if (count($ranking) >= 3) break; + } + } + $ranking1 = []; + $ranking2 = []; + if(count($ranking)<3){ + $make_up_num = 3 - count($ranking); + $ranking_make_up = db::name('user_friending_heart') + ->where(['room_id'=>$room_id,'friend_id'=>$friend_id ,'id'=> ['notin',$heart_ids]]) + ->limit($make_up_num) + ->order('heart_value DESC')->select(); + foreach ($ranking_make_up as $rel1) { + $heart_ids[] = $rel1['id']; + if(in_array($rel1['user1_id'], $usedUsers) && in_array($rel1['user2_id'], $usedUsers)){ + continue; + } + if(in_array($rel1['user1_id'], $usedUsers)){ + $ranking1[] = [ +// 'left' => $rel1['user1_id'], +// 'right' => $rel1['user2_id'], + 'heart_value' => 0, + 'id' => $rel1['id'], + 'user1_id' => -1, + 'user2_id' => $rel1['user2_id'], + ]; + $usedUsers[] = $rel1['user2_id']; + } + if(in_array($rel1['user2_id'], $usedUsers)){ + $ranking1[] = [ +// 'left' => $rel1['user1_id'], +// 'right' => $rel1['user2_id'], + 'heart_value' => 0, + 'id' => $rel1['id'], + 'user1_id' => $rel1['user1_id'], + 'user2_id' => -1, + ]; + $usedUsers[] = $rel1['user1_id']; + } + } + } + // 返回最终的排名列表 + $ranking_rut = array_merge($ranking, $ranking1); + if(count($ranking_rut)<6){ + $make_up_num = 6 - count($ranking_rut); + $ranking_make_up = db::name('user_friending_heart') + ->where(array('room_id'=>$room_id,'friend_id'=>$friend_id ,'id'=>array('notin',$heart_ids))) + ->limit($make_up_num) + ->order('heart_value DESC')->select(); + foreach ($ranking_make_up as $rel1) { + $heart_ids[] = $rel1['id']; + if(in_array($rel1['user1_id'], $usedUsers) && in_array($rel1['user2_id'], $usedUsers)){ + continue; + } + if(in_array($rel1['user1_id'], $usedUsers)){ + $ranking2[] = [ +// 'left' => $rel1['user1_id'], +// 'right' => $rel1['user2_id'], + 'heart_value' => 0, + 'id' => $rel1['id'], + 'user1_id' => -1, + 'user2_id' => $rel1['user2_id'], + ]; + $usedUsers[] = $rel1['user2_id']; + } + if(in_array($rel1['user2_id'], $usedUsers)){ + $ranking2[] = [ +// 'left' => $rel1['user1_id'], +// 'right' => $rel1['user2_id'], + 'heart_value' => 0, + 'id' => $rel1['id'], + 'user1_id' => $rel1['user1_id'], + 'user2_id' => -1, + ]; + $usedUsers[] = $rel1['user1_id']; + } + } + } + return array_merge($ranking_rut, $ranking2); + } + + + //抱上麦 还是换麦 + public function pullUserPit($room_id,$friend_id){ + $friendPlayPit = $this->friendPlayPit($room_id,$friend_id); // 获取实际应该对应的麦位 + $this->changePitToPosPair($room_id,$friendPlayPit);//换麦,上下麦 + $this->pullHeartChange($room_id,$friend_id);//聊天室心动值变化通知 + } + + //交友处理麦位排名 + public function friendPlayPit($room_id,$friend_id){ + //查询当前交友心动值表 + $heart_data = $this->getRanking($room_id,$friend_id); + $pit = []; + $pit_number_array = [2=>5,1=>6,3=>4,5=>2,6=>1,4=>3]; //麦位对应关系 + $pit_number_array_reverse = [0=>2,1=>1,2=>3]; + if($heart_data){ + //排麦位 + $pit_unique = []; + foreach($heart_data as $key => $value) { + //这条数据有一个用户已经排过了,就剔除这条数据 + if(count($pit) >= 6){ + break; + } + if($value['user1_id'] == -1){ + $user_sex = db::name('user')->where('id',$value['user2_id'])->value('sex'); + if($user_sex == 2){ + if(!in_array($value['user2_id'],$pit_unique)){ + $pit[$pit_number_array_reverse[$key]] = $value['user2_id']; + } + }else{ + if(!in_array($value['user2_id'],$pit_unique)){ + $pit[$pit_number_array[$pit_number_array_reverse[$key]]] = $value['user2_id']; + } + } + + } + if($value['user2_id'] == -1){ + $user_sex = db::name('user')->where('id',$value['user1_id'])->value('sex'); + if($user_sex == 2){ + if(!in_array($value['user1_id'],$pit_unique)){ + $pit[$pit_number_array_reverse[$key]] = $value['user1_id']; + } + }else{ + if(!in_array($value['user1_id'],$pit_unique)){ + $pit[$pit_number_array[$pit_number_array_reverse[$key]]] = $value['user1_id']; + } + } + + } + if($value['user1_id']!=-1 && $value['user2_id']!=-1){ + //判断用户1性别 + $user1_sex = db::name('user')->where('id',$value['user1_id'])->value('sex'); + if($user1_sex == 2){ + if(!in_array($value['user1_id'],$pit_unique)){ + $pit[$pit_number_array_reverse[$key]] = $value['user1_id']; + } + if(!in_array($value['user2_id'],$pit_unique)){ + $pit[$pit_number_array[$pit_number_array_reverse[$key]]] = $value['user2_id']; + } + }else{ + if(!in_array($value['user1_id'],$pit_unique)){ + $pit[$pit_number_array_reverse[$key]] = $value['user2_id']; + } + if(!in_array($value['user2_id'],$pit_unique)){ + $pit[$pit_number_array[$pit_number_array_reverse[$key]]] = $value['user1_id']; + } + } + } + + //用户去重 + $pit_unique[] = $value['user1_id']; + $pit_unique[] = $value['user2_id']; + } + } + return array_flip($pit); + } + + //换麦 + public function changePitToPosPair($room_id,$friendPlayPit){ +// $push = new Push(0, $this->room_id); + //获取实际麦位上的用 + $newPitUser = array_keys($friendPlayPit); + //获取当前麦位上的用户 + $oldPitUser = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number'=>['<',7]])->column('user_id'); + //获取交集 + $intersection = array_intersect($newPitUser,$oldPitUser); + //取差集 + $diff = array_diff($newPitUser,$oldPitUser); + $changeData = []; + if($diff){ + //推下麦 + foreach($diff as $key => $value){ + if(in_array($value,$oldPitUser)){ + //查询当前空麦位 + $pit_null = model('api/RoomPit')->getRoomNullPitWithout($room_id, [7,8,9,10]); + if($pit_null){ +// $this->room_pit_model->getOnPit($this->room_id, $value, $pit_null); + db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $pit_null])->update(['user_id' => $value]); + }else{ + //下麦 + $UserRoomPit = db::name('vs_room_pit')->where(['room_id' => $room_id, 'user_id' => $value])->value('pit_number'); + model('api/RoomPit')->DownPit($value, $room_id, $UserRoomPit); + } + } + + if(in_array($value,$newPitUser)){ + //推上麦 + //获取目标麦位是否有人 + $getRoomPitUser= db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $friendPlayPit[$value]])->value('user_id'); + if($getRoomPitUser){ + //查询当前空麦位 + $getRoomNullPitss = model('api/RoomPit')->getRoomNullPitWithout($room_id, [7,8,9,10,$friendPlayPit[$value]]); + if($getRoomNullPitss){ +// $this->room_pit_model->getOnPit($this->room_id, $getRoomPitUser, $getRoomNullPitss); + db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $getRoomNullPitss])->update(['user_id' => $getRoomPitUser]); + }else{ + model('api/RoomPit')->DownPit($getRoomPitUser, $room_id, $friendPlayPit[$value]); + } + } + model('api/RoomPit')->OnPit($value, $room_id, $friendPlayPit[$value]); + } + } + } + if($intersection){//交换麦位 + //查询麦上的用户 + $newPitUserStr = implode(',',$newPitUser); + $getRoomPit = db::name('vs_room_pit')->where("room_id=".$room_id." AND user_id in (".$newPitUserStr.")")->column('pit_number'); + db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => ['in', $getRoomPit]])->update(['user_id' => 0]); + $changePitUser = []; + foreach ($friendPlayPit as $key => $value){ + if(empty($value)){ + $value = model('api/RoomPit')->getRoomNullPitWithout($room_id, [7,8,9,10]); + } + //获取目标麦位是否有人 + $isPitHaveUser= db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $value])->value('user_id'); + if($isPitHaveUser && !in_array($isPitHaveUser,$newPitUser)){ + $changePitUser[$key]['user_id'] = $isPitHaveUser; + $changePitUser[$key]['pit_number'] = $value; + } + db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $value])->update(['user_id' => $key]); + } + //处理原麦位上的用户 + foreach ($changePitUser as $key_change => $value_change){ + //判断是否在左边 1,,2,,3 麦位上 + if(in_array($value_change['pit_number'],[1,2,3])){ + $null_pit = model('api/RoomPit')->getRoomNullPitWithout($room_id, [4,5,6,7,8,9,10]); + if(empty($null_pit)){ + $null_pit = model('api/RoomPit')->getRoomNullPitWithout($room_id, [7,8,9,10]); + } + }else{ + $null_pit = model('api/RoomPit')->getRoomNullPitWithout($room_id, [1,2,3,7,8,9,10]); + if(empty($null_pit)){ + $null_pit = model('api/RoomPit')->getRoomNullPitWithout($room_id, [7,8,9,10]); + } + } + db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $null_pit])->update(['user_id' => $value_change['user_id']]); + } + $getRoomNullPit = $this->room_pit_model->where(['room_id'=>$room_id,'pit_number'=>['notin',[7,9]]])->select(); + $getRoomNullPit = db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => ['<',7]])->select(); + $data_users = []; + foreach($getRoomNullPit as $key_data => $value_data){ + $data_users[$key_data]['user_id'] = $value_data['user_id']; + $data_users[$key_data]['nickname'] = db::name('user')->where('id',$value_data['user_id'])->value('nickname'); + $data_users[$key_data]['avatar'] = db::name('user')->where('id',$value_data['user_id'])->value('avatar'); + $data_users[$key_data]['sex'] = db::name('user')->where('id',$value_data['user_id'])->value('sex'); + //获取用户在此房间今天的魅力值 + $charm =[]; + if($value_data['user_id']){ + $charm = db::name('vs_room_user_charm')->where(['user_id' => $value_data['user_id'],'room_id' => $room_id])->value('charm'); + } + $data_users[$key_data]['dress_picture'] = model('Decorate')->user_decorate_detail($value_data['user_id'],1); + $data_users[$key_data]['xin_dong'] = $charm??0; + $data_users[$key_data]['pit_number'] = $value_data['pit_number']; + } + //推送给前端消息 + $text['text'] = '房间换麦位'; + $text['list'] = $data_users; + model('api/Chat')->sendMsg(5062,$room_id,$text); + } + + } + + + //交友厅游戏开始后送礼后一系列操作 + //插入/更新心动表 + public function addUserHeart($user_id,$friend_id,$value,$room_id){ + //给多个用户送礼 + $user_ids = explode(",", $user_id); + $heart_value = $value;//心动值 + for ($i = 0; $i < count($user_ids); $i++) { + // 处理用户ID顺序 + $user1 = min(UID, $user_ids[$i]); + $user2 = max(UID, $user_ids[$i]); + // 更新心动关系表 + $relation = db::name('user_friending_heart')->where([ + 'user1_id' => $user1, + 'user2_id' => $user2, + 'friend_id' => $friend_id + ])->find(); + + if ($relation) { + db::name('user_friending_heart')->where([ + 'room_id' => $room_id, + 'user1_id' => $user1, + 'user2_id' => $user2, + 'friend_id' => $friend_id + ])->setInc('heart_value', $heart_value); + } else { + $relation['id'] = db::name('user_friending_heart')->insert([ + 'room_id' => $room_id, + 'user1_id' => $user1, + 'user2_id' => $user2, + 'friend_id' => $friend_id, + 'heart_value' => $heart_value + ]); + } + } + //修改用户行动连线状态 + $relation = db::name('user_friending_heart')->where("(user1_id=".UID." OR user2_id=".UID.") AND friend_id=$friend_id AND room_id=$room_id AND status!=3")->order('heart_value desc')->find(); + if($relation){ + db::name('user_friending_heart')->where("(user1_id=".UID." OR user2_id=".UID.") AND friend_id=$friend_id AND room_id=$room_id AND status!=3")->update(['status'=>2]); + db::name('user_friending_heart')->where(['id'=>$relation['id']])->update(['status'=>1]); + } } } \ No newline at end of file diff --git a/application/api/model/GiveGift.php b/application/api/model/GiveGift.php index 97db2f3..eb4d968 100644 --- a/application/api/model/GiveGift.php +++ b/application/api/model/GiveGift.php @@ -431,6 +431,14 @@ class GiveGift extends Model ]; //聊天室推送系统消息 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_screen'] == 1){ //推送礼物横幅 @@ -508,7 +516,7 @@ class GiveGift extends Model Db::name('vs_room')->where(['id'=>$from_id,'apply_status'=>2])->setInc('today_hot_value',$gift_totalaa); Db::commit(); - return ['code' => 1, 'msg' => '送礼成功', 'data' => null]; + return ['code' => 1, 'msg' => '送礼成功', 'data' => ['gift_total' => $gift_total]]; } //送礼特效