server_id)->first(); $user = User::where('id',$request->user_id)->first(); if(!$user) return $this->fail('该用户不存在'); $content = $request->input('content', ''); //我的聯係人 $my_linkman = MessageLinkman::where('user_id', $mine->id)->where('other_user_id', $user->id)->first(); $other_linkman = MessageLinkman::where('user_id', $user->id)->where('other_user_id', $mine->id)->first(); if (empty($other_linkman)) { $other_linkman = MessageLinkman::create([ 'user_id'=>$user->id, 'other_user_id'=>$mine->id, ]); }else{ $other_linkman->updated_at = date('Y-m-d H:i:s'); $other_linkman->save(); } if (empty($my_linkman)) { $my_linkman = MessageLinkman::create([ 'user_id'=>$mine->id, 'other_user_id'=>$user->id, ]); }else{ $my_linkman->updated_at = date('Y-m-d H:i:s'); $my_linkman->save(); } $content_type = $request->input('content_type', 'text'); //创建聊天记录 ChatMessage::create([ 'user_id'=>$mine->id, 'other_user_id'=>$user->id, 'content'=>$content, 'content_type'=>$content_type, 'system_type'=>$request->system_type??'', ]); return $this->success('消息发送成功'); } catch (\Exception $e) { $this->getError($e); return $this->failure('发送聊天信息失败,请稍后再试'); } } //消息列表 public function linkmen(Request $request) { $user_id = $request->server_id; if(!$user_id) return $this->failure('请提供用户信息!'); $types = $request->input('type') ? [$request->input('type')] : ['single', 'loveing', 'marriage']; $linkmen = MessageLinkman::with('otherUser:id,nickname,photo,app_avatar,circle_avatar')->whereHas('otherUser', function ($sql) use ($types) { $sql->where('id', '>', 0) // ->where('hidden_profile', '<>', 'ALLSEX') ->whereIn('type', $types); })/*->where('other_user_id', '<>', 1)*/->select('id', 'user_id', 'other_user_id')->where('user_id', $user_id); $linkmen = $linkmen->orderBy('updated_at', 'desc')->paginate(); foreach ($linkmen as $linkman) { //新消息数 $new_count = $this->newChatMessageCount($linkman->user_id, $linkman->other_user_id); $linkman->new_count = $new_count; $linkman->type = auth()->user()->type; $other_user_id = $linkman->other_user_id; $user_id = $linkman->user_id; // \Log::info('other_user_id'. $other_user_id); // \Log::info('user_id'. $user_id); $last_message = ChatMessage::whereIn('user_id', [$user_id, $other_user_id]) ->whereIn('other_user_id', [$user_id, $other_user_id])->select('user_id', 'other_user_id', 'content', 'content_type', 'created_at')->orderBy('id', 'desc')->first(); if ($last_message) { $last_time = $this->getLastTime(strtotime($last_message->created_at->toDateTimeString())); $last_time = (explode(' ', $last_time))[0]; $last_message->last_time = $last_time; if ($last_message->user_id != $user_id) { switch ($last_message->content_type) { case 'source': $content = "[你收到一条语音消息,请在福恋APP上查看]"; break; case 'video': $content = "[你收到一个视频,请在福恋APP上查看]"; break; case 'image': $content = "[你收到一张图片,请在福恋APP上查看]"; break; default: $content = $last_message->content; } } else { switch ($last_message->content_type) { case 'source': $content = "[你发送一条语音消息,请在福恋APP上查看]"; break; case 'video': $content = "[你发送一个视频,请在福恋APP上查看]"; break; case 'image': $content = "[你发送一张图片,请在福恋APP上查看]"; break; default: $content = $last_message->content; } } $last_message->content = $content; } $linkman->last_message = $last_message; $linkman->otherUser->circle_avatar = $linkman->otherUser->userAvatar(); } return $this->success('ok',$linkmen); } //获取网易云token public function getImToken(Request $request) { $user_id = $request->user_id; $user = User::where('id',$user_id)->first(); //判断是否已创建accid; if(!$user) return $this->failure('获取用户信息失败'); $wyy_user = $user->IMUser; $im_service = new IMService(env('IM_APP_KEY'), env("IM_APP_SECRET")); if (empty($wyy_user)) { $wyy_user = $user->createIMUser(); } elseif (empty($wyy_user->token)) { //更新网易云token $result = $im_service->updateUserToken($user->id); if ($result['code'] == 200) { $user->IMUser()->update(['token' => $result['info']['token']]); $wyy_user->token = $result['info']['token']; } } $birthday = $user->profileCourtship ? $user->profileCourtship->birthday : null; $avatar = $this->getUserValidPhoto($user); $result = $im_service->updateUinfo($user->id, $user->nickname, $avatar, $sign = '', $user->email, $birthday, $user->mobile, $user->sex); return $this->success('ok',$wyy_user); } /**获取好友的列表 */ public function myFriendsChat(Request $request){ $user_id = $request->server_id; $keyword = $request->keyword; $ids = MessageLinkman::where('user_id', $user_id)->pluck('other_user_id'); $other_ids = MessageLinkman::where('other_user_id', $user_id)->pluck('user_id'); $users = User::select('id','nickname','name','mobile','photo','app_avatar','circle_avatar')->where(function ($sql) use ($ids, $other_ids) { $sql->whereIn('id', $ids)->orWhereIn('id', $other_ids); }); if ($keyword) { $keyword = trim($keyword); $users = $users->where(function ($sql) use ($keyword) { $sql->where('name', 'like', '%' . $keyword . '%') ->orWhere('nickname', 'like', '%' . $keyword . '%') ->orWhere('mobile', 'like', '%' . $keyword . '%'); }); } $users = $users->orderBy('id', 'desc')->paginate(); return $this->success('ok',$users); } /**获取用户的可以用的头像 */ public function getUserValidPhoto($user){ try{ if ($user->app_avatar) { $avatar = strstr($user->app_avatar,'?x-oss-process=style/scale1')?$user->app_avatar:$user->app_avatar.'?x-oss-process=style/scale1'; } elseif ($user->photo) { $avatar = strstr($user->photo,'?x-oss-process=style/scale1')?$user->photo:$user->photo.'?x-oss-process=style/scale1'; } elseif ($user->circle_avatar) { $avatar = $user->circle_avatar; } elseif (empty($user->photo) && empty($user->app_avatar)) { if ($user->sex == 1) { $avatar = 'http://images.ufutx.com/201811/12/0e8b72aae6fa640d9e73ed312edeebf3.png'; }elseif ($user->sex == 2) { $avatar = 'http://images.ufutx.com/201811/12/dddd79aa2c2fc6a6f35e641f6b8fb8f5.png'; }else{ $avatar = 'https://images.ufutx.com/202007/01/e0de60525143427d4dd19515a5b387ba.png'; } } return $avatar; } catch (\Exception $e) { \CommonUtilsService::HandleLogsAdd(3,'获取最适合的头像失败',[],'getUserValidPhoto'); return 'https://images.ufutx.com/202007/01/e0de60525143427d4dd19515a5b387ba.png';; } return 'https://images.ufutx.com/202007/01/e0de60525143427d4dd19515a5b387ba.png';; } /** * 未查看某人的聊天数 * @return [type] [description] */ public function newChatMessageCount($user_id, $other_user_id) { $new_count = ChatMessage::where('status', 0)->where('other_user_id', $user_id)->where('user_id', $other_user_id)->count(); return $new_count ? $new_count : 0; } /** * 获取已经过了多久 * PHP时间转换 * 刚刚、几分钟前、几小时前 * 今天昨天前天几天前 * @param string $targetTime 时间戳 * @return string */ public function getLastTime($targetTime) { // 今天最大时间 $todayLast = strtotime(date('Y-m-d 23:59:59')); $agoTimeTrue = time() - $targetTime; $agoTime = $todayLast - $targetTime; $agoDay = floor($agoTime / 86400); // dd($targetTime); if ($agoTimeTrue < 60) { $result = '刚刚'; } elseif ($agoTimeTrue < 3600) { $result = (ceil($agoTimeTrue / 60)) . '分钟前'; } elseif ($agoTimeTrue < 3600 * 12) { $result = (ceil($agoTimeTrue / 3600)) . '小时前'; } elseif ($agoDay == 0) { $result = '今天 ' . date('H:i', $targetTime); } elseif ($agoDay == 1) { $result = '昨天 ' . date('H:i', $targetTime); } elseif ($agoDay == 2) { $result = '前天 ' . date('H:i', $targetTime); } elseif ($agoDay > 2 && $agoDay < 16) { $result = $agoDay . '天前 ' . date('H:i', $targetTime); } else { $format = date('Y') != date('Y', $targetTime) ? "Y-m-d H:i" : "m-d H:i"; $result = date($format, $targetTime); } return $result; } }