|
|
@@ -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);
|
|
|
@@ -682,6 +756,7 @@ class Events
|
|
|
]
|
|
|
];
|
|
|
Gateway::sendToClient($client_id, json_encode($chat_message, 256));
|
|
|
+ Gateway::closeClient($client_id);
|
|
|
$isServiceUserOut = false;
|
|
|
// 将会员服务信息,从客服的服务列表中移除
|
|
|
$old = $kfList = self::$global->kfList;
|