Açıklama Yok

main.js 17KB

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