郑州第一人民医院UI

main.js 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580
  1. var ws, hidTel, hidCallID;
  2. var cls = 0;
  3. var lockReconnect = false; //避免重复连接
  4. var scoketDatas = {}; //发送和接收的scoket数据
  5. //var lasttime = new Date().getTime();
  6. //创建scoket连接
  7. function createWebSocket() {
  8. try {
  9. $("#top-search li i").removeClass("active");
  10. Connect();
  11. } catch(e) {
  12. reconnect();
  13. }
  14. }
  15. //连接
  16. function Connect() {
  17. ws = new WebSocket("ws://" + huayi.config.socket_ip + ":" + huayi.config.socket_port);
  18. ws.onopen = function() {
  19. console.log(new Date() + " " + "建立连接");
  20. //心跳检测重置
  21. heartCheck.reset().start();
  22. cls = 0;
  23. $(".Login").addClass("active");
  24. //自动签入
  25. //lasttime = new Date().getTime();
  26. //scoketDatas.Type = "Login";
  27. //scoketDatas.AgentType = "0";
  28. //Send();
  29. };
  30. //接收到消息的回调方法
  31. ws.onmessage = function(evt) {
  32. //如果获取到消息,心跳检测重置
  33. //拿到任何消息都说明当前连接是正常的
  34. heartCheck.reset().start();
  35. var myDate = new Date();
  36. console.log(myDate + " receive " + evt.data);
  37. var data = JSON.parse(evt.data)[0];
  38. if(data) {
  39. var rlt = data.Result;
  40. if(rlt === true) {
  41. var type = data.Type;
  42. console.log("================" + type + "=====================");
  43. switch(type.toLowerCase()) {
  44. case "login":
  45. LoginBack();
  46. break; //签入
  47. case "logout":
  48. LogoutBack();
  49. break; //签出
  50. case "dropcall":
  51. DropCallBack();
  52. break; //挂断
  53. case "makecall":
  54. MakeCallBack();
  55. break; //外呼
  56. case "setstate":
  57. SetState(data);
  58. break; //置忙置闲
  59. case "meeting":
  60. MeetingBack();
  61. break; //多方通话
  62. case "transfer":
  63. TransferBack();
  64. break; //转移
  65. case "consult":
  66. ConsultBack();
  67. break; //协商呼叫
  68. case "hold":
  69. HoldBack();
  70. break; //保持
  71. case "retrieve":
  72. RetrieveBack();
  73. break; //接回
  74. case "incoming":
  75. IncomingBack(data);
  76. break; //来电
  77. case "linestateagent":
  78. LineStateAgentBack(data);
  79. break; //线路状态通知
  80. case "recordpath":
  81. RecordPathBack(data);
  82. break; //录音返回
  83. case "listen":
  84. layer.msg('监听操作成功!');
  85. break;
  86. case "forceagentstate":
  87. updateSeatMonitorlists(); //更新坐席监控内坐席的状态
  88. layer.msg('置闲操作成功!');
  89. break;
  90. case "replace":
  91. updateSeatMonitorlists(); //更新坐席监控内坐席的状态
  92. layer.msg('代接操作成功!');
  93. break;
  94. case "insert":
  95. updateSeatMonitorlists(); //更新坐席监控内坐席的状态
  96. layer.msg('强插操作成功!');
  97. break;
  98. case "intercept":
  99. updateSeatMonitorlists(); //更新坐席监控内坐席的状态
  100. layer.msg('拦截操作成功!');
  101. break;
  102. case "cut":
  103. updateSeatMonitorlists(); //更新坐席监控内坐席的状态
  104. layer.msg('强拆操作成功!');
  105. break;
  106. }
  107. } else {
  108. if(rlt === false) {
  109. var errCode = data.Error % 10000;
  110. var errTips = getErrTips(errCode); //获取错误信息
  111. layer.msg(errTips + '!');
  112. $(".hwzt").text(errTips + '!');
  113. } else {
  114. $(".hwzt").text(rlt);
  115. }
  116. }
  117. }
  118. };
  119. //连接关闭的回调方法
  120. ws.onclose = function(evt) {
  121. if(cls == 0) {
  122. cls = 1;
  123. $(".hwzt").text('连接关闭!');
  124. $("#top-search li i").removeClass("active");
  125. reconnect();
  126. }
  127. };
  128. //连接发生错误的回调方法
  129. ws.onerror = function(evt) {
  130. //产生异常
  131. $(".hwzt").text('连接出现异常!');
  132. console.log(ws);
  133. if(ws == null || ws.readyState != ws.OPEN) {
  134. console.log(new Date() + "开始重连");
  135. reconnect();
  136. }
  137. }
  138. }
  139. //重连
  140. function reconnect() {
  141. if(lockReconnect) return;
  142. lockReconnect = true;
  143. //没连接上会一直重连,设置延迟避免请求过多
  144. setTimeout(function() {
  145. console.log(new Date() + " " + "重连中……");
  146. createWebSocket("ws://" + huayi.config.socket_ip + ":" + huayi.config.socket_port);
  147. lockReconnect = false;
  148. }, 2000);
  149. }
  150. //发送
  151. function Send() {
  152. if(ws.readyState != ws.OPEN) {
  153. reconnect();
  154. }
  155. if(ws.readyState == ws.OPEN) {
  156. var myDate = new Date();
  157. console.log(new Date() + " send " + JSON.stringify(scoketDatas));
  158. ws.send(JSON.stringify(scoketDatas));
  159. }
  160. }
  161. //心跳检测
  162. var heartCheck = {
  163. timeout: 25000, //25秒
  164. timeoutObj: null,
  165. serverTimeoutObj: null,
  166. reset: function() {
  167. clearTimeout(this.timeoutObj);
  168. clearTimeout(this.serverTimeoutObj);
  169. return this;
  170. },
  171. start: function() {
  172. var self = this;
  173. this.timeoutObj = setTimeout(function() {
  174. //这里发送一个心跳,后端收到后,返回一个心跳消息,
  175. //onmessage拿到返回的心跳就说明连接正常
  176. scoketDatas.Type = "Heart";
  177. Send();
  178. self.serverTimeoutObj = setTimeout(function() { //如果超过一定时间还没重置,说明后端主动断开了
  179. ws.close(); //如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
  180. }, self.timeout)
  181. }, this.timeout)
  182. }
  183. }
  184. //签入
  185. function LoginBack() {
  186. $("#top-search li i").removeClass("active");
  187. $(".Logout").addClass("active");
  188. $(".SayBusy").addClass("active");
  189. $(".MakeCall").addClass("active");
  190. $(".zxzt").removeClass("br").addClass("bl");
  191. $(".fwzt").removeClass("br").addClass("bl");
  192. $(".hwzt").text('空闲');
  193. //弹出 相关计划任务
  194. btn_joinTask().then(function(){
  195. //签入成功后 显示右上角 当前参与任务信息
  196. $('#task_real_info').show();
  197. //绑定切换按钮
  198. $(document).off('click', '#btn_switching', switchingTask);
  199. $(document).on('click', '#btn_switching', switchingTask);
  200. //获取当前任务信息
  201. getTaskRealInfo();
  202. if(taskRealInfoTimer) {
  203. clearInterval(taskRealInfoTimer); //停止刷新数据
  204. }
  205. isTaskTimerOn = true;
  206. //每间隔 huayi.config.taskRealInfoTime 刷新数据
  207. refreshTaskRealInfo(huayi.config.taskRealInfoTime);
  208. });
  209. }
  210. //签出
  211. function LogoutBack() {
  212. layer.msg('签出成功!');
  213. $("#top-search li i").removeClass("active");
  214. $(".Login").addClass("active");
  215. $(".zxzt").removeClass("bl").addClass("br");
  216. $(".fwzt").removeClass("bl").addClass("br");
  217. $(".hwzt").text('');
  218. isTaskTimerOn = false;
  219. //停止刷新数据
  220. clearInterval(taskRealInfoTimer);
  221. //签出成功后 隐藏右上角 当前参与任务信息
  222. $('#task_real_info').hide();
  223. //取消绑定切换按钮
  224. $(document).off('click', '#btn_switching', switchingTask);
  225. }
  226. //来电
  227. function IncomingBack(data) {
  228. //组id和group一致是正常弹屏;不一致是预测外呼弹屏;
  229. var openUrl = '';
  230. var openTxt = '';
  231. if(data.TaskIcon === window.localStorage.getItem("group")) {
  232. openUrl = './callScreen/callScreen.html';
  233. openTxt = '来电弹屏';
  234. } else {
  235. openUrl = './autoCallScreen/autoCallScreen.html';
  236. openTxt = '自动外呼弹屏';
  237. }
  238. var p = '<a href="javascript:;" class="active J_menuTab" data-id="' + openUrl + '?tel=' + data.Number + '&CallID=' + data.CallID + '">' + openTxt + data.Number + ' <i class="glyphicon glyphicon-remove-sign"></i></a>';
  239. $(".J_menuTab").removeClass("active");
  240. var nif = '<iframe class="J_iframe J_iframeNew" name="iframe' + data.CallID + '" width="100%" height="100%" src="' + openUrl + '?Number=' + data.Number + '&CallID=' + data.CallID + '" frameborder="0" data-id="' + openUrl + '?tel=' + data.Number + '&CallID=' + data.CallID + '" seamless></iframe>';
  241. $(".J_mainContent").find("iframe.J_iframe").hide().parents(".J_mainContent").append(nif);
  242. $(".J_menuTabs .page-tabs-content").append(p);
  243. hidTel = data.Number;
  244. hidCallID = data.CallID;
  245. }
  246. //挂断
  247. function DropCallBack() {
  248. $("#top-search li i").removeClass("active");
  249. $(".Logout").addClass("active");
  250. $(".SayBusy").addClass("active");
  251. $(".MakeCall").addClass("active");
  252. }
  253. //线路状态通知
  254. function LineStateAgentBack(data) {
  255. //var obj = $("iframe:visible")
  256. //0分机不可用,1空闲,2摘机等待拨号,3正在拨号,4呼出振铃,5来电振铃,6通话中,7播放忙音中,8移除IP分机,9通话保持中
  257. if(data.State == '0') {
  258. $(".hwzt").text('分机不可用'); //左下角状态显示
  259. $(".fwzt").removeClass("bl").addClass("br"); //话机状态灯
  260. $(".zxzt").removeClass("bl").addClass("br"); //坐席状态灯
  261. }
  262. if(data.State == '1') {
  263. if($("#isml").val() == 1) {
  264. $(".hwzt").text('置忙'); //左下角状态显示
  265. $(".zxzt").removeClass("bl").addClass("br");
  266. } else {
  267. $(".hwzt").text('空闲'); //左下角状态显示
  268. $(".zxzt").removeClass("br").addClass("bl");
  269. }
  270. $(".fwzt").removeClass("br").addClass("bl");
  271. if(window.frames['iframe' + hidCallID + '']) {
  272. window.frames['iframe' + hidCallID + ''].clearInter();
  273. }
  274. $("#top-search li i").removeClass("active");
  275. $(".Logout").addClass("active");
  276. if($("#isml").val() == 0) {
  277. $(".SayBusy").addClass("active");
  278. } else {
  279. $(".SayFree").addClass("active");
  280. }
  281. $(".MakeCall").addClass("active");
  282. }
  283. if(data.State == '2') {
  284. $(".hwzt").text('摘机等待拨号'); //左下角状态显示
  285. }
  286. if(data.State == '3') {
  287. $(".hwzt").text('正在拨号'); //左下角状态显示
  288. }
  289. if(data.State == '4') {
  290. $(".hwzt").text('呼出振铃'); //左下角状态显示
  291. }
  292. if(data.State == '5') {
  293. $(".hwzt").text('来电振铃'); //左下角状态显示
  294. $(".fwzt").removeClass("br").addClass("bl"); //话机状态灯
  295. $(".zxzt").removeClass("bl").addClass("br"); //坐席状态灯
  296. }
  297. if(data.State == '6') {
  298. $(".hwzt").text('通话中'); //左下角状态显示
  299. $(".fwzt").removeClass("bl").addClass("br");
  300. $(".zxzt").removeClass("bl").addClass("br");
  301. $("#top-search li i").removeClass("active");
  302. $(".DropCall").addClass("active");
  303. $(".Hold").addClass("active");
  304. $(".Transfer").addClass("active");
  305. $(".Consult").addClass("active");
  306. $(".Meeting").addClass("active");
  307. if(window.frames['iframe' + hidCallID + '']) {
  308. // setTimeout(window.frames['iframe' + hidCallID + ''].calling(), 500); /*因软电话设置为 自动应答 通话时间不计时问题*/
  309. window.frames['iframe' + hidCallID + ''].calling(); /*因软电话设置为 自动应答 通话时间不计时问题*/
  310. }
  311. }
  312. if(data.State == '7') {
  313. $(".hwzt").text('播放忙音中'); //左下角状态显示
  314. }
  315. if(data.State == '8') {
  316. $(".hwzt").text('移除IP分机'); //左下角状态显示
  317. }
  318. if(data.State == '9') {
  319. $(".hwzt").text('通话保持中'); //左下角状态显示
  320. }
  321. }
  322. //外呼
  323. function MakeCallBack() {
  324. $("#top-search li i").removeClass("active");
  325. $(".DropCall").addClass("active");
  326. //20180920新增
  327. $(".Meeting").addClass("active");
  328. $(".Transfer").addClass("active");
  329. $(".Consult").addClass("active");
  330. $(".Hold").addClass("active");
  331. }
  332. /**
  333. * 置忙置闲
  334. * sayOption (点击置忙置闲后的返回值)
  335. * */
  336. function SetState(sayOption) {
  337. if(sayOption.State == '5') {
  338. $(".SayBusy").removeClass("active");
  339. $(".SayFree").addClass("active");
  340. $(".zxzt").removeClass("bl").addClass("br");
  341. $(".hwzt").text('置忙');
  342. $("#isml").val(1);
  343. }
  344. if(sayOption.State == '2') {
  345. $(".SayBusy").addClass("active");
  346. $(".SayFree").removeClass("active");
  347. $(".zxzt").removeClass("br").addClass("bl");
  348. $(".hwzt").text('空闲');
  349. $("#isml").val(0);
  350. }
  351. }
  352. //置忙
  353. function SayBusyBack() {
  354. $(".SayBusy").removeClass("active");
  355. $(".SayFree").addClass("active");
  356. $("#isml").val(1)
  357. }
  358. //坐席班长置闲
  359. function SayFreeBack() {
  360. $(".SayBusy").addClass("active");
  361. $(".SayFree").removeClass("active");
  362. $(".zxzt").removeClass("br").addClass("bl"); // 坐席状态指示
  363. $(".hwzt").text('空闲'); // 坐席状态指示
  364. $("#isml").val(0)
  365. }
  366. //多方通话
  367. function MeetingBack() {
  368. }
  369. //转移
  370. function TransferBack() {
  371. $("#top-search li i").removeClass("active");
  372. $(".Logout").addClass("active");
  373. $(".SayBusy").addClass("active");
  374. $(".MakeCall").addClass("active");
  375. }
  376. //协商呼叫
  377. function ConsultBack() {
  378. // console.log('.....协商呼叫成功!....');
  379. layer.confirm('请您确认转移或者挂机?', {
  380. icon: 3,
  381. btn: ['转移', '挂机'], //按钮
  382. }, function(index, layero) {
  383. // console.log('转移');
  384. scoketDatas = {
  385. "Type": "ConfirmTransfer",
  386. "AgentID": window.localStorage.getItem('userCode'),
  387. "AgentExten": window.localStorage.getItem("extno"),
  388. "EndParmer": "1" //1.转移 3.将对方挂断
  389. };
  390. Send();
  391. layer.close(index);
  392. }, function(index) {
  393. // console.log('挂机');
  394. scoketDatas = {
  395. "Type": "ConfirmTransfer",
  396. "AgentID": window.localStorage.getItem('userCode'),
  397. "AgentExten": window.localStorage.getItem("extno"),
  398. "EndParmer": "3" //1.转移 3.将对方挂断
  399. };
  400. Send();
  401. });
  402. }
  403. //保持
  404. function HoldBack() {
  405. $(".Hold").removeClass("active");
  406. $(".Retrieve").addClass("active");
  407. }
  408. //接回
  409. function RetrieveBack() {
  410. $(".Hold").addClass("active");
  411. $(".Retrieve").removeClass("active");
  412. }
  413. //录音返回
  414. function RecordPathBack(data) {
  415. // $(".hidCallID").val(data.CallID);
  416. // if(hidTel) {
  417. // $.post(huayi.config.callcenter_url + 'CallInScreen/UpdateLY', {
  418. // callid: data.CallID,
  419. // path: data.RecPath,
  420. // }, function(result) {
  421. // result = JSON.parse(result);
  422. // if(result.state.toLowerCase() == "success") {}
  423. // })
  424. // }
  425. }
  426. //更新坐席监控内坐席的状态
  427. function updateSeatMonitorlists() {
  428. top.$("iframe:visible")[0].contentWindow.getSeatsRealStates();
  429. }
  430. //获取 错误信息
  431. //errCode 错误代码
  432. function getErrTips(errCode) {
  433. var errTips = '';
  434. switch(errCode) {
  435. case 9011:
  436. errTips = '分机号不存在';
  437. break;
  438. case 9012:
  439. errTips = '分机号已绑定';
  440. break;
  441. case 9013:
  442. errTips = '坐席已登陆';
  443. break;
  444. case 9058:
  445. errTips = '授权验证失败';
  446. break;
  447. case 10:
  448. errTips = '没有找到线路';
  449. break;
  450. case 11:
  451. errTips = '线路忙';
  452. break;
  453. case 12:
  454. errTips = '线路非空闲';
  455. break;
  456. case 13:
  457. errTips = '线路非振铃';
  458. break;
  459. case 14:
  460. errTips = '非通话';
  461. break;
  462. case 15:
  463. errTips = '线路空闲';
  464. break;
  465. case 16:
  466. errTips = '线路已邦定任务';
  467. break;
  468. case 50:
  469. errTips = '对端线路空';
  470. break;
  471. case 51:
  472. errTips = '对端线路忙';
  473. break;
  474. case 52:
  475. errTips = '非分机';
  476. break;
  477. case 20:
  478. errTips = '没找到座席';
  479. break;
  480. case 21:
  481. errTips = '坐席绑定异常';
  482. break;
  483. case 22:
  484. errTips = '坐席非空闲';
  485. break;
  486. case 30:
  487. errTips = '被监控中';
  488. break;
  489. case 31:
  490. errTips = '错误指令';
  491. break;
  492. case 100:
  493. errTips = '线路关联任务失败';
  494. break;
  495. case 101:
  496. errTips = '执行操作失败';
  497. break;
  498. case 102:
  499. errTips = '呼叫取消';
  500. break;
  501. case 103:
  502. errTips = '挂机失败';
  503. break;
  504. case 104:
  505. errTips = '禁止自呼';
  506. break;
  507. case 110:
  508. errTips = '不是保持状态';
  509. break;
  510. case 111:
  511. errTips = '不在放音';
  512. break;
  513. case 250:
  514. errTips = '正常挂机';
  515. break;
  516. case 251:
  517. errTips = '用户忙';
  518. break;
  519. case 252:
  520. errTips = '未接听';
  521. break;
  522. case 253:
  523. errTips = '没响应';
  524. break;
  525. case 254:
  526. errTips = '拒接';
  527. break;
  528. case 255:
  529. errTips = '未没注册';
  530. break;
  531. case 259:
  532. errTips = '未知';
  533. break;
  534. default:
  535. errTips = errCode;
  536. break;
  537. }
  538. return errTips;
  539. }