<apex:page showChat="false" showHeader="false" sidebar="false">
|
|
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
<head>
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<title></title>
|
<style type="text/css">
|
#Text1 {
|
width: 236px;
|
}
|
|
#TextArea1 {
|
height: 192px;
|
width: 472px;
|
}
|
|
#txtLog {
|
height: 201px;
|
width: 503px;
|
}
|
|
#btnConfig {
|
width: 60px;
|
}
|
|
#btnLogin {
|
width: 60px;
|
}
|
|
#btnLogout {
|
width: 60px;
|
}
|
|
#btnReady {
|
width: 60px;
|
}
|
|
#btnNotReady {
|
width: 60px;
|
}
|
|
#btnMakeCall {
|
width: 78px;
|
}
|
|
#btnAnswer {
|
width: 78px;
|
}
|
|
#btnDTMF {
|
width: 78px;
|
}
|
|
#btnHangup {
|
width: 78px;
|
}
|
|
#btnHold {
|
width: 78px;
|
}
|
|
#btnUnhold {
|
width: 78px;
|
}
|
|
#btnMuteOn {
|
width: 78px;
|
}
|
|
#btnMuteOff {
|
width: 78px;
|
}
|
|
#btnFinish {
|
width: 78px;
|
}
|
|
#btnUnhold {
|
width: 78px;
|
}
|
|
#btnConsultOut {
|
width: 94px;
|
}
|
|
#btnConsultInner {
|
width: 94px;
|
}
|
|
#btnCompleteTransfer {
|
width: 94px;
|
}
|
|
#btnCompleteTransfer0 {
|
width: 94px;
|
}
|
|
#btnCancelTransfer {
|
width: 94px;
|
}
|
|
#btnCompleteTransfer0 {
|
width: 94px;
|
}
|
|
#btnTransOut {
|
width: 94px;
|
}
|
|
#btnTransInner {
|
width: 94px;
|
}
|
|
#btnTransIVR {
|
width: 94px;
|
}
|
|
#btnConsultIVR {
|
width: 94px;
|
}
|
|
#btnCancelConsult {
|
width: 94px;
|
}
|
|
#btnDTMF0 {
|
width: 78px;
|
}
|
|
#btnDTMF1 {
|
width: 78px;
|
}
|
|
#btnMakeCall0 {
|
width: 78px;
|
}
|
|
#btnCallOut {
|
width: 78px;
|
}
|
|
#btnAnswer0 {
|
width: 78px;
|
}
|
|
#btnConsultOut0 {
|
width: 94px;
|
}
|
|
#btnConsultOut1 {
|
width: 94px;
|
}
|
|
#btnConsultOut2 {
|
width: 94px;
|
}
|
|
#btnForceOut0 {
|
width: 83px;
|
}
|
|
#btnForceOut1 {
|
width: 83px;
|
}
|
|
#btnForceOut2 {
|
width: 83px;
|
}
|
|
#btnForceOut3 {
|
width: 83px;
|
}
|
|
#btnListen {
|
width: 81px;
|
}
|
|
#btnInsert {
|
width: 88px;
|
}
|
</style>
|
</head>
|
<body>
|
<!-- <script type="text/javascript" src="cti.js"></script> -->
|
<apex:includeScript value="{!URLFOR($Resource.cti)}"/>
|
<p>
|
<input id="btnLogin" type="button" value="登录" onclick="login()" />
|
<!-- <input id="btnLogout" type="button" value="注销" onclick="logout()" />
|
<input id="btnReady" type="button" value="示闲" onclick="setReady()" />
|
<input id="btnNotReady" type="button" value="示忙" onclick="setNotReady()" />
|
<input id="btnQueryAllAgents" type="button" value="查询座席状态" onclick="queryAllAgentStatus()" /> -->
|
</p>
|
|
|
<!-- <p>
|
<input id="txtNumber" type="text" />
|
<input id="btnCallOut" type="button" value="拨打" onclick="callOut()" />
|
<input id="btnCallInner" type="button" value="呼叫座席" onclick="callInner()" />
|
<input id="btnAnswer" type="button" value="接听" onclick="answer()" />
|
<input id="btnCallInfo" type="button" value="呼叫信息" onclick="showCallInfo()" />
|
</p>
|
<p>
|
<input id="txtDTMF" type="text" />
|
<input id="btnDTMF" type="button" value="二次拨号" onclick="sendDTMF()" />
|
</p>
|
<p>
|
<input id="txtCallData" type="text" />
|
<input id="btnDTMF0" type="button" value="读随路数据" onclick="getCallData()" />
|
<input id="btnDTMF1" type="button" value="写随路数据" onclick="setCallData()" />
|
</p>
|
<p>
|
<input id="btnHold" type="button" value="保持" onclick="hold()" />
|
<input id="btnUnhold" type="button" value="取保持" onclick="unhold()" />
|
<input id="btnMuteOn" type="button" value="设置静音" onclick="setmuteon()" />
|
<input id="btnMuteOff" type="button" value="取消静音" onclick="setmuteoff()" />
|
<input id="btnHangup" type="button" value="挂断" onclick="hangup()" />
|
<input id="btnFinish" type="button" value="结束通话" onclick="finish()" />
|
</p>
|
<p>
|
<input id="txtTransNum" type="text" />
|
</p>
|
<p>
|
<input id="btnTransOut" type="button" value="单步转外线" onclick="transOut()" />
|
<input id="btnTransInner" type="button" value="单步转内线" onclick="transInner()" />
|
<input id="btnTransQueue" type="button" value="转队列" onclick="transQueue()" />
|
<input id="btnTransIVR" type="button" value="单步转IVR" onclick="transIVR()" />
|
<input id="btnConsultIVR" type="button" value="挂起转IVR" onclick="consultIVR()" />
|
</p>
|
<p>
|
<input id="btnConsultOut" type="button" value="协商外线" onclick="consultOut()" />
|
<input id="btnConsultInner" type="button" value="协商座席" onclick="consultInner()" />
|
<input id="btnCompleteTransfer" type="button" value="完成转接" onclick="consultTransfer()" />
|
<input id="btnCompleteTransfer0" type="button" value="三方通话" onclick="consultConference()" />
|
<input id="btnCancelConsult" type="button" value="取消协商" onclick="cancelConsult()" />
|
</p>
|
<p>
|
<input id="txtAgentId" type="text" />
|
</p>
|
<p>
|
<input id="btnForceBusy" type="button" value="强制示忙" onclick="forceBusy()" />
|
<input id="btnForceReady" type="button" value="强制示闲" onclick="forceReady()" />
|
<input id="btnForceOut" type="button" value="强制签出" onclick="forceOut()" />
|
<input id="btnListen" type="button" value="监听" onclick="listen()" />
|
<input id="btnStopListen" type="button" value="停止监听" onclick="stopListen()" />
|
<input id="btnInsert" type="button" value="插入" onclick="insert()" />
|
<input id="btnStopInsert" type="button" value="停止插入" onclick="stopInsert()" />
|
</p> -->
|
|
<script type="text/javascript">
|
|
var cti;
|
var stateDescrArray = ["未登录", "示忙", "示闲", "小休", "振铃", "拨号", "通话", "话后"];
|
var consultStateDescrArray = ["未知状态", "正在呼叫", "协商接通", "三方通话", "三方失败"];
|
|
try {
|
cti = createCTI();
|
cti.onAgentStateChanged = function (e) {
|
AppendLog("状态改变, 当前状态: " + getStateDescr(e.NewState.StateCode));
|
};
|
cti.onAnswerRequest = function () { AppendLog("请求应答"); };
|
cti.onRecordStart = function (e) { AppendLog("录音开始: CallId = " + e.CallId + ", 文件名 = " + e.RecordFileName) };
|
cti.onRecordStop = function (e) { AppendLog("录音停止: CallId = " + e.CallId + ", 文件名 = " + e.RecordFileName) };
|
cti.onConsultStateChange = function (e) { AppendLog("三方状态改变: " + getConsultStateDescr(e.NewState.StateCode)); };
|
cti.onAgentAsrNotify = function (e) { AppendLog("语音识别: ") };
|
cti.onQueueNumNotify = function (e) { AppendLog(e) };
|
cti.attachEvent();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
function getConsultStateDescr(stateCode) {
|
|
if (stateCode < 0 || stateCode >= consultStateDescrArray.length) {
|
return "未知状态";
|
}
|
|
return consultStateDescrArray[stateCode];
|
}
|
|
function getStateDescr(stateCode) {
|
|
if (stateCode < 0 || stateCode >= stateDescrArray.length) {
|
return "未知状态";
|
}
|
|
return stateDescrArray[stateCode];
|
}
|
var GetConfig = function (domain, serverAddress, serverPort, agentID, agentPassword,
|
useWebVoip, webVoipSIPServerIP, webVoipSIPServerPort, webVoipAccount, webVoipPassword) {
|
|
return {
|
"CTI.Provider": "Lusca.LuscaCTIProvider, Lusca" // 提供程序
|
, "CTI.Timeout": "30000" // 超时设置
|
, "CTI.Lusca.ServerAddress": serverAddress // 服务器地址 |domain
|
, "CTI.Lusca.ServerPort": serverPort // 服务器端口号
|
, "CTI.Lusca.EventPollUrl": "http://"+serverAddress+":"+serverPort + "/as/event?agent_id="+agentID
|
, "CTI.Lusca.UseWebVoip": useWebVoip // 是否使用软电话
|
, "CTI.Lusca.WebVoipSIPServerIP": webVoipSIPServerIP // 软电话服务器地址
|
, "CTI.Lusca.WebVoipSIPServerPort": webVoipSIPServerPort // 软电话服务器端口
|
, "CTI.Lusca.WebVoipAccount": webVoipAccount // 软电话账号
|
, "CTI.Lusca.WebVoipPassword": webVoipPassword // 软电话密码
|
, "CTI.AgentID": agentID // 座席工号
|
, "CTI.AgentPassword": agentPassword // 座席密码
|
, "CTI.Lusca.TenantId": "as"
|
, "CTI.Lusca.QueueName": "support@default" //队列
|
, "CTI.UpdatePath": "ftp://192.168.17.141//Lusca"
|
, "CTI.UpdateMode": "0" //0:ftp 1:netbios
|
, "CTI.AutoLogout": "true"
|
, "CTI.EnableVoiceAnalysis": "false"
|
, "CTI.LocalRecording.Mode": ""
|
, "CTI.LocalRecording.Path": ""
|
, "CTI.Lusca.Domain": ""//domain
|
}
|
}
|
|
// 配置参数
|
function config() {
|
try {
|
//var config = GetConfig(服务器地址, 端口, 坐席号, "as", 是否开启软电话,软电话地址, 端口号,软电话号码, 密码);
|
var config = GetConfig("domain_ysb", "223.112.26.254", "9528", "10005", "1234", "true", "223.112.26.254|domain_ysb", "63000", "80005", "1234");
|
//var config = GetConfig("domain_ysb", "223.112.26.254", "9528", "10200", "1234", "true", "223.112.26.254|domain_ysb", "9060", "80200", "pactera_op");
|
cti.setConfig(config);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 登录
|
function login() {
|
try {
|
config();
|
var result = cti.agentLogin(false);
|
|
if (result == 1) {
|
if (confirm("座席已经登录,要强制登录吗?")) {
|
cti.agentLogin(true);
|
}
|
else {
|
return;
|
}
|
}
|
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 注销
|
function logout() {
|
try {
|
cti.agentLogout();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 示闲
|
function setReady() {
|
try {
|
cti.agentSetReady();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 示忙
|
function setNotReady() {
|
try {
|
cti.agentSetNotReady();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 接听
|
function answer() {
|
try {
|
cti.answerCall();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 呼出
|
function callOut() {
|
try {
|
|
var number = txtNumber.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入号码.");
|
return;
|
}
|
|
cti.callOut("", number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 内线呼叫
|
function callInner() {
|
try {
|
|
var number = txtNumber.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入号码.");
|
return;
|
}
|
|
cti.callInner(number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 挂机
|
function hangup() {
|
try {
|
cti.releaseCall();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 二次拨号
|
function sendDTMF() {
|
try {
|
|
var number = txtDTMF.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入号码.");
|
return;
|
}
|
|
cti.sendDTMF(number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 设置静音
|
function setmuteon() {
|
try {
|
cti.setMuteOn();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 取消静音
|
function setmuteoff() {
|
try {
|
cti.setMuteOff();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 读随路数据
|
function getCallData() {
|
try {
|
txtCallData.value = cti.queryCallData();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 写随路数据
|
function setCallData() {
|
try {
|
cti.setCallData(txtCallData.value);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 保持
|
function hold() {
|
try {
|
cti.holdCall();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 取保持
|
function unhold() {
|
try {
|
cti.retrieveCall();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 结束通话(小结时调用)
|
function finish() {
|
try {
|
cti.finishCall(0);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 单步转外线
|
function transOut() {
|
try {
|
var number = txtTransNum.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入号码.");
|
return;
|
}
|
|
cti.transferOut("", number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 单步转内线
|
function transInner() {
|
try {
|
var number = txtTransNum.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入号码.");
|
return;
|
}
|
|
cti.transferInner(number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 单步转队列
|
function transQueue() {
|
try {
|
var number = txtTransNum.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入号码.");
|
return;
|
}
|
|
cti.transferQueue(number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 单步转IVR
|
function transIVR() {
|
try {
|
var number = txtTransNum.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入号码.");
|
return;
|
}
|
|
cti.transferIVR(number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 挂起转IVR
|
function consultIVR() {
|
try {
|
var number = txtTransNum.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入号码.");
|
return;
|
}
|
|
cti.consultIVR(number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 协商外线
|
function consultOut() {
|
try {
|
var number = txtTransNum.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入号码.");
|
return;
|
}
|
|
cti.consultOut("", number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 协商座席
|
function consultInner() {
|
try {
|
var number = txtTransNum.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入号码.");
|
return;
|
}
|
|
cti.consultInner(number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 取消协商
|
function cancelConsult() {
|
try {
|
cti.cancelConsult();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 协商转接
|
function consultTransfer() {
|
try {
|
cti.consultTransfer();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 三方通话
|
function consultConference() {
|
try {
|
cti.consultConference();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 强制示忙
|
function forceBusy() {
|
try {
|
var number = txtAgentId.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入座席工号.");
|
return;
|
}
|
|
cti.forceAgentBusy(number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 强制示闲
|
function forceReady() {
|
try {
|
var number = txtAgentId.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入座席工号.");
|
return;
|
}
|
|
cti.forceAgentReady(number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 强制签出
|
function forceOut() {
|
try {
|
var number = txtAgentId.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入座席工号.");
|
return;
|
}
|
|
cti.forceAgentLogout(number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 监听
|
function listen() {
|
try {
|
var number = txtAgentId.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入座席工号.");
|
return;
|
}
|
|
cti.listen(number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 停止插入
|
function stopListen() {
|
try {
|
cti.stopListen();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 插入
|
function insert() {
|
try {
|
var number = txtAgentId.value;
|
|
if (number == null || number == undefined || number.length == 0) {
|
alert("请输入座席工号.");
|
return;
|
}
|
|
cti.insert(number);
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
// 停止插入
|
function stopInsert() {
|
try {
|
cti.stopInsert();
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
function showCallInfo() {
|
try {
|
var call = cti.getActiveCallInfo();
|
|
if (call != null) {
|
alert("活动呼叫: CallId = " + call.CallId + ", 主叫 = " + call.CallerNum + ", 被叫 = " + call.CalledNum);
|
}
|
|
call = cti.getHeldCallInfo();
|
|
if (call != null) {
|
alert("保持呼叫: CallId = " + call.CallId + ", 主叫 = " + call.CallerNum + ", 被叫 = " + call.CalledNum);
|
}
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
function queryAllAgentStatus() {
|
try {
|
var result = cti.queryAllAgentStatus();
|
|
if (result != null) {
|
|
var str = "";
|
|
for (var i = 0; i < result.length; i++) {
|
|
str += "工号: " + result[i].AgentId;
|
str += ", 状态: " + getStateDescr(result[i].AgentState);
|
str += "\r\n";
|
}
|
|
alert(str);
|
}
|
else {
|
alert("没有座席.");
|
}
|
}
|
catch (e) {
|
alert(e.message);
|
}
|
}
|
|
Date.prototype.Format = function (fmt) { //author: meizz
|
var o = {
|
"M+": this.getMonth() + 1, //月份
|
"d+": this.getDate(), //日
|
"h+": this.getHours(), //小时
|
"m+": this.getMinutes(), //分
|
"s+": this.getSeconds(), //秒
|
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
|
"S": this.getMilliseconds() //毫秒
|
};
|
|
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
|
for (var k in o)
|
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
|
return fmt;
|
}
|
|
// 输出日志
|
function AppendLog(message) {
|
var now = new Date();
|
txtLog.value += now.Format("yyyy-MM-dd hh:mm:ss") + " " + message + "\r\n";
|
}
|
</script>
|
|
<!-- <p>
|
<textarea id="txtLog" name="S1"></textarea>
|
</p> -->
|
|
</body>
|
</html>
|
</apex:page>
|