190 lines
7.5 KiB
PHP
190 lines
7.5 KiB
PHP
<?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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |