commonUtils = new CommonUtilsService(); } /** * 小程序会话数据 */ public function session() { $user = auth()->user(); $user_id = request()->input('user_id'); if (!$user_id) { $user_id = $user->id; } \DB::enableQueryLog(); // 启用查询日志 $group_chat = (new Team()) ->setTable('t') ->from('teams as t') ->join("user_team as ut", "t.id", "=", "ut.team_id") ->leftJoin("msg_histories as last_msg", function ($join) { $join->on('t.id', '=', 'last_msg.team_id') ->whereRaw('ufutx_last_msg.id IN (select MAX(last_msg2.id) from ufutx_msg_histories as last_msg2 group by last_msg2.team_id)'); }) ->select('ut.id', 'ut.user_id', 'ut.team_id as join_to_id') ->selectRaw("'group_chat' as chat_type") ->selectRaw("ufutx_last_msg.id as last_id") ->selectRaw("UNIX_TIMESTAMP(if(ufutx_last_msg.created_at,ufutx_last_msg.created_at,ufutx_t.created_at)) as last_time") ->selectRaw('ufutx_ut.is_top') ->where('ut.user_id', $user_id); $u1 = DB::table('chat_messages')->where('user_id', '<>', $user_id)->where('other_user_id', $user_id) ->select('id', 'user_id as receiver', 'content', 'created_at'); $u2 = DB::table('chat_messages')->where('user_id', '=', $user_id)->where('other_user_id', '<>', $user_id) ->select('id', 'other_user_id as receiver', 'content', 'created_at'); $query = $u1->union($u2)->orderBy('id', 'desc'); $sql = $query->toSql(); $linkmen = DB::table(DB::raw("($sql) as ufutx_m")) ->mergeBindings($query) ->join('message_linkmen as l', 'm.receiver', 'l.other_user_id') ->join('users as u', 'l.other_user_id', 'u.id') ->whereNull('l.deleted_at') ->where('l.user_id', $user_id) ->select('l.id', 'l.user_id', 'm.receiver as join_to_id') ->selectRaw("'linkmen' as chat_type") ->selectRaw("ufutx_m.id as last_id") ->selectRaw("UNIX_TIMESTAMP(ufutx_m.created_at) as last_time") ->selectRaw("'0' as is_top") ->groupBy(['join_to_id']) ->orderBy('last_time', 'desc'); $union_all_query = $linkmen->unionAll($group_chat); $data = DB::table(DB::raw("({$union_all_query->toSql()}) as sub")) ->mergeBindings($union_all_query) ->orderBy('is_top', 'desc') ->orderBy('last_time', 'desc') ->paginate(); $queries = \DB::getQueryLog(); // 获取查询日志 // \Log::info("查看sql语句"); // \Log::info($queries); foreach ($data as &$item) { switch ($item->chat_type) { case 'linkmen': $item = $this->handleLinkmen($item, $user); break; case 'group_chat': $item = $this->handleGroupChat($item, $user); break; } } return $data; } private function handleLinkmen($item, $user) { $item->other_user_id = $item->join_to_id; $item->new_count = ChatMessage::where('status', 0)->where('other_user_id', $user->id) ->where('user_id', $item->other_user_id)->count() ?: 0; $item->type = $user->type; $item->other_user = User::selectRaw('id,nickname,photo,app_avatar,circle_avatar,type,hidden_profile,sex,is_photo_audited')->find($item->other_user_id); $item->last_message = ChatMessage::select('user_id', 'other_user_id', 'content', 'content_type', 'created_at', 'is_recall')->find($item->last_id); if (!$item->last_message) { return $item; } if ($item->last_message) { $last_time = $this->commonUtils->getLastTime(strtotime($item->last_message->created_at->toDateTimeString())); $last_time = (explode(' ', $last_time))[0]; $item->last_message->last_time = $last_time; switch ($item->last_message->content_type) { case 'AUDIO': $content = "[语音]"; break; case 'VIDEO': $content = "[视频]"; break; case 'PICTURE': $content = "[图片]"; break; default: $content = $item->last_message->content; } if ($item->last_message->is_recall) { $text = $item->last_message->user_id == $user->id ? '我' : '对方'; $content = "[{$text}撤回了一条消息]"; } $item->last_message->content = $content; } return $item; } private function handleGroupChat($item, $user) { $item->team_id = $item->join_to_id; $item->team = Team::select('id', 'tid', 'tname', 'icon')->find($item->team_id); $item->last_message = MsgHistory::with('otherUser:id,nickname,photo,app_avatar,circle_avatar,type,hidden_profile') ->whereHas('otherUser') ->select('user_id', 'team_id', 'body', 'created_at', 'type', 'is_recall') ->find($item->last_id) ?: null; if (!$item->last_message) { return $item; } //群昵称 $group_chat_nick = UserTeam::where('user_id', $item->last_message->otherUser->id)->where('team_id', $item->team_id)->value('nick'); if (!empty($group_chat_nick)) { $item->last_message->otherUser->nickname = $group_chat_nick; } $last_time = $this->commonUtils->getLastTime(strtotime($item->last_message->created_at->toDateTimeString())); $last_time = (explode(' ', $last_time))[0]; $item->last_message->last_time = $last_time; $body = json_decode(json_encode($item->last_message->body), true); switch ($item->last_message->type) { case 1: $body['msg'] = '[图片]'; break; case 2: $body['msg'] = '[语音]'; break; case 3: $body['msg'] = '[视频]'; break; } if ($item->last_message->is_recall) { $body['msg'] = '[撤回了一条消息]'; } $item->last_message->body = json_encode($body); return $item; } }