record.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2. var Controller = {
  3. offset: 0,
  4. limit: 10,
  5. index: function () {
  6. // 初始化表格参数配置
  7. Table.api.init({
  8. extend: {
  9. index_url: 'kefu/record/index' + location.search,
  10. add_url: 'kefu/record/add',
  11. edit_url: 'kefu/record/edit',
  12. del_url: 'kefu/record/del',
  13. multi_url: 'kefu/record/multi',
  14. record_url: 'kefu/record/index/session_id/{session_id}',
  15. table: 'kefu_record',
  16. }
  17. });
  18. var table = $("#table");
  19. // 初始化表格
  20. table.bootstrapTable({
  21. url: $.fn.bootstrapTable.defaults.extend.index_url,
  22. pk: 'id',
  23. sortName: 'id',
  24. columns: [
  25. [
  26. {checkbox: true},
  27. {field: 'id', title: __('Id')},
  28. {field: 'session_id', title: __('Session_id')},
  29. {
  30. field: 'sender_identity',
  31. title: __('Sender_identity'),
  32. searchList: {"0": __('Sender_identity 0'), "1": __('Sender_identity 1')},
  33. formatter: Table.api.formatter.normal,
  34. sortable: true
  35. },
  36. {field: 'sender_id', title: __('Sender_id'), sortable: true},
  37. {
  38. field: 'message_type',
  39. title: __('Message_type'),
  40. searchList: {
  41. "0": __('Message_type 0'),
  42. "1": __('Message_type 1'),
  43. "2": __('Message_type 2'),
  44. "3": __('Message_type 3'),
  45. "4": __('Message_type 4'),
  46. "5": __('Message_type 5')
  47. },
  48. formatter: Table.api.formatter.normal,
  49. sortable: true
  50. },
  51. {
  52. field: 'message',
  53. title: __('Message'),
  54. operate: 'LIKE',
  55. placeholder: '模糊查找',
  56. formatter: Controller.api.formatter.message
  57. },
  58. {
  59. field: 'status',
  60. title: __('Status'),
  61. searchList: {"0": __('Status 0'), "1": __('Status 1')},
  62. formatter: Table.api.formatter.status,
  63. sortable: true
  64. },
  65. {
  66. field: 'createtime',
  67. title: __('Createtime'),
  68. operate: 'RANGE',
  69. addclass: 'datetimerange',
  70. formatter: Table.api.formatter.datetime,
  71. sortable: true
  72. },
  73. {
  74. field: 'operate',
  75. title: __('Operate'),
  76. table: table,
  77. events: Table.api.events.operate,
  78. formatter: Table.api.formatter.operate,
  79. buttons: [
  80. {
  81. name: 'record',
  82. title: '只看该会话',
  83. classname: 'btn btn-xs btn-info btn-addtabs',
  84. icon: 'fa fa-file-text-o',
  85. url: $.fn.bootstrapTable.defaults.extend.record_url,
  86. }
  87. ]
  88. }
  89. ]
  90. ]
  91. });
  92. // 为表格绑定事件
  93. Table.api.bindevent(table);
  94. Controller.api.toolbar = Config.toolbar;
  95. },
  96. sessionrecord: function () {
  97. var session_id = Fast.api.query('session_id');
  98. Controller.api.toolbar = Config.toolbar;
  99. Controller.api.loadRecord(session_id)
  100. $(window).scroll(function (e) {
  101. var scrollTop = $(this).scrollTop();
  102. var scrollHeight = $(document).height();
  103. var windowHeight = $(this).height();
  104. if (scrollTop + windowHeight == scrollHeight) {
  105. Controller.api.loadRecord(session_id)
  106. }
  107. });
  108. $(document).on('click', '.record', function (e) {
  109. var img_obj = $(e.target);
  110. if (img_obj.hasClass('emoji')) {
  111. return;
  112. }
  113. img_obj = img_obj[0];
  114. var scrollTop = $(window).scrollTop();
  115. layer.photos({
  116. photos: {
  117. "title": "聊天图片预览",
  118. "id": "record",
  119. data: [
  120. {
  121. "src": img_obj.src
  122. }
  123. ]
  124. }, end: function () {
  125. $(window).scrollTop(scrollTop)
  126. }, anim: 5
  127. });
  128. });
  129. },
  130. add: function () {
  131. Controller.api.bindevent();
  132. },
  133. edit: function () {
  134. Controller.api.bindevent();
  135. },
  136. api: {
  137. bindevent: function () {
  138. Form.api.bindevent($("form[role=form]"));
  139. },
  140. formatCard: function (message) {
  141. var message = message.split('#');
  142. var message_arr = [];
  143. for (let i in message) {
  144. let message_temp = message[i].split('=');
  145. if (typeof message_temp[1] != 'undefined') {
  146. message_arr[message_temp[0]] = message_temp[1];
  147. }
  148. }
  149. return message_arr;
  150. },
  151. formatter: {
  152. message: function (value, row, index) {
  153. if (row.message_type == 0 || row.message_type == 3) {
  154. let value_length = value.replace(/[\u0391-\uFFE5]/g, "aa").length;
  155. return value_length > 20 ? value.substring(0, 20) + '...' : value;
  156. } else if (row.message_type == 2) {
  157. return Table.api.formatter.url(value, row, index);
  158. } else if (row.message_type == 1) {
  159. return Table.api.formatter.image(value, row, index);
  160. } else if (row.message_type == 4 || row.message_type == 5) {
  161. var message = Controller.api.formatCard(value);
  162. var card_url = (row.message_type == 4) ? Controller.api.toolbar.goods.card_url : Controller.api.toolbar.order.card_url
  163. card_url += '?ref=addtabs&id=' + message['id'];
  164. return '<a class="btn-addtabs" href="' + card_url + '">查看</a>';
  165. }
  166. }
  167. },
  168. loadRecord: function (session_id) {
  169. if (Controller.limit === false) {
  170. return;
  171. }
  172. Fast.api.ajax({
  173. url: 'kefu/record/sessionRecord',
  174. type: 'GET',
  175. dataType: "json",
  176. loading: true,
  177. data: {
  178. addtabs: 1,
  179. sort: 'id',
  180. order: 'asc',
  181. offset: Controller.offset,
  182. limit: Controller.limit,
  183. filter: '{"session_id":"' + session_id + '"}',
  184. op: '{"session_id":"="}',
  185. _: new Date().getTime()
  186. },
  187. success: function (ret) {
  188. var index = Layer.load(true);
  189. index && Layer.close(index);
  190. Controller.offset += 10;
  191. // Controller.limit += 10;
  192. if (ret.rows.length) {
  193. // 渲染到页面
  194. for (var i in ret.rows) {
  195. Controller.api.buildRecord(ret.rows[i])
  196. }
  197. if (ret.rows.length < 10) {
  198. Controller.limit = false;
  199. }
  200. } else {
  201. Controller.limit = false;
  202. }
  203. }
  204. });
  205. },
  206. buildRecord: function (row) {
  207. var message = '';
  208. row.createtime = Table.api.formatter.datetime(row.createtime)
  209. row.sender_identity = (row.sender_identity == 0) ? 'me' : 'you';
  210. if (row.message_type == 1) {
  211. message = Controller.api.buildChatImg(row.message, '聊天图片', 'record');
  212. } else if (row.message_type == 2) {
  213. var file_name = row.message.split('.');
  214. var file_suffix = file_name[file_name.length - 1];
  215. message = Controller.api.buildChatA(row.message, file_suffix, 'record');
  216. } else if (row.message_type == 3) {
  217. Controller.api.buildPrompt(row.message);
  218. return;
  219. } else if (row.message_type == 4 || row.message_type == 5) {
  220. var message_arr = Controller.api.formatCard(row.message);
  221. var card_url = (row.message_type == 4) ? Controller.api.toolbar.goods.card_url : Controller.api.toolbar.order.card_url
  222. card_url += '?ref=addtabs&id=' + message_arr['id'];
  223. message = '<a class="btn-addtabs" href="' + card_url + '">\n' +
  224. ' <div class="record_card">\n' +
  225. ' <img src="' + message_arr['logo'] + '" />\n' +
  226. ' <div class="record_card_body">\n' +
  227. ' <div class="record_card_title">' + message_arr['subject'] + '</div>\n' +
  228. (message_arr['note'] ? '<div class="record_card_note">' + message_arr['note'] + '</div>\n' : '') +
  229. ' <div class="record_card_price">\n' +
  230. (message_arr['price'] ? '<span>¥' + message_arr['price'] + '</span>\n' : '') +
  231. (message_arr['number'] ? '<span>x' + message_arr['number'] + '</span>\n' : '') +
  232. ' </div>\n' +
  233. ' </div>\n' +
  234. ' </div>\n' +
  235. ' </a>';
  236. } else {
  237. message = row.message;
  238. }
  239. $('.chat').append('<div class="record_item">\
  240. <p><span class="user_name">' + row.sender_id + '</span> ' + row.createtime + ' </p>\
  241. <div class="bubble ' + row.sender_identity + '">' + message + '</div>\
  242. </div>');
  243. },
  244. buildChatA: function (filepath, file_suffix, class_name) {
  245. if (class_name == 'record') {
  246. return '<a target="_blank" class="' + class_name + '" href="' + filepath + '">点击下载:' + file_suffix + ' 文件</a>';
  247. } else {
  248. return '<a target="_blank" class="' + class_name + '" href="' + filepath + '">点击下载:' + file_suffix + ' 文件</a>';
  249. }
  250. },
  251. buildChatImg: function (filename, facename, class_name = 'emoji') {
  252. return '<img class="' + class_name + '" title="' + facename + '" src="' + filename + '" />';
  253. },
  254. buildPrompt: function (data) {
  255. $('.chat').append('<div class="status"><span>' + data + '</span></div>');
  256. },
  257. }
  258. };
  259. return Controller;
  260. });