171 lines
4.1 KiB
JavaScript
Raw Normal View History

2025-06-30 09:38:03 +08:00
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