Brak opisu

main.js 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. var ws, n = 0,
  2. timer;
  3. var lockReconnect = false; //避免重复连接
  4. var obj = {};
  5. var eorrorConnect;
  6. var cls = 0;
  7. var directType;
  8. var sendType;
  9. var mesCont;
  10. var lasttime = new Date().getTime();
  11. var errorState;
  12. var reconnecTion;
  13. var recon;
  14. var loginOr;
  15. //创建scoket连接
  16. function createWebSocket() {
  17. try {
  18. $("#top-search li i").removeClass("active");
  19. ws = new WebSocket("ws://" + huayi.config.socket_ip + ":" + huayi.config.socket_port);
  20. Connect();
  21. } catch(e) {
  22. reconnect();
  23. }
  24. }
  25. //连接
  26. function Connect() {
  27. try {
  28. ws.onopen = function() {
  29. //console.log(new Date() + " " + "建立连接");
  30. //心跳检测重置
  31. heartCheck.reset().start();
  32. cls = 0;
  33. $(".Login").addClass("active");
  34. if (errorState) {
  35. //自动签入
  36. lasttime = new Date().getTime();
  37. obj.Type = "Login";
  38. obj.AgentType = "0";
  39. Send();
  40. clearInterval(timer);
  41. //loginOr=false;
  42. errorState=false;
  43. }else{
  44. //签入
  45. Send();
  46. }
  47. };
  48. //接收到消息的回调方法
  49. ws.onmessage = function(evt) {
  50. //如果获取到消息,心跳检测重置
  51. //拿到任何消息都说明当前连接是正常的
  52. heartCheck.reset().start();
  53. var myDate = new Date();
  54. console.log(myDate + " receive " + evt.data);
  55. var data = JSON.parse(evt.data)[0];
  56. //打印日志
  57. directType="recive";
  58. sendType=data.Type; //JSON.stringify(data)
  59. mesCont=JSON.stringify(data);
  60. debuggerLog()
  61. if(data) {
  62. var rlt = data.Result;
  63. if(rlt == true) {
  64. var type = data.Type;
  65. if (eorrorConnect) {
  66. LoginBack();
  67. obj.Type = "Login";
  68. Send();
  69. eorrorConnect=false;
  70. }
  71. switch(type.toLowerCase()) {
  72. //case "heart": HeartBack(); break;//心跳
  73. case "login":
  74. LoginBack();
  75. break; //签入
  76. case "logout":
  77. LogoutBack();
  78. break; //签出
  79. case "dropcall":
  80. DropCallBack();
  81. break; //挂断
  82. case "makecall":
  83. MakeCallBack();
  84. break; //外呼
  85. case "setstate":
  86. SetState(data);
  87. break; //置忙置闲
  88. break;
  89. case "meeting":
  90. MeetingBack();
  91. break; //多方通话
  92. case "transfer":
  93. TransferBack();
  94. break; //转移
  95. case "hold":
  96. HoldBack();
  97. break; //保持
  98. case "retrieve":
  99. RetrieveBack();
  100. break; //接回
  101. case "incoming":
  102. IncomingBack(data);
  103. break; //来电
  104. case "subscribe":
  105. SubScribeBack();
  106. break; //监测
  107. case "subscribecancel":
  108. SubScribeCancelBack();
  109. break; //停止监测
  110. case "agentstate":
  111. AgentStateBack(data);
  112. break; //坐席状态
  113. case "linestate":
  114. LineStateBack(data);
  115. break; //线路状态
  116. case "motorsetstate":
  117. SayFreeBack();
  118. break; //班长置闲
  119. case "linestateagent":
  120. LineStateAgentBack(data);
  121. break; //线路状态通知
  122. case "callid":
  123. CallIDBack(data);
  124. break; //获取callid
  125. case "recordpath":
  126. RecordPathBack(data);
  127. break; //录音返回
  128. }
  129. } else {
  130. if(rlt == false) {
  131. if (data.Type=="AcdConnectNotify") {
  132. //LogoutBack();
  133. $(".hwzt").text('连接异常!');
  134. setTimeout(function () {
  135. // 签入
  136. obj.Type = "login";
  137. Send();
  138. }, 5000);
  139. }
  140. $(".hwzt").text('操作失败!');
  141. } else {
  142. $(".hwzt").text(rlt);
  143. }
  144. }
  145. }
  146. };
  147. //连接关闭的回调方法
  148. ws.onclose = function(evt) {
  149. //打印日志
  150. //LogoutBack();
  151. var data = JSON.parse(evt.data)[0];
  152. directType="recive";
  153. sendType="close"; //JSON.stringify(data)
  154. mesCont=JSON.stringify(data);
  155. debuggerLog();
  156. $(".hwzt").text('连接关闭!');
  157. // if(cls == 0) {
  158. // cls = 1;
  159. // $(".hwzt").text('连接关闭!');
  160. // $("#top-search li i").removeClass("active");
  161. // //reconnect();
  162. // }
  163. };
  164. //连接发生错误的回调方法
  165. ws.onerror = function(evt) {
  166. //产生异常
  167. //打印日志
  168. var data = JSON.parse(evt.data)[0];
  169. directType="recive";
  170. sendType="连接错误 "; //JSON.stringify(data)
  171. mesCont=JSON.stringify(data);
  172. debuggerLog();
  173. //LogoutBack();
  174. $(".hwzt").text('连接异常!');
  175. console.log(ws);
  176. // if(ws == null || ws.readyState != ws.OPEN) {
  177. // directType="send";
  178. // sendType="开始重连 "; //JSON.stringify(data)
  179. // mesCont=mesCont;
  180. // debuggerLog()
  181. // console.log(new Date() + "开始重连");
  182. // reconnect();
  183. // eorrorConnect=true
  184. // $(".hwzt").text('连接异常!');
  185. // }
  186. $(".hwzt").text('连接异常!');
  187. };
  188. } catch(ex) {
  189. $(".hwzt").text('连接关闭 try-catch!');
  190. $("#top-search li i").removeClass("active");
  191. reconnect();
  192. }
  193. }
  194. //重连
  195. function reconnect() {
  196. if(lockReconnect){return};
  197. lockReconnect = true;
  198. //没连接上会一直重连,设置延迟避免请求过多
  199. setTimeout(function() {
  200. directType="send";
  201. sendType="重连中 "; //JSON.stringify(data)
  202. mesCont="重连中";
  203. debuggerLog();
  204. console.log(new Date() + " " + "重连中……");
  205. createWebSocket("ws://" + huayi.config.socket_ip + ":" + huayi.config.socket_port);
  206. lockReconnect = false;
  207. }, 5000);
  208. }
  209. function debuggerLog(){
  210. $.post(huayi.config.callcenter_url + 'Log/CallOpt', {
  211. direct: directType,
  212. type: sendType,
  213. cont: mesCont,
  214. "token": $.cookie("token")
  215. }, function(result) {
  216. result = $.parseJSON(result);
  217. if(result.state.toLowerCase() == "warning") {
  218. //layer.msg("创建工单成功");
  219. }
  220. })
  221. }
  222. //异常重连
  223. function errorFun(){
  224. clearInterval(timer);
  225. var errorNum=0
  226. timer = setInterval(function() {
  227. errorNum++;
  228. if (errorNum>2) {
  229. //$("#top-search li i").removeClass("active");
  230. $(".hwzt").text('连接异常!');
  231. }else{
  232. LogoutBack();
  233. }
  234. reconnect();
  235. $(".hwzt").text('连接异常!');
  236. }, 15000);
  237. }
  238. noLine();
  239. clearInterval(recon);
  240. recon = setInterval(function () {
  241. if(loginOr){
  242. noLine();
  243. setTimeout(function () {
  244. lineState();
  245. }, 2000);
  246. }
  247. }, 1000*10);
  248. function lineState(){
  249. if (reconnecTion) {
  250. reconnecTion=false;
  251. }else{
  252. errorState=true;
  253. LogoutBack();
  254. errorFun();
  255. var numEorr=0;
  256. numEorr++;
  257. if (numEorr>2) {
  258. $("#top-search li i").removeClass("active");
  259. }
  260. $(".hwzt").text('网络异常!');
  261. }
  262. }
  263. function noLine(){
  264. $.ajax({
  265. type: "get",
  266. url: huayi.config.callcenter_url + 'UserAccount/GetNowUser',
  267. async: true,
  268. dataType: 'json',
  269. data: {
  270. "token": $.cookie("token")
  271. },
  272. success: function(data) {
  273. reconnecTion = data.data.user.F_UserCode;
  274. }
  275. });
  276. }
  277. //发送
  278. function Send() {
  279. if(ws.readyState != ws.OPEN) {
  280. errorState=true;
  281. LogoutBack();
  282. errorFun();
  283. $(".hwzt").text('连接异常!');
  284. }
  285. if(ws.readyState == ws.OPEN) {
  286. console.log(new Date() + " send " + JSON.stringify(obj));
  287. if (obj.Type) {
  288. directType="send";
  289. sendType=obj.Type;
  290. mesCont=JSON.stringify(obj);
  291. debuggerLog()
  292. }else{
  293. directType="send";
  294. sendType="建立连接";
  295. mesCont=JSON.stringify(obj);
  296. debuggerLog()
  297. }
  298. ws.send(JSON.stringify(obj));
  299. }
  300. }
  301. //心跳检测
  302. var heartCheck = {
  303. timeout: 25000, //25秒
  304. timeoutObj: null,
  305. serverTimeoutObj: null,
  306. reset: function() {
  307. clearTimeout(this.timeoutObj);
  308. clearTimeout(this.serverTimeoutObj);
  309. return this;
  310. },
  311. start: function() {
  312. var self = this;
  313. this.timeoutObj = setTimeout(function() {
  314. //这里发送一个心跳,后端收到后,返回一个心跳消息,
  315. //onmessage拿到返回的心跳就说明连接正常
  316. obj.Type = "Heart";
  317. Send();
  318. self.serverTimeoutObj = setTimeout(function() { //如果超过一定时间还没重置,说明后端主动断开了
  319. ws.close(); //如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
  320. }, self.timeout)
  321. }, this.timeout)
  322. }
  323. }
  324. //签入
  325. function LoginBack() {
  326. loginOr=true;
  327. $("#top-search li i").removeClass("active");
  328. $(".Logout").addClass("active");
  329. $(".SayBusy").addClass("active");
  330. $(".MakeCall").addClass("active");
  331. $(".zxzt").removeClass("br").addClass("bl");
  332. $(".fwzt").removeClass("br").addClass("bl");
  333. $(".hwzt").text('');
  334. }
  335. //签出
  336. function LogoutBack() {
  337. loginOr=false;
  338. $("#top-search li i").removeClass("active");
  339. $(".Login").addClass("active");
  340. $(".zxzt").removeClass("bl").addClass("br");
  341. $(".fwzt").removeClass("bl").addClass("br");
  342. $(".hwzt").text('');
  343. }
  344. //来电
  345. function IncomingBack(data) {
  346. var UserCode
  347. $(".hidTel").val(data.Number);
  348. $(".tel").text(data.Number);
  349. $("#zxdh_").val(data.Number);
  350. $("#tsdh").val(data.Number);
  351. $(".ldtime").text(getNowFormatDate());
  352. $(".thsc").text("00:00");
  353. //获取callid
  354. $.ajaxSettings.async = false;
  355. $.getJSON(huayi.config.callcenter_url + 'CallInScreen/GetCallIdByPhone', {
  356. "tel": $(".hidTel").val(),
  357. "token": $.cookie("token")
  358. }, function(result) {
  359. $.ajaxSettings.async = true;
  360. if(result.state.toLowerCase() == "success") {
  361. $(".hidCallID").val(result.data.CallId);
  362. }
  363. })
  364. //获取信息
  365. $.getJSON(huayi.config.callcenter_url + 'UserAccount/GetNowUser', {
  366. "token": $.cookie("token")
  367. }, function(result) {
  368. if(result.state.toLowerCase() == "success") {
  369. console.log(result);
  370. if(result.data.role) {
  371. console.log(result.data);
  372. UserCode = result.data.user.F_UserCode;
  373. }
  374. }
  375. })
  376. //获取电话所属地
  377. $.getJSON(huayi.config.callcenter_url + 'CallInScreen/GetPhoneLocation', {
  378. "tel": $(".hidTel").val(),
  379. "token": $.cookie("token")
  380. }, function(result) {
  381. if(result.state.toLowerCase() == "success") {
  382. $(".khgsd").text(result.data);
  383. $(".ldlocation").text(result.data);
  384. }
  385. })
  386. //获取客户信息
  387. $(".ldtel").text($(".hidTel").val());
  388. $("#tsdh").val($(".hidTel").val());
  389. $(".ldtel1").val($(".hidTel").val());
  390. $.getJSON(huayi.config.callcenter_url + 'CallInScreen/GetCustomerByTel', {
  391. "tel": $(".hidTel").val(),
  392. "token": $.cookie("token")
  393. }, function(result) {
  394. if(result.state.toLowerCase() == "success") {
  395. if(result.data.length > 0) {
  396. $("#zxr_").val(result.data[0].F_CustomerName);
  397. $("#tskh").val(result.data[0].F_CustomerName);
  398. $("#khid").val(result.data[0].F_CustomerId);
  399. $(".khbh").val(result.data[0].F_CustomerCode);
  400. $(".ldtel1").val(result.data[0].F_Telephone);
  401. $(".ldtel2").val(result.data[0].F_Mobile);
  402. $(".ldtel3").val(result.data[0].F_ChargeTelephone);
  403. }
  404. }
  405. })
  406. loadOld();
  407. $('.maxOpen').trigger("click");
  408. $('.head-pic .lahei .la-before').show();
  409. $('.head-pic .lahei .la-after').hide();
  410. $(".Bacha").hide();
  411. }
  412. function CallIDBack(data) {
  413. //$(".hidCallID").val(data.CurrID);
  414. }
  415. //挂断
  416. function DropCallBack() {
  417. $("#top-search li i").removeClass("active");
  418. $(".Logout").addClass("active");
  419. $(".SayBusy").addClass("active");
  420. $(".MakeCall").addClass("active");
  421. $(".td-call").hide();
  422. //$('.ldtp-con').css("display", 'none');
  423. }
  424. function LineStateAgentBack(data) {
  425. //0分机不可用,1空闲,2摘机等待拨号,3正在拨号,4呼出振铃,5来电振铃,6通话中,7播放忙音中,8移除IP分机,9通话保持中
  426. if(data.State == '0') {
  427. $(".hwzt").text('分机不可用'); //左下角状态显示
  428. }
  429. if(data.State == '1') {
  430. $(".hwzt").text('空闲'); //左下角状态显示
  431. $(".fwzt").removeClass("br").addClass("bl");
  432. clearInterval(timer);
  433. if($(".hidTel").val() && $(".hidCallID").val()) {
  434. $.post(huayi.config.callcenter_url + 'CallInScreen/UpdateGJ', {
  435. callid: $(".hidCallID").val(),
  436. "token": $.cookie("token")
  437. }, function(result) {
  438. result = JSON.parse(result);
  439. if(result.state.toLowerCase() == "success") {}
  440. })
  441. }
  442. $("#top-search li i").removeClass("active");
  443. $(".Logout").addClass("active");
  444. $(".SayBusy").addClass("active");
  445. $(".MakeCall").addClass("active");
  446. $(".td-call").hide();
  447. $(".Bacha").show();
  448. //$(".hidTel").val("");
  449. //$(".hidCallID").val("");
  450. }
  451. if(data.State == '2') {
  452. $(".hwzt").text('摘机等待拨号'); //左下角状态显示
  453. }
  454. if(data.State == '3') {
  455. $(".hwzt").text('正在拨号'); //左下角状态显示
  456. }
  457. if(data.State == '4') {
  458. $(".hwzt").text('呼出振铃'); //左下角状态显示
  459. }
  460. if(data.State == '5') {
  461. $(".hwzt").text('来电振铃'); //左下角状态显示
  462. $(".fwzt").removeClass("bl").addClass("br");
  463. if($(".hidTel").val() && $(".hidCallID").val()) {
  464. $.post(huayi.config.callcenter_url + 'CallInScreen/UpdateZL', {
  465. callid: $(".hidCallID").val(),
  466. "token": $.cookie("token")
  467. }, function(result) {
  468. result = JSON.parse(result);
  469. if(result.state.toLowerCase() == "success") {}
  470. })
  471. }
  472. }
  473. if(data.State == '6') {
  474. $(".hwzt").text('通话中'); //左下角状态显示
  475. $(".fwzt").removeClass("bl").addClass("br");
  476. if($(".hidTel").val() && $(".hidCallID").val()) {
  477. $.post(huayi.config.callcenter_url + 'CallInScreen/UpdateZJ', {
  478. callid: $(".hidCallID").val(),
  479. "token": $.cookie("token")
  480. }, function(result) {
  481. result = JSON.parse(result);
  482. if(result.state.toLowerCase() == "success") {}
  483. })
  484. }
  485. ///
  486. var timestamp = Date.parse(new Date());
  487. //呼叫中心传入城管平台参数
  488. $.ajax({
  489. type: "get",
  490. url: 'http://10.50.80.21:8086/callcenter/PutTel?',
  491. async: true,
  492. dataType: 'json',
  493. data: {
  494. id: $('.user_code').text(),
  495. tel: $(".tel").text(),
  496. time: timestamp
  497. },
  498. success: function(data) {}
  499. });
  500. $(".td-call").show();
  501. n = 0;
  502. $("#top-search li i").removeClass("active");
  503. $(".DropCall").addClass("active");
  504. $(".Hold").addClass("active");
  505. $(".Transfer").addClass("active");
  506. $(".Meeting").addClass("active");
  507. clearInterval(timer);
  508. timer = setInterval(function() {
  509. n++;
  510. var m = parseInt(n / 60 % 60);
  511. var s = parseInt(n % 60);
  512. $(".thsc").text(toDub(m) + ":" + toDub(s));
  513. }, 1000);
  514. }
  515. if(data.State == '7') {
  516. $(".hwzt").text('播放忙音中'); //左下角状态显示
  517. }
  518. if(data.State == '8') {
  519. $(".hwzt").text('移除IP分机'); //左下角状态显示
  520. }
  521. if(data.State == '9') {
  522. $(".hwzt").text('通话保持中'); //左下角状态显示
  523. }
  524. }
  525. function toDub(i) {
  526. return i < 10 ? "0" + i : "" + i;
  527. }
  528. //外呼
  529. function MakeCallBack() {
  530. $("#top-search li i").removeClass("active");
  531. $(".DropCall").addClass("active");
  532. }
  533. //置忙置闲
  534. function SetState(obj) {
  535. if(obj.State == '5') {
  536. $(".SayBusy").removeClass("active");
  537. $(".SayFree").addClass("active");
  538. $(".zxzt").removeClass("bl").addClass("br");
  539. $(".hwzt").text('置忙');
  540. }
  541. if(obj.State == '2') {
  542. $(".SayBusy").addClass("active");
  543. $(".SayFree").removeClass("active");
  544. $(".zxzt").removeClass("br").addClass("bl");
  545. $(".hwzt").text('空闲');
  546. }
  547. }
  548. //置忙
  549. function SayBusyBack() {
  550. $(".SayBusy").removeClass("active");
  551. $(".SayFree").addClass("active");
  552. }
  553. //置闲
  554. function SayFreeBack() {
  555. $(".SayBusy").addClass("active");
  556. $(".SayFree").removeClass("active");
  557. }
  558. //多方通话
  559. function MeetingBack() {
  560. }
  561. //转移
  562. function TransferBack() {
  563. $("#top-search li i").removeClass("active");
  564. $(".Logout").addClass("active");
  565. $(".SayBusy").addClass("active");
  566. $(".MakeCall").addClass("active");
  567. }
  568. //保持
  569. function HoldBack() {
  570. $(".Hold").removeClass("active");
  571. $(".Retrieve").addClass("active");
  572. }
  573. //接回
  574. function RetrieveBack() {
  575. $(".Hold").addClass("active");
  576. $(".Retrieve").removeClass("active");
  577. }
  578. //监测
  579. function SubScribeBack() {
  580. var obj = $("iframe:visible")
  581. if(obj.attr("data-id") == "./TelCall/SeatMonitor.html") {
  582. window.frames[obj.attr("name")].Start();
  583. }
  584. }
  585. //取消监测
  586. function SubScribeCancelBack() {
  587. var obj = $("iframe:visible")
  588. if(obj.attr("data-id") == "./TelCall/SeatMonitor.html") {
  589. window.frames[obj.attr("name")].Stop();
  590. }
  591. }
  592. //班长监测返回状态
  593. //坐席状态
  594. function AgentStateBack(data) {
  595. var obj = $("iframe:visible")
  596. if(obj.attr("data-id") == "./TelCall/SeatMonitor.html") {
  597. window.frames[obj.attr("name")].UpdateAgentState(data.AgentID, data.State);
  598. }
  599. }
  600. //线路状态
  601. function LineStateBack(data) {
  602. var obj = $("iframe:visible")
  603. if(obj.attr("data-id") == "./TelCall/SeatMonitor.html") {
  604. window.frames[obj.attr("name")].UpdateLineState(data.AgentID, data.State);
  605. }
  606. }
  607. //录音返回
  608. function RecordPathBack(data) {
  609. //if ($(".hidTel").val() && $(".hidCallID").val()) {
  610. // $.post(huayi.config.callcenter_url + 'CallInScreen/UpdateLY', { callid: $(".hidCallID").val(),path:data.RecPath, "token": $.cookie("token") }, function (result) {
  611. // result = JSON.parse(result);
  612. // if (result.state.toLowerCase() == "success") {
  613. // }
  614. // })
  615. //}
  616. if($(".hidTel").val()) {
  617. $.post(huayi.config.callcenter_url + 'CallInScreen/UpdateLY', {
  618. callid: data.CallID,
  619. path: data.RecPath,
  620. "token": $.cookie("token")
  621. }, function(result) {
  622. result = JSON.parse(result);
  623. if(result.state.toLowerCase() == "success") {}
  624. })
  625. }
  626. }
  627. //获取当前的日期时间 格式“yyyy-MM-dd HH:mm:ss”
  628. function getNowFormatDate() {
  629. var date = new Date();
  630. var seperator1 = "-";
  631. var seperator2 = ":";
  632. var month = date.getMonth() + 1;
  633. var strDate = date.getDate();
  634. if(month >= 1 && month <= 9) {
  635. month = "0" + month;
  636. }
  637. if(strDate >= 0 && strDate <= 9) {
  638. strDate = "0" + strDate;
  639. }
  640. var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate +
  641. " " + date.getHours() + seperator2 + date.getMinutes() +
  642. seperator2 + date.getSeconds();
  643. return currentdate;
  644. }