chat.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import define from '@/utils/define';
  2. import jnpf from '@/utils/jnpf';
  3. import {
  4. useChatStoreWithOut
  5. } from '@/store/modules/chat';
  6. import {
  7. useUserStore
  8. } from '@/store/modules/user';
  9. const chatStore = useChatStoreWithOut();
  10. const userStore = useUserStore();
  11. let socketTask = false;
  12. const Socket = {
  13. conTime: 0,
  14. initSocket() {
  15. try {
  16. const token = uni.getStorageSync('token') || '';
  17. const sys = uni.getStorageSync('systemInfo') || '';
  18. const userInfo = uni.getStorageSync('userInfo') || {};
  19. socketTask = uni.connectSocket({
  20. url: define.webSocketUrl + '/' + encodeURIComponent(token),
  21. // #ifdef APP
  22. header: {
  23. 'User-Agent': sys
  24. },
  25. // #endif
  26. success() {
  27. setTimeout(() => chatStore.setSocket(socketTask), 0);
  28. },
  29. });
  30. socketTask.onMessage((res) => {
  31. let dataStr = res.data;
  32. const data = JSON.parse(dataStr);
  33. let options = {
  34. cover: false,
  35. sound: 'system',
  36. title: data.title
  37. };
  38. switch (data.method) {
  39. case "initMessage": //初始化
  40. const msgInfo = {
  41. messageText: data.messageDefaultText || '暂无数据',
  42. messageCount: data.unreadMessageCount + data.unreadSystemMessageCount < 0 ? 0 : data.unreadMessageCount + data.unreadSystemMessageCount + data.unreadScheduleCount,
  43. messageDate: data.messageDefaultTime || 0,
  44. };
  45. let badgeNum = data.unreadTotalCount;
  46. for (let i = 0; i < data.unreadNums.length; i++) {
  47. badgeNum = badgeNum + data.unreadNums[i].unreadNum;
  48. }
  49. chatStore.setBadgeNum(badgeNum);
  50. chatStore.setMsgInfo(msgInfo);
  51. break;
  52. case "Online": //在线用户
  53. break;
  54. case "Offline": //离线用户
  55. break;
  56. case "sendMessage": //发送消息
  57. chatStore.sendMessage(data);
  58. break;
  59. case "receiveMessage": //接收消息
  60. // #ifdef APP
  61. plus.push.createMessage('你有一条聊天消息', {
  62. ...data,
  63. messageType: 100
  64. }, options);
  65. // #endif
  66. chatStore.receiveMessage(data);
  67. break;
  68. case "messageList": //消息列表
  69. chatStore.getMessageList(data);
  70. break;
  71. case "messagePush": //消息推送
  72. // #ifdef APP
  73. let content = "公告";
  74. if (data.messageType == 2) content = '流程';
  75. if (data.messageType == 3) content = '系统';
  76. if (data.messageType == 4) content = '日程';
  77. uni.createPushMessage(res => {});
  78. uniCloud.callFunction({
  79. name: 'jnpfPush', // 云函数名称
  80. data: {
  81. "push_clientid": uni.getStorageSync('push_clientid'),
  82. "title": data.title,
  83. "content": `你有一条${content}消息`,
  84. "payload": {
  85. "data": {
  86. ...data
  87. },
  88. "options": {
  89. ...options
  90. }
  91. }
  92. },
  93. success: res => {},
  94. fail: err => {}
  95. });
  96. // #endif
  97. chatStore.messagePush(data);
  98. break;
  99. case "closeSocket": //断开websocket连接
  100. Socket.close();
  101. break;
  102. case "logout":
  103. uni.showToast({
  104. title: data.msg || '登录已过期',
  105. icon: 'none',
  106. complete: () => {
  107. setTimeout(() => {
  108. userStore.resetToken();
  109. setTimeout(() => {
  110. Socket.close();
  111. uni.reLaunch({
  112. url: '/pages/login/index'
  113. });
  114. }, 500);
  115. }, 1000);
  116. }
  117. });
  118. break;
  119. case "refresh":
  120. uni.showToast({
  121. title: '您的权限发生变更,正在刷新界面!',
  122. icon: 'none',
  123. complete: () => {
  124. setTimeout(() => {
  125. setTimeout(() => {
  126. uni.reLaunch({
  127. url: '/pages/index/index'
  128. });
  129. }, 500);
  130. }, 1000);
  131. }
  132. });
  133. break;
  134. default:
  135. break;
  136. }
  137. });
  138. socketTask.onOpen((data) => {
  139. Socket.conTime = 0;
  140. const msg = JSON.stringify({
  141. method: "OnConnection",
  142. token,
  143. mobileDevice: true,
  144. systemId: userInfo.appSystemId
  145. });
  146. Socket.sendMsg(msg);
  147. });
  148. socketTask.onClose((data) => {
  149. socketTask = false;
  150. chatStore.setSocket(null);
  151. });
  152. socketTask.onError((data) => {
  153. chatStore.setSocket(null);
  154. setTimeout(() => {
  155. Socket.conTime += 1;
  156. if (Socket.conTime <= 10) {
  157. if (Socket.conTime >= 3) {
  158. uni.showToast({
  159. title: 'IM通讯正在连接:' + '连接第' + Socket.conTime + '次!稍后...',
  160. icon: 'none'
  161. });
  162. }
  163. Socket.reConnect();
  164. } else {
  165. uni.showToast({
  166. title: 'IM通讯连接失败,联系服务器管理员',
  167. icon: 'none'
  168. });
  169. }
  170. }, 10000);
  171. });
  172. } catch (e) {}
  173. },
  174. sendMsg(data) {
  175. if (socketTask === false) return Socket.reConnect();
  176. let content = data;
  177. socketTask.send({
  178. data: content,
  179. complete(e) {}
  180. });
  181. },
  182. //重连
  183. reConnect() {
  184. Socket.initSocket();
  185. },
  186. close() {
  187. socketTask.close({
  188. complete(e) {
  189. socketTask = false;
  190. chatStore.setSocket(null);
  191. }
  192. });
  193. }
  194. };
  195. export default Socket;