## 來電彈屏
>[info]**功能說明:**
> 在自動外呼(即預測式外呼)中,客戶接聽,電話分配座席后,座席在接聽前,座席電腦上應該會自動彈出本次電話的來電信息,一般會包含有:主叫號碼,主叫號碼歸屬地,主叫用戶信息(姓名,地址,歷史來電記錄,歷史溝通記錄等等)。
> 通過該接口即可實現座席電話振鈴同時座席電腦上自動彈出來電信息。
### **使用websocket獲取座席狀態**
客戶端(瀏覽器),直接使用websocket連接到服務器,服務器會發送座席分機的狀態,根據服務器發送的狀態來判斷瀏覽器是否需要彈屏,如果需要websocket的demo我們可以提供demo文件.
以下為websocket的demo文件部分代碼,僅供參考
`
$(function() {
var lockReconnect = false;//避免重復連接的變量
var ws = null; //WebSocket
var wsUrl = "ws://cs.aicallcenter.cc:2348?ext=8001";//WebSocket地址,參數ext為座席分機號
//創建WebSocket連接
function createWebSocket(url){
try {
if ('WebSocket' in window) {
ws = new WebSocket(url);
} else {
ws = new SockJS(url);
}
initEventHandle();
} catch (e) {
reconnect(wsUrl);
}
}
function reconnect(url) {
if(lockReconnect) return;
lockReconnect = true;
//沒連接上會一直重連,設置延遲避免請求過多
setTimeout(function () {
createWebSocket(wsUrl);
console.log("正在重連,當前時間"+new Date())
lockReconnect = false;
}, 5000); //這里設置重連間隔(ms)
}
function initEventHandle() {
// 連接成功建立后響應
ws.onopen = function() {
console.log("成功連接到" + wsUrl);
//發送登錄信息,服務器端綁座席定分機
var cmd='{"type":"login","ext":"8001"}';//參數ext為座席分機號
ws.send(cmd);
//心跳檢測重置
heartCheck.reset().start();
}
// 收到服務器消息后響應
ws.onmessage = function(e) {
//拿到任何服務器的消息都說明當前連接是正常的
heartCheck.reset().start();
try {
var msg=eval('(' + e.data + ')');
} catch(ex) {
var msg='';
console.log(e);
return false;
}
if(msg){
/*
這里判斷服務器消息是否是談判消息
如果是,則彈屏
*/
}
}
// 連接關閉后響應
ws.onclose = function() {
console.log("關閉連接");
reconnect(wsUrl);//重連
}
ws.onerror = function () {
reconnect(wsUrl);//重連
};
}
//與服務器的心跳
var heartCheck = {
timeout: 30000,//連接超時時間毫秒(30s)
timeoutObj: null,
serverTimeoutObj: null,
reset: function(){
clearTimeout(this.timeoutObj);
clearTimeout(this.serverTimeoutObj);
return this;
},
start: function(){
var self = this;
this.timeoutObj = setTimeout(function(){
//這里發送一個心跳,后端收到后,返回一個心跳消息,拿到返回的心跳就說明連接正常
var cmd='{"type":"heartBeat","ext":"8001"}';//參數ext為座席分機號
ws.send(cmd);
console.log("heartBeat");
//如果超過一定時間還沒重置,說明后端主動斷開了
self.serverTimeoutObj = setTimeout(function(){
ws.close();//如果onclose會執行reconnect,我們執行ws.close()就行了.如果直接執行reconnect 會觸發onclose導致重連兩次
}, self.timeout)
}, this.timeout)
}
}
// 強制退出
window.onunload = function() {
ws.close();
}
createWebSocket(wsUrl);//瀏覽器連接WebSocket
});
`
* **服務器發送的消息**
| 參數 | 類型 | 描述 |
| --- | --- | --- |
| status | string | 請求結果:success:成功。failed:失敗。|
| msg | string | 如果返回failed,對失敗原因的描述。|
| data對象 | json | 返回ext對應的座席的狀態。|
| data.agentNum | string | 座席工號,“簽入”接口中所傳的值。也可用于判斷座席是否簽入,如果為空則未簽入。|
| data.agentName | string | 座席姓名,“簽入”接口中所傳的值。|
| data.agentGroup | string | 座席工作組,“簽入”接口中所傳的值。|
| data.status | string | 座席狀態,系統有:簽入,簽出,空閑,分機未注冊,呼入,呼出,話后,置忙。其他狀態是由“座席置忙”API接口傳的值,如:小休,就餐,培訓,等等。|
| data.callid | string | 本次通話的唯一ID。|
| data.phone | string | 與座席通話的外線號碼。|
| data.callee | string | 被叫號碼,只有呼入才會有值。比如呼叫中心系統有多條個外線號碼,表示主叫撥打的是哪一個號碼 |
| data.calleeQueue | string | 被叫的隊列(組)號碼,只有呼入才會有值,如果在“簽入”接口中,座席同時簽入了多個隊列,該值表示本次接聽的號碼是哪一個隊列分配給座席的電話。|
| data.direction | string | 本次通話的呼叫方向,值:inbound,outbound,(來電彈屏一般是呼入才彈屏,呼出不 彈屏)。|
| data.icon | string | 座席狀態圖標,值:1,2,3 座席客戶端。座席客戶端界面狀態圖標顯示,一般3個顏色,1灰;2綠;3紅;1灰表示座席沒簽入系統;2綠表示隊列會給座席分配電話(空閑是綠);3紅表示隊列不會給座席分配電話(簽入,置忙,通話,話后都是紅),該字段僅供參考,開發人員也可以根據座席狀態顯示業務上需要的狀態圖標。|
* **響應示例**
```
{
"status": "success",
"data": {
"agentNum":"1001",
"agentName":"Linda",
"agentGroup":"6700,6701",
"status":"空閑",
......
......
}
}
```