Files
CompanyProject/金壶/ydyd_service/application/http/service/ChatCloseService.php
2024-09-27 01:32:49 +08:00

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);
}
}
}
}
}