|
@@ -479,7 +479,7 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts" name="telControl">
|
|
|
-import { reactive, ref, computed, defineAsyncComponent, onMounted, onUnmounted, onBeforeUnmount } from 'vue';
|
|
|
+import { reactive, ref, computed, defineAsyncComponent, onMounted, onUnmounted, onBeforeUnmount, unref } from 'vue';
|
|
|
import { ElMessageBox, ElNotification, ElMessage, FormInstance } from 'element-plus';
|
|
|
import { storeToRefs } from 'pinia';
|
|
|
import { useTelStatus, TelStates, RestStates } from '@/stores/telStatus';
|
|
@@ -606,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);
|
|
@@ -745,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) {
|
|
@@ -769,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(() => {})
|
|
@@ -826,7 +825,8 @@ 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;
|
|
|
})
|
|
@@ -900,12 +900,19 @@ const onMessage = async (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') {
|
|
|
// 签出
|
|
@@ -1140,19 +1147,24 @@ const onMessage = async (event: any) => {
|
|
|
const isReconnect = ref(true); // 呼叫中心是否需要重连
|
|
|
const onClose = () => {
|
|
|
console.log('呼叫中心断开链接', isReconnect.value ? '需要重连' : '不需要重连');
|
|
|
- // 重置所有状态
|
|
|
- useTelStatusStore.resetState();
|
|
|
removeTimerOnDuty(); // 移除签入时长定时器
|
|
|
removeTimer(); // 移除通话计时器
|
|
|
clearTimeout(talkDealTimer.value); // 清除话后整理定时器
|
|
|
clearInterval(pingTimer.value); // 清除心跳定时器
|
|
|
- if (isReconnect.value) reConnect(); // 重新链接呼叫中心
|
|
|
+ clearInterval(onDutyTimer.value); // 清除签入时长定时器
|
|
|
+ clearInterval(talkTimer.value); // 清除通话时长定时器
|
|
|
+ if (isReconnect.value) {
|
|
|
+ reConnect(); // 重新链接呼叫中心
|
|
|
+ Local.set('currentTelNo', currentTel.value.telNo);
|
|
|
+ }
|
|
|
+ // 重置所有状态
|
|
|
+ useTelStatusStore.resetState();
|
|
|
};
|
|
|
// 重新链接呼叫中心
|
|
|
let reconnectAttempts = 0; // 重连次数
|
|
|
let maxReconnectAttempts = 10; // 最大重连次数
|
|
|
-let reconnectInterval = 5; // 重连间隔
|
|
|
-const reConnect = () => {
|
|
|
+let reconnectInterval = 2; // 重连间隔
|
|
|
+const reConnect = async () => {
|
|
|
ElNotification({
|
|
|
title: '重连提示',
|
|
|
message: `检测到与呼叫中心链接断开,${reconnectInterval}秒后将重新链接`,
|
|
@@ -1197,16 +1209,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;
|
|
|
}
|
|
|
};
|
|
|
// 保持状态处理
|
|
@@ -1579,14 +1595,36 @@ const wsReceive = (message: any) => {
|
|
|
};
|
|
|
// 刷新页面呼叫中心链接
|
|
|
const callCenterConnect = async () => {
|
|
|
- if (telStatusInfo.value.telsNo) {
|
|
|
+ const currentTelNo = Local.get('currentTelNo');
|
|
|
+ console.log(telStatusInfo.value.telsNo, currentTelNo, isReconnect.value, '刷新页面呼叫中心链接');
|
|
|
+ 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);
|
|
@@ -1598,7 +1636,6 @@ const callCenterConnect = async () => {
|
|
|
} else {
|
|
|
// 重置所有状态
|
|
|
useTelStatusStore.resetState();
|
|
|
- // 移除
|
|
|
}
|
|
|
};
|
|
|
// 获取小休原因
|
|
@@ -1627,6 +1664,8 @@ onMounted(async () => {
|
|
|
removeTimer(); // 移除通话计时器
|
|
|
clearTimeout(talkDealTimer.value); // 清除话后整理定时器
|
|
|
clearInterval(pingTimer.value); // 清除心跳定时器
|
|
|
+ clearInterval(onDutyTimer.value); // 清除签入时长定时器
|
|
|
+ clearInterval(talkTimer.value); // 清除通话时长定时器
|
|
|
await getTelsLists(); // 查询所有分机
|
|
|
await callCenterConnect(); // 呼叫中心链接
|
|
|
// 加入分组
|
|
@@ -1634,7 +1673,7 @@ onMounted(async () => {
|
|
|
});
|
|
|
onBeforeUnmount(() => {
|
|
|
mittBus.off('RestApplyPass');
|
|
|
- ola.close();
|
|
|
+ if (ola.ws) ola.close();
|
|
|
});
|
|
|
</script>
|
|
|
|