Files
fe.ems.vue3/src/views/dashboard/overview/hooks/useWS.ts
2024-01-26 17:35:27 +08:00

149 lines
3.2 KiB
TypeScript

import {
RESULT_CODE_ERROR,
RESULT_CODE_SUCCESS,
} from '@/constants/result-constants';
import { OptionsType, WS } from '@/plugins/ws-websocket';
import { computed, onBeforeUnmount, onMounted, reactive, ref } from 'vue';
import { ueEventData, ueEventId, ueEventTotal } from './useUEEvent';
/**websocket连接 */
export default function useWS() {
const ws = new WS();
/**发消息 */
function wsSend(data: Record<string, any>) {
ws.send(data);
}
/**接收数据后回调 */
function wsMessage(res: Record<string, any>) {
console.log(res);
const { code, requestId, groupId, data } = res;
if (code === RESULT_CODE_ERROR) {
console.warn(res.msg);
return;
}
// 普通信息
switch (requestId) {
// ueEvent UE会话事件
case '1010':
if (Array.isArray(data.rows)) {
ueEventTotal.value = data.total;
const evDataArr: Record<string, any>[] = [];
for (const item of data.rows) {
const v = ueEventParse(item);
if (v) {
evDataArr.push(v);
}
}
ueEventData.value = evDataArr;
if (evDataArr.length > 0) {
ueEventId.value = evDataArr[0].id;
}
}
break;
}
// 订阅组信息
switch (groupId) {
// ueEvent UE会话事件
case '1010':
if (data.data) {
const v = ueEventParse(data.data);
if (v) {
ueEventData.value.unshift(v);
ueEventId.value = v.id;
}
}
break;
}
}
function wsInitData() {
ws.send({
requestId: '1010',
type: 'ue',
data: {
neType: 'AMF',
neId: '001',
sortField: 'timestamp',
sortOrder: 'desc',
pageNum: 1,
pageSize: 50,
},
});
}
/**ueEvent UE会话事件 数据解析 */
function ueEventParse(item: Record<string, any>) {
let evData: Record<string, any> = {};
try {
evData = JSON.parse(item.eventJSON);
} catch (error) {
console.error(error);
return false;
}
if (Reflect.has(evData, 'authTime')) {
return {
id: item.id,
type: item.eventType,
time: evData.authTime,
imsi: evData.imsi,
msg: `${evData.authMessage}`,
};
}
if (Reflect.has(evData, 'detachTime')) {
return {
id: item.id,
type: item.eventType,
time: evData.detachTime,
imsi: evData.imsi,
msg: `${evData.detachResult}`,
};
}
if (Reflect.has(evData, 'changeTime')) {
return {
id: item.id,
type: item.eventType,
time: evData.changeTime,
imsi: evData.imsi,
msg: `${evData.onlineNumber}`,
};
}
}
/**接收数据后回调 */
function wsError(ev: any) {
// 接收数据后回调
console.log(ev);
}
onMounted(() => {
const options: OptionsType = {
url: '/ws',
params: {
/**订阅通道组
*
* UE会话事件-AMF (GroupID:1010)
*/
subGroupID: '1010',
},
onmessage: wsMessage,
onerror: wsError,
};
ws.connect(options);
});
onBeforeUnmount(() => {
ws.close();
});
return {
wsInitData,
wsSend,
};
}