From 57319e03ce7de1e244107224ea09920a9ceac330 Mon Sep 17 00:00:00 2001 From: ASUS <515617283@qq.com> Date: Fri, 21 Nov 2025 15:13:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=8A=E5=A4=A9=EF=BC=8C=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E5=AE=8C=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/chat/model/ChatGroupMember.php | 10 +- app/chat/model/ChatMessage.php | 2 + extend/chat/model/Base.php | 203 +++++++++++++++++++++++++---- extend/chat/model/OnbocChat.php | 2 +- extend/chat/model/ShoppingChat.php | 2 +- 5 files changed, 181 insertions(+), 38 deletions(-) diff --git a/app/chat/model/ChatGroupMember.php b/app/chat/model/ChatGroupMember.php index c026dbe..a680221 100644 --- a/app/chat/model/ChatGroupMember.php +++ b/app/chat/model/ChatGroupMember.php @@ -2,16 +2,10 @@ namespace app\chat\model; +use support\think\Db; + class ChatGroupMember extends BaseModel { public $tabla_name = 'chat_group_member'; - // 是否退群 - public static function getUserQuit($uid, $group_id) - { - - } - - - } \ No newline at end of file diff --git a/app/chat/model/ChatMessage.php b/app/chat/model/ChatMessage.php index ecd909b..577b477 100644 --- a/app/chat/model/ChatMessage.php +++ b/app/chat/model/ChatMessage.php @@ -49,6 +49,7 @@ class ChatMessage extends BaseModel $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']; @@ -57,6 +58,7 @@ class ChatMessage extends BaseModel 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 = ''; diff --git a/extend/chat/model/Base.php b/extend/chat/model/Base.php index 9bad873..4329f31 100644 --- a/extend/chat/model/Base.php +++ b/extend/chat/model/Base.php @@ -2,6 +2,7 @@ namespace extend\chat\model; use app\chat\model\ChatGroupMute; + use app\chat\model\ChatMessage; use app\exception\MyBusinessException; use ba\Random; use GatewayWorker\Lib\Gateway; @@ -70,25 +71,70 @@ namespace extend\chat\model; } - public static function init(string $client_id, array $message) + public static function insertChatUser() { - self::$user_info = self::getUser($message['token']); - // 先拿到会话列表 - $list_json = Redis::get('usermsg:list:' . self::$user_info['user_type'] . ':' . self::$user_info['uid']); - $list_arr = []; - // 绑定自己的UID - Gateway::bindUid($client_id, self::getUid(self::$user_info['uid'], self::$user_info['user_type'])); - if($list_json) { - $list_arr = json_decode($list_json, true); - // 挨个加入分组 - foreach ($list_arr as $k => $list) { - if($list['chat_type'] == 2) { - // 如果是群聊 按照会话ID加入分组 不能按照会话ID绑定 - Gateway::joinGroup($client_id, $list['group_id']); + // 存入chat_user + // 如果是用户 + if(self::$user_info['user_type'] == 1) { + $chat_user = Db::name('chat_user')->where(['user_id' => self::$user_info['uid'], 'type' => 1])->find(); + if(!$chat_user) { + $user_info = Db::name('tb_user_info')->where(['id' => self::$user_info['uid']])->find(); + if($user_info) { + Db::name('chat_user')->insert([ + 'user_id' => self::$user_info['uid'], + 'nick_name' => $user_info['nick_name'], + 'avatar' => $user_info['head_img'], + 'type' => 1, + 'created_time' => d(), + ]); + } + } + }elseif (self::$user_info['user_type'] == 2) { + // 如果是商家 + $chat_user = Db::name('chat_user')->where(['user_id' => self::$user_info['uid'], 'type' => 2])->find(); + if(!$chat_user) { + $sys_user_info = Db::name('sys_user')->where(['id' => self::$user_info['uid']])->find(); + if($sys_user_info) { + Db::name('chat_user')->insert([ + 'user_id' => self::$user_info['uid'], + 'nick_name' => $sys_user_info['nick_name'], + 'avatar' => $sys_user_info['avatar'], + 'type' => 2, + 'created_time' => d(), + ]); } } } - return $list_arr; + } + + + + + + + public static function init(string $client_id, array $message) + { + self::$user_info = self::getUser($message['token']); + // 存入chat_user + self::insertChatUser(); + $list_arr = []; + // 绑定自己的UID + Gateway::bindUid($client_id, self::getUid(self::$user_info['uid'], self::$user_info['user_type'])); + // 先拿到会话列表 + $list_json = Redis::get('usermsg:list:' . self::$user_info['user_type'] . ':' . self::$user_info['uid']); + if($list_json) { + $list_arr = json_decode($list_json, true); + } + + // 回馈 + Gateway::sendToClient($client_id, self::sendGormat($message, $list_arr)); + + $str_uid = self::getUid(self::$user_info['uid'], self::$user_info['user_type']); + // 上线后立马发送没有发送的消息 + $send_data = Redis::get('nosuccessful:message:sent:' . $str_uid); + if($send_data) { + Gateway::sendToClient($client_id, $send_data); + } } @@ -98,6 +144,19 @@ namespace extend\chat\model; $group_id = null; if($message['chat_type'] == 2) { $group_id = $message['to_id']; + // 查询此人是否再群里 + $is_member = Db::name('chat_group_member')->where(['group_id' => $group_id, 'user_id' => self::$user_info['uid']])->find(); + if(!$is_member) { + Gateway::sendToClient($client_id, json_encode(['msg' => '你不在群内无法发言'])); + return; + }else { + // 被踢或者退出 + if($is_member['quit_time'] || $is_member['is_kicked'] == 1) { + Gateway::sendToClient($client_id, json_encode(['msg' => '你不在群内无法发言'])); + return; + } + } + // 查询此人是否被禁言 $chat_group_mute = ChatGroupMute::getUserMuteStatus(self::$user_info['uid'], $group_id); if($chat_group_mute['is_mute'] == 1) { @@ -108,12 +167,6 @@ namespace extend\chat\model; Gateway::sendToClient($client_id, json_encode(['msg' => '你已被永久禁言'])); return; } - - // 是否退群 - - - - } $session_id = $message['session_id']; if(empty($session_id)) { @@ -131,6 +184,12 @@ namespace extend\chat\model; if($to_message_one && !$from_message_one) { $session_id = $to_message_one['session_id']; } + // 加入未读计数 + if(!Db::name('chat_unread_count')->where(['user_id' => $message['to_id']])->find()) { + Db::name('chat_unread_count')->where(['user_id' => $message['to_id'], 'session_id' => $session_id])->update(['count' => 1, 'updated_time' => d()]); + }else { + Db::name('chat_unread_count')->where(['user_id' => $message['to_id'], 'session_id' => $session_id])->inc('count')->update(['updated_time' => d()]); + } }elseif ($message['chat_type'] == 2) { // 群聊 // 如果发过群聊消息 @@ -142,11 +201,82 @@ namespace extend\chat\model; } } } + $time = d(); + // 通知数据 + $notice_data = [ + 'from_id' => self::$user_info['uid'], + 'to_id' => $message['to_id'], + 'operate_type' => $message['operate_type'], + 'group_id' => $group_id, + 'chat_type' => $message['chat_type'], + 'msg_type' => $message['msg_type'], + 'content' => $message['content'], + 'image_url' => $message['image_url'], + 'order_id' => $message['order_id'], + 'send_time' => $time, + 'session_id' => $session_id, + ]; + $res = Db::name('chat_message')->insert($notice_data); + if(!$res) { + // 插入失败 + Gateway::sendToClient($client_id, self::sendGormat($message, [], 0)); + return; + } + // 如果是单聊推给对方 + if($message['chat_type'] == 1) { + if($message['to_user_type'] == 1) { + $chat_user = Db::name('chat_user')->where(['user_id' => $message['to_id'], 'type' => 1])->find(); + }else { + $chat_user = Db::name('chat_user')->where(['user_id' => $message['to_id'], 'type' => 2])->find(); + } + // 通知数据中加入会话信息 + $notice_data['avatar'] = $chat_user['avatar']; + $notice_data['nick_name'] = $chat_user['nick_name']; + $str_uid = self::getUid($message['to_id'], $message['to_user_type']); + // 更新对方会话列表 + ChatMessage::getconverlist($message['to_id'], $message['to_user_type']); + // 对方是否在线,在线发 不在线存起来等上线了发 + if(Gateway::isUidOnline($str_uid)) { + Gateway::sendToUid($str_uid, self::sendReceive($notice_data)); + return; + }else { + // 不在线的存下来等上线了发 + Redis::set('nosuccessful:message:sent:' . $str_uid, json_encode($notice_data)); + } - Db::name()->insert(); - // 通知 + }elseif ($message['chat_type'] == 2) { + // 群聊 + $group = Db::name('chat_group')->where(['id' => $message['to_id']])->find(); + // 通知数据中加入会话信息 + $notice_data['avatar'] = $group['avatar']; + $notice_data['nick_name'] = $group['name']; + // 找到群组中的人,挨个通知,退群的不通知,自己不通知 + $group_user = Db::name('chat_group_member')->where(['group_id' => $group_id, 'quit_time' => null, 'is_kicked' => 0])->select()->toArray(); + foreach ($group_user as $k => $grep) { + if($grep['user_id'] != self::$user_info['uid']) { + $user_type = $grep['role']==1?2:1; + $str_uid = self::getUid($grep['user_id'], $user_type); + // 群成员是否在线,在线发 不在线存起来等上线了发 + if(Gateway::isUidOnline($str_uid)) { + Gateway::sendToUid($str_uid, self::sendReceive($notice_data)); + return; + }else { + // 不在线的存下来等上线了发 + Redis::set('nosuccessful:message:sent:' . $str_uid, json_encode($notice_data)); + } + // 加入未读计数 + if(!Db::name('chat_unread_count')->where(['user_id' => $grep['user_id']])->find()) { + Db::name('chat_unread_count')->where(['user_id' => $grep['user_id'], 'session_id' => $session_id])->update(['count' => 1, 'updated_time' => d()]); + }else { + Db::name('chat_unread_count')->where(['user_id' => $grep['user_id'], 'session_id' => $session_id])->inc('count')->update(['updated_time' => d()]); + } + } + } + } + // 给发送者反馈 + Gateway::sendToClient($client_id, self::sendGormat($message)); } @@ -156,12 +286,27 @@ namespace extend\chat\model; return $user_type . '_' . $uid; } - public static function sendGormat($message, $data, $status = 1):string - { + // 发送者反馈 + public static function sendGormat($message, $data = [], $status = 1):string + { + $data = [ + 'type' => $message['type'], + 'operate_type' => $message['operate_type'], + 'status' => $status, + 'data' => $data + ]; + $json = json_encode($data); + return $json; + } + + + // 接收消息 + public static function sendReceive($data = [], $status = 1):string + { $data = [ - 'type' => $message['type'], - 'operate_type' => $message['operate_type'], + 'type' => 'chat', + 'operate_type' => 'receive_msg', 'status' => $status, 'data' => $data ]; @@ -171,4 +316,6 @@ namespace extend\chat\model; -} \ No newline at end of file + + + } \ No newline at end of file diff --git a/extend/chat/model/OnbocChat.php b/extend/chat/model/OnbocChat.php index df494ff..6921ce5 100644 --- a/extend/chat/model/OnbocChat.php +++ b/extend/chat/model/OnbocChat.php @@ -18,7 +18,7 @@ class OnbocChat extends Base // 初始化 public static function init(string $client_id, array $message) { - Gateway::sendToClient($client_id, self::sendGormat($message, Base::init($client_id, $message))); + Base::init($client_id, $message); } public static function sendMsg(string $client_id, array $message) diff --git a/extend/chat/model/ShoppingChat.php b/extend/chat/model/ShoppingChat.php index 49ccd10..d475864 100644 --- a/extend/chat/model/ShoppingChat.php +++ b/extend/chat/model/ShoppingChat.php @@ -18,7 +18,7 @@ class ShoppingChat extends Base // 初始化 public static function init(string $client_id, array $message):void { - Gateway::sendToClient($client_id, self::sendGormat($message, Base::init($client_id, $message))); + Base::init($client_id, $message); } public static function sendMsg(string $client_id, array $message)