chat.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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 ?
  43. 0 : data.unreadMessageCount + data.unreadSystemMessageCount + data
  44. .unreadScheduleCount,
  45. messageDate: data.messageDefaultTime || 0,
  46. }
  47. let badgeNum = data.unreadTotalCount
  48. for (let i = 0; i < data.unreadNums.length; i++) {
  49. badgeNum = badgeNum + data.unreadNums[i].unreadNum
  50. }
  51. chatStore.setBadgeNum(badgeNum)
  52. chatStore.setMsgInfo(msgInfo)
  53. break;
  54. case "Online": //在线用户
  55. break;
  56. case "Offline": //离线用户
  57. break;
  58. case "sendMessage": //发送消息
  59. chatStore.sendMessage(data)
  60. break;
  61. case "receiveMessage": //接收消息
  62. // #ifdef APP
  63. plus.push.createMessage('你有一条聊天消息', {
  64. ...data,
  65. messageType: 100
  66. }, options);
  67. // #endif
  68. chatStore.receiveMessage(data)
  69. break;
  70. case "messageList": //消息列表
  71. chatStore.getMessageList(data)
  72. break;
  73. case "messagePush": //消息推送
  74. // #ifdef APP
  75. let content = "公告"
  76. if (data.messageType == 2) content = '流程'
  77. if (data.messageType == 3) content = '系统'
  78. if (data.messageType == 4) content = '日程'
  79. plus.push.createMessage(`你有一条${content}消息`, data, options);
  80. // #endif
  81. chatStore.messagePush(data)
  82. break;
  83. case "closeSocket": //断开websocket连接
  84. Socket.close()
  85. break;
  86. case "logout":
  87. uni.showToast({
  88. title: data.msg || '登录已过期',
  89. icon: 'none',
  90. complete: () => {
  91. setTimeout(() => {
  92. userStore.resetToken()
  93. setTimeout(() => {
  94. Socket.close()
  95. uni.reLaunch({
  96. url: '/pages/login/index'
  97. })
  98. }, 500)
  99. }, 1000)
  100. }
  101. })
  102. break;
  103. default:
  104. break;
  105. }
  106. })
  107. socketTask.onOpen((data) => {
  108. Socket.conTime = 0
  109. const msg = JSON.stringify({
  110. method: "OnConnection",
  111. token,
  112. mobileDevice: true,
  113. systemId: userInfo.appSystemId
  114. });
  115. Socket.sendMsg(msg)
  116. })
  117. socketTask.onClose((data) => {
  118. socketTask = false
  119. chatStore.setSocket(null)
  120. })
  121. socketTask.onError((data) => {
  122. chatStore.setSocket(null)
  123. setTimeout(() => {
  124. Socket.conTime += 1
  125. if (Socket.conTime <= 10) {
  126. if (Socket.conTime >= 3) {
  127. uni.showToast({
  128. title: 'IM通讯正在连接:' + '连接第' + Socket.conTime + '次!稍后...',
  129. icon: 'none'
  130. })
  131. }
  132. Socket.reConnect();
  133. } else {
  134. uni.showToast({
  135. title: 'IM通讯连接失败,联系服务器管理员',
  136. icon: 'none'
  137. })
  138. }
  139. }, 10)
  140. })
  141. } catch (e) {}
  142. },
  143. sendMsg(data) {
  144. if (socketTask === false) return Socket.reConnect()
  145. let content = data;
  146. socketTask.send({
  147. data: content,
  148. complete(e) {}
  149. })
  150. },
  151. //重连
  152. reConnect() {
  153. Socket.initSocket()
  154. },
  155. close() {
  156. socketTask.close({
  157. complete(e) {
  158. socketTask = false
  159. chatStore.setSocket(null)
  160. }
  161. })
  162. }
  163. };
  164. export default Socket