Kaynağa Gözat

'用户对话超时提示及关闭'

Ethan 6 yıl önce
ebeveyn
işleme
9c52285f02

+ 3 - 3
application/service/controller/Words.php

@@ -107,7 +107,7 @@ class Words extends Common
 
 
     /**
-     * 快捷语修改
+     * 删除快捷语
      *
      * @access public
      * @return array JsonString
@@ -145,7 +145,7 @@ class Words extends Common
 
 
     /**
-     * 快捷语修改
+     * 新增快捷语
      *
      * @access public
      * @return array JsonString
@@ -182,7 +182,7 @@ class Words extends Common
             return json(['code' => $code, 'data' => [], 'msg' => $msg]);
         }//end try
 
-    }//end deleteWords()
+    }//end addWords()
 
 
 }

+ 77 - 2
vendor/GatewayWorker_windows/Applications/whisper/Events.php

@@ -90,6 +90,80 @@ class Events
             });
 
         }
+
+
+        // 检查对话时效给出.
+        Timer::add(3, function () {
+            // 查询对话时效设置.
+            $systemConfigData = self::$db->query("SELECT `systemconfig_data`,`systemconfig_enName`,`systemconfig_content` FROM `ws_systemconfig`");
+            foreach ($systemConfigData as $k => $v) {
+                if ($v['systemconfig_enName'] == 'overtime') {
+                    self::$global->overtime = $v;
+                } elseif ($v['systemconfig_enName'] == 'unoperated') {
+                    self::$global->unoperated = $v;
+                } elseif ($v['systemconfig_enName'] == 'noResponse') {
+                    self::$global->noResponse = $v;
+                }
+            }
+            // 查询未断开的工单.
+            $serviceLog = self::$db->query("SELECT `servicelog_id`,`client_id`,`start_time` FROM `ws_service_log` WHERE `status`='1' OR `status`='3'");
+            $whereOr = '1=0';
+            foreach ($serviceLog as $k => $v) {
+                if ($k == 0) {
+                    $whereOr = "`servicelog_id`=".$v['servicelog_id'];
+                } else {
+                    $whereOr .= " OR `servicelog_id`=".$v['servicelog_id'];
+                }
+            }
+            // 查询最后一次会话.
+            //$chatLog = self::$db->query("SELECT `servicelog_id`,MAX(`time_line`) FROM `ws_chat_log` WHERE ".$whereOr." group by `servicelog_id`");
+            $chatLog = self::$db->query("
+                select * from ws_chat_log as a where  time_line=(
+                  select max(b.time_line) from ws_chat_log as b where a.servicelog_id = b.servicelog_id and (".$whereOr.") group by servicelog_id
+                )
+            ");
+            $setOvertime = strtotime('-'.(self::$global->overtime['systemconfig_data']-60).' second');
+            $overtime = strtotime('-'.(self::$global->overtime['systemconfig_data']).' second');
+            $setUnoperated = strtotime('-'.(self::$global->unoperated['systemconfig_data']-60).' second');
+            $unoperated = strtotime('-'.(self::$global->unoperated['systemconfig_data']).' second');
+            $noResponse = strtotime('-'.(self::$global->noResponse['systemconfig_data']).' second');
+            foreach ($serviceLog as $k => $v) {//注意该循环时间
+                if (!strlen(array_search($v['servicelog_id'], array_column($chatLog, 'servicelog_id')))) {
+                    // 如果小于设定时间则关闭会话.
+                    if ($v['start_time'] <= $unoperated) {
+                        self::serverClose($v['client_id']);
+                    // 如果小于设定时间前一分钟则给出提示.
+                    } elseif ($v['start_time'] <= $setUnoperated) {
+                        $chat_message = [
+                            'message_type' => 'overtime',
+                            'data' => [
+                                'content' => htmlspecialchars(self::$global->unoperated['systemconfig_content']),
+                            ]
+                        ];
+                        Gateway::sendToClient($v['client_id'], json_encode($chat_message));
+                    }
+                }
+            }
+            // 循环检测会话时效.
+            foreach ($chatLog as $k => $v) {
+                $toWho = substr($v['to_id'],0,2);
+                // 如果对话为客服的最后一次对话且时间小于设定时间则结束工单.
+                if ($toWho != 'KF' && $v['time_line'] <= $overtime) {
+                    $found_key = array_search($v['servicelog_id'], array_column($serviceLog, 'servicelog_id'));
+                    self::serverClose($serviceLog[$found_key]['client_id']);
+                // 如果对话为客服的最后一次对话且时间小于设定时间前一分钟则给出提示.
+                } elseif ($toWho != 'KF' && $v['time_line'] <= $setOvertime) {
+                    $chat_message = [
+                        'message_type' => 'overtime',
+                        'data' => [
+                            'content' => htmlspecialchars(self::$global->overtime['systemconfig_content']),
+                        ]
+                    ];
+                    $found_key = array_search($v['servicelog_id'], array_column($serviceLog, 'servicelog_id'));
+                    Gateway::sendToClient($serviceLog[$found_key]['client_id'], json_encode($chat_message));
+                }
+            }
+        });
     }
 
 
@@ -130,8 +204,8 @@ class Events
             Gateway::sendToCurrentClient('{"type":"pong"}');
             return;
         } else {
-            echo "onMessage: " . $message . "\r\n";
-            print_r([self::$global->kfList, self::$global->userList, self::$global->uidSimpleList, self::$global->userToKf]);
+            /*echo "onMessage: " . $message . "\r\n";
+            print_r([self::$global->kfList, self::$global->userList, self::$global->uidSimpleList, self::$global->userToKf]);*/
         }
 
         $message = json_decode($message, true);
@@ -579,6 +653,7 @@ class Events
             ]
         ];
         Gateway::sendToClient($client_id, json_encode($chat_message, 256));
+        Gateway::closeClient($client_id);
         $isServiceUserOut = false;
         // 将会员服务信息,从客服的服务列表中移除
         $old = $kfList = self::$global->kfList;