|
|
@@ -131,7 +131,7 @@ class Events
|
|
|
if (!strlen(array_search($v['servicelog_id'], array_column($chatLog, 'servicelog_id')))) {
|
|
|
// 如果小于设定时间则关闭会话.
|
|
|
if ($v['start_time'] <= $unoperated) {
|
|
|
- self::serverClose($v['client_id']);
|
|
|
+ self::serverClose($v['client_id'], $v['servicelog_id']);
|
|
|
// 如果小于设定时间前一分钟则给出提示.
|
|
|
} elseif ($v['start_time'] <= $setUnoperated) {
|
|
|
$chat_message = [
|
|
|
@@ -150,7 +150,7 @@ class Events
|
|
|
// 如果对话为客服的最后一次对话且时间小于设定时间则结束工单.
|
|
|
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']);
|
|
|
+ self::serverClose($serviceLog[$found_key]['client_id'], $v['servicelog_id']);
|
|
|
// 如果对话为客服的最后一次对话且时间小于设定时间前一分钟则给出提示.
|
|
|
} elseif ($toWho != 'KF' && $v['time_line'] <= $setOvertime) {
|
|
|
$chat_message = [
|
|
|
@@ -356,10 +356,30 @@ class Events
|
|
|
break;
|
|
|
// 客服关闭会话.
|
|
|
case 'kfCloseUser':
|
|
|
- $client = Gateway::getClientIdByUid($message['data']['to_id']);
|
|
|
+ $client = Gateway::getClientIdByUid($userId);
|
|
|
if (!empty($client)) {
|
|
|
- self::serverClose($client['0']);
|
|
|
+ $userId = $message['data']['to_id'];
|
|
|
+ $kfId = $message['data']['kf_id'];
|
|
|
+ $groupId = $message['data']['group_id'];
|
|
|
+ $clientId = $client['0'];
|
|
|
+ $sql = "select 'servicelog_id' from `ws_service_log` where `user_id`= '$userId' and `client_id`= '$clientId' and `status`!= '2' and `group_id`!= '$groupId' and `kf_id`!= '$kfId'";
|
|
|
+ $serviceLog = self::$db->query($sql);
|
|
|
+ self::serverClose($clientId, $serviceLog[0]['servicelog_id']);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ // 客服更改状态.
|
|
|
+ case 'kfOnline':
|
|
|
+ $kfList = self::$global->kfList;
|
|
|
+ $userId = $message['data']['uid'];
|
|
|
+ $status = $message['data']['status'];
|
|
|
+ foreach ($kfList as $k => $v) {
|
|
|
+ foreach ($v as $ke => $va) {
|
|
|
+ if ($ke == $userId) {
|
|
|
+ $kfList[$k][$ke]['status'] = $status;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+ self::$global->kfList = $kfList;
|
|
|
break;
|
|
|
case 'changeOtherhKeFu';
|
|
|
self::changeOtherhKeFu($client_id, $message);
|
|
|
@@ -486,6 +506,7 @@ class Events
|
|
|
'avatar' => $message['avatar'],
|
|
|
'client_id' => $client_id,
|
|
|
'task' => 0,
|
|
|
+ 'status' => 2,// 1为在线(接收分配、接收消息)2为隐身(不接收分配、只接收消息)
|
|
|
'user_info' => []
|
|
|
];
|
|
|
} while (!self::$global->cas('kfList', $kfList, $newKfList));
|
|
|
@@ -590,7 +611,6 @@ class Events
|
|
|
|
|
|
// 尝试分配新会员进入服务
|
|
|
self::userOnlineTask($client_id, $message['group'], $message['uid']);
|
|
|
-
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -739,7 +759,7 @@ class Events
|
|
|
* tips: 当服务端主动退出的时候,会出现 exit status 9.原因是:服务端主动断开之后,连接的客户端会走这个方法,而短时间内进程
|
|
|
* 需要处理这多的逻辑,又有cas操作,导致进程退出会超时,然后会被内核杀死,从而报出错误 9.实际对真正的业务没有任何的影响。
|
|
|
*/
|
|
|
- public static function serverClose($client_id)
|
|
|
+ public static function serverClose($client_id, $servicelog_id)
|
|
|
{
|
|
|
// 返回.
|
|
|
$chat_message = [
|
|
|
@@ -751,6 +771,10 @@ class Events
|
|
|
];
|
|
|
Gateway::sendToClient($client_id, json_encode($chat_message, 256));
|
|
|
Gateway::closeClient($client_id);
|
|
|
+ $now = time();
|
|
|
+ $sql = "update `ws_service_log` set `status`='2',end_time=$now where `servicelog_id`= '$servicelog_id'";
|
|
|
+ //echo "客户退出:". $sql ."\n";
|
|
|
+ self::$db->query($sql);
|
|
|
$isServiceUserOut = false;
|
|
|
// 将会员服务信息,从客服的服务列表中移除
|
|
|
$old = $kfList = self::$global->kfList;
|
|
|
@@ -1102,8 +1126,17 @@ class Events
|
|
|
*/
|
|
|
private static function assignmentTask($kfList, $userList, $group, $total, $uid = 0)
|
|
|
{
|
|
|
+ // 注:修改为已上线(status为1上线status为2不接受分配)
|
|
|
+ $onlineKF = [];
|
|
|
+ foreach ($kfList as $k => $v) {
|
|
|
+ foreach ($v as $ke => $va) {
|
|
|
+ if ($va['status'] == 1) {
|
|
|
+ $onlineKF[$k][$ke] = $va;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
// 没有客服上线
|
|
|
- if (empty($kfList) || empty($kfList[$group])) {
|
|
|
+ if (empty($onlineKF) || empty($onlineKF[$group])) {
|
|
|
return ['code' => -1];
|
|
|
}
|
|
|
|
|
|
@@ -1118,7 +1151,7 @@ class Events
|
|
|
}
|
|
|
|
|
|
// 查看该组的客服是否在线
|
|
|
- if (!isset($kfList[$group])) {
|
|
|
+ if (!isset($onlineKF[$group])) {
|
|
|
return ['code' => -1];
|
|
|
}
|
|
|
|
|
|
@@ -1144,22 +1177,22 @@ class Events
|
|
|
//上次用户掉线后,还可以继续上一次 (如果没有关闭) 的会话 --2
|
|
|
if ($odltalksession) {
|
|
|
$oldkrid = 'KF' . $odltalksession['kf_id'];
|
|
|
- if (isset($kfList[$group][$oldkrid])) {
|
|
|
- $kf = $kfList[$group][$oldkrid];
|
|
|
+ if (isset($onlineKF[$group][$oldkrid])) {
|
|
|
+ $kf = $onlineKF[$group][$oldkrid];
|
|
|
$min = $kf['task'];
|
|
|
$flag = $kf['id'];
|
|
|
- unset($kfList[$group][$oldkrid]);
|
|
|
+ unset($onlineKF[$group][$oldkrid]);
|
|
|
} else {
|
|
|
goto NOSIGNKF;
|
|
|
}
|
|
|
} else {
|
|
|
NOSIGNKF:
|
|
|
- $kf = $kfList[$group];
|
|
|
+ $kf = $onlineKF[$group];
|
|
|
$kf = array_shift($kf);
|
|
|
$min = $kf['task'];
|
|
|
$flag = $kf['id'];
|
|
|
|
|
|
- foreach ($kfList[$group] as $key => $vo) {
|
|
|
+ foreach ($onlineKF[$group] as $key => $vo) {
|
|
|
if ($vo['task'] < $min) {
|
|
|
$min = $vo['task'];
|
|
|
$flag = $key;
|
|
|
@@ -1169,19 +1202,19 @@ class Events
|
|
|
}
|
|
|
|
|
|
// 需要排队了
|
|
|
- if ($kfList[$group][$flag]['task'] == $total) {
|
|
|
+ if ($onlineKF[$group][$flag]['task'] == $total) {
|
|
|
return ['code' => -4];
|
|
|
}
|
|
|
|
|
|
$kfList[$group][$flag]['task'] += 1;
|
|
|
- array_push($kfList[$group][$flag]['user_info'], $user['client_id']); // 被分配的用户信息
|
|
|
+ array_push($onlineKF[$group][$flag]['user_info'], $user['client_id']); // 被分配的用户信息
|
|
|
|
|
|
return [
|
|
|
'code' => 1,
|
|
|
'data' => [
|
|
|
- $kfList[$group][$flag]['id'],
|
|
|
- $kfList[$group][$flag]['name'],
|
|
|
- $kfList[$group][$flag]['client_id'],
|
|
|
+ $onlineKF[$group][$flag]['id'],
|
|
|
+ $onlineKF[$group][$flag]['name'],
|
|
|
+ $onlineKF[$group][$flag]['client_id'],
|
|
|
$user,
|
|
|
$kfList,
|
|
|
$userList
|