|
@@ -149,6 +149,27 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
+ <!-- 静音和取消静音 可用 -->
|
|
|
+ <template v-if="telStatusInfo.isDutyOn && activeArr.includes('mute')">
|
|
|
+ <div
|
|
|
+ class="item active"
|
|
|
+ :title="telStatusInfo.isMute ? '取消静音' : '静音'"
|
|
|
+ @click="onControlClick(telStatusInfo.isMute ? 'unMute' : 'mute')"
|
|
|
+ @mouseenter="onHover('muteSrc', 'phoneControls/mute_white.png')"
|
|
|
+ @mouseleave="onHover('muteSrc', 'phoneControls/mute_blue.png')"
|
|
|
+ >
|
|
|
+ <img :src="state.muteSrc" alt="" />
|
|
|
+ <span>{{ telStatusInfo.isMute ? '取消静音' : '静音' }}</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <!-- 灰色静音不可用 -->
|
|
|
+ <template v-else>
|
|
|
+ <div class="item disabled" title="静音">
|
|
|
+ <img :src="getImageUrl('phoneControls/mute_grey.png')" alt="" />
|
|
|
+ <span>静音</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
<!-- 话后整理和取消话后整理中 可用-->
|
|
|
<template v-if="telStatusInfo.isDutyOn && activeArr.includes('TalkingDeal')">
|
|
|
<div
|
|
@@ -261,6 +282,7 @@
|
|
|
<el-text class="duty-on-time-time" tag="b" type="danger" v-if="onDutyTime">{{ formatDuration(onDutyTime) }}</el-text>
|
|
|
</div>
|
|
|
</div>
|
|
|
+
|
|
|
<!-- 占位标签 -->
|
|
|
<div class="seizeSeat-box"></div>
|
|
|
<!-- 功能 -->
|
|
@@ -577,6 +599,7 @@ const state = reactive<any>({
|
|
|
hangupSrc: getImageUrl('phoneControls/hangup_blue.png'), //挂断图片
|
|
|
restSrc: getImageUrl('phoneControls/rest_blue.png'), //小休图片
|
|
|
holdSrc: getImageUrl('phoneControls/hold_blue.png'), //保持图片
|
|
|
+ muteSrc: getImageUrl('phoneControls/mute_blue.png'), // 静音图片
|
|
|
talkingDealSrc: getImageUrl('phoneControls/talkingDeal_blue.png'), //话后整理图片
|
|
|
transferSrc: getImageUrl('phoneControls/transfer_blue.png'), //转接图片
|
|
|
conferenceSrc: getImageUrl('phoneControls/conference_blue.png'), //三方会议图片
|
|
@@ -664,10 +687,11 @@ const activeArr = computed(() => {
|
|
|
const switchCases: any = {
|
|
|
dutyOff: ['dutyOn'], // 签出状态
|
|
|
dutyOn: ['dutyOff', 'callOut', 'rest', 'outbound'], // 已签入无通话状态
|
|
|
- onCallOut: ['callOut', 'outbound'], // 外呼模式中
|
|
|
+ onCallOut: ['dutyOff', 'callOut', 'outbound'], // 外呼模式中
|
|
|
rest: ['rest'], // 小休中状态
|
|
|
ring: ['hangup'], //振铃中
|
|
|
- onCall: ['hangup', 'hold', 'transfer', 'conference'], // 单个通话中
|
|
|
+ onCall: ['hangup', 'hold', 'transfer', 'conference', 'mute'], // 单个通话中
|
|
|
+ onMute: ['hangup', 'transfer', 'mute'], // 静音中
|
|
|
onHold: ['hangup', 'hold', 'transfer'], // 保持中
|
|
|
onTalkingDeal: ['dutyOff', 'rest', 'TalkingDeal'], // 话后整理中
|
|
|
onConference: ['hangup'], // 三方会议中 只能挂断
|
|
@@ -688,6 +712,7 @@ const currentStatusText = computed(() => {
|
|
|
rest: '小休中',
|
|
|
ring: '振铃中',
|
|
|
onHold: '保持中',
|
|
|
+ onMute: '静音中',
|
|
|
onCall: '通话中',
|
|
|
onTalkingDeal: '整理中',
|
|
|
onConference: '会议中',
|
|
@@ -753,8 +778,11 @@ const onControlClick = (val: string) => {
|
|
|
case 'unHold': //取消保持
|
|
|
onUnHold();
|
|
|
break;
|
|
|
- case 'TalkingDeal': //话后整理
|
|
|
- onTalkingDeal();
|
|
|
+ case 'mute': //保持
|
|
|
+ onMute();
|
|
|
+ break;
|
|
|
+ case 'unMute': //取消保持
|
|
|
+ onUnMute();
|
|
|
break;
|
|
|
case 'unTalkingDeal': // 取消话后整理
|
|
|
unTalkingDeal();
|
|
@@ -926,6 +954,7 @@ const onMessage = async (event: any) => {
|
|
|
await onEndAcw(); // 挂机后整理结束
|
|
|
}
|
|
|
console.log('呼叫中心:示闲中');
|
|
|
+ isReconnect.value = true; // 签入重置需要是否重连
|
|
|
sendMsg('ready');
|
|
|
}
|
|
|
} else if (data.state == 'unready') {
|
|
@@ -1027,10 +1056,43 @@ const onMessage = async (event: any) => {
|
|
|
if (data.state == 'busy') {
|
|
|
call_direction.value = data.call_direction; // 保存呼叫方向
|
|
|
if (['held', 'unheld'].includes(data.private_data)) {
|
|
|
- // 保持
|
|
|
- holdStatus(data.private_data); //处理保持
|
|
|
- if (data.private_data == 'held') await holdStart(); // 保持开始 业务系统统计需要
|
|
|
- else await holdEnd();
|
|
|
+ console.log(muteModel.value, '21321');
|
|
|
+ if (muteModel.value || isTelMute.value) {
|
|
|
+ // 如果是静音状态
|
|
|
+ // 静音
|
|
|
+ if (data.private_data == 'held') {
|
|
|
+ // 设置电话状态
|
|
|
+ useTelStatusStore.setMute(true);
|
|
|
+ // 设置电话状态 静音中
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.onMute);
|
|
|
+ sendMsg('mute');
|
|
|
+ await muteStart();
|
|
|
+ } else {
|
|
|
+ // 设置电话状态 取消单个静音为通话中
|
|
|
+ useTelStatusStore.setMute(false);
|
|
|
+ // 设置电话状态
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.onCall);
|
|
|
+ sendMsg('busy');
|
|
|
+ await muteEnd();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 保持
|
|
|
+ if (data.private_data == 'held') {
|
|
|
+ // 设置电话状态
|
|
|
+ useTelStatusStore.setHold(true);
|
|
|
+ // 设置电话状态 保持中
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.onHold);
|
|
|
+ sendMsg('held');
|
|
|
+ await holdStart(); // 保持开始 业务系统统计需要
|
|
|
+ } else {
|
|
|
+ // 设置电话状态 取消单个保持为通话中
|
|
|
+ useTelStatusStore.setHold(false);
|
|
|
+ // 设置电话状态
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.onCall);
|
|
|
+ sendMsg('busy');
|
|
|
+ await holdEnd();
|
|
|
+ }
|
|
|
+ }
|
|
|
} else {
|
|
|
// 非保持状态
|
|
|
if (data.private_data == 'monitoring') {
|
|
@@ -1219,72 +1281,8 @@ const reConnect = async () => {
|
|
|
const stopReconnect = () => {
|
|
|
isReconnect.value = false;
|
|
|
clearTimeout(reconnectTimeout.value);
|
|
|
- setTimeout(() => {
|
|
|
- isReconnect.value = true;
|
|
|
- }, 3000);
|
|
|
console.log('停止重连');
|
|
|
};
|
|
|
-// 小休原因
|
|
|
-const restReason = ref(''); // 小休原因
|
|
|
-const break_reason = (reason: string) => {
|
|
|
- switch (reason) {
|
|
|
- case 'away':
|
|
|
- restReason.value = '外出中';
|
|
|
- break;
|
|
|
- case 'rest':
|
|
|
- restReason.value = '休息中';
|
|
|
- break;
|
|
|
- case 'conference':
|
|
|
- restReason.value = '会议中';
|
|
|
- break;
|
|
|
- case 'train':
|
|
|
- restReason.value = '培训中';
|
|
|
- break;
|
|
|
- case 'eat':
|
|
|
- restReason.value = '用餐中';
|
|
|
- break;
|
|
|
- default:
|
|
|
- restReason.value = '休息中';
|
|
|
- break;
|
|
|
- }
|
|
|
- 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;
|
|
|
- }
|
|
|
-};
|
|
|
-// 保持状态处理
|
|
|
-const holdStatus = (status: string) => {
|
|
|
- switch (status) {
|
|
|
- case 'held':
|
|
|
- // 设置电话状态
|
|
|
- useTelStatusStore.setHold(true);
|
|
|
- // 设置电话状态 保持中
|
|
|
- useTelStatusStore.setPhoneControlState(TelStates.onHold);
|
|
|
- sendMsg('held');
|
|
|
- break;
|
|
|
- case 'unheld':
|
|
|
- // 设置电话状态 通话中
|
|
|
- // 设置电话状态 取消单个保持为通话中
|
|
|
- useTelStatusStore.setHold(false);
|
|
|
- // 设置电话状态
|
|
|
- useTelStatusStore.setPhoneControlState(TelStates.onCall);
|
|
|
- sendMsg('busy');
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
-};
|
|
|
const dutyFormRef = ref<RefType>();
|
|
|
const currentTel = ref<any>({}); // 当前分机
|
|
|
const isRest = ref<boolean>(false); // 是否小休
|
|
@@ -1341,17 +1339,20 @@ const clickOnDuty = (formEl: FormInstance | undefined) => {
|
|
|
request = {
|
|
|
telNo: state.dutyForm.telNo,
|
|
|
telPwd: state.dutyForm.password,
|
|
|
+ telModelState: 2, // 默认呼出模式
|
|
|
};
|
|
|
} else if (AppConfigInfo.value.isNeedTelNo) {
|
|
|
//需要分机号
|
|
|
request = {
|
|
|
telNo: state.dutyForm.telNo,
|
|
|
+ telModelState: 2, // 默认呼出模式
|
|
|
};
|
|
|
} else if (AppConfigInfo.value.isTelNeedVerify) {
|
|
|
// 需要密码
|
|
|
request = {
|
|
|
telNo: state.dutyForm.telNo,
|
|
|
telPwd: userInfos.value.defaultTelNo,
|
|
|
+ telModelState: 2, // 默认呼出模式
|
|
|
};
|
|
|
}
|
|
|
dutyOn(request)
|
|
@@ -1503,6 +1504,45 @@ const onHangup = () => {
|
|
|
})
|
|
|
.catch(() => {});
|
|
|
};
|
|
|
+// 小休原因
|
|
|
+const restReason = ref(''); // 小休原因
|
|
|
+const break_reason = (reason: string) => {
|
|
|
+ switch (reason) {
|
|
|
+ case 'away':
|
|
|
+ restReason.value = '外出中';
|
|
|
+ break;
|
|
|
+ case 'rest':
|
|
|
+ restReason.value = '休息中';
|
|
|
+ break;
|
|
|
+ case 'conference':
|
|
|
+ restReason.value = '会议中';
|
|
|
+ break;
|
|
|
+ case 'train':
|
|
|
+ restReason.value = '培训中';
|
|
|
+ break;
|
|
|
+ case 'eat':
|
|
|
+ restReason.value = '用餐中';
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ restReason.value = '休息中';
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+};
|
|
|
// 小休
|
|
|
const restFormRef = ref<RefType>(); //小休表单
|
|
|
const onRest = async () => {
|
|
@@ -1648,6 +1688,7 @@ const onHold = () => {
|
|
|
autofocus: false,
|
|
|
})
|
|
|
.then(() => {
|
|
|
+ muteModel.value = false;
|
|
|
ola.hold(); //保持
|
|
|
})
|
|
|
.catch(() => {});
|
|
@@ -1663,12 +1704,62 @@ const onUnHold = () => {
|
|
|
autofocus: false,
|
|
|
})
|
|
|
.then(() => {
|
|
|
+ muteModel.value = false;
|
|
|
+ ola.unhold(); //取消保持
|
|
|
+ })
|
|
|
+ .catch(() => {});
|
|
|
+};
|
|
|
+// 业务系统静音开始
|
|
|
+const muteStart = async () => {
|
|
|
+ try {
|
|
|
+ const res: any = await startAfterCall({ actionType: 4 });
|
|
|
+ console.log(res, '业务系统记录静音开始');
|
|
|
+ } catch (err) {
|
|
|
+ console.log(err);
|
|
|
+ }
|
|
|
+};
|
|
|
+// 业务系统静音结束
|
|
|
+const muteEnd = async () => {
|
|
|
+ try {
|
|
|
+ const res: any = await endAfterCall({ actionType: 4 });
|
|
|
+ console.log(res, '业务系统记录静音结束');
|
|
|
+ } catch (err) {
|
|
|
+ console.log(err);
|
|
|
+ }
|
|
|
+};
|
|
|
+// 静音
|
|
|
+const muteModel = ref(false);
|
|
|
+const onMute = () => {
|
|
|
+ ElMessageBox.confirm(`确定要静音,是否继续?`, '提示', {
|
|
|
+ confirmButtonText: '确认',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ draggable: true,
|
|
|
+ cancelButtonClass: 'default-button',
|
|
|
+ autofocus: false,
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ muteModel.value = true;
|
|
|
+ ola.hold(); //保持
|
|
|
+ })
|
|
|
+ .catch(() => {});
|
|
|
+};
|
|
|
+// 静音取消
|
|
|
+const onUnMute = () => {
|
|
|
+ ElMessageBox.confirm(`确定要取消静音,是否继续?`, '提示', {
|
|
|
+ confirmButtonText: '确认',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ draggable: true,
|
|
|
+ cancelButtonClass: 'default-button',
|
|
|
+ autofocus: false,
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ muteModel.value = true;
|
|
|
ola.unhold(); //取消保持
|
|
|
})
|
|
|
.catch(() => {});
|
|
|
};
|
|
|
-// 话后整理(系统默认进入)
|
|
|
-const onTalkingDeal = () => {};
|
|
|
// 取消话后整理
|
|
|
const unTalkingDeal = () => {
|
|
|
ElMessageBox.confirm(`确定要取消话后整理,是否继续?`, '提示', {
|
|
@@ -1836,6 +1927,7 @@ const resetState = () => {
|
|
|
// 获取当前分机状态
|
|
|
const isCallHold = ref(false); // 是否是保持中
|
|
|
const isAcw = ref(false); // 是否是话后整理中
|
|
|
+const isTelMute = ref(false); // 是否是静音中
|
|
|
const getTelStatusFn = async () => {
|
|
|
try {
|
|
|
const { result } = await getTelStatus();
|
|
@@ -1848,6 +1940,7 @@ const getTelStatusFn = async () => {
|
|
|
isRest.value = result.isRest;
|
|
|
isCallHold.value = result.isCallHold;
|
|
|
isAcw.value = result.isCallEndArrange; // 是否话后整理中
|
|
|
+ isTelMute.value = result.isTelMute; // 是否静音中
|
|
|
} catch (e) {
|
|
|
console.log(e);
|
|
|
}
|
|
@@ -1871,6 +1964,7 @@ const callCenterConnect = async () => {
|
|
|
isCallHold.value = result.isCallHold;
|
|
|
isRest.value = result.isRest;
|
|
|
isAcw.value = result.isCallEndArrange; // 是否话后整理中
|
|
|
+ isTelMute.value = result.isTelMute; // 是否静音中
|
|
|
state.loading = false;
|
|
|
} else {
|
|
|
// 没有查询到当前用户上班状态 直接重置
|
|
@@ -1945,7 +2039,7 @@ onBeforeUnmount(() => {
|
|
|
}
|
|
|
.infos {
|
|
|
text-align: left;
|
|
|
- width: 140px;
|
|
|
+ width: 150px;
|
|
|
|
|
|
.dutyOn_status {
|
|
|
color: var(--el-color-primary);
|