|
@@ -41,9 +41,10 @@ class Events
|
|
|
public static function onWorkerStart($worker)
|
|
public static function onWorkerStart($worker)
|
|
|
{
|
|
{
|
|
|
if (empty(self::$db)) {
|
|
if (empty(self::$db)) {
|
|
|
- self::$db = new \Workerman\MySQL\Connection('192.168.2.186', '3306', 'root', '', 'customer_service');
|
|
|
|
|
|
|
+ self::$db = new \Workerman\MySQL\Connection('192.168.2.200', '3306', 'vali', '1234', 'customer_service');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
if (empty(self::$global)) {
|
|
if (empty(self::$global)) {
|
|
|
self::$global = new \GlobalData\Client('127.0.0.1:2207');
|
|
self::$global = new \GlobalData\Client('127.0.0.1:2207');
|
|
|
// 客服列表
|
|
// 客服列表
|
|
@@ -80,6 +81,7 @@ class Events
|
|
|
|
|
|
|
|
// 定时统计数据
|
|
// 定时统计数据
|
|
|
if (0 === $worker->id) {
|
|
if (0 === $worker->id) {
|
|
|
|
|
+
|
|
|
self::writeLogKfStatus(0, 0, 0);
|
|
self::writeLogKfStatus(0, 0, 0);
|
|
|
|
|
|
|
|
// 1分钟统计一次实时数据
|
|
// 1分钟统计一次实时数据
|
|
@@ -113,9 +115,8 @@ class Events
|
|
|
$adminList = self::$global->adminList ?? [];
|
|
$adminList = self::$global->adminList ?? [];
|
|
|
self::systemMonitoring($adminList);
|
|
self::systemMonitoring($adminList);
|
|
|
});
|
|
});
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -179,7 +180,7 @@ class Events
|
|
|
}
|
|
}
|
|
|
unset($sayHello);
|
|
unset($sayHello);
|
|
|
// 检测是否开启广告
|
|
// 检测是否开启广告
|
|
|
- $advertisement = self::$db->query('select `*` from `ws_advertisement` where `advertisement_status` = 1');
|
|
|
|
|
|
|
+ $advertisement = self::$db->query('select * from `ws_advertisement` where `advertisement_status` = 1');
|
|
|
if (!empty($advertisement)) {
|
|
if (!empty($advertisement)) {
|
|
|
$chat_message = [
|
|
$chat_message = [
|
|
|
'message_type' => 'advertisement',
|
|
'message_type' => 'advertisement',
|
|
@@ -202,8 +203,8 @@ class Events
|
|
|
//Gateway::sendToCurrentClient('{"type":"pong"}');
|
|
//Gateway::sendToCurrentClient('{"type":"pong"}');
|
|
|
return;
|
|
return;
|
|
|
} else {
|
|
} 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);
|
|
$message = json_decode($message, true);
|
|
@@ -221,7 +222,6 @@ class Events
|
|
|
break;
|
|
break;
|
|
|
// 顾客初始化
|
|
// 顾客初始化
|
|
|
case 'userInit';
|
|
case 'userInit';
|
|
|
- print_r([self::$global->kfList,$message['data']]);
|
|
|
|
|
$data = $message['data'];
|
|
$data = $message['data'];
|
|
|
self::userInitEnt($client_id, $data);
|
|
self::userInitEnt($client_id, $data);
|
|
|
break;
|
|
break;
|
|
@@ -254,12 +254,15 @@ class Events
|
|
|
'servicelog_id' => $message['data']['conversationId'],
|
|
'servicelog_id' => $message['data']['conversationId'],
|
|
|
'time_line' => time()
|
|
'time_line' => time()
|
|
|
];
|
|
];
|
|
|
-
|
|
|
|
|
self::$db->insert('ws_chat_log')->cols($serviceLog)->query();
|
|
self::$db->insert('ws_chat_log')->cols($serviceLog)->query();
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
if ($message['data']['sensitiveNumber']) {
|
|
if ($message['data']['sensitiveNumber']) {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
self::$db->query("update `ws_alarm` set `alarm_corresponding` = '$corresponding',alarm_respond=2 where `servicelog_id`= '$servicelog_id'");
|
|
self::$db->query("update `ws_alarm` set `alarm_corresponding` = '$corresponding',alarm_respond=2 where `servicelog_id`= '$servicelog_id'");
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
unset($serviceLog);
|
|
unset($serviceLog);
|
|
|
}
|
|
}
|
|
|
if (isset($message['data']['isFirst']) && $message['data']['isFirst']) {
|
|
if (isset($message['data']['isFirst']) && $message['data']['isFirst']) {
|
|
@@ -439,18 +442,18 @@ class Events
|
|
|
$kfs = self::$global->kfList;
|
|
$kfs = self::$global->kfList;
|
|
|
$groupnamemap = self::$global->groupmap;
|
|
$groupnamemap = self::$global->groupmap;
|
|
|
|
|
|
|
|
- if (!$kfs || empty($nowkfid)) {
|
|
|
|
|
|
|
+ if (!$kfs || empty($nowkfid)) {
|
|
|
return $return;
|
|
return $return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
$ret = [];
|
|
$ret = [];
|
|
|
|
|
|
|
|
foreach ($kfs as $gruop => $users) {
|
|
foreach ($kfs as $gruop => $users) {
|
|
|
- foreach ($users as $uid=>$uinfo){
|
|
|
|
|
- if ($uid != $nowkfid){
|
|
|
|
|
- $ret[] = ['groupid'=>$gruop,'groupname'=>$groupnamemap[$gruop],'kfuid'=>$uid,'kfname'=>$uinfo['name'],'kfjobname'=>$uinfo['job_name']];
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ foreach ($users as $uid => $uinfo) {
|
|
|
|
|
+ if ($uid != $nowkfid) {
|
|
|
|
|
+ $ret[] = ['groupid' => $gruop, 'groupname' => $groupnamemap[$gruop], 'kfuid' => $uid, 'kfname' => $uinfo['name'], 'kfjobname' => $uinfo['job_name']];
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
$return['data'] = $ret;
|
|
$return['data'] = $ret;
|
|
|
return $return;
|
|
return $return;
|
|
@@ -566,6 +569,10 @@ class Events
|
|
|
];
|
|
];
|
|
|
Gateway::sendToClient($tokfidclientid, json_encode($noticeKf, 256));
|
|
Gateway::sendToClient($tokfidclientid, json_encode($noticeKf, 256));
|
|
|
unset($noticeKf);
|
|
unset($noticeKf);
|
|
|
|
|
+
|
|
|
|
|
+ self::servicetrutoother('OUT', $fromkfuid, $toukfid, $oldlog['servicelog_id'], $uid);
|
|
|
|
|
+ self::servicetrutoother('IN', $toukfid, $fromkfuid, $new_id, $uid);
|
|
|
|
|
+
|
|
|
//回转接人,转接成功
|
|
//回转接人,转接成功
|
|
|
Gateway::sendToCurrentClient(json_encode(['message_type' => 'trunconnect', 'data' => ['status' => 1], 256]));
|
|
Gateway::sendToCurrentClient(json_encode(['message_type' => 'trunconnect', 'data' => ['status' => 1], 256]));
|
|
|
|
|
|
|
@@ -674,10 +681,10 @@ class Events
|
|
|
if (empty($uid) || empty($token)) {
|
|
if (empty($uid) || empty($token)) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
- $expire_time_vali = time() - 60 * 60 * 24 * 3;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ $expire_time_vali = time() - 60 * 60 * 24;
|
|
|
$kfid = intval(substr($uid, 2));
|
|
$kfid = intval(substr($uid, 2));
|
|
|
- $ret = self::$db->select('*')->from('ws_users')->where('id= :id and token=:token and expire_time>=:expire_time')->bindValues(array('id' => $kfid, 'token' => $token, 'expire_time' => $expire_time_vali))->row();
|
|
|
|
|
|
|
+ $ret = self::$db->select('*')->from('ws_users')->where('id=:id and token=:token and expire_time>=:expire_time')->bindValues(array('id' => $kfid, 'token' => $token, 'expire_time' => $expire_time_vali))->row();
|
|
|
|
|
+
|
|
|
if ($ret) {
|
|
if ($ret) {
|
|
|
self::$db->update('ws_users')->cols(array('online_status' => 1, 'online_connectid' => $client))->where('id=' . $kfid)->query();
|
|
self::$db->update('ws_users')->cols(array('online_status' => 1, 'online_connectid' => $client))->where('id=' . $kfid)->query();
|
|
|
return $ret;
|
|
return $ret;
|
|
@@ -772,9 +779,9 @@ class Events
|
|
|
//echo "下线:$uid - $client_id - $isKefuoff \n";
|
|
//echo "下线:$uid - $client_id - $isKefuoff \n";
|
|
|
|
|
|
|
|
$adminList = self::$global->adminList ?? [];
|
|
$adminList = self::$global->adminList ?? [];
|
|
|
- $key = array_search($client_id ,$adminList);
|
|
|
|
|
|
|
+ $key = array_search($client_id, $adminList);
|
|
|
if (strlen($key)) {
|
|
if (strlen($key)) {
|
|
|
- array_splice($adminList,$key,1);
|
|
|
|
|
|
|
+ array_splice($adminList, $key, 1);
|
|
|
self::$global->adminList = $adminList;
|
|
self::$global->adminList = $adminList;
|
|
|
}
|
|
}
|
|
|
if (empty($uid)) {
|
|
if (empty($uid)) {
|
|
@@ -1331,6 +1338,9 @@ class Events
|
|
|
|
|
|
|
|
case -1:
|
|
case -1:
|
|
|
$waitMsg = '暂时没有客服上班,请稍后再咨询。';
|
|
$waitMsg = '暂时没有客服上班,请稍后再咨询。';
|
|
|
|
|
+ Gateway::sendToClient($client_id, json_encode(['message_type' => "noservice", 'data' => ['content' => $waitMsg]], 256));
|
|
|
|
|
+ Gateway::closeClient($client_id);
|
|
|
|
|
+ return;
|
|
|
break;
|
|
break;
|
|
|
case -2:
|
|
case -2:
|
|
|
break;
|
|
break;
|
|
@@ -1362,8 +1372,39 @@ class Events
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
Gateway::sendToGroup('group_' . $group, json_encode(['message_type' => 'kfqueuelength', 'leng' => $waitcount], 256));
|
|
Gateway::sendToGroup('group_' . $group, json_encode(['message_type' => 'kfqueuelength', 'leng' => $waitcount], 256));
|
|
|
|
|
+ self::todayqueuelength();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //今天排序累加
|
|
|
|
|
+ private static function todayqueuelength()
|
|
|
|
|
+ {
|
|
|
|
|
+ $dtype = 'user.queue.day.length';
|
|
|
|
|
+ $today = date("Y-m-d");
|
|
|
|
|
+
|
|
|
|
|
+ $sret = self::$db->select('*')->from('ws_countmidtable')->where('dtype=:dtype and mdate=:mdate')->bindValues(array('dtype' => $dtype, 'mdate' => $today))->row();
|
|
|
|
|
+ if ($ret) {
|
|
|
|
|
+ $db->update('ws_countmidtable')->cols(array('dcontent' => intval($sret['dcontent']) + 1))->where('id=' . $sret['id'])->query();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ $db->insert('ws_countmidtable')->cols(array(
|
|
|
|
|
+ 'dtype' => $dtype,
|
|
|
|
|
+ 'mdate' => $today,
|
|
|
|
|
+ 'datatype' => 1,
|
|
|
|
|
+ 'dcontent' => 1))->query();
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ //客服工单转单
|
|
|
|
|
+ private static function servicetrutoother($type, $owen, $otherkfid, $serverid, $clientuid)
|
|
|
|
|
+ {
|
|
|
|
|
+ $db->insert('ws_serviceturn_log')->cols(array(
|
|
|
|
|
+ 'stype' => $type,
|
|
|
|
|
+ 'uid' => $owen,
|
|
|
|
|
+ 'tuid' => $otherkfid,
|
|
|
|
|
+ 'serverid' => $serverid,
|
|
|
|
|
+ 'guestuid' => $clientuid
|
|
|
|
|
+ ))->query();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1617,8 +1658,8 @@ class Events
|
|
|
|
|
|
|
|
$group = self::$db->query("SELECT * FROM `ws_groups`");
|
|
$group = self::$db->query("SELECT * FROM `ws_groups`");
|
|
|
$arr = [];
|
|
$arr = [];
|
|
|
- if ($group){
|
|
|
|
|
- foreach ($group as $val){
|
|
|
|
|
|
|
+ if ($group) {
|
|
|
|
|
+ foreach ($group as $val) {
|
|
|
$arr[$val['id']] = $val['name'];
|
|
$arr[$val['id']] = $val['name'];
|
|
|
}
|
|
}
|
|
|
self::$global->groupmap = $arr;
|
|
self::$global->groupmap = $arr;
|
|
@@ -1689,7 +1730,7 @@ class Events
|
|
|
// 如果对话为客服的最后一次对话且时间小于设定时间则结束工单.
|
|
// 如果对话为客服的最后一次对话且时间小于设定时间则结束工单.
|
|
|
if ($v['time_line'] <= $overtime) {
|
|
if ($v['time_line'] <= $overtime) {
|
|
|
$found_key = array_search($v['servicelog_id'], array_column($serviceLog, 'servicelog_id'));
|
|
$found_key = array_search($v['servicelog_id'], array_column($serviceLog, 'servicelog_id'));
|
|
|
- print_r([1,$serviceLog[$found_key]['client_id']]);
|
|
|
|
|
|
|
+ print_r([1, $serviceLog[$found_key]['client_id']]);
|
|
|
self::serverClose($serviceLog[$found_key]['client_id'], $v['servicelog_id']);
|
|
self::serverClose($serviceLog[$found_key]['client_id'], $v['servicelog_id']);
|
|
|
// 如果对话为客服的最后一次对话且时间小于设定时间前一分钟则给出提示.
|
|
// 如果对话为客服的最后一次对话且时间小于设定时间前一分钟则给出提示.
|
|
|
} elseif ($v['time_line'] <= $setOvertime) {
|
|
} elseif ($v['time_line'] <= $setOvertime) {
|
|
@@ -1735,7 +1776,7 @@ class Events
|
|
|
$serverSensitive = 0; // 客服敏感词报警次数.
|
|
$serverSensitive = 0; // 客服敏感词报警次数.
|
|
|
$csdNumber = 0; // 响应超时次数.
|
|
$csdNumber = 0; // 响应超时次数.
|
|
|
$csdTime = []; // 响应超时时间.
|
|
$csdTime = []; // 响应超时时间.
|
|
|
- foreach ($serviceLog as $k => $v) {
|
|
|
|
|
|
|
+ foreach ($serviceLog as $k => $v) {
|
|
|
// 工单报警总次数.
|
|
// 工单报警总次数.
|
|
|
$allCount = 0;
|
|
$allCount = 0;
|
|
|
// 差评次数.
|
|
// 差评次数.
|