Selaa lähdekoodia

Merge branch 'dev' of http://git.bocai108.com:10180/Ethan/Customer-Service into dev

Jonlin 6 vuotta sitten
vanhempi
commit
3e83046b58
1 muutettua tiedostoa jossa 60 lisäystä ja 54 poistoa
  1. 60 54
      vendor/GatewayWorker_windows/Applications/whisper/Events.php

+ 60 - 54
vendor/GatewayWorker_windows/Applications/whisper/Events.php

@@ -43,6 +43,7 @@ class Events
     const  USERINFOKEY = 'USERINFO';          //用户信息hash表
     const  USERLIST = 'USERLIST';             //用户排队表
     const  SERVICELOG = 'SERVICELOG';            //工单信息
+    const  WEBSOCKALLUSER = 'WEBSOCKALLUSER';          //所有连接
 
     /**
      * 进程启动后初始化数据库连接
@@ -110,6 +111,8 @@ class Events
             unset($chat_message);
         }
         unset($advertisement);
+
+        self::$redis->hset(self::WEBSOCKALLUSER, $client_id, json_encode(array_merge($_SERVER, ['time' => date('H:i:s')])));
     }
 
     /**
@@ -239,26 +242,13 @@ class Events
             Gateway::sendToClient($data['kf_client_id'], json_encode($chat_message, 256));
         }
         // 返回当前时间
-        if (isset($message['webTime'])) {
-            $timeDifference = strtotime(date('H:i')) - strtotime($message['webTime']);
-            if ($timeDifference >= 120) {
-                $chat_message = [
-                    'message_type' => 'webTime',
-                    'data' => [
-                        'webTime' => date('H:i'),
-                    ]
-                ];
-                Gateway::sendToCurrentClient(json_encode($chat_message, 256));
-            }
-        } else {
-            $chat_message = [
-                'message_type' => 'webTime',
-                'data' => [
-                    'webTime' => date('H:i'),
-                ]
-            ];
-            Gateway::sendToCurrentClient(json_encode($chat_message, 256));
-        }
+        $chat_message = [
+            'message_type' => 'webTime',
+            'data' => [
+                'webTime' => date('H:i'),
+            ]
+        ];
+        Gateway::sendToCurrentClient(json_encode($chat_message, 256));
         // 保存修改后的工单信息.
         self::$redis->HSET('SERVICELOG', $message['conversationId'], json_encode($data, 256));
 
@@ -555,6 +545,7 @@ class Events
      */
     public static function onClose($client_id)
     {
+        self::$redis->hdel(self::WEBSOCKALLUSER, $client_id);
         $isKefuoff = isset($_SESSION['iskefu']) ? $_SESSION['iskefu'] : 0;
         $uid = isset($_SESSION['uid']) ? $_SESSION['uid'] : false;
 
@@ -582,6 +573,10 @@ class Events
         $group = $_SESSION['group'];
         $uinfo = self::$redis->hget(self::KFINFOKEY, $uid);
         $uinfo = json_decode($uinfo, true);
+        if (empty($uinfo)) {
+            echo "客服发生异常退出\n";
+            return;
+        }
         $user_info = $uinfo['user_info'];
         $kfid = self::getkfid($uid);
         $now = time();
@@ -592,6 +587,7 @@ class Events
 
         if (!empty($user_info)) {
             foreach ($user_info as $val => $serverid) {
+                self::insertServerLog($serverid, 4);
                 self::$redis->hdel(self::SERVICELOG, intval($serverid));
                 self::MySendMsg($val, json_encode(['message_type' => 'serviceoffline', 'msg' => '客户人员下线!'], 256));
                 Gateway::closeClient($val);
@@ -741,6 +737,44 @@ class Events
     }
 
 
+    /**
+     * 修改工单数据库数据
+     * @param int $client_id 连接id
+     *
+     * tips: 当服务端主动退出的时候,会出现 exit status 9.原因是:服务端主动断开之后,连接的客户端会走这个方法,而短时间内进程
+     * 需要处理这多的逻辑,又有cas操作,导致进程退出会超时,然后会被内核杀死,从而报出错误 9.实际对真正的业务没有任何的影响。
+     */
+    public static function insertServerLog($servicelogId, $closeBy = 0)
+    {
+        // 获取当前工单数据.
+        $data = json_decode(self::$redis->HGET('SERVICELOG', $servicelogId), true);
+        if (empty($data)) {
+            return;
+        }
+        // 查询工单会话总数.
+        $chatCount = self::$db->select('count(*) as count')->from('ws_chat_log')->where("servicelog_id=$servicelogId")->row();
+        // 将数据存入数据库.
+        $updateServiceLogData = [
+            'status' => 2,
+            'evaluate_id' => isset($data['evaluate_id']) ? $data['evaluate_id'] : 0,
+            'evaluate_content' => isset($data['evaluate_content']) ? $data['evaluate_content'] : '',
+            'servicelog_close_type' => $closeBy,
+            'end_time' => time(),
+        ];
+        $updataAlarmData = [
+            'alarm_userSensitive' => $data['alarm_userSensitive'],
+            'alarm_serverSensitive' => $data['alarm_serverSensitive'],
+            'alarm_corresponding' => $data['alarm_corresponding'],
+            'alarm_cvtOvertime' => time() - $data['start_time'],
+            'alarm_respond' => $data['alarm_respond'],
+            'alarm_lineTime' => $data['start_time'] - $data['intime'],
+            'alarm_count' => $chatCount['count'],
+        ];
+        self::$db->update('ws_service_log')->cols($updateServiceLogData)->where("servicelog_id=$servicelogId")->query();
+        self::$db->update('ws_alarm')->cols($updataAlarmData)->where("servicelog_id=$servicelogId")->query();
+    }
+
+
     /**
      * 有人退出
      * @param $group
@@ -840,7 +874,7 @@ class Events
                 'user_ip' => $userInfo['ip'],
                 'kf_id' => self::getkfid($kfuid),
                 'start_time' => time(),
-                'group_id' => $userInfo['group'],
+                'group_id' => $group ? $group : $userInfo['group'],
                 'website' => $userInfo['website'],
                 'system' => $userInfo['system'],
                 'browse' => $userInfo['browse'],
@@ -1339,7 +1373,6 @@ class Events
         $kf_info_to = json_decode(self::$redis->hget(self::KFINFOKEY, $toukfid), true);
         $user_info = json_decode(self::$redis->hget(self::USERINFOKEY, $uid), true);
         $serviceid = intval($user_info['serverid']);
-        $data = json_decode(self::$redis->hget(self::SERVICELOG, $serviceid), true);
 
         if (empty($kf_info_from) || empty($kf_info_to) || empty($user_info) || empty($serviceid)) {
             self::DebugOut('changeOtherhKeFu exit23...');
@@ -1357,20 +1390,11 @@ class Events
             self::DebugOut('changeOtherhKeFu exit5...');
             return false;
         }
-        //self::$db->update('ws_service_log')->cols(['servicelog_close_type' => 5, 'status' => 2, 'end_time' => time()])->where("servicelog_id=$serviceid")->query();
+
+        self::insertServerLog($serviceid, 5);
         self::$redis->hdel(self::SERVICELOG, $serviceid);
         unset($oldlog['servicelog_id']);
 
-
-        /*
-        $oldlog = array_merge($oldlog, ['kf_id' => self::getkfid($toukfid), 'start_time' => time(), 'end_time' => 0, 'status' => 1, 'evaluate_id' => 0]);
-        $new_id = self::$db->insert('ws_service_log')->cols($oldlog)->query();
-        if (!$new_id) {
-            self::DebugOut('changeOtherhKeFu exit6...');
-            return false;
-        }
-        */
-
         ///更新redis数据
         $kf_info_from['user_info'] = self::ArrayDataopt($kf_info_from['user_info'], $user_info['client_id'], 0);
         $kf_info_from['task'] = count($kf_info_from['user_info']);
@@ -1378,25 +1402,6 @@ class Events
 
         ///////旧工单部分数据更新回库
         /// 查询工单会话总数.
-        $chatCount = self::$db->select('count(*) as count')->from('ws_chat_log')->where("servicelog_id=$serviceid")->row();
-        $updateServiceLogData = [
-            'status' => 2,
-            'evaluate_id' => isset($data['evaluate_id']) ? $data['evaluate_id'] : 0,
-            'evaluate_content' => isset($data['evaluate_content']) ? $data['evaluate_content'] : '',
-            'servicelog_close_type' => 5,
-            'end_time' => time(),
-        ];
-        $updataAlarmData = [
-            'alarm_userSensitive' => $data['alarm_userSensitive'],
-            'alarm_serverSensitive' => $data['alarm_serverSensitive'],
-            'alarm_corresponding' => $data['alarm_corresponding'],
-            'alarm_cvtOvertime' => time() - $data['start_time'],
-            'alarm_respond' => $data['alarm_respond'],
-            'alarm_lineTime' => $data['start_time'] - $data['intime'],
-            'alarm_count' => $chatCount['count'],
-        ];
-        self::$db->update('ws_service_log')->cols($updateServiceLogData)->where("servicelog_id=$serviceid")->query();
-        self::$db->update('ws_alarm')->cols($updataAlarmData)->where("servicelog_id=$serviceid")->query();
 
         self:: BeginTalk($toukfid, $uid, $groupidto, 0, $user_info);
 
@@ -1449,6 +1454,7 @@ class Events
             self::$redis->del(self::USERLIST);
             self::$redis->del(self::USERINFOKEY);
             self::$redis->del('adminList');
+            self::$redis->del(self::WEBSOCKALLUSER);
             self::$db->query("update ws_service_log set status=2,end_time=$now where  start_time>=$t and  status!=2");
         }
 
@@ -1456,7 +1462,7 @@ class Events
 
     public static function onWorkerStop($businessWorker)
     {
-        if ($businessWorker->worker_id == 1) {
+        if ($businessWorker->id == 1) {
             self::resetServiceLog();
         }
     }
@@ -1558,7 +1564,7 @@ class Events
             });
 
             // 检查对话时效给出.
-            Timer::add(20, function () {
+            Timer::add(40, function () {
                 self::overTime();
             });