Files
p_ysk/app/chat/model/ChatMessage.php
2025-12-03 14:29:55 +08:00

120 lines
4.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace app\chat\model;
use ba\Random;
use support\Redis;
use support\think\Db;
class ChatMessage extends BaseModel
{
public $tabla_name = 'chat_message';
public static function getconverlist($uid, $user_type)
{
// 获取所有会话ID 自己发送过消息的或者别人发送过消息的
$sessionIds = Db::name('chat_message')->where('from_id', $uid)->WhereOr('to_id', $uid)
->group('session_id')->field('session_id,to_id as group_id,chat_type')->select()->toArray();
// 查看自己加了那些群
$group_arr = Db::name('chat_group_member')->where(['user_id' => $uid])->field('group_id')->select()->toArray();
$data = [];
if($sessionIds) {
foreach ($sessionIds as $k => $session_id) {
foreach ($group_arr as $gk => &$group) {
$group['session_id'] = '';
$group['chat_type'] = 2;
if($session_id['chat_type'] == 2) {
if ($group['group_id'] == $session_id['group_id']) {
unset($group_arr[$gk]);
}
}
}
}
$sessionIds = array_merge($sessionIds, $group_arr);
$group_id = '';
$i = 0;
foreach ($sessionIds as $k => $session) {
if($session['session_id']) {
// 未读计数
$unreadCount = Db::name('chat_unread_count')->where(['user_id' => $uid, 'session_id' => $session['session_id']])->value('count')?:0;
}else {
$unreadCount = 0;
}
$data[$i]['unread_count'] = $unreadCount;
if($session['session_id']) {
// 最后一条消息
$lastMsg = Db::name('chat_message')
->where('session_id', $session['session_id'])
->order('send_time', 'desc')
->find();
}else {
$lastMsg = '';
}
if($session['chat_type'] == 1) {
$chat_user = Db::name('chat_user')->where(['user_id' => $session['group_id']])->field('nick_name,avatar')->find();
$avatar = $chat_user['avatar'];
$name = $chat_user['nick_name'];
$group_id = '';
$data[$i]['user_id'] = $session['group_id'];
}elseif($session['chat_type'] == 2) {
$group_info = Db::name('chat_group')->where(['id' => $session['group_id']])->field('id,name,avatar')->find();
$avatar = $group_info['avatar'];
$group_id = $group_info['id'];
$name = $group_info['name'];
if($lastMsg) {
$chat_user = Db::name('chat_user')->where(['user_id' => $lastMsg['from_id']])->field('nick_name,avatar')->find();
}
$data[$i]['user_id'] = $group_id;
}
// 单聊的话 两个人对话用一样的会话ID
$msg = '';
if($lastMsg) {
// 如果是自己发的不显示发送人
if($lastMsg['from_id'] == $uid) {
$msg = $lastMsg['content'];
}else {
// 如果是别人发的显示昵称
$msg = $chat_user['nick_name'] . '' . $lastMsg['content'];
}
$data[$i]['send_time'] = formatWeChatTime($lastMsg['send_time']);
}
$data[$i]['avatar'] = $avatar;
$data[$i]['chat_type'] = $session['chat_type'];
$data[$i]['session_id'] = $session['session_id'];
$data[$i]['name'] = $name;
$data[$i]['msg'] = $msg;
$data[$i]['group_id'] = $group_id;
$i ++;
}
Redis::setEx('usermsg:list:' . $user_type . ':' . $uid, 30 * 86400, json_encode($data));
}
return $data;
}
// 更新会话列表
public static function updateConverList($uid, $user_type, $session_id)
{
$is_update = false;
$list_json = Redis::get('usermsg:list:' . $user_type . ':' . $uid);
if($list_json) {
$list_arr = json_decode($list_json, true);
foreach ($list_arr as $k => $list) {
if($list['session_id'] == $session_id) {
$is_update = true;
}
}
}
if($is_update) {
self::getconverlist($uid, $user_type);
}
}
public static function getUserIsQuit($uid, $group_id)
{
// $auit = Db::name('')->where()->find();
}
}