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