Ei kuvausta

seatMonitorList.js 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  1. /**
  2. * 坐席监控
  3. * */
  4. var groupLists = []; //坐席組数组
  5. var postSeatsLists = []; //post的参数
  6. var seatRealSateTimer = null; //定时器
  7. var isTimerOn = false;//定时器是否开启
  8. $(function() {
  9. getGroups().then(function() {
  10. getSeatLists(); //获取全部坐席
  11. });
  12. //tab切换
  13. $('#tab_head_left li').click(function() {
  14. var tabIndex = $(this).attr('data-index');
  15. $(this).addClass('tab_head_active').siblings().removeClass('tab_head_active');
  16. $('#tab_contents .seat_lists_all').eq(tabIndex).addClass('show_lists').siblings().removeClass('show_lists');
  17. });
  18. //监测
  19. $('#HY_monitor').on('click', function() {
  20. switch($(this).val()) {
  21. case "开始监测":
  22. // if(top.$('#navbarTopLinks').find('i.Login').hasClass('active')) {
  23. // layer.confirm('您还没有签入,请签入后再试...', {
  24. // icon: 7,
  25. // btn: ['确定'] //按钮
  26. // });
  27. // return;
  28. // }
  29. getSeatsRealStates();
  30. $(this).val("停止监测");
  31. if(seatRealSateTimer){
  32. clearInterval(seatRealSateTimer); //停止刷新数据
  33. }
  34. isTimerOn = true;
  35. refreshDatas(huayi.config.monitorPlatformTime); //开始刷新数据
  36. break;
  37. case "停止监测":
  38. $(this).val("开始监测");
  39. isTimerOn = false;
  40. clearInterval(seatRealSateTimer); //停止刷新数据
  41. getSeatLists();
  42. break;
  43. }
  44. });
  45. });
  46. //获取全部坐席
  47. function getSeatLists() {
  48. var loadIndex;
  49. $.ajax({
  50. type: "get",
  51. url: huayi.config.callcenter_url + "signtokenapi/api/useraccount/getseatlist",
  52. dataType: 'json',
  53. async: true,
  54. beforeSend: function() { //触发ajax请求开始时执行
  55. loadIndex = layer.load();
  56. },
  57. success: function(data) {
  58. layer.close(loadIndex);
  59. if(data.state.toLowerCase() === "success") {
  60. data = data.data;
  61. $('#seat_lists').html('');
  62. if(data && data.length > 0) {
  63. $.each(data, function(i, v) {
  64. postSeatsLists.push({
  65. "group_id": v.group, // 坐席所在组ID
  66. // "agent_id": v.usercode - 0 // 坐席ID
  67. "agent_id": Number(v.usercode) // 坐席ID
  68. });
  69. $('#seat_lists').append('<div class="col-sm-2 seat_item_content seat_outline">' +
  70. '<div class="seat_item clearfix" onclick="btn_opareteSeats(event)">' +
  71. '<div class="seat_item_left pull-left">' +
  72. '<div class="seat_head_img">' +
  73. '<img id="headImg_' + v.id + '" class="img-circle" src="' + v.head_small_img + '" alt="头像" onerror="this.src=\'../img/zxPhone.png\'">' +
  74. '</div>' +
  75. '</div>' +
  76. '<div class="seat_item_right pull-right">' +
  77. '<p class="seat_name">' + v.username + '</p>' +
  78. '<p class="seat_usercode" id="seat_usercode_'+ v.usercode +'">工号:' + v.usercode + '</p>' +
  79. '<p>分机号:<span class="seat_userextid">未知</span></p>' +
  80. '<p class="seat_usernum">坐席组:' + formatterGroups(groupLists, v.group) + '</p>' +
  81. '<p class="seat_callee"></p>' +
  82. '<p id="seat_listen_'+ v.usercode +'" class="seat_listen"></p>'+
  83. '</div>' +
  84. '<p class="seat_state">' +
  85. '<i class="fa icon-weizhi state_des_icon"></i>' +
  86. '</p>' +
  87. '</div>' +
  88. '</div>');
  89. //头像
  90. var ipUrl = v.head_small_img;
  91. if(ipUrl) {
  92. $('#headImg_' + v.id).attr('src', ipUrl);
  93. } else {
  94. $('#headImg_' + v.id).attr('src', '../img/pro_default_user.png');
  95. }
  96. });
  97. updateTable1(data); //更新表格
  98. calculatCount();
  99. } else {
  100. $('#seat_lists').html('<p class="text-center">没有找到您想要的记录呢!我会努力的...</p>');
  101. }
  102. }
  103. },
  104. error: function(textStatus) {
  105. layer.close(loadIndex);
  106. layer.confirm('网络繁忙,请稍后再试...', {
  107. icon: 7,
  108. closeBtn: 0,
  109. btn: ['确定'] //按钮
  110. });
  111. },
  112. complete: function(XMLHttpRequest, textStatus) {
  113. layer.close(loadIndex);
  114. if(textStatus == 'timeout') {
  115. var xmlhttp = window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHttp");
  116. xmlhttp.abort();
  117. layer.confirm('网络超时,请稍后再试...', {
  118. icon: 7,
  119. closeBtn: 0,
  120. btn: ['确定'] //按钮
  121. });    
  122. }
  123. },
  124. });
  125. }
  126. /**
  127. * 获取坐席组
  128. */
  129. function getGroups() {
  130. var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象
  131. $.getJSON(huayi.config.callcenter_url + "callcenterapi/api/sysseatgroup/getlist", function(data) {
  132. if(data.state.toLowerCase() == "success") {
  133. var content = data.data;
  134. if(content && content.length > 0) {
  135. $(content).each(function(i, n) {
  136. groupLists.push({
  137. 'id': n.id,
  138. 'names': n.zxzname
  139. })
  140. });
  141. }
  142. dtd.resolve(); // 改变Deferred对象的执行状态
  143. }
  144. })
  145. return dtd.promise(); // 返回promise对象
  146. }
  147. /**
  148. * 监测坐席状态 坐席实时状态
  149. */
  150. function getSeatsRealStates() {
  151. $.ajax({
  152. type: "post",
  153. url: huayi.config.callcenter_url + "callcenterapi/api/autocall/postsend",
  154. async: true,
  155. // ContentType: 'application/json',
  156. // data: JSON.stringify(postSeatsLists), //也可以不带参数名传递
  157. // dataType: 'json',
  158. data: {
  159. posturl: huayi.config.callcenter_acd_url + "v1/acd/AgentlMgr/state", //(请求的连接)
  160. postobj: JSON.stringify(postSeatsLists), //(json数据)
  161. },
  162. success: function(data) {
  163. data = JSON.parse(data);
  164. if(data.state.toLowerCase() === "success") {
  165. data = data.data;
  166. if(data.state.toLowerCase() === "success") {
  167. data = data.data;
  168. if(data && data.length > 0) {
  169. var seat_lists_usercodes = $('#seat_lists').find('.seat_usercode');
  170. if(seat_lists_usercodes.length > 0) {
  171. $.each(seat_lists_usercodes, function(i, v) {
  172. $.each(data, function(j, k) {
  173. if(Number($(v).text().substring(3)) === k.agent_id) {
  174. $(v).siblings().find('.seat_userextid').text(k.extid === 0 ? '未知' : k.extid);
  175. //根据 agent_state 获取坐席状态对应的 class
  176. var real_sate_class = formatterSeatState(k.agent_state).agentStateClass;
  177. $(v).parent().parent().parent().attr('class', 'col-sm-2 seat_item_content ' + real_sate_class);
  178. //根据 class 名获取 对应的图标
  179. var seatIcon = formatterSeatStateClass(real_sate_class).agentStateIcon;
  180. $(v).parent().siblings('.seat_state').html('<i class="fa ' + seatIcon + ' state_des_icon"></i>');
  181. $(v).parent().parent().parent().attr('data-agent_state', k.agent_state); //坐席状态
  182. $(v).parent().parent().parent().attr('data-ext_state', k.ext_state); //线路状态
  183. //通话中,获取电话号码
  184. if(k.agent_state === 3) {
  185. getSeatsCallStates(k.agent_id, k.extid, $(v));
  186. } else {
  187. $(v).siblings('.seat_callee').html('');
  188. }
  189. // console.log('被监听状态:.............' + k.mon_state);
  190. //被监听状态
  191. if(k.mon_state === 1){
  192. $('#seat_listen_'+ k.agent_id).text('被监听中•••');
  193. }else{
  194. $('#seat_listen_'+ k.agent_id).text('');
  195. }
  196. }
  197. });
  198. });
  199. //计算 实时状态的数量
  200. calculatCount();
  201. updateTable2(data); //更新表格
  202. }
  203. }
  204. }
  205. }
  206. },
  207. error: function(textStatus) {
  208. layer.confirm('网络繁忙,请稍后再试...', {
  209. icon: 7,
  210. closeBtn: 0,
  211. btn: ['确定'] //按钮
  212. });
  213. },
  214. complete: function(XMLHttpRequest, textStatus) {
  215. if(textStatus == 'timeout') {
  216. var xmlhttp = window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHttp");
  217. xmlhttp.abort();
  218. layer.confirm('网络超时,请稍后再试...', {
  219. icon: 7,
  220. closeBtn: 0,
  221. btn: ['确定'] //按钮
  222. });    
  223. }
  224. },
  225. });
  226. }
  227. /**
  228. * 监测 坐席通话关联状态
  229. * agent_id 坐席ID
  230. * ext_id 分机ID
  231. * el 坐席工号所在元素
  232. */
  233. function getSeatsCallStates(agent_id, ext_id, el) {
  234. var postCallJson = [{
  235. "agent_id": agent_id,
  236. "ext_id": ext_id
  237. }];
  238. $.ajax({
  239. type: "post",
  240. url: huayi.config.callcenter_url + "callcenterapi/api/autocall/postsend",
  241. async: true,
  242. data: {
  243. posturl: huayi.config.callcenter_cti_url + "v1/cti/AgentlMgr/assoc/info", //(请求的连接)
  244. postobj: JSON.stringify(postCallJson), //(json数据)
  245. },
  246. success: function(data) {
  247. data = JSON.parse(data);
  248. if(data.state.toLowerCase() === "success") {
  249. data = data.data;
  250. if(data.state.toLowerCase() === "success") {
  251. data = data.data;
  252. if(data && data.length > 0) {
  253. if(data[0].caller_flag === 1){//1-是主叫
  254. if(data[0].callee){
  255. el.siblings('.seat_callee').html('呼出:' + data[0].callee); //呼出 主叫
  256. }else{
  257. el.siblings('.seat_callee').html('');
  258. }
  259. }else{
  260. if(data[0].caller){
  261. el.siblings('.seat_callee').html('呼入:' + data[0].caller); //呼入 被叫
  262. }else{
  263. el.siblings('.seat_callee').html('');
  264. }
  265. }
  266. }
  267. }
  268. }
  269. },
  270. error: function(textStatus) {
  271. layer.confirm('网络繁忙,请稍后再试...', {
  272. icon: 7,
  273. closeBtn: 0,
  274. btn: ['确定'] //按钮
  275. });
  276. },
  277. complete: function(XMLHttpRequest, textStatus) {
  278. if(textStatus == 'timeout') {
  279. var xmlhttp = window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHttp");
  280. xmlhttp.abort();
  281. layer.confirm('网络超时,请稍后再试...', {
  282. icon: 7,
  283. closeBtn: 0,
  284. btn: ['确定'] //按钮
  285. });    
  286. }
  287. },
  288. });
  289. }
  290. //操作坐席
  291. function btn_opareteSeats(event) {
  292. event.stopPropagation();
  293. if($('#HY_monitor').val() === '开始监测') {
  294. layer.confirm('您还没有开始监测,请点击开始监测后再操作!', {
  295. icon: 7,
  296. closeBtn: 0,
  297. btn: ['确定'] //按钮
  298. });
  299. return
  300. }
  301. if(top.$('#navbarTopLinks').find('i.Login').hasClass('active')) {
  302. layer.confirm('您还没有签入,请签入后再操作!', {
  303. icon: 7,
  304. btn: ['确定'] //按钮
  305. });
  306. return;
  307. }
  308. var $el = $(event.currentTarget);//当前被点击的元素 .seat_item
  309. var real_sate_class = $el.parent().attr('class').split(' ')[2];//元素的状态class名
  310. var agent_state_title = formatterSeatStateClass(real_sate_class).agentStateTitle;//坐席状态对应的名称
  311. var oparate_agent_state = $el.parent().attr('data-agent_state'); //坐席状态
  312. var oparate_ext_state = $el.parent().attr('data-ext_state'); //线路状态
  313. var head_img = $el.find('.img-circle').attr('src'); //头像
  314. var seat_name = $el.find('.seat_name').text(); //姓名
  315. var seat_usercode = $el.find('.seat_usercode').text().split(':')[1]; //工号
  316. var call_number = $el.find('.seat_callee').text(); //呼出或呼入
  317. if(seat_usercode === window.localStorage.getItem('userCode')){
  318. layer.confirm('您不能在坐席监控中对自己进行操作!', {
  319. icon: 7,
  320. closeBtn: 0,
  321. btn: ['确定'] //按钮
  322. });
  323. return;
  324. }
  325. if($('#seat_usercode_'+ window.localStorage.getItem('userCode')).parent().parent().parent().hasClass('seat_calling')){
  326. layer.confirm('您当前在通话中不能对坐席进行操作!', {
  327. icon: 7,
  328. btn: ['确定'] //按钮
  329. });
  330. return;
  331. }
  332. var layerTitle = '';//弹出窗口的 title
  333. if(call_number){
  334. layerTitle = '当前状态: ' + agent_state_title + '(' + call_number + ')';
  335. }else{
  336. layerTitle = '当前状态: ' + agent_state_title;
  337. }
  338. //(小休/空闲)置闲 (通话中/通话中)监听强插强拆拦截 (空闲/来电振铃)代接
  339. // console.log('坐席:'+ oparate_agent_state + ', 线路:' + oparate_ext_state);
  340. if((oparate_agent_state === '5' && oparate_ext_state === '1')
  341. || (oparate_agent_state === '3' && oparate_ext_state === '6')
  342. || (oparate_agent_state === '2' && oparate_ext_state === '5')) {
  343. layer.open({
  344. type: 2,
  345. content: "template/opareteSeats.html?oparate_agent_state=" + oparate_agent_state + "&oparate_ext_state=" + oparate_ext_state + "&head_img=" + head_img + "&seat_name=" + seat_name + "&seat_usercode=" + seat_usercode, //iframe的url,no代表不显示滚动条
  346. title: layerTitle,
  347. closeBtn: 1,
  348. area: ['496px', '340px'], //宽高
  349. });
  350. }else{
  351. layer.confirm('当前坐席无需操作!', {
  352. title: layerTitle,
  353. icon: 7,
  354. closeBtn: 0,
  355. btn: ['确定'] //按钮
  356. });
  357. }
  358. }
  359. //计算 实时状态的数量
  360. function calculatCount() {
  361. var seat_items = $('#seat_lists').find('.seat_item_content');
  362. var totalCount = seat_items.length; //全部坐席数量
  363. var offlineCount = 0; //离线数量
  364. var freeCount = 0; //空闲数量
  365. var callingCount = 0; //通话中数量
  366. var afterCallCount = 0; //话后处理数量
  367. var busyCount = 0; //置忙数量(小休)
  368. $.each(seat_items, function(i, v) {
  369. var seat_state_class = $(v).attr('class').substring(27);
  370. switch(seat_state_class) {
  371. case 'seat_busy':
  372. offlineCount++;
  373. break;
  374. case 'seat_free':
  375. freeCount++;
  376. break;
  377. case 'seat_calling':
  378. callingCount++;
  379. break;
  380. case 'seat_after_call':
  381. afterCallCount++;
  382. break;
  383. case 'seat_ringing':
  384. busyCount++;
  385. break;
  386. default:
  387. break;
  388. }
  389. });
  390. var onlineCount = freeCount + callingCount + afterCallCount + busyCount; //在线数量
  391. $('#seat_sts').find('.total_count').text(totalCount);
  392. $('#seat_sts').find('.online_count').text(onlineCount);
  393. $('#seat_sts').find('.outline_count').text(offlineCount);
  394. $('#seat_sts').find('.free_count').text(freeCount);
  395. $('#seat_sts').find('.in_call_count').text(callingCount);
  396. $('#seat_sts').find('.call_in_count').text(afterCallCount);
  397. $('#seat_sts').find('.busy_count').text(busyCount);
  398. }
  399. /**
  400. * 刷新 数据
  401. * monitorPlatformTime 刷新间隔
  402. * */
  403. function refreshDatas(monitorPlatformTime) {
  404. var objTime = {
  405. init: 0,
  406. time: function() {
  407. if(top.$("iframe:visible").contents().find('.layui-layer').length === 0) {
  408. objTime.init += 1000;
  409. //console.log(objTime.init);
  410. //当页面没有click、keydown、mousewheel 并且没有layer 弹窗时;每间隔 monitorPlatformTime 刷新数据;
  411. if(objTime.init == monitorPlatformTime) {
  412. getSeatsRealStates();
  413. objTime.init = 0;
  414. }
  415. }
  416. },
  417. eventFun: function() {
  418. clearInterval(seatRealSateTimer);
  419. objTime.init = 0;
  420. if(isTimerOn){
  421. seatRealSateTimer = setInterval(objTime.time, 1000);
  422. }
  423. }
  424. }
  425. seatRealSateTimer = setInterval(objTime.time, 1000);
  426. var body = document.querySelector('html');
  427. body.addEventListener("click", objTime.eventFun);
  428. body.addEventListener("keydown", objTime.eventFun);
  429. body.addEventListener("mousewheel", objTime.eventFun);
  430. }
  431. /**
  432. * 更新列表1 (用于检测之前)
  433. * tData 数据
  434. */
  435. function updateTable1(tData) {
  436. $('#list').html('');
  437. $.each(tData, function(i, v) {
  438. var tr = '<tr><td>' + (i + 1) + '</td>' +
  439. '<td>' + v.username + '</td>' +
  440. '<td class="seat_list_usercode">' + v.usercode + '</td>' +
  441. '<td class="extid">未知</td>' +
  442. '<td class="agent_ip">未知</td>' +
  443. '<td>' + formatterGroups(groupLists, v.group) + '</td>' +
  444. '<td>' + formatterGroupType(v.seat_right) + '</td>' +
  445. '<td class="time_login">未知</td>' +
  446. '<td class="login_times">0</td>' +
  447. '<td class="free_times">0</td>' +
  448. '<td class="repose_times">0</td>' +
  449. '<td class="talk_times">0</td>' +
  450. '<td class="repose_num">0</td>' +
  451. '<td class="answer_num">0</td>' +
  452. '<td class="cur_state_times">0</td>' +
  453. '<td class="agent_state">未知</td>' +
  454. '<td class="ext_state">未知</td>' +
  455. '<td class="mon_state">未知</td></tr>';
  456. $('#list').append(tr);
  457. });
  458. }
  459. /**
  460. * 更新列表2(用于检测之后)
  461. * tData 数据
  462. */
  463. function updateTable2(tData) {
  464. var s_usercodes = $('#list').find('.seat_list_usercode');
  465. $.each(s_usercodes, function(j, k) {
  466. $.each(tData, function(i, v) {
  467. if($(k).text() == v.agent_id) {
  468. $(k).siblings('.extid').text(v.extid === 0 ? '未知' : v.extid); //分机号
  469. $(k).siblings('.agent_ip').text(v.agent_ip === '' ? '未知' : v.agent_ip); //坐席IP
  470. var time_logins = v.time_login === 0 ? '未知' : helper.DateFormat.timestampToTime(v.time_login);
  471. $(k).siblings('.time_login').text(time_logins); //签入时间
  472. $(k).siblings('.login_times').text(v.login_times); //签入时长
  473. $(k).siblings('.free_times').text(v.free_times); //空闲时长
  474. $(k).siblings('.repose_times').text(v.repose_times); //休息时长
  475. $(k).siblings('.talk_times').text(v.talk_times); //通话时长
  476. $(k).siblings('.repose_num').text(v.repose_num); //休息次数
  477. $(k).siblings('.answer_num').text(v.answer_num); //应答次数
  478. $(k).siblings('.cur_state_times').text(v.cur_state_times); //当前状态时长
  479. $(k).siblings('.agent_state').text(formatterSeatState(v.agent_state).agentStateName); //坐席状态
  480. $(k).siblings('.ext_state').text(formatterExtState(v.ext_state)); //分机状态
  481. $(k).siblings('.mon_state').text(formatterListenState(v.mon_state)); //被监听状态
  482. }
  483. });
  484. });
  485. }
  486. /**
  487. * 格式化坐席组 角色
  488. * option1 数组
  489. * option2 id
  490. */
  491. function formatterGroups(option1, option2) {
  492. var groupName = '';
  493. $(option1).each(function(i, n) {
  494. if(option2 === n.id) {
  495. groupName = n.names;
  496. }
  497. });
  498. return groupName;
  499. }
  500. /**
  501. * 格式化坐席类型
  502. * typeVal 坐席类型的值
  503. * 0 普通坐席 1 班长坐席
  504. */
  505. function formatterGroupType(typeVal) {
  506. var typeName = '-';
  507. switch(typeVal) {
  508. case 0:
  509. typeName = '普通坐席';
  510. break;
  511. case 1:
  512. typeName = '班长坐席';
  513. break;
  514. default:
  515. break;
  516. }
  517. return typeName;
  518. }
  519. // 格式化 坐席状态的class名,获取 对应的状态名称和icon
  520. function formatterSeatStateClass(real_sate_class) {
  521. var agent_state_title = '';
  522. var agent_state_icon = '';
  523. switch(real_sate_class) {
  524. case 'seat_outline':
  525. agent_state_title = '未知';
  526. agent_state_icon = 'icon-weizhi';
  527. break;
  528. case 'seat_free':
  529. agent_state_title = '空闲中';
  530. agent_state_icon = 'icon-kongxian';
  531. break;
  532. case 'seat_busy':
  533. agent_state_title = '离线';
  534. agent_state_icon = 'icon-zhuxiao';
  535. break;
  536. case 'seat_after_call':
  537. agent_state_title = '话后处理中';
  538. agent_state_icon = 'icon-kongxian1';
  539. break;
  540. case 'seat_call_out':
  541. agent_state_title = '已签入';
  542. agent_state_icon = 'icon-denglu';
  543. break;
  544. case 'seat_ringing':
  545. agent_state_title = '小休';
  546. agent_state_icon = 'icon-xiuxi';
  547. break;
  548. case 'seat_calling':
  549. agent_state_title = '通话中';
  550. agent_state_icon = 'icon-tonghuazhong';
  551. break;
  552. case 'seat_requset':
  553. agent_state_title = '被请求中';
  554. agent_state_icon = 'icon-qingqiu';
  555. break;
  556. default:
  557. break;
  558. }
  559. return {
  560. 'agentStateTitle': agent_state_title,
  561. 'agentStateIcon': agent_state_icon,
  562. };
  563. }
  564. /**
  565. * 格式化坐席状态 获取class 名称 和 状态名
  566. * agent_state 坐席状态值
  567. * 0x00 未知 0x01 已签入 0x02 空闲 0x03 通话中 0x04 话后处理 0x05 小休 0x06 被请求 0x07 离线
  568. */
  569. function formatterSeatState(agent_state) {
  570. var agent_state_class = '';
  571. var typeName = '-';
  572. switch(agent_state) {
  573. case 0x00:
  574. agent_state_class = 'seat_outline'; //未知
  575. typeName = '未知';
  576. break;
  577. case 0x01:
  578. agent_state_class = 'seat_call_out'; //已签入
  579. typeName = '已签入';
  580. break;
  581. case 0x02:
  582. agent_state_class = 'seat_free'; //空闲
  583. typeName = '空闲';
  584. break;
  585. case 0x03:
  586. agent_state_class = 'seat_calling'; //通话中
  587. typeName = '通话中';
  588. break;
  589. case 0x04:
  590. agent_state_class = 'seat_after_call'; //话后处理
  591. typeName = '话后处理';
  592. break;
  593. case 0x05:
  594. agent_state_class = 'seat_ringing'; //小休
  595. typeName = '小休';
  596. break;
  597. case 0x06:
  598. agent_state_class = 'seat_requset'; //被请求
  599. typeName = '被请求';
  600. break;
  601. case 0x07:
  602. agent_state_class = 'seat_busy'; //离线
  603. typeName = '离线';
  604. break;
  605. default:
  606. break;
  607. }
  608. return {
  609. "agentStateClass": agent_state_class,
  610. "agentStateName": typeName
  611. };
  612. }
  613. /**
  614. * 格式化线路状态
  615. * typeVal 线路状态的值
  616. * 0x00,分机不可用 0x01,空闲 0x02,摘机等待拨号 0x03,正在拨号 0x04,呼出振铃
  617. * 0x05,来电振铃 0x06,通话中 0x07,播放忙音中 0x08,移除IP分机 0x0100,通话保持中
  618. */
  619. function formatterExtState(typeVal) {
  620. var typeName = '-';
  621. switch(typeVal) {
  622. case 0x00:
  623. typeName = '分机不可用';
  624. break;
  625. case 0x01:
  626. typeName = '空闲';
  627. break;
  628. case 0x02:
  629. typeName = '摘机等待拨号';
  630. break;
  631. case 0x03:
  632. typeName = '正在拨号';
  633. break;
  634. case 0x04:
  635. typeName = '呼出振铃';
  636. break;
  637. case 0x05:
  638. typeName = '来电振铃';
  639. break;
  640. case 0x06:
  641. typeName = '通话中';
  642. break;
  643. case 0x07:
  644. typeName = '播放忙音中';
  645. break;
  646. case 0x08:
  647. typeName = '移除IP分机';
  648. break;
  649. case 0x0100:
  650. typeName = '通话保持中';
  651. break;
  652. default:
  653. break;
  654. }
  655. return typeName;
  656. }
  657. /**
  658. * 格式化坐席监听状态
  659. * typeVal 坐席监听的值
  660. * 0 未被监听 1 被监听中
  661. */
  662. function formatterListenState(typeVal) {
  663. var typeName = '-';
  664. switch(typeVal) {
  665. case 0:
  666. typeName = '未被监听';
  667. break;
  668. case 1:
  669. typeName = '被监听中';
  670. break;
  671. default:
  672. break;
  673. }
  674. return typeName;
  675. }