import define from '@/utils/define'; import jnpf from '@/utils/jnpf'; import { useChatStoreWithOut } from '@/store/modules/chat'; import { useUserStore } from '@/store/modules/user'; const chatStore = useChatStoreWithOut(); const userStore = useUserStore(); let socketTask = false; const Socket = { conTime: 0, initSocket() { try { const token = uni.getStorageSync('token') || ''; const sys = uni.getStorageSync('systemInfo') || ''; const userInfo = uni.getStorageSync('userInfo') || {}; socketTask = uni.connectSocket({ url: define.webSocketUrl + '/' + encodeURIComponent(token), // #ifdef APP header: { 'User-Agent': sys }, // #endif success() { setTimeout(() => chatStore.setSocket(socketTask), 0); }, }); socketTask.onMessage((res) => { let dataStr = res.data; const data = JSON.parse(dataStr); let options = { cover: false, sound: 'system', title: data.title }; switch (data.method) { case "initMessage": //初始化 const msgInfo = { messageText: data.messageDefaultText || '暂无数据', messageCount: data.unreadMessageCount + data.unreadSystemMessageCount < 0 ? 0 : data.unreadMessageCount + data.unreadSystemMessageCount + data.unreadScheduleCount, messageDate: data.messageDefaultTime || 0, }; let badgeNum = data.unreadTotalCount; for (let i = 0; i < data.unreadNums.length; i++) { badgeNum = badgeNum + data.unreadNums[i].unreadNum; } chatStore.setBadgeNum(badgeNum); chatStore.setMsgInfo(msgInfo); break; case "Online": //在线用户 break; case "Offline": //离线用户 break; case "sendMessage": //发送消息 chatStore.sendMessage(data); break; case "receiveMessage": //接收消息 // #ifdef APP plus.push.createMessage('你有一条聊天消息', { ...data, messageType: 100 }, options); // #endif chatStore.receiveMessage(data); break; case "messageList": //消息列表 chatStore.getMessageList(data); break; case "messagePush": //消息推送 // #ifdef APP let content = "公告"; if (data.messageType == 2) content = '流程'; if (data.messageType == 3) content = '系统'; if (data.messageType == 4) content = '日程'; uni.createPushMessage(res => {}); uniCloud.callFunction({ name: 'jnpfPush', // 云函数名称 data: { "push_clientid": uni.getStorageSync('push_clientid'), "title": data.title, "content": `你有一条${content}消息`, "payload": { "data": { ...data }, "options": { ...options } } }, success: res => {}, fail: err => {} }); // #endif chatStore.messagePush(data); break; case "closeSocket": //断开websocket连接 Socket.close(); break; case "logout": uni.showToast({ title: data.msg || '登录已过期', icon: 'none', complete: () => { setTimeout(() => { userStore.resetToken(); setTimeout(() => { Socket.close(); uni.reLaunch({ url: '/pages/login/index' }); }, 500); }, 1000); } }); break; case "refresh": uni.showToast({ title: '您的权限发生变更,正在刷新界面!', icon: 'none', complete: () => { setTimeout(() => { setTimeout(() => { uni.reLaunch({ url: '/pages/index/index' }); }, 500); }, 1000); } }); break; default: break; } }); socketTask.onOpen((data) => { Socket.conTime = 0; const msg = JSON.stringify({ method: "OnConnection", token, mobileDevice: true, systemId: userInfo.appSystemId }); Socket.sendMsg(msg); }); socketTask.onClose((data) => { socketTask = false; chatStore.setSocket(null); }); socketTask.onError((data) => { chatStore.setSocket(null); setTimeout(() => { Socket.conTime += 1; if (Socket.conTime <= 10) { if (Socket.conTime >= 3) { uni.showToast({ title: 'IM通讯正在连接:' + '连接第' + Socket.conTime + '次!稍后...', icon: 'none' }); } Socket.reConnect(); } else { uni.showToast({ title: 'IM通讯连接失败,联系服务器管理员', icon: 'none' }); } }, 10000); }); } catch (e) {} }, sendMsg(data) { if (socketTask === false) return Socket.reConnect(); let content = data; socketTask.send({ data: content, complete(e) {} }); }, //重连 reConnect() { Socket.initSocket(); }, close() { socketTask.close({ complete(e) { socketTask = false; chatStore.setSocket(null); } }); } }; export default Socket;