IM12345_Web demo - 代码源于 商丘市12345项目

chat.js 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. var uid = localStorage.getItem("uid");
  2. var ws, obj = {},
  3. lockReconnect = false;
  4. CreateWebSocket();
  5. $(".send_content").focus();
  6. function CreateWebSocket() {
  7. try {
  8. Connect();
  9. } catch (e) {
  10. ReConnect();
  11. }
  12. }
  13. //连接
  14. function Connect() {
  15. //ws = new WebSocket("ws://192.168.4.18:4006");
  16. ws = new WebSocket("ws://192.168.8.10:2022");
  17. //ws = new WebSocket("ws://117.158.196.116:4006");
  18. ws.onopen = function () {
  19. console.log(new Date() + " " + "建立连接");
  20. lockReconnect = false;
  21. obj.action = "cusconn";
  22. obj.code = uid;
  23. Send();
  24. };
  25. //接收到消息的回调方法
  26. ws.onmessage = function (evt) {
  27. console.log(new Date() + " receive " + evt.data);
  28. var data = JSON.parse(evt.data);
  29. if (data) {
  30. var type = data.action;
  31. switch (type.toLowerCase()) {
  32. case "cusconn":
  33. // $(".main_message .chatlist_con").find("li").remove();
  34. if (data.state) {
  35. localStorage.setItem("uid", data.code);
  36. } else {
  37. // $('.notice').html('');
  38. notice("notice", data.msg);
  39. }
  40. if (data.code) {
  41. obj.action = "loglist";
  42. obj.code = data.code;
  43. obj.msg = "";
  44. Send();
  45. }
  46. break;
  47. //case "servicerson":
  48. // append("notice", data.msg);
  49. // break; //通知客服上线
  50. case "cussend":
  51. if (data.state) {
  52. append("self", data.msg, data.time, data.humanclass);
  53. // document.getElementById("msg").value = "";
  54. $('.send_content').val('');
  55. } else {
  56. notice("notice", data.msg);
  57. // $('.notice').html(data.msg);
  58. }
  59. break
  60. case "cusreceive":
  61. append("left", data.msg, data.time, data.humanclass)
  62. break; //收到消息
  63. case "loglist":
  64. var list = data.data.rows;
  65. $(list).each(function (i, n) {
  66. var classname = "left";
  67. if (n.F_FromUser == uid) {
  68. classname = "self";
  69. }
  70. insert(classname, n.F_Message, $(".hidnum").val(), n.F_HumanClass);
  71. })
  72. if (!data.data.isfirst) {
  73. $(".more").css("display", "block");
  74. $(".hidnum").val(data.data.num);
  75. } else {
  76. $(".more").css("display", "none");
  77. }
  78. break; //聊天记录
  79. }
  80. }
  81. };
  82. //连接关闭的回调方法
  83. ws.onclose = function (evt) {
  84. console.log(new Date() + " " + "连接关闭");
  85. console.log(new Date() + " " + "开始重连");
  86. ReConnect();
  87. };
  88. //连接发生错误的回调方法
  89. ws.onerror = function (evt) {
  90. console.log(new Date() + " " + "连接关闭");
  91. console.log(new Date() + " " + "开始重连");
  92. ReConnect();
  93. };
  94. }
  95. //重连
  96. function ReConnect() {
  97. if (!lockReconnect) {
  98. lockReconnect = true;
  99. //没连接上会一直重连,设置延迟避免请求过多
  100. setTimeout(function () {
  101. console.log(new Date() + " " + "重连中……");
  102. lockReconnect = false;
  103. CreateWebSocket();
  104. }, 2000);
  105. }
  106. }
  107. //发送
  108. function Send() {
  109. if (ws.readyState != ws.OPEN) {
  110. ReConnect();
  111. }
  112. if (ws.readyState == ws.OPEN) {
  113. console.log(new Date() + " send " + JSON.stringify(obj));
  114. ws.send(JSON.stringify(obj));
  115. }
  116. }
  117. //查看更多
  118. function getmore() {
  119. obj.action = "loglist";
  120. obj.code = localStorage.getItem("uid");
  121. obj.msg = $(".hidnum").val();
  122. Send();
  123. }
  124. //发送消息
  125. function sendinfo() {
  126. // var msg = document.getElementById("msg").value;
  127. var msg = $('.send_content').val();
  128. if ($.trim(msg)) {
  129. obj.action = "cussend";
  130. obj.msg = msg;
  131. Send();
  132. $(".error").text("");
  133. } else {
  134. $('.send_content').val('');
  135. $(".error").text("请输入内容");
  136. }
  137. }
  138. function append(cname, msg, dates, humanclass) {
  139. var html = '<li>' +
  140. '<p class="message_time"><span>' + dates + '</span></p>' +
  141. '<div class="message_mincon ' + cname + '">'
  142. if (humanclass) {
  143. if (humanclass == 1)
  144. html += '<img class="ver_middle chat_yhtx" src="img/kefuTx.png" alt="" width="30" height="30" />'
  145. else if (humanclass == 2)
  146. html += '<img class="ver_middle chat_yhtx" src="img/youkeTx.png" alt="" width="30" height="30" />'
  147. else
  148. html += '<img class="ver_middle chat_yhtx" src="img/robot.png" alt="" width="30" height="30" />'
  149. }
  150. else {
  151. if (cname == 'self') {
  152. html += '<img class="ver_middle chat_yhtx" src="img/kefuTx.png" alt="" width="30" height="30" />'
  153. } else {
  154. html += '<img class="ver_middle" src="img/youkeTx.png" alt="" width="30" height="30"/>'
  155. }
  156. }
  157. html += '<div class="message_text">' + msg + '</div>' +
  158. '</div>' +
  159. '</li>'
  160. $(html).appendTo($(".chatlist_con")[0]);
  161. console.log($(".chatlist_con")[0].scrollHeight);
  162. $(".chatlist_con").scrollTop($(".chatlist_con")[0].scrollHeight);
  163. }
  164. function insert(cname, msg, nodown, humanclass) {
  165. var html = '<li>' +
  166. // '<p class="message_time"><span>' + n.CreateDate + '</span></p>' +
  167. '<div class="message_mincon ' + cname + '">'
  168. if (humanclass) {
  169. if (humanclass == 1)
  170. html += '<img class="ver_middle chat_yhtx" src="img/kefuTx.png" alt="" width="30" height="30" />'
  171. else if (humanclass == 2)
  172. html += '<img class="ver_middle chat_yhtx" src="img/youkeTx.png" alt="" width="30" height="30" />'
  173. else
  174. html += '<img class="ver_middle chat_yhtx" src="img/robot.png" alt="" width="30" height="30" />'
  175. }
  176. else {
  177. if (cname == 'self') {
  178. html += '<img class="ver_middle chat_yhtx" src="img/kefuTx.png" alt="" width="30" height="30" />'
  179. } else {
  180. html += '<img class="ver_middle" src="img/youkeTx.png" alt="" width="30" height="30"/>'
  181. }
  182. }
  183. html += '<div class="message_text">' + msg + '</div>' +
  184. '</div>' +
  185. '</li>'
  186. var list = $(".chatlist_con").find("li");
  187. if (list.length) {
  188. $(html).insertBefore(list[0]);
  189. }
  190. else {
  191. $(html).appendTo($(".chatlist_con")[0]);
  192. }
  193. if (!nodown) {
  194. $(".chatlist_con").scrollTop($(".chatlist_con")[0].scrollHeight);
  195. }
  196. }
  197. //键盘发送事件
  198. $(document).keydown(function (event) {
  199. event = event || window.event;
  200. if ($(".send_content").is(":focus") == true) {
  201. if (event.keyCode == 13) {
  202. $(".sendTo").click();
  203. event.returnValue = false;
  204. return false
  205. }
  206. }
  207. });
  208. function notice(cname, msg) {
  209. var html = '<li><span class="' + cname + '">' + msg + '</span></li>';
  210. $(html).appendTo($(".chatlist_con")[0]);
  211. $(".chatlist_con").scrollTop($(".chatlist_con")[0].scrollHeight);
  212. }
  213. //智能回复 - 动作 start
  214. // 创建工单
  215. $(".chatlist_con").on('click', "li .message_mincon .message_text #btnaddworkorder", function () {
  216. var width_active = 460;
  217. //$("#chat").width(width_active);
  218. if ($(".chat_main").width() == width_active) {
  219. $(".chat_main").width(782);
  220. $(".chat_rightcontent").css('display', 'none');
  221. } else {
  222. $(".chat_main").width(width_active);
  223. $(".chat_rightcontent").css('display', 'block');
  224. }
  225. });
  226. //信息分类
  227. LB($("#xxlb"));
  228. //主题关键词
  229. ZT($("#keys"));
  230. //事件区域
  231. QY($('#sourcearea'), 0);
  232. $('#sourcearea').change(function () {
  233. QY($('#town'), $(this).val())
  234. })
  235. $('#town').change(function () {
  236. QY($('#village'), $(this).val())
  237. })
  238. //上传附件
  239. $("#scwj").click(function () {
  240. $("#upFile").trigger("click");
  241. })
  242. $("#upFile").change(function () {
  243. upload();
  244. })
  245. // 创建工单
  246. $("#SavedSubmit").click(function () {
  247. var myreg = /^[0-9]*$/;
  248. var myregs = /^[0-9]*$/
  249. var reg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
  250. var cusname = $('#cusname').val(); //姓名
  251. var cussex = $("input[name='sex']:checked").val(); //性别
  252. var touSuphone = $('#touSuphone').val(); //投诉电话
  253. var cusphone = $("#conphone").val(); //投诉人电话
  254. var title = $('#title').val(); //主题
  255. var content = $('#content').val(); //内容
  256. var email = $("#email").val();
  257. var zipcode = $("#zipcode").val();
  258. var sourcearea = $("#sourcearea").val(); //=事发地域id
  259. var sourceaddress = $('#sourceaddress').val(); //=事发详细地址
  260. var type = $('#xxlb').val(); //信息类别ID
  261. var keys = $('#keys').val(); //主题词
  262. var isprotect = $("input[name='secret']:checked").val(); //(0保密1公开)
  263. if (!$.trim(cusname)) {
  264. layer.confirm('请输入姓名!', {
  265. btn: ['确定']
  266. });
  267. return;
  268. }
  269. if (!$.trim(cusphone)) {
  270. layer.confirm('请输入联系电话!', {
  271. btn: ['确定']
  272. });
  273. return;
  274. }
  275. if (!myreg.test($.trim(cusphone))) {
  276. layer.confirm('联系电话格式不正确!', {
  277. btn: ['确定']
  278. });
  279. return;
  280. }
  281. if (email) {
  282. if (!reg.test($.trim(email))) {
  283. layer.confirm('邮箱格式不正确!', {
  284. btn: ['确定']
  285. });
  286. return;
  287. }
  288. }
  289. if (zipcode) {
  290. if (!/^[0-9][0-9]{5}$/.test($.trim(zipcode))) {
  291. layer.confirm('邮编格式不正确!', {
  292. btn: ['确定']
  293. });
  294. return;
  295. }
  296. }
  297. if (!$.trim(touSuphone)) {
  298. layer.confirm('请输入投诉电话!', {
  299. btn: ['确定']
  300. });
  301. return;
  302. }
  303. if (!/^[0-9]*$/.test($.trim(touSuphone))) {
  304. layer.confirm('投诉电话格式不正确!', {
  305. btn: ['确定']
  306. });
  307. return;
  308. }
  309. if (!$.trim(title)) {
  310. layer.confirm('请输入主题!', {
  311. btn: ['确定']
  312. });
  313. return;
  314. }
  315. if (!type) {
  316. layer.confirm('请选择信息类别!', {
  317. btn: ['确定']
  318. });
  319. return;
  320. }
  321. if (!$.trim(content)) {
  322. layer.confirm('请输入内容!', {
  323. btn: ['确定']
  324. });
  325. return;
  326. }
  327. if (!keys) {
  328. layer.confirm('请选择主题词!', {
  329. btn: ['确定']
  330. });
  331. return;
  332. }
  333. if (!$.trim(sourceaddress)) {
  334. layer.confirm('请输入详细地址!', {
  335. btn: ['确定']
  336. });
  337. return;
  338. }
  339. $.ajax({
  340. type: "post",
  341. url: huayi.config.callcenter_url + 'web/AddWebWorkOrder',
  342. async: true,
  343. dataType: 'json',
  344. data: {
  345. cusname: cusname,
  346. cussex: cussex,
  347. conphone: touSuphone,
  348. //投诉电话
  349. cusphone: cusphone,
  350. //=投诉人电话
  351. //cusaddress: cusaddress,
  352. sourcearea: sourcearea,
  353. sourceaddress: $('#town').find("option:selected").text() + " " + $('#village').find("option:selected").text() + " " + $('#sourceaddress').val(),
  354. zipcode: zipcode,
  355. email: email,
  356. title: title,
  357. content: content,
  358. //isfile:isfile,
  359. //filename:filename,
  360. files: $("#file").val(),
  361. keys: keys,
  362. type: type,
  363. source: 4,
  364. issubmit: 1,
  365. //=(0保存1保存并提交)
  366. isprotect: isprotect
  367. },
  368. success: function (result) {
  369. if (result.state.toLowerCase() == "success") {
  370. var msg = '受理编号:' + result.data.workorderid + '&nbsp;查询密码:' + result.data.password + ',如需要查询请进网络查询'
  371. if ($.trim(msg)) {
  372. obj.action = "cusreceive"; //cussend
  373. obj.msg = msg;
  374. Send();
  375. layer.msg('网上受理,提交成功');
  376. }
  377. Clean();
  378. }
  379. }
  380. });
  381. });
  382. //信息类别
  383. function LB(obj) {
  384. obj.empty();
  385. $.ajax({
  386. type: "get",
  387. url: huayi.config.callcenter_url + "web/GetWebTypeList",
  388. async: true,
  389. dataType: 'json',
  390. success: function (data) {
  391. if (data.state.toLowerCase() == "success") {
  392. var content = data.data;
  393. $(content).each(function (i, n) {
  394. $("<option value='" + n.F_ValueId + "'>" + n.F_Value + "</option>").appendTo(obj);
  395. })
  396. }
  397. }
  398. });
  399. }
  400. //主题词
  401. function ZT(obj) {
  402. obj.empty();
  403. //obj.append('<option selected="selected" value="">请选择</option>');
  404. $.ajax({
  405. type: "get",
  406. url: huayi.config.callcenter_url + "web/GetWebKeyList",
  407. async: true,
  408. dataType: 'json',
  409. success: function (data) {
  410. if (data.state.toLowerCase() == "success") {
  411. var content = data.data;
  412. $(content).each(function (i, n) {
  413. $("<option value='" + n.F_ValueId + "'>" + n.F_Value + "</option>").appendTo(obj);
  414. })
  415. }
  416. }
  417. });
  418. }
  419. function QY(obj, aid) {
  420. obj.empty();
  421. //obj.append('<option selected="selected" value="">请选择</option>');
  422. $.ajax({
  423. type: "get",
  424. url: huayi.config.callcenter_url + "Web/GetWebAreaListById",
  425. async: true,
  426. dataType: 'json',
  427. data: {
  428. id: aid,
  429. },
  430. success: function (data) {
  431. if (data.state.toLowerCase() == "success") {
  432. var content = data.data;
  433. $(content).each(function (i, n) {
  434. $("<option value='" + n.F_AreaId + "'>" + n.F_AreaName + "</option>").appendTo(obj);
  435. })
  436. obj.trigger('change')
  437. }
  438. }
  439. });
  440. }
  441. //清除事件
  442. function Clean() {
  443. $('#cusname').val(''); //姓名
  444. $('#conphone').val(''); //联系电话
  445. $('#touSuphone').val(''); //投诉电话
  446. $('#zipcode').val(''); //邮编
  447. $('#email').val(''); //邮箱
  448. $('#title').val(''); //内容主题
  449. $('#content').val(''); //详细内容
  450. $('#sourceaddress').val(''); //事件详细地址
  451. $('#xxlb').val(''); //形式分类id
  452. }
  453. //上传文件
  454. function upload() {
  455. var Files = document.getElementById("upFile").files;
  456. if (Files.length > 0) {
  457. var formData = new FormData();
  458. for (var i = 0; i < Files.length; i++) {
  459. formData.append('file' + i, Files[i]);
  460. }
  461. var typeName = Files[0].name.split('.')[1];
  462. if (typeName == "png" || typeName == 'jpg' || typeName == 'mp4' || typeName == 'mp3' || typeName == 'pdf' || typeName == 'doc' || typeName == 'docx' || typeName == 'xls' || typeName == 'xlsx') {
  463. $.ajax({
  464. url: huayi.config.callcenter_url + "Web/UploadFile",
  465. type: "POST",
  466. data: formData,
  467. /**
  468. *必须false才会自动加上正确的Content-Type
  469. */
  470. contentType: false,
  471. /**
  472. * 必须false才会避开jQuery对 formdata 的默认处理
  473. * XMLHttpRequest会对 formdata 进行正确的处理
  474. */
  475. processData: false,
  476. success: function (result) {
  477. document.getElementById("upFile").outerHTML = document.getElementById("upFile").outerHTML;
  478. $("#upFile").change(function () {
  479. upload();
  480. });
  481. var r = $.parseJSON(result);
  482. if (r.state.toLowerCase() == "success") {
  483. var a = r.data;
  484. $(a).each(function (i, n) {
  485. var strs = '<span class="files" fiel-num="' + n.F_FileId + '">' + n.F_FileName + '<i class="fa del_file">X</i></span>'
  486. $(strs).appendTo($('.fileBox')).find('.del_file').click(function (event) {
  487. event.stopPropagation();
  488. $(this).parent().remove();
  489. file_num();
  490. })
  491. })
  492. file_num();
  493. }
  494. }
  495. });
  496. } else {
  497. layer.msg("格式不正确");
  498. }
  499. } else {
  500. layer.confirm('请上传文件!', {
  501. btn: ['确定']
  502. });
  503. }
  504. }
  505. //智能回复 - 动作 end