Browse Source

'修改聊天'

Ethan 6 years ago
parent
commit
4239ee981a
2 changed files with 65 additions and 25 deletions
  1. 1 0
      .gitignore
  2. 64 25
      vendor/GatewayWorker_windows/Applications/whisper/Events.php

+ 1 - 0
.gitignore

@@ -2,3 +2,4 @@
 composer.lock
 *.log
 runtime
+public/uploads

+ 64 - 25
vendor/GatewayWorker_windows/Applications/whisper/Events.php

@@ -68,7 +68,7 @@ class Events
 
         // 检查对话时效给出.
         Timer::add(6, function () {
-            // self::overTime();
+            self::overTime();
         });
     }
 
@@ -112,7 +112,6 @@ class Events
             Gateway::sendToClient($client_id, json_encode($hello, 256));
             unset($hello);
         }
-
         unset($sayHello);
         // 检测是否开启广告
         $advertisement = self::$db->query('select * from `ws_advertisement` where `advertisement_status` = 1');
@@ -188,6 +187,7 @@ class Events
                     break;
                 // 客服关闭会话.
                 case 'kfCloseUser':
+                    self::serverClose($message['data']['conversationId'],3);
                     break;
                 // 客服更改状态.
                 case 'kfOnline':
@@ -208,6 +208,9 @@ class Events
     {
         // 获取当前会话工单.
         $data = json_decode(self::$redis->HGET('SERVICELOG', $message['conversationId']), true);
+        if (empty($data)) {
+            return;
+        }
         $chat_message = [
             'message_type' => 'chatMessage',
             'data' => [
@@ -219,26 +222,27 @@ class Events
         ];
         if (isset($message['isFirst']) && $message['isFirst']) {
             $data['alarm_corresponding'] = time() - $data['start_time'];
+            $data['alarm_respond'] = 2;
         }
         // 发送消息.
         if (substr($message['from_id'], 0, 2) === 'KF') {
             $data['userLastTime'] = time();
-            Gateway::sendToClient($data['client_id'], json_encode($chat_message));
+            Gateway::sendToClient($data['client_id'], json_encode($chat_message, 256));
         } else {
             $data['serverLastTime'] = time();
-            Gateway::sendToClient($data['kf_client_id'], json_encode($chat_message));
+            Gateway::sendToClient($data['kf_client_id'], json_encode($chat_message, 256));
         }
         // 保存修改后的工单信息.
-        self::$redis->HSET('SERVICELOG', $message['conversationId'], $data);
+        self::$redis->HSET('SERVICELOG', $message['conversationId'], json_encode($data,256));
 
         // 聊天信息入库
         $insertChatData = [
-            'from_id' => $message['data']['from_id'],
-            'from_name' => $message['data']['from_name'],
-            'to_id' => $message['data']['to_id'],
-            'to_name' => $message['data']['to_name'],
-            'content' => $message['data']['content'],
-            'servicelog_id' => $message['data']['conversationId'],
+            'from_id' => $message['from_id'],
+            'from_name' => $message['from_name'],
+            'to_id' => $message['to_id'],
+            'to_name' => $message['to_name'],
+            'content' => $message['content'],
+            'servicelog_id' => $message['conversationId'],
             'time_line' => time()
         ];
         self::$db->insert('ws_chat_log')->cols($insertChatData)->query();
@@ -647,31 +651,66 @@ class Events
      * tips: 当服务端主动退出的时候,会出现 exit status 9.原因是:服务端主动断开之后,连接的客户端会走这个方法,而短时间内进程
      * 需要处理这多的逻辑,又有cas操作,导致进程退出会超时,然后会被内核杀死,从而报出错误 9.实际对真正的业务没有任何的影响。
      */
-    public static function serverClose($servicelogId)
+    public static function serverClose($servicelogId, $closeBy=0)
     {
         // 获取当前工单数据.
         $data = json_decode(self::$redis->HGET('SERVICELOG', $servicelogId), true);
+        if (empty($data)) {
+            return;
+        }
         // 获取当前工单数据.
         $kfInfo = json_decode(self::$redis->HGET('KFINFO', 'KF' . $data['kf_id']), true);
         // 删除当前工单.
-        //self::$redis->hdel('SERVICELOG', $servicelogId);
+        self::$redis->hdel('SERVICELOG', $servicelogId);
         // 当前服务客服删除当前人员.
         $kfUserList = self::ArrayDataopt($kfInfo['user_info'], $data['client_id'], 0);
-
-        return;
-
-        if (isset($kfInfo)) {
-            print_r([$kfInfo, $servicelogId]);
-            die;
-        }
+        // 删除当前人员信息.
+        self::$redis->hdel('USERINFO', $data['user_id']);
         // 当前客服所接待人员.
         $kfInfo['user_info'] = $kfUserList;
         $kfInfo['task'] = count($kfUserList);
         // 存入客服信息.
-        $redis->HSET('KFINFO', 'KF' . $data['kf_id'], $kfInfo);
+        self::$redis->HSET('KFINFO', 'KF' . $data['kf_id'], json_encode($kfInfo, 256));
+        // 发送消息给用户.
+        $chat_message = [
+            'message_type' => 'closeBysever',
+            'data' => [
+                'content' => '客服停止了该会话',
+                'time' => date('H:i'),
+            ]
+        ];
+        Gateway::sendToClient($data['client_id'], json_encode($chat_message, 256));
+        // 关闭用户连接.
+        Gateway::closeClient($data['client_id']);
+        // 发送消息给客服.
+        $del_message = [
+            'message_type' => 'delUser',
+            'data' => [
+                'id' => $data['user_id']
+            ]
+        ];
+        Gateway::sendToClient($data['kf_client_id'], json_encode($del_message, 256));
+        // 查询工单会话总数.
+        $chatCount = self::$db->select('count(*) as count')->from('ws_chat_log')->where("servicelog_id=$servicelogId")->row();print_r($chatCount);
         // 将数据存入数据库.
-
-
+        $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();
     }
 
 
@@ -1150,7 +1189,7 @@ class Events
             $data = json_decode($v, true);
             if (!isset($data['userLastTime'])) {
                 if ($data['start_time'] <= $unoperated) {
-                    self::serverClose($k);
+                    self::serverClose($k, 1);
                     // 如果小于设定时间前一分钟则给出提示.
                 } elseif ($data['start_time'] <= $setUnoperated) {
                     $chat_message = [
@@ -1163,7 +1202,7 @@ class Events
                 }
                 // 双方静默超时.
             } elseif ($data['userLastTime'] <= $overtime && $data['serverLastTime'] <= $overtime) {
-                self::serverClose($k);
+                self::serverClose($k, 2);
                 // 如果小于设定时间前一分钟则给出提示.
             } elseif ($data['userLastTime'] <= $setOvertime && $data['serverLastTime'] <= $setOvertime) {
                 $chat_message = [