|
@@ -479,7 +479,7 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts" name="telControl">
|
|
|
-import { reactive, ref, computed, defineAsyncComponent, onMounted, onUnmounted } from "vue";
|
|
|
+import { reactive, ref, computed, defineAsyncComponent, onMounted, onBeforeUnmount } from 'vue';
|
|
|
import { ElMessageBox, ElNotification, ElMessage, FormInstance } from 'element-plus';
|
|
|
import { storeToRefs } from 'pinia';
|
|
|
import { useTelStatus, TelStates, RestStates } from '@/stores/telStatus';
|
|
@@ -490,16 +490,26 @@ import { formatDuration } from '@/utils/formatTime';
|
|
|
import { commonEnum } from '@/utils/constants';
|
|
|
import other from '@/utils/other';
|
|
|
import { workflowStepOptions } from '@/api/system/workflow';
|
|
|
-import { restFlowStart, restFlowDel, restFlowStartWex, getTelList, telRestBaseData, dutyOff, dutyOn, busyOff, busyOn } from '@/api/public/wex';
|
|
|
+import {
|
|
|
+ restFlowStart,
|
|
|
+ restFlowDel,
|
|
|
+ restFlowStartWex,
|
|
|
+ getTelList,
|
|
|
+ telRestBaseData,
|
|
|
+ dutyOff,
|
|
|
+ dutyOn,
|
|
|
+ busyOff,
|
|
|
+ busyOn,
|
|
|
+ queryBlacklist,
|
|
|
+} from '@/api/public/wex';
|
|
|
import signalR from '@/utils/signalR';
|
|
|
import { Local } from '@/utils/storage';
|
|
|
import { ola } from '@/utils/ola_api';
|
|
|
import { useRouter } from 'vue-router';
|
|
|
-import dayjs from 'dayjs';
|
|
|
-import axios from 'axios';
|
|
|
import { useSocket } from '@/utils/websocket';
|
|
|
import mittBus from '@/utils/mitt';
|
|
|
-import { voiceAssistant } from "@/api/todo/voiceAssistant";
|
|
|
+import { voiceAssistant } from '@/api/todo/voiceAssistant';
|
|
|
+import { submitLog } from '@/api/public/log';
|
|
|
// 引入组件
|
|
|
const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
|
|
|
const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue'));
|
|
@@ -558,6 +568,7 @@ const state = reactive<any>({
|
|
|
// 三方会议表单
|
|
|
telNo: null, // 三方会议号码
|
|
|
},
|
|
|
+ whiteList: [], // 白名单
|
|
|
});
|
|
|
|
|
|
const useTelStatusStore = useTelStatus();
|
|
@@ -572,7 +583,7 @@ const talkTimer = ref<any>(null); // 通话时长定时器
|
|
|
// 开始通话计时
|
|
|
const startTime = () => {
|
|
|
let localTalkTime = Local.get('talkTime');
|
|
|
- if (talkTime) {
|
|
|
+ if (talkTime.value) {
|
|
|
talkTime.value = Number(localTalkTime);
|
|
|
talkTimer.value = setInterval(() => {
|
|
|
talkTime.value++;
|
|
@@ -595,14 +606,11 @@ const removeTimer = () => {
|
|
|
// 开始签入时长
|
|
|
const onDutyTime = ref<any>(0); // 签入时长
|
|
|
const onDutyTimer = ref<any>(null); // 签入时长定时器
|
|
|
-const startDutyTimer = (startTime?: any) => {
|
|
|
- if (startTime) {
|
|
|
+const startDutyTimer = (second: any) => {
|
|
|
+ if (second) {
|
|
|
// 从后台获取签入时长
|
|
|
- // 使用当前时间减去后台返回的签入时间
|
|
|
- if (!startTime) startTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss');
|
|
|
- startTime = dayjs(new Date()).diff(dayjs(startTime), 'second');
|
|
|
- if (startTime < 0) startTime = 0; // 防止后台返回的签入时间大于当前时间
|
|
|
- onDutyTime.value = startTime;
|
|
|
+ if (second < 0) second = 0; // 防止后台返回的签入时间大于当前时间
|
|
|
+ onDutyTime.value = second;
|
|
|
onDutyTimer.value = setInterval(() => {
|
|
|
onDutyTime.value++;
|
|
|
}, 1000);
|
|
@@ -619,11 +627,11 @@ const removeTimerOnDuty = () => {
|
|
|
};
|
|
|
// 监听消息
|
|
|
const signalRStart = async () => {
|
|
|
- mittBus.on('RestApplyPass', (data) => {
|
|
|
- // 小休审批通过消息
|
|
|
- console.log(data, '小休审批通过消息');
|
|
|
- RestApplyPassFn(data);
|
|
|
- });
|
|
|
+ mittBus.on('RestApplyPass', (data) => {
|
|
|
+ // 小休审批通过消息
|
|
|
+ console.log(data, '小休审批通过消息');
|
|
|
+ RestApplyPassFn(data);
|
|
|
+ });
|
|
|
};
|
|
|
// 检查用户状态
|
|
|
// 设置当前可用的按钮
|
|
@@ -734,6 +742,7 @@ const onControlClick = (val: string) => {
|
|
|
|
|
|
const dutyFormRef = ref<RefType>();
|
|
|
const currentTel = ref<any>({}); // 当前分机
|
|
|
+const isRest = ref<boolean>(false); // 是否小休
|
|
|
//签入
|
|
|
const onDutyFn = async () => {
|
|
|
if (AppConfigInfo.value.isNeedTelNo || AppConfigInfo.value.isTelNeedVerify) {
|
|
@@ -758,7 +767,8 @@ const onDutyFn = async () => {
|
|
|
currentTel.value.queue = res.result.queueId;
|
|
|
// 不需要选择分机号和密码 直接签入 传入默认分机号
|
|
|
websocket_connect(); //开启消息监听
|
|
|
- startDutyTimer(res.result.startTime); // 开启计时 签入时长
|
|
|
+ startDutyTimer(res.result.second); // 开启计时 签入时长
|
|
|
+ isRest.value = res.result.isRest;
|
|
|
state.loading = false;
|
|
|
})
|
|
|
.catch(() => {})
|
|
@@ -815,12 +825,13 @@ const clickOnDuty = (formEl: FormInstance | undefined) => {
|
|
|
currentTel.value.queue = res.result.queueId;
|
|
|
}
|
|
|
websocket_connect(); //开启消息监听
|
|
|
- startDutyTimer(res.result.startTime); // 开启计时 签入时长
|
|
|
+ startDutyTimer(res.result.second); // 开启计时 签入时长
|
|
|
+ isRest.value = res.result.isRest;
|
|
|
state.loading = false;
|
|
|
state.dutyDialogVisible = false;
|
|
|
})
|
|
|
.catch(() => {
|
|
|
- dutyOff();
|
|
|
+ // dutyOff();
|
|
|
// 重置所有状态
|
|
|
useTelStatusStore.resetState();
|
|
|
console.log('呼叫中心:签入错误111');
|
|
@@ -850,6 +861,10 @@ const onConnect = () => {
|
|
|
ola.subscribe('ola.caller.' + currentTel.value.telNo);
|
|
|
ola.get_agent_state(currentTel.value.telNo);
|
|
|
|
|
|
+ pingTimer.value = setInterval(() => {
|
|
|
+ ola.ping();
|
|
|
+ }, 3000);
|
|
|
+
|
|
|
// ola.logout(currentTel.value.telNo); //连接之后,先登出一次,防止其他地方已经登陆
|
|
|
let array_ola_queue: EmptyArrayType = []; // 队列
|
|
|
if (currentTel.value.queue) {
|
|
@@ -860,6 +875,7 @@ const onConnect = () => {
|
|
|
ola.login(array_ola_queue, currentTel.value.telNo, { type: 'onhook' });
|
|
|
connectVoiceAssistant(currentTel.value.telNo); // 坐席助手开启
|
|
|
}
|
|
|
+ Local.set('telNo', currentTel.value.telNo);
|
|
|
};
|
|
|
// 业务系统发送消息
|
|
|
const sendMsg = (msg: any) => {
|
|
@@ -867,8 +883,10 @@ const sendMsg = (msg: any) => {
|
|
|
};
|
|
|
const router = useRouter();
|
|
|
const talkDealTimer = ref<any>(null); // 话后整理定时器
|
|
|
+const pingTimer = ref<any>(null); // 心跳定时器
|
|
|
+const call_direction = ref<any>(''); // 呼叫方向
|
|
|
// 呼叫中心消息
|
|
|
-const onMessage = (event: any) => {
|
|
|
+const onMessage = async (event: any) => {
|
|
|
const data = JSON.parse(event.data);
|
|
|
if (data.event_type == 'agent_state') {
|
|
|
if (data.agent_extn) {
|
|
@@ -884,12 +902,19 @@ const onMessage = (event: any) => {
|
|
|
useTelStatusStore.setCallInfo({ telsNo: currentTel.value.telNo });
|
|
|
state.loading = true;
|
|
|
setTimeout(() => {
|
|
|
- // 设置示闲状态
|
|
|
- ola.go_ready();
|
|
|
- console.log('呼叫中心:调用示闲');
|
|
|
+ console.log('isRest', `当前分机是否正在休息${isRest.value}`);
|
|
|
+ if (isRest.value) {
|
|
|
+ // 如果是小休状态
|
|
|
+ ola.go_break(''); //设置忙碌
|
|
|
+ } else {
|
|
|
+ // 设置示闲状态
|
|
|
+ ola.go_ready();
|
|
|
+ console.log('呼叫中心:调用示闲');
|
|
|
+ }
|
|
|
}, 1000);
|
|
|
console.log('呼叫中心:已签入');
|
|
|
ElMessage.success('签入成功');
|
|
|
+
|
|
|
sendMsg('login');
|
|
|
} else if (data.state == 'logout') {
|
|
|
// 签出
|
|
@@ -897,6 +922,8 @@ const onMessage = (event: any) => {
|
|
|
useTelStatusStore.resetState();
|
|
|
console.log('呼叫中心:已签出');
|
|
|
ElMessage.success('签出成功');
|
|
|
+ clearInterval(pingTimer.value); // 清除心跳定时器
|
|
|
+ isReconnect.value = false; // 不需要重连
|
|
|
seatAssistOff();
|
|
|
} else if (data.state == 'ready') {
|
|
|
// 结束计时
|
|
@@ -915,10 +942,10 @@ const onMessage = (event: any) => {
|
|
|
console.log('呼叫中心:示闲中');
|
|
|
sendMsg('ready');
|
|
|
} else if (data.state == 'unready') {
|
|
|
- break_reason(data.private_data);
|
|
|
- sendMsg('unready'); // 发送消息 业务系统消息通知
|
|
|
+ break_reason(data.private_data);
|
|
|
+ sendMsg('unready'); // 发送消息 业务系统消息通知
|
|
|
|
|
|
- console.log('呼叫中心:示忙中,小休开始');
|
|
|
+ console.log('呼叫中心:示忙中,小休开始');
|
|
|
// 示忙中
|
|
|
useTelStatusStore.setPhoneControlState(TelStates.rest);
|
|
|
useTelStatusStore.setRest(RestStates.resting);
|
|
@@ -956,37 +983,52 @@ const onMessage = (event: any) => {
|
|
|
});
|
|
|
}*/
|
|
|
} else if (data.state == 'acw') {
|
|
|
- // 设置分机号和坐席组
|
|
|
- useTelStatusStore.setCallInfo({ telsNo: data.agent_extn });
|
|
|
+ console.log(call_direction.value, '呼入还是呼出');
|
|
|
+ if (call_direction.value === 'inbound') {
|
|
|
+ // 呼入需要进入话后整理
|
|
|
+ // 设置分机号和坐席组
|
|
|
+ useTelStatusStore.setCallInfo({ telsNo: data.agent_extn });
|
|
|
|
|
|
- // 话后整理中
|
|
|
- const time: number = AppConfigInfo.value.talkingDealTime * 1000; // 话后整理时间
|
|
|
- ElNotification({
|
|
|
- title: '自动开启话后整理成功',
|
|
|
- message: `${time / 1000}秒后自动结束话后整理,或者手动结束话后整理`,
|
|
|
- type: 'success',
|
|
|
- });
|
|
|
- // 设置话后整理
|
|
|
- useTelStatusStore.setTalkingDeal(true);
|
|
|
- // 设置话机状态 设置为话后整理中
|
|
|
- useTelStatusStore.setPhoneControlState(TelStates.onTalkingDeal);
|
|
|
- talkDealTimer.value = setTimeout(() => {
|
|
|
+ // 话后整理中
|
|
|
+ const time: number = AppConfigInfo.value.talkingDealTime * 1000; // 话后整理时间
|
|
|
+ ElNotification({
|
|
|
+ title: '自动开启话后整理成功',
|
|
|
+ message: `${time / 1000}秒后自动结束话后整理,或者手动结束话后整理`,
|
|
|
+ type: 'success',
|
|
|
+ duration: 1000 * 10,
|
|
|
+ });
|
|
|
// 设置话后整理
|
|
|
- useTelStatusStore.setTalkingDeal(false);
|
|
|
- // 设置话机状态 取消话后整理修改为空闲状态
|
|
|
- useTelStatusStore.setPhoneControlState(TelStates.dutyOn);
|
|
|
+ useTelStatusStore.setTalkingDeal(true);
|
|
|
+ // 设置话机状态 设置为话后整理中
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.onTalkingDeal);
|
|
|
+ talkDealTimer.value = setTimeout(() => {
|
|
|
+ // 设置话后整理
|
|
|
+ useTelStatusStore.setTalkingDeal(false);
|
|
|
+ // 设置话机状态 取消话后整理修改为空闲状态
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.dutyOn);
|
|
|
+ ola.go_ready(); // 示闲
|
|
|
+ console.log('呼叫中心:调用示闲');
|
|
|
+ clearTimeout(talkDealTimer.value); // 清除话后整理定时器
|
|
|
+ }, time);
|
|
|
+ console.log('呼叫中心:话后整理中');
|
|
|
+ sendMsg('acw');
|
|
|
+ } else {
|
|
|
+ // 呼出直接调用示闲
|
|
|
ola.go_ready(); // 示闲
|
|
|
console.log('呼叫中心:调用示闲');
|
|
|
- clearTimeout(talkDealTimer.value); // 清除话后整理定时器
|
|
|
- }, time);
|
|
|
- console.log('呼叫中心:话后整理中');
|
|
|
- sendMsg('acw');
|
|
|
+ }
|
|
|
} else if (data.state == 'busy') {
|
|
|
- } else {
|
|
|
console.log(data.state, '其他状态');
|
|
|
+ /* // 设置振铃中
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.ring);
|
|
|
+ sendMsg('busy');
|
|
|
+ console.log('呼叫中心:转接中....');*/
|
|
|
+ } else {
|
|
|
+ console.log(data.state, '其他状态1');
|
|
|
}
|
|
|
|
|
|
if (data.state == 'busy') {
|
|
|
+ call_direction.value = data.call_direction; // 保存呼叫方向
|
|
|
holdStatus(data.private_data); //处理保持
|
|
|
if (data.private_data == 'monitoring') {
|
|
|
// 三方来电振铃中
|
|
@@ -1009,6 +1051,9 @@ const onMessage = (event: any) => {
|
|
|
console.log('呼叫中心:三方来电挂断');
|
|
|
} else if (data.private_data == 'three_way_ring') {
|
|
|
// 三方通话呼出中
|
|
|
+ // 设置振铃中
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.ring);
|
|
|
+ sendMsg('busy');
|
|
|
console.log('呼叫中心:三方通话呼出中');
|
|
|
} else if (data.private_data == 'three_way_answered') {
|
|
|
// 三方通话呼出接通
|
|
@@ -1037,6 +1082,8 @@ const onMessage = (event: any) => {
|
|
|
startTime();
|
|
|
// 设置电话状态 通话中
|
|
|
useTelStatusStore.setPhoneControlState(TelStates.onCall);
|
|
|
+
|
|
|
+ mittBus.emit('outboundConnect', data); // 外呼接通之后收到的消息
|
|
|
console.log('呼叫中心:呼出通话中');
|
|
|
}
|
|
|
sendMsg('busy');
|
|
@@ -1049,11 +1096,17 @@ const onMessage = (event: any) => {
|
|
|
console.log(data, '呼叫中心:来电弹单信息');
|
|
|
// 来电才展示弹屏
|
|
|
// 跳转到录入工单页面
|
|
|
- if (!router.hasRoute('orderAccept')) {
|
|
|
- ElMessage.warning('请先配置工单受理页面');
|
|
|
- return;
|
|
|
+ await getWithList(); // 获取白名单列表
|
|
|
+ const isWhite = state.whiteList.filter((item: any) => item.phone === data.ani);
|
|
|
+ if (isWhite) {
|
|
|
+ // 如果来电电话在呼入白名单中 需要提示
|
|
|
+ ElNotification({
|
|
|
+ title: '来电提醒',
|
|
|
+ message: '该市民为白名单。',
|
|
|
+ type: 'success',
|
|
|
+ });
|
|
|
}
|
|
|
- router.push({
|
|
|
+ await router.push({
|
|
|
name: 'orderAccept',
|
|
|
state: {
|
|
|
createBy: 'tel',
|
|
@@ -1072,7 +1125,6 @@ const onMessage = (event: any) => {
|
|
|
startTime();
|
|
|
// 设置电话状态 通话中
|
|
|
useTelStatusStore.setPhoneControlState(TelStates.onCall);
|
|
|
-
|
|
|
console.log('呼叫中心:呼入通话中');
|
|
|
}
|
|
|
sendMsg('busy');
|
|
@@ -1094,7 +1146,7 @@ const onMessage = (event: any) => {
|
|
|
//通话状态
|
|
|
// special feature, never mind
|
|
|
if (data.action == 'in') {
|
|
|
- console.log('呼叫中心:呼入', data.caller.cid_number, data.caller.uuid);
|
|
|
+ console.log('呼叫中心:呼入', data.caller.cid_number, data.caller.iuud);
|
|
|
// ola.take_call(data.caller.uuid);
|
|
|
} else {
|
|
|
console.log('呼叫中心:呼出', data.caller.uuid);
|
|
@@ -1104,10 +1156,68 @@ const onMessage = (event: any) => {
|
|
|
// console.log('command/reply', data);
|
|
|
}
|
|
|
};
|
|
|
+// 记录日志
|
|
|
+const submitLogFn = async (event: any) => {
|
|
|
+ const telsNo = Local.get('telNo');
|
|
|
+ const name: string = `分机号:${telsNo}的websocket断开链接`;
|
|
|
+ const remark: string = `websocket 断开: 错误code:${event.code}, 错误原因:${event.reason}, 是否正常断开:${event.wasClean}`;
|
|
|
+ console.log(name, remark, event);
|
|
|
+ const request = {
|
|
|
+ creationTime: new Date(),
|
|
|
+ name,
|
|
|
+ remark,
|
|
|
+ executeUrl: import.meta.env.VITE_CALLCENTER_SOCKET_URL,
|
|
|
+ };
|
|
|
+ try {
|
|
|
+ await submitLog(request);
|
|
|
+ Local.remove('telNo');
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error);
|
|
|
+ }
|
|
|
+};
|
|
|
// 呼叫中心链接关闭
|
|
|
-const onClose = () => {
|
|
|
- console.log('呼叫中心断开链接');
|
|
|
- // ElMessage.error('呼叫中心断开链接,请刷新重试');
|
|
|
+const isReconnect = ref(true); // 呼叫中心是否需要重连
|
|
|
+const onClose = async (event: any) => {
|
|
|
+ removeTimerOnDuty(); // 移除签入时长定时器
|
|
|
+ removeTimer(); // 移除通话计时器
|
|
|
+ clearTimeout(talkDealTimer.value); // 清除话后整理定时器
|
|
|
+ clearInterval(pingTimer.value); // 清除心跳定时器
|
|
|
+ clearInterval(onDutyTimer.value); // 清除签入时长定时器
|
|
|
+ clearInterval(talkTimer.value); // 清除通话时长定时器
|
|
|
+ console.log('呼叫中心断开链接', isReconnect.value ? '需要重连' : '不需要重连');
|
|
|
+ if (isReconnect.value) {
|
|
|
+ await reConnect(); // 重新链接呼叫中心
|
|
|
+ Local.set('currentTelNo', currentTel.value.telNo);
|
|
|
+ }
|
|
|
+ // 重置所有状态
|
|
|
+ useTelStatusStore.resetState();
|
|
|
+ await submitLogFn(event);
|
|
|
+};
|
|
|
+// 重新链接呼叫中心
|
|
|
+let reconnectAttempts = 0; // 重连次数
|
|
|
+let maxReconnectAttempts = 10; // 最大重连次数
|
|
|
+let reconnectInterval = 2; // 重连间隔
|
|
|
+const reConnect = async () => {
|
|
|
+ ElNotification({
|
|
|
+ title: '重连提示',
|
|
|
+ message: `检测到与呼叫中心链接断开,${reconnectInterval}秒后将重新链接`,
|
|
|
+ type: 'warning',
|
|
|
+ duration: reconnectInterval * 1000,
|
|
|
+ });
|
|
|
+ console.log('开始重连', `已重连${reconnectAttempts}次,最大重连次数${maxReconnectAttempts}次,重连间隔${reconnectInterval}秒`);
|
|
|
+ if (reconnectAttempts < maxReconnectAttempts) {
|
|
|
+ setTimeout(() => {
|
|
|
+ reconnectAttempts++;
|
|
|
+ websocket_connect();
|
|
|
+ }, reconnectInterval * 1000);
|
|
|
+ } else {
|
|
|
+ ElNotification({
|
|
|
+ title: '呼叫中心重连失败',
|
|
|
+ message: '已到达重连次数最高,请手动刷新重连',
|
|
|
+ type: 'warning',
|
|
|
+ });
|
|
|
+ console.error('已到达重连次数最高,请手动刷新重连');
|
|
|
+ }
|
|
|
};
|
|
|
// 小休原因
|
|
|
const restReason = ref(''); // 小休原因
|
|
@@ -1132,16 +1242,20 @@ const break_reason = (reason: string) => {
|
|
|
restReason.value = '休息中';
|
|
|
break;
|
|
|
}
|
|
|
- if (telStatusInfo.value.isRest !== 'resting') {
|
|
|
+ if (telStatusInfo.value.isRest !== 'resting' && !isRest.value) {
|
|
|
// 如果不在在小休中
|
|
|
const restReasons = state.restReasonOptions.find((item: any) => item.dicDataValue === reason);
|
|
|
busyOn({ reason: restReasons?.dicDataName ?? '' }) // 开始小休 设置示忙 业务系统统计需要
|
|
|
.then(() => {
|
|
|
console.log('业务系统调用示忙成功');
|
|
|
+ state.loading = false;
|
|
|
})
|
|
|
.catch((err) => {
|
|
|
console.log('业务系统调用示忙失败', err);
|
|
|
+ state.loading = false;
|
|
|
});
|
|
|
+ } else {
|
|
|
+ state.loading = false;
|
|
|
}
|
|
|
};
|
|
|
// 保持状态处理
|
|
@@ -1179,6 +1293,8 @@ const offDutyFn = () => {
|
|
|
state.loading = true;
|
|
|
dutyOff()
|
|
|
.then(() => {
|
|
|
+ console.log('业务系统:签出成功');
|
|
|
+ Local.set('isReconnect1', false);
|
|
|
sendMsg('logout');
|
|
|
ola.logout(currentTel.value.telNo); //签出
|
|
|
setTimeout(() => {
|
|
@@ -1186,8 +1302,13 @@ const offDutyFn = () => {
|
|
|
}, 500);
|
|
|
// 重置所有状态
|
|
|
useTelStatusStore.resetState();
|
|
|
- removeTimerOnDuty(); // 移除定时器
|
|
|
- state.loading = false;
|
|
|
+ removeTimerOnDuty(); // 移除签入时长定时器
|
|
|
+ removeTimer(); // 移除通话计时器
|
|
|
+ clearTimeout(talkDealTimer.value); // 清除话后整理定时器
|
|
|
+ clearInterval(pingTimer.value); // 清除心跳定时器
|
|
|
+ clearInterval(onDutyTimer.value); // 清除签入时长定时器
|
|
|
+ clearInterval(talkTimer.value); // 清除通话时长定时器
|
|
|
+
|
|
|
state.dutyOnSrc = getImageUrl('phoneControls/dutyOn_blue.png'); //签入图片
|
|
|
state.loading = false;
|
|
|
})
|
|
@@ -1300,6 +1421,7 @@ const clickOnRest = (formEl: FormInstance | undefined) => {
|
|
|
} else {
|
|
|
//不需要审核直接开始小休
|
|
|
ola.go_break(state.restForm.reason); //设置忙碌
|
|
|
+ clearTimeout(talkDealTimer.value); // 清除话后整理定时器
|
|
|
console.log('呼叫中心:调用示忙');
|
|
|
state.restDialogVisible = false;
|
|
|
state.loading = false;
|
|
@@ -1427,6 +1549,12 @@ const clickOnThreeWay = (formEl: FormInstance | undefined) => {
|
|
|
formEl.validate((valid: boolean) => {
|
|
|
if (!valid) return;
|
|
|
ola.three_way(telStatusInfo.value.telsNo, state.threeWayForm.telNo); //三方会议
|
|
|
+
|
|
|
+ // 三方通话呼出接通
|
|
|
+ onCallArr.value.push({ telNo: state.threeWayForm.telNo }); // 三方通话呼出接通
|
|
|
+ // 设置电话状态 呼出三方通话中 可以踢人和挂断通话
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.onThreeWay);
|
|
|
+ sendMsg('treeWay');
|
|
|
state.threeWayDialogVisible = false;
|
|
|
});
|
|
|
};
|
|
@@ -1441,6 +1569,8 @@ const kickOut = (item: any) => {
|
|
|
})
|
|
|
.then(() => {
|
|
|
ola.exit_three_way(item.telNo); // 踢出第三方
|
|
|
+ // 恢复通话
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.onCall);
|
|
|
onCallArr.value = [];
|
|
|
})
|
|
|
.catch(() => {});
|
|
@@ -1481,13 +1611,13 @@ const connectVoiceAssistant = async (telNo: string) => {
|
|
|
socket.value = useSocket(import.meta.env.VITE_VOICE_ASSISTANT_SOCKET_URL, { uid, subscribe });
|
|
|
socket.value.on('open', () => {
|
|
|
socket.value.send({ id: '', type: 1, from: uid, to: 'sys', timestamps: new Date().getTime(), body: result.userName });
|
|
|
- console.log('坐席辅助连接成功')
|
|
|
- ElMessage.success('坐席辅助连接成功');
|
|
|
+ console.log('坐席辅助连接成功');
|
|
|
+ ElMessage.success('坐席辅助连接成功');
|
|
|
});
|
|
|
socket.value.on('message', wsReceive);
|
|
|
} catch (err) {
|
|
|
console.log(err, '坐席辅助链接失败');
|
|
|
- ElMessage.error('坐席辅助链接失败');
|
|
|
+ ElMessage.error('坐席辅助链接失败');
|
|
|
}
|
|
|
};
|
|
|
// 坐席辅助关闭
|
|
@@ -1513,18 +1643,39 @@ const wsReceive = (message: any) => {
|
|
|
};
|
|
|
// 刷新页面呼叫中心链接
|
|
|
const callCenterConnect = async () => {
|
|
|
- if (telStatusInfo.value.telsNo) {
|
|
|
+ const currentTelNo = Local.get('currentTelNo');
|
|
|
+ if (currentTelNo && isReconnect.value) {
|
|
|
+ // 重新链接
|
|
|
+ try {
|
|
|
+ const { result } = await dutyOn({ telNo: currentTelNo });
|
|
|
+ currentTel.value.password = result.telPwd;
|
|
|
+ currentTel.value.telNo = result.telNo;
|
|
|
+ currentTel.value.queue = result.queueId;
|
|
|
+ Local.remove('currentTelNo');
|
|
|
+ startDutyTimer(result.second); // 开启计时 签入时长
|
|
|
+ isRest.value = result.isRest;
|
|
|
+ state.loading = false;
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e);
|
|
|
+ // await dutyOff();
|
|
|
+ // 重置所有状态
|
|
|
+ useTelStatusStore.resetState();
|
|
|
+ state.loading = false;
|
|
|
+ }
|
|
|
+ } else if (telStatusInfo.value.telsNo) {
|
|
|
+ // 刷新页面
|
|
|
try {
|
|
|
const { result } = await dutyOn({ telNo: telStatusInfo.value.telsNo });
|
|
|
currentTel.value.password = result.telPwd;
|
|
|
currentTel.value.telNo = result.telNo;
|
|
|
currentTel.value.queue = result.queueId;
|
|
|
websocket_connect(); //开启消息监听
|
|
|
- startDutyTimer(result.startTime); // 开启计时 签入时长
|
|
|
+ startDutyTimer(result.second); // 开启计时 签入时长
|
|
|
+ isRest.value = result.isRest;
|
|
|
state.loading = false;
|
|
|
} catch (e) {
|
|
|
console.log(e);
|
|
|
- await dutyOff();
|
|
|
+ // await dutyOff();
|
|
|
// 重置所有状态
|
|
|
useTelStatusStore.resetState();
|
|
|
state.loading = false;
|
|
@@ -1544,20 +1695,33 @@ const getReason = async () => {
|
|
|
console.log(err);
|
|
|
}
|
|
|
};
|
|
|
+// 获取白名单列表
|
|
|
+const getWithList = async () => {
|
|
|
+ try {
|
|
|
+ const response: any = await queryBlacklist({ SpecialFlag: 1 });
|
|
|
+ state.whiteList = response.result;
|
|
|
+ } catch (err) {
|
|
|
+ console.log(err);
|
|
|
+ }
|
|
|
+};
|
|
|
onMounted(async () => {
|
|
|
- clearTimeout(talkDealTimer.value); // 清除话后整理定时器
|
|
|
await getReason(); // 获取小休原因
|
|
|
await signalRStart(); //开启消息监听
|
|
|
- removeTimerOnDuty(); // 移除定时器
|
|
|
+ removeTimerOnDuty(); // 移除签入时长定时器
|
|
|
+ removeTimer(); // 移除通话计时器
|
|
|
+ clearTimeout(talkDealTimer.value); // 清除话后整理定时器
|
|
|
+ clearInterval(pingTimer.value); // 清除心跳定时器
|
|
|
+ clearInterval(onDutyTimer.value); // 清除签入时长定时器
|
|
|
+ clearInterval(talkTimer.value); // 清除通话时长定时器
|
|
|
await getTelsLists(); // 查询所有分机
|
|
|
await callCenterConnect(); // 呼叫中心链接
|
|
|
-
|
|
|
// 加入分组
|
|
|
- signalR.joinGroup('CallCenter');
|
|
|
+ await signalR.joinGroup('CallCenter');
|
|
|
+});
|
|
|
+onBeforeUnmount(() => {
|
|
|
+ mittBus.off('RestApplyPass');
|
|
|
+ if (ola.ws) ola.close();
|
|
|
});
|
|
|
-onUnmounted(()=>{
|
|
|
- mittBus.off('RestApplyPass');
|
|
|
-})
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|