Geen omschrijving

main.js 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. if (typeof console == "undefined") {
  2. this.console = {
  3. log: function (msg) { }
  4. };
  5. }
  6. // 如果浏览器不支持websocket,会使用这个flash自动模拟websocket协议,此过程对开发者透明
  7. WEB_SOCKET_SWF_LOCATION = "./js/websocket/WebSocketMain.swf";
  8. // 开启flash的websocket debug
  9. WEB_SOCKET_DEBUG = true;
  10. var ws, n = 0,
  11. timer;
  12. var lockReconnect = false; //避免重复连接
  13. var obj = {};
  14. var Statess;
  15. var cls = 0;
  16. var webData;
  17. var dataLength;
  18. let distributionData = [];
  19. let callDate = [];
  20. let hwcount;
  21. let jtcount;
  22. let daySeatName = ['登陆坐席数量', '呼叫排队数量', '话务量', '呼入接通量'];
  23. let callSeatStateName = ['排队', '振铃', '呼入', '呼出', '空闲', '离席']
  24. var lasttime = new Date().getTime();
  25. let callSeatStateData;
  26. //坐席分析
  27. agentCount();
  28. getPhoneCount();
  29. GetDistributionCount()
  30. setInterval(function () {
  31. agentCount();
  32. getPhoneCount();
  33. GetDistributionCount();
  34. }, 120000)
  35. //坐席数量
  36. function agentCount() {
  37. $.ajax({
  38. url: huayi.config.callcenter_url + "SeatMonitoring/getlist",
  39. data: {},
  40. async: false,
  41. dataType: 'json',
  42. success: function (res) {
  43. dataLength = res.data.length;
  44. }
  45. })
  46. }
  47. //话务量接通量
  48. function getPhoneCount() {
  49. $.ajax({
  50. url: huayi.config.callcenter_url + "/InfoNew/GetTrafficCountByNow",
  51. // url: "http://192.168.8.9:1042/InfoNew/GetTrafficCountByNow",
  52. data: {},
  53. async: false,
  54. dataType: 'json',
  55. success: function (res) {
  56. hwcount = res.data.hw[0].hwcount;
  57. jtcount = res.data.hw[0].jtcount
  58. }
  59. })
  60. }
  61. //话务数据统计
  62. function GetDistributionCount() {
  63. $.ajax({
  64. url: huayi.config.callcenter_url + "InfoNew/GetDistributionCount",
  65. // url: "http://192.168.8.9:1042/InfoNew/GetDistributionCount",
  66. data: {},
  67. async: false,
  68. dataType: 'json',
  69. success: function (res) {
  70. distributionData = [];
  71. let hw = res.data.hw[0];
  72. let gd = res.data.gd[0];
  73. Object.keys(hw).forEach((key, n) => {
  74. if (key == 'hrjtcount') {
  75. distributionData.push({
  76. name: '呼入接通数量',
  77. value: hw[key]
  78. })
  79. }
  80. if (key == 'hcjtcount') {
  81. distributionData.push({
  82. name: '呼出接通数量',
  83. value: hw[key]
  84. })
  85. }
  86. if (key == 'hrtime') {
  87. distributionData.push({
  88. name: '呼入通话时长',
  89. value: hw[key]
  90. })
  91. }
  92. if (key == 'hctime') {
  93. distributionData.push({
  94. name: '呼出通话时长',
  95. value: hw[key]
  96. })
  97. }
  98. if (key == 'pjhrtime') {
  99. distributionData.push({
  100. name: '平均呼入通时',
  101. value: hw[key]
  102. })
  103. }
  104. if (key == 'pjhctime') {
  105. distributionData.push({
  106. name: '平均呼出通时',
  107. value: hw[key]
  108. })
  109. }
  110. if (key == 'fqcount') {
  111. distributionData.push({
  112. name: '放弃呼叫量',
  113. value: hw[key]
  114. })
  115. }
  116. if (key == 'hscount') {
  117. distributionData.push({
  118. name: '日呼损量',
  119. value: hw[key]
  120. })
  121. }
  122. if (key == 'sdhscount') {
  123. distributionData.push({
  124. name: '时段呼损量',
  125. value: hw[key]
  126. })
  127. }
  128. })
  129. Object.keys(gd).forEach((key, n) => {
  130. if (key == 'dxcount') {
  131. distributionData.push({
  132. name: '短信受理量',
  133. value: gd[key]
  134. })
  135. }
  136. if (key == 'wxcount') {
  137. distributionData.push({
  138. name: '微信受理量',
  139. value: gd[key]
  140. })
  141. }
  142. if (key == 'wbcount') {
  143. distributionData.push({
  144. name: '微博受理量',
  145. value: gd[key]
  146. })
  147. }
  148. if (key == 'apcount') {
  149. distributionData.push({
  150. name: 'APP受理量',
  151. value: gd[key]
  152. })
  153. }
  154. if (key == 'xxcount') {
  155. distributionData.push({
  156. name: '市长信箱受理量',
  157. value: gd[key]
  158. })
  159. }
  160. })
  161. distributionData.unshift({
  162. name: '登陆坐席数量',
  163. value: 0
  164. })
  165. distributionData.unshift({
  166. name: '呼叫排队数量',
  167. value: 0
  168. })
  169. }
  170. })
  171. }
  172. Connect()
  173. //创建scoket连接
  174. function createWebSocket() {
  175. try {
  176. Connect();
  177. } catch (e) {
  178. reconnect();
  179. }
  180. }
  181. //连接
  182. function Connect() {
  183. // debugger
  184. ws = new WebSocket("ws://" + huayi.config.socket_ip + ":" + huayi.config.socket_port);
  185. ws.onopen = function () {
  186. console.log(new Date() + " " + "建立连接");
  187. //心跳检测重置
  188. heartCheck.reset().start();
  189. cls = 0;
  190. $(".Login").addClass("active");
  191. lasttime = new Date().getTime();
  192. // debugger
  193. //话务坐席情况
  194. obj = {
  195. "Type": 'GetAgentDetail', //话后处理时长设置,0代表一致话后处理,除非发送置闲 (按照历史习惯,字符串形式)
  196. };
  197. Send();
  198. };
  199. //接收到消息的回调方法
  200. ws.onmessage = function (evt) {
  201. //如果获取到消息,心跳检测重置
  202. //拿到任何消息都说明当前连接是正常的
  203. heartCheck.reset().start();
  204. var myDate = new Date();
  205. data = JSON.parse(evt.data)[0];
  206. if (data.Type == "GetAgentDetail") {
  207. // console.log(data.WaiteCallCount)
  208. // console.log(data.AgentOnlineCount)
  209. distributionData[0].value=data.WaiteCallCount;
  210. distributionData[1].value=data.AgentOnlineCount
  211. let disStr = ''
  212. distributionData.forEach(function (v, n) {
  213. disStr += '<li><label>' + v.name + '</label><span class="num_roll" id="">' + parseInt(v.value % 100000 / 10000) +
  214. '</span><span class="num_roll" id="">' + parseInt(v.value % 10000 / 1000) +
  215. '</span><span class="num_roll" id="">' + parseInt(v.value % 1000 / 100) +
  216. '</span><span class="num_roll"id="">' + parseInt((v.value % 100) / 10) +
  217. '</span><span class="num_roll" id="">' + parseInt(v.value % 10) + '</span></li>'
  218. })
  219. $('.callTraffic .data_info').html(disStr)
  220. callDate = [Number(data.AgentOnlineCount), Number(data.WaiteCallCount), Number(hwcount), Number(jtcount)]
  221. const outLine = dataLength - data.AgentOnlineCount;
  222. callSeatStateData = [data.WaiteCallCount, data.AgentRingCount, data.TrunkCallInCount, data.AgentCallOutCount, data.AgentFreeCount, outLine]
  223. hotThingsChart('timeTraffic', daySeatName, callDate, callDate[0])
  224. hotThingsChart('callSeatState', callSeatStateName, callSeatStateData, 500)
  225. $('.btn_time').click(function (e) {
  226. if (e.target.tagName == 'SPAN') {
  227. if ($(e.target).attr('data-state') == '1') {
  228. $('.daySeat').css('display', 'none')
  229. $('.timeTraffic').css('display', 'inline-block')
  230. $('#traffic').css('display', 'none')
  231. $('#timeTraffic').css('display', 'block')
  232. $('.act').html('当日数据')
  233. $('.call_situation h2').text('话务数据统计')
  234. trafficState = 2
  235. hotThingsChart('timeTraffic', nameD, callDate, callDate[0])
  236. }
  237. }
  238. e.stopPropagation();
  239. })
  240. }
  241. if (data) {
  242. var rlt = data.Result;
  243. if (rlt == true) {
  244. var type = data.Type;
  245. switch (type.toLowerCase()) {
  246. case "subscribe":
  247. SubScribeBack();
  248. break; //监测
  249. case "subscribecancel":
  250. SubScribeCancelBack();
  251. break; //停止监测
  252. case "agentstate":
  253. AgentStateBack(data);
  254. break; //坐席状态
  255. case "linestate":
  256. LineStateBack(data);
  257. break; //线路状态
  258. }
  259. } else {
  260. if (rlt == false) {
  261. //layer.confirm('操作失败!', {
  262. // btn: ['确定']
  263. //});
  264. $(".hwzt").text('操作失败!');
  265. } else {
  266. $(".hwzt").text(rlt);
  267. //layer.confirm(rlt, {
  268. // btn: ['确定']
  269. //});
  270. switch (data.Type.toLowerCase()) {
  271. case "waitcount":
  272. backstageQueue(data);
  273. break;//后台排队
  274. }
  275. }
  276. }
  277. }
  278. }
  279. };
  280. //连接关闭的回调方法
  281. ws.onclose = function (evt) {
  282. if (cls == 0) {
  283. cls = 1;
  284. //console.log("连接关闭!");
  285. //layer.confirm('连接关闭!', {
  286. // btn: ['确定']
  287. //});
  288. $(".hwzt").text('连接关闭!');
  289. $("#top-search li i").removeClass("active");
  290. reconnect();
  291. }
  292. };
  293. //连接发生错误的回调方法
  294. ws.onerror = function (evt) {
  295. //产生异常
  296. $(".hwzt").text('连接出现异常!');
  297. console.log(ws);
  298. if (ws == null || ws.readyState != ws.OPEN) {
  299. console.log(new Date() + "开始重连");
  300. reconnect();
  301. }
  302. };
  303. //}
  304. //重连
  305. function reconnect() {
  306. if (lockReconnect) return;
  307. lockReconnect = true;
  308. //没连接上会一直重连,设置延迟避免请求过多
  309. setTimeout(function () {
  310. console.log(new Date() + " " + "重连中……");
  311. createWebSocket("ws://" + huayi.config.socket_ip + ":" + huayi.config.socket_port);
  312. lockReconnect = false;
  313. }, 2000);
  314. }
  315. //发送
  316. function Send() {
  317. if (ws.readyState != ws.OPEN) {
  318. reconnect();
  319. }
  320. if (ws.readyState == ws.OPEN) {
  321. console.log(new Date() + " send " + JSON.stringify(obj));
  322. ws.send(JSON.stringify(obj));
  323. }
  324. }
  325. //心跳检测
  326. var heartCheck = {
  327. timeout: 25000, //25秒
  328. timeoutObj: null,
  329. serverTimeoutObj: null,
  330. reset: function () {
  331. clearTimeout(this.timeoutObj);
  332. clearTimeout(this.serverTimeoutObj);
  333. return this;
  334. },
  335. start: function () {
  336. var self = this;
  337. this.timeoutObj = setTimeout(function () {
  338. //这里发送一个心跳,后端收到后,返回一个心跳消息,
  339. //onmessage拿到返回的心跳就说明连接正常
  340. obj.Type = "Heart";
  341. Send();
  342. self.serverTimeoutObj = setTimeout(function () { //如果超过一定时间还没重置,说明后端主动断开了
  343. ws
  344. .close(); //如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
  345. }, self.timeout)
  346. }, this.timeout)
  347. }
  348. }
  349. //开始监测
  350. function SubScribeBack() {
  351. $(".star_btn").css("background-color", 'rgb(1,216,235)');
  352. $(".stop_btn").css("background-color", '#064695');
  353. }
  354. //取消监测
  355. function SubScribeCancelBack() {
  356. $(".stop_btn").css("background-color", 'rgb(1,216,235)');
  357. $(".star_btn").css("background-color", '#064695');
  358. $(".stop_btn").addClass("dis");
  359. $(".star_btn").removeClass("dis");
  360. $(".zx_people i").removeClass().addClass("lx");
  361. $(".zx_people i").removeClass().addClass("lx").attr("zx_item", "0").attr("xl_item", "0");
  362. }
  363. //班长监测返回状态
  364. //坐席状态
  365. function AgentStateBack(data) {
  366. var sts = "";
  367. switch (data.State) {
  368. case "0": sts = "lx"; break;//离线
  369. case "1": break;//登录中
  370. case "2": sts = "kx"; break;//空闲
  371. case "3": sts = "th"; break;//通话中
  372. case "4": sts = "hh"; break;//话后处理中
  373. case "5": sts = "ml"; break;//小休
  374. case "6": sts = "zl"; break;//被请求
  375. case "7": sts = "lx"; break;//注销
  376. }
  377. console.log('状态',sts)
  378. if (data.AgentID * 1 < 10) { data.AgentID = '0' + data.AgentID; }
  379. var ele = $("." + data.AgentID).find("i");
  380. if (sts) {
  381. ele.removeClass().addClass(sts);
  382. }
  383. ele.attr("zx_item", data.State);
  384. if ($(".zxtp .g_nums").text() == data.AgentID) {
  385. if (sts) {
  386. $(".zxtp i").removeClass().addClass(sts);
  387. }
  388. }
  389. }
  390. //线路状态
  391. function LineStateBack(data) {
  392. if (data.State.indexOf("|") != -1) {
  393. arr = data.State.split("|");
  394. data.State = arr[0];
  395. }
  396. if (data.AgentID * 1 < 10) { data.AgentID = '0' + data.AgentID; }
  397. var ele = $("." + data.AgentID).find("i");
  398. var sts = "";
  399. switch (data.State) {
  400. case "0": sts = "lx"; break;//分机不可用
  401. case "1": if (!(ele.hasClass("hh") || ele.hasClass("ml"))) { sts = "kx"; } break;//空闲
  402. case "2": sts = "ml"; break;//摘机等待拨号
  403. case "3": sts = "ml"; break;//正在拨号
  404. case "4": sts = "zl"; break;//呼出振铃
  405. case "5": sts = "zl"; break;//来电振铃
  406. case "6": sts = "th"; break;//通话中
  407. case "7": sts = "ml"; break;//播放忙音中
  408. case "8": sts = "th"; break;//通话保持中
  409. case "9": break;//话机移除
  410. case "10": break;//保持/空闲
  411. case "11": break;//保持/摘机等待拨号
  412. case "12": break;//保持/正在拨号
  413. case "13": break;//保持/呼出振铃
  414. case "14": break;//保持/通话中
  415. }
  416. if (sts) {
  417. ele.removeClass().addClass(sts);
  418. }
  419. ele.attr("xl_item", data.State);
  420. if ($(".zxtp .g_nums").text() == data.AgentID) {
  421. if (sts) {
  422. $(".zxtp i").removeClass().addClass(sts);
  423. }
  424. }
  425. }
  426. function toDub(i) {
  427. return i < 10 ? "0" + i : "" + i;
  428. }
  429. //默认记忆上次是否签入,是否置忙置闲 0表示已签入 空闲,1表示签入置忙,2表示签出
  430. function SetStateCookie(state) {
  431. $.cookie("socket_state", state);
  432. }
  433. function backstageQueue(data) {
  434. console.log("123")
  435. var obj = $("iframe:visible")
  436. // if (obj.attr("data-id") == "index_v1.html") {
  437. window.frames[obj.attr("name")].realTimeMonitorQueue(data.WaitCount);
  438. // }
  439. }
  440. //在线坐席信息
  441. function GetAgentListBack(data) {
  442. console.log(data)
  443. $.ajax({
  444. type: "get",
  445. url: huayi.config.callcenter_url + "SeatMonitoring/GetAgentList",
  446. async: true,
  447. dataType: 'json',
  448. data: {
  449. "token": $.cookie("token")
  450. },
  451. success: function (result) {
  452. var user = result.data;
  453. $(user).each(function (j, m) {
  454. $(data.AgentList).each(function (k, g) {
  455. if (g.AgentID == m.UserCode) {
  456. g.userName = m.UserName;
  457. }
  458. })
  459. })
  460. $(data.AgentList).each(function (k, m) {
  461. var strr = '';
  462. switch (m.State) {
  463. case "0":
  464. strr = "离线";
  465. break; //离线
  466. case "1":
  467. break; //登录中
  468. case "2":
  469. strr = "空闲";
  470. break; //空闲
  471. case "3":
  472. strr = "通话中";
  473. break; //通话中
  474. case "4":
  475. strr = "话后处理中";
  476. break; //话后处理中
  477. case "5":
  478. strr = "忙碌";
  479. break; //小休
  480. case "6":
  481. strr = "振铃";
  482. break; //被请求
  483. case "7":
  484. strr = "注销";
  485. break; //注销
  486. }
  487. var html = '<tr fjh="' + m.AgentExten + '">' +
  488. '<td>' + (m.userName ? '' : m.userName) + '</td>' //姓名
  489. +
  490. '<td>' + m.AgentID + '</td>' //工号
  491. +
  492. '<td>' + m.AgentExten + '</td>' //分机号
  493. +
  494. '<td class=" ' + m.UserCode + 'state">' + strr + '</td>' //状态
  495. +
  496. '</tr>';
  497. $(html).appendTo("#zxTable tbody");
  498. })
  499. }
  500. });
  501. }
  502. //获取当前的日期时间 格式“yyyy-MM-dd HH:mm:ss”
  503. function getNowFormatDate() {
  504. var date = new Date();
  505. var seperator1 = "-";
  506. var seperator2 = ":";
  507. var month = date.getMonth() + 1;
  508. var strDate = date.getDate();
  509. if (month >= 1 && month <= 9) {
  510. month = "0" + month;
  511. }
  512. if (strDate >= 0 && strDate <= 9) {
  513. strDate = "0" + strDate;
  514. }
  515. var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate +
  516. " " + date.getHours() + seperator2 + date.getMinutes() +
  517. seperator2 + date.getSeconds();
  518. return currentdate;
  519. }
  520. var iswebcloase = 1;
  521. window.onunload = function () {
  522. if (iswebcloase) {
  523. iswebcloase = 0;
  524. if (ws.readyState == ws.OPEN) {
  525. obj.Type = 'Logout';
  526. Send();
  527. ws.onclose();
  528. }
  529. }
  530. }
  531. window.onbeforeunload = function () {
  532. if (iswebcloase) {
  533. iswebcloase = 0;
  534. if (ws.readyState == ws.OPEN) {
  535. obj.Type = 'Logout';
  536. Send();
  537. ws.onclose();
  538. }
  539. }
  540. }