Files
jianfeng-server/app/im/controller/MessageHandlerV2.php
2025-10-02 10:33:06 +08:00

221 lines
6.8 KiB
PHP
Executable File

<?php
namespace app\im\controller;
use app\Common\LongbingServiceNotice;
use app\Common\service\LongbingUserInfoService;
use app\im\service\ImService;
use longbingcore\tools\LongbingStr;
use longbingcore\tools\LongbingTime;
use think\App;
class MessageHandlerV2 extends BaseMessage
{
//连接客户端ID
protected $connect_name = 'longbing_im_connect_';
//链接对应的用户ID
protected $connect_user_name = 'longbing_im_connect_user';
//房间ID
protected $chat_name = 'longbing_chat_';
protected $uniacid_wss = 'wss';
protected $noLogin = ['code' => 401, 'error' => '请登录系统!'] ;
//发送消息
public function sendMessage($server ,$client_id ,$data)
{
//检查登录
$user_id = $this->checkLogin($server ,$client_id ,$data);
if(!$user_id){
return $this->sendLogin($server , $client_id ) ;
}
$uniacid = $data['data']['uniacid'];
$target_id = $data['data']['target_id']; //接收消息用户id
$content = $data['data']['content'];
if( isset($data['data']['id']) && $data['data']['id'] > 0 ) { //
$message = $data['data'] ;
$message_type = $data['data']['message_type'];
}else{
$chat_id = ImService::getChatId($uniacid, $user_id, $target_id);
$message_type = $data['data']['type'];
$message['message_type'] = $message_type; //
$message['status'] = 1; //消息状态 1=>未读消息 2=>已读 3=>已撤销 4=>已删除
$message['user_id'] = $user_id; //发送消息用户id
$message['target_id'] = $target_id; //接收消息用户id
$message['content'] = $content; // 消息内容
$message['uniacid'] = $uniacid; //平台ID
$message['chat_id'] = $chat_id; // 房间ID
$message['create_time'] = time();
$message['update_time'] = time();
ImService::addMessage($message);
}
$pushTargetClientId = intval( $this->getClientIdByUserId($target_id) ) ;
//客户在线
if($pushTargetClientId){
$this->sendServerMsg($server , $pushTargetClientId , 'getNewMessage' ,true,'', $message );
$this->getUnReadMessageCount($server , $pushTargetClientId , ['data'=>['user_id' => $target_id ] ] );
$this->getCustomerUnReadMessageCount($server , $pushTargetClientId , ['data'=>['user_id' => $target_id ,'target_id' => $user_id ] ] );
}else{
//发送服务通知给客户
//员工姓名,必须为中文,不能带有数字和符号
//$name = LongbingUserInfoService::getNameByUserId($user_id);
//ImService::sendTmplMsg($uniacid,$target_id,[ $name , '有未读私信' , LongbingTime::getChinaNowTime()] , 'pages/user/home' );
}
$this->sendServerMsg($server , $client_id , 'sendMessage' ,true,'', $message );
$this->getUnReadMessageCount($server , $client_id , ['data'=>['user_id' => $user_id ] ] );
//给员工发通知消息
//$note = new LongbingServiceNotice($uniacid);
//$note->sendImMessageServiceNoticeToStaff($target_id , $content) ;
}
//获取未读消息总数
public function getUnReadMessageCount($server ,$client_id ,$data)
{
$user_id = $data['data']['user_id'] ;
$count = ImService::getUnReadMessageCount($user_id);
$this->sendServerMsg($server ,$client_id , 'getUnReadMessageCount' , true,'', ['count' => $count ] ) ;
}
//查询目标客户,给我发送的消息数量
public function getCustomerUnReadMessageCount($server ,$client_id ,$data)
{
if (isset($data['data']['target_id']) && isset($data['data']['user_id'])) {
$user_id = $data['data']['user_id'];
$target_id = $data['data']['target_id'];
$count = ImService::getUnReadMessageCountByUserIdAndTargetId( $target_id , $user_id);
$this->sendServerMsg($server, $client_id, 'getCustomerUnReadMessageCount', true, '', ['count' => $count, 'user_id' => $user_id , 'target_id' => $target_id ]);
}
}
//登陆
public function login($server ,$client_id ,$data)
{
//登录失败
$user_id = $this->checkLogin($server ,$client_id ,$data);
if(!$user_id){
return $this->sendLogin($server , $client_id ) ;
}
$this->updateClentAndUserIdCache($client_id , $user_id);
$this->sendServerMsg($server ,$client_id , 'login' , true ) ;
//用户登录成功,给客户发未读消息数量
$this->getUnReadMessageCount($server , $client_id , ['data'=>['user_id' => $user_id ] ] );
}
//检查登录
public function checkLogin( $server ,$client_id ,$data ){
if(isset($data['data']['token'])){
$token = $data['data']['token'];
$uniacid = $data['data']['uniacid'] ;
$user = getCache($token , $uniacid );
if(empty($user)){
return false ;
}
return $user['id'] ;
}else{
echo json_encode($data);
}
return false ;
}
//发送登录提示消息信息
public function sendLogin( $server ,$client_id ){
$this->sendServerMsg($server, $client_id ,'login',false,'',$this->noLogin);
}
//更新缓存客户和用户ID
public function updateClentAndUserIdCache($client_id , $user_id){
//缓存客户端对应的用户ID
$key = $this->connect_name . $client_id;
setCache ( $key, $user_id, 3600, $this->uniacid_wss );
//缓存用户登录对应的客户端ID
$key = $this->connect_user_name . $user_id;
setCache ( $key, $client_id, 3600, $this->uniacid_wss );
}
//根据用户ID获取 $client_id
public function getClientIdByUserId($userId){
$key = $this->connect_user_name . $userId;
$client_id = getCache( $key , $this->uniacid_wss ) ;
return $client_id;
}
//退出
public function logout($client_id)
{
$key = $this->connect_name . $client_id;
$user_id = getCache( $key , $this->uniacid_wss ) ;
//删除客户对应的用户ID
delCache($key ,$this->uniacid_wss);
//删除用户对应的客户ID
$key = $this->connect_user_name . $user_id;
delCache($key ,$this->uniacid_wss);
}
//检查链接是否正常
public function checkWs($server ,$client_id ,$data)
{
//检查登录
$user_id = $this->checkLogin($server ,$client_id ,$data);
if(!$user_id){
return $this->sendLogin($server , $client_id ) ;
}
$this->updateClentAndUserIdCache($client_id , $user_id) ;
$this->sendServerMsg($server, $client_id ,'checkWsOk');
}
}