chat - 副本.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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