first commit
This commit is contained in:
190
金壶/ydyd_service/application/http/service/ChatCloseService.php
Normal file
190
金壶/ydyd_service/application/http/service/ChatCloseService.php
Normal file
@@ -0,0 +1,190 @@
|
||||
<?php
|
||||
|
||||
namespace app\http\service;
|
||||
|
||||
use app\facade\AppConstant;
|
||||
use app\facade\RedisCache;
|
||||
use think\captcha\Captcha;
|
||||
use think\Db;
|
||||
use think\facade\Cache;
|
||||
use think\facade\Config;
|
||||
use think\facade\Log;
|
||||
|
||||
class ChatCloseService extends CommonService
|
||||
{
|
||||
protected $fd=0;
|
||||
protected $server=null;
|
||||
|
||||
public function __construct($server, $fd)
|
||||
{
|
||||
$this->fd=$fd;
|
||||
$this->server=$server;
|
||||
}
|
||||
|
||||
public function onClose() {
|
||||
$fd_store=RedisCache::hget('CHAT_USER_FD_MAP',$this->fd);
|
||||
if ($fd_store) {
|
||||
//删除并存储相应的对话记录
|
||||
//先取出所有的keys
|
||||
$chat_list=RedisCache::keys('CHAT_DATA_'.$fd_store.'_*');
|
||||
//做相应的对话处理
|
||||
$cs_store=[];
|
||||
$remove_flag=[];
|
||||
|
||||
$add_data=[];
|
||||
$tmp_add_data['create_time']=date('Y-m-d H:i:s');
|
||||
$user_info_data = json_decode(RedisCache::hget('CHAT_USER_INFO',$fd_store),true);
|
||||
if ($user_info_data['guest_flag']) {
|
||||
$tmp_add_data['user_id']=0;
|
||||
$tmp_add_data['user_session']=$fd_store;
|
||||
} else {
|
||||
$tmp_add_data['user_id']=$fd_store;
|
||||
$tmp_add_data['user_session']='';
|
||||
}
|
||||
|
||||
foreach ($chat_list as $v) {
|
||||
//取出用户本次通话的记录
|
||||
$chat_message_list=RedisCache::lrange($v);
|
||||
//第一条系统发出的,不做判断
|
||||
if (count($chat_message_list)>1) {
|
||||
$remove_flag[]=false;
|
||||
} else {
|
||||
$remove_flag[]=true;
|
||||
}
|
||||
|
||||
//取出用户目前的存储id
|
||||
$this_cs_store=substr($v,strlen('CHAT_DATA_'.$fd_store.'_'));
|
||||
|
||||
//存入数据库的数据组装
|
||||
$tmp_add_data['admin_user_id']=$this_cs_store;
|
||||
$tmp_add_data['message']=json_encode($chat_message_list);
|
||||
$tmp_add_data['offline_flag']=0;
|
||||
$add_data[]=$tmp_add_data;
|
||||
|
||||
$cs_store[]=$this_cs_store;
|
||||
}
|
||||
|
||||
//离线消息部分
|
||||
//先取出所有的keys
|
||||
$offline_chat_list=RedisCache::keys('OFFLINE_CHAT_DATA_'.$fd_store.'_*');
|
||||
|
||||
foreach ($offline_chat_list as $v) {
|
||||
//取出用户本次离线消息的记录
|
||||
$offline_chat_message_list=RedisCache::lrange($v);
|
||||
|
||||
//取出客服目前的存储id
|
||||
$this_cs_store=substr($v,strlen('OFFLINE_CHAT_DATA_'.$fd_store.'_'));
|
||||
|
||||
//存入数据库的数据组装
|
||||
$tmp_add_data['admin_user_id']=$this_cs_store;
|
||||
$tmp_add_data['message']=json_encode($offline_chat_message_list);
|
||||
$tmp_add_data['offline_flag']=1;
|
||||
$add_data[]=$tmp_add_data;
|
||||
}
|
||||
//--
|
||||
|
||||
$this->noticeUserLeave($this->server,$fd_store,$cs_store,$remove_flag,$user_info_data);
|
||||
//删除
|
||||
RedisCache::batch_del($chat_list);
|
||||
RedisCache::batch_del($offline_chat_list);
|
||||
|
||||
//用户关闭连接,删除相应缓存
|
||||
RedisCache::hdel('CHAT_USER_FD_MAP',$this->fd);
|
||||
RedisCache::hdel('CHAT_USER_FD',$fd_store);
|
||||
RedisCache::hdel('CHAT_USER_INFO',$fd_store);
|
||||
RedisCache::lrem('CHAT_USER_QUEUE',$fd_store,0);
|
||||
//广播通知
|
||||
$this->pushUserQueueNum($this->server);
|
||||
//聊天记录存入数据库
|
||||
if (count($add_data)>0) {
|
||||
Db::name('chat_message')->insertAll($add_data);
|
||||
}
|
||||
} else {
|
||||
$fd_store=RedisCache::hget('CHAT_CS_FD_MAP',$this->fd);
|
||||
if ($fd_store) {
|
||||
//先删除并存储相应的对话记录
|
||||
//先取出所有的keys
|
||||
$chat_list=RedisCache::keys('CHAT_DATA_*_'.$fd_store);
|
||||
//做相应的对话处理,待实现
|
||||
$user_store=[];
|
||||
|
||||
$add_data=[];
|
||||
$tmp_add_data['create_time']=date('Y-m-d H:i:s');
|
||||
$tmp_add_data['admin_user_id']=$fd_store;
|
||||
foreach ($chat_list as $v) {
|
||||
//取出用户本次通话的记录
|
||||
$chat_message_list=RedisCache::lrange($v);
|
||||
|
||||
//取出用户目前的存储id
|
||||
$this_user_store=substr($v,strlen('CHAT_DATA_'),strrpos($v,'_'.$fd_store)-strlen('CHAT_DATA_'));
|
||||
|
||||
$user_info_data = json_decode(RedisCache::hget('CHAT_USER_INFO',$this_user_store),true);
|
||||
if ($user_info_data['guest_flag']) {
|
||||
$tmp_add_data['user_id']=0;
|
||||
$tmp_add_data['user_session']=$this_user_store;
|
||||
} else {
|
||||
$tmp_add_data['user_id']=$this_user_store;
|
||||
$tmp_add_data['user_session']='';
|
||||
}
|
||||
$tmp_add_data['message']=json_encode($chat_message_list);
|
||||
$tmp_add_data['offline_flag']=0;
|
||||
$tmp_add_data['read_flag']=1;
|
||||
$add_data[]=$tmp_add_data;
|
||||
|
||||
$user_store[]=$this_user_store;
|
||||
}
|
||||
|
||||
//离线消息部分
|
||||
//先取出所有的keys
|
||||
$offline_chat_list=RedisCache::keys('OFFLINE_CHAT_DATA_*_'.$fd_store);
|
||||
|
||||
foreach ($offline_chat_list as $v) {
|
||||
//取出用户本次离线消息的记录
|
||||
$offline_chat_message_list=RedisCache::lrange($v);
|
||||
|
||||
//取出用户目前的存储id
|
||||
$this_user_store=substr($v,strlen('OFFLINE_CHAT_DATA_'),strrpos($v,'_'.$fd_store)-strlen('OFFLINE_CHAT_DATA_'));
|
||||
|
||||
if (checkGuestFlag($this_user_store)) {
|
||||
$tmp_add_data['user_id']=0;
|
||||
$tmp_add_data['user_session']=$this_user_store;
|
||||
} else {
|
||||
$tmp_add_data['user_id']=$this_user_store;
|
||||
$tmp_add_data['user_session']='';
|
||||
}
|
||||
$tmp_add_data['message']=json_encode($offline_chat_message_list);
|
||||
$tmp_add_data['offline_flag']=1;
|
||||
$tmp_add_data['read_flag']=0;
|
||||
$add_data[]=$tmp_add_data;
|
||||
}
|
||||
//--
|
||||
|
||||
$this->noticeCSLeave($this->server,$user_store,$fd_store);
|
||||
//删除
|
||||
RedisCache::batch_del($chat_list);
|
||||
RedisCache::batch_del($offline_chat_list);
|
||||
|
||||
//客服关闭连接,删除相应缓存
|
||||
RedisCache::hdel('CHAT_CS_FD_MAP',$this->fd);
|
||||
RedisCache::hdel('CHAT_CS_FD',$fd_store);
|
||||
RedisCache::hdel('CHAT_CS_INFO',$fd_store);
|
||||
RedisCache::lrem('CUSTOMER_ONLINE_QUEUE',$fd_store,0);
|
||||
|
||||
//聊天记录存入数据库
|
||||
if (count($add_data)>0) {
|
||||
Db::name('chat_message')->insertAll($add_data);
|
||||
}
|
||||
} else {
|
||||
Log::info('普通工作人员关闭连接'.$this->fd);
|
||||
//普通工作人员
|
||||
$fd_store=RedisCache::hget('CHAT_ADMIN_FD_MAP',$this->fd);
|
||||
if ($fd_store) {
|
||||
//普通工作人员关闭连接,删除相应缓存
|
||||
RedisCache::hdel('CHAT_ADMIN_FD_MAP',$this->fd);
|
||||
RedisCache::hdel('CHAT_ADMIN_FD',$fd_store);
|
||||
RedisCache::hdel('CHAT_ADMIN_INFO',$fd_store);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user