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