2025-06-30 09:38:03 +08:00

171 lines
4.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 = '日程'
plus.push.createMessage(`你有一条${content}消息`, data, options);
// #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;
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'
})
}
}, 10)
})
} 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