|
@@ -31,7 +31,6 @@
|
|
|
<img :src="getImageUrl('phoneControls/dutyOff_grey.png')" alt="" />
|
|
|
<span>签出</span>
|
|
|
</div>
|
|
|
- <!-- 签出不可用 -->
|
|
|
</template>
|
|
|
<!-- 灰色签入不可用 -->
|
|
|
<template v-else>
|
|
@@ -47,6 +46,27 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
+<!-- <!– 外呼模式和取消外呼模式 可用 –>
|
|
|
+ <template v-if="telStatusInfo.isDutyOn && activeArr.includes('callOut')">
|
|
|
+ <div
|
|
|
+ class="item active"
|
|
|
+ :title="telStatusInfo.isHold ? '取消外呼模式' : '外呼模式'"
|
|
|
+ @click="onControlClick(telStatusInfo.isCallOut ? 'unCallOut' : 'callOut')"
|
|
|
+ @mouseenter="onHover('callOutSrc', 'phoneControls/evaluate_white.png')"
|
|
|
+ @mouseleave="onHover('callOutSrc', 'phoneControls/evaluate_blue.png')"
|
|
|
+ >
|
|
|
+ <img :src="state.callOutSrc" alt="" />
|
|
|
+ <span>{{ telStatusInfo.isCallOut ? '取消外呼模式' : '外呼模式' }}</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <!– 灰色外呼不可用 –>
|
|
|
+ <template v-else>
|
|
|
+ <div class="item disabled" title="外呼模式">
|
|
|
+ <img :src="getImageUrl('phoneControls/evaluate_grey.png')" alt="" />
|
|
|
+ <span>外呼模式</span>
|
|
|
+ </div>
|
|
|
+ </template>-->
|
|
|
+
|
|
|
<!-- 可用挂断 -->
|
|
|
<template v-if="telStatusInfo.isDutyOn && activeArr.includes('hangup')">
|
|
|
<div
|
|
@@ -553,10 +573,11 @@ const state = reactive<any>({
|
|
|
hangupSrc: getImageUrl('phoneControls/hangup_blue.png'), //挂断图片
|
|
|
restSrc: getImageUrl('phoneControls/rest_blue.png'), //小休图片
|
|
|
holdSrc: getImageUrl('phoneControls/hold_blue.png'), //保持图片
|
|
|
- talkingDealSrc: getImageUrl('phoneControls/talkingDeal_blue.png'), //时候处理图片
|
|
|
+ talkingDealSrc: getImageUrl('phoneControls/talkingDeal_blue.png'), //话后整理图片
|
|
|
transferSrc: getImageUrl('phoneControls/transfer_blue.png'), //转接图片
|
|
|
conferenceSrc: getImageUrl('phoneControls/conference_blue.png'), //三方会议图片
|
|
|
outboundSrc: getImageUrl('phoneControls/outbound_blue.png'), //外呼图片
|
|
|
+ callOutSrc: getImageUrl('phoneControls/evaluate_blue.png'), // 外呼模式图片
|
|
|
restReasonOptions: [], // 小休原因
|
|
|
nextStepOptions: [], // 下一个环节
|
|
|
handlerOptions: [], // 处理人
|
|
@@ -638,12 +659,13 @@ const signalRStart = async () => {
|
|
|
const activeArr = computed(() => {
|
|
|
const switchCases: any = {
|
|
|
dutyOff: ['dutyOn'], // 签出状态
|
|
|
- dutyOn: ['dutyOff', 'rest', 'outbound', 'callForwarding'], // 已签入无通话状态
|
|
|
- rest: ['rest', 'callForwarding'], // 小休中状态
|
|
|
+ dutyOn: ['dutyOff', 'callOut', 'rest', 'outbound'], // 已签入无通话状态
|
|
|
+ onCallOut: ['callOut', 'outbound'], // 外呼模式中
|
|
|
+ rest: ['rest'], // 小休中状态
|
|
|
ring: ['hangup'], //振铃中
|
|
|
onCall: ['hangup', 'hold', 'transfer', 'evaluate', 'conference'], // 单个通话中
|
|
|
onHold: ['hangup', 'hold', 'transfer', 'evaluate'], // 保持中
|
|
|
- onTalkingDeal: ['dutyOff', 'rest', 'callForwarding', 'TalkingDeal'], // 话后整理中
|
|
|
+ onTalkingDeal: ['dutyOff', 'rest', 'TalkingDeal'], // 话后整理中
|
|
|
onConference: ['hangup'], // 三方会议中 只能挂断
|
|
|
onThreeWay: ['hangup', 'conference'], // 三方会议呼出中 只能挂断和踢人
|
|
|
};
|
|
@@ -658,6 +680,7 @@ const currentStatusText = computed(() => {
|
|
|
const statusMap: any = {
|
|
|
dutyOff: '签出',
|
|
|
dutyOn: '空闲',
|
|
|
+ onCallOut: '外呼中',
|
|
|
rest: '小休中',
|
|
|
ring: '振铃中',
|
|
|
onHold: '保持中',
|
|
@@ -705,6 +728,12 @@ const onControlClick = (val: string) => {
|
|
|
case 'dutyOff': //签出
|
|
|
offDutyFn();
|
|
|
break;
|
|
|
+ case 'unCallOut': //取消外呼模式
|
|
|
+ onUnCallOut();
|
|
|
+ break;
|
|
|
+ case 'callOut': //外呼模式
|
|
|
+ onCallOut();
|
|
|
+ break;
|
|
|
case 'hangup': //挂断
|
|
|
onHangup();
|
|
|
break;
|
|
@@ -739,110 +768,6 @@ const onControlClick = (val: string) => {
|
|
|
break;
|
|
|
}
|
|
|
};
|
|
|
-
|
|
|
-const dutyFormRef = ref<RefType>();
|
|
|
-const currentTel = ref<any>({}); // 当前分机
|
|
|
-const isRest = ref<boolean>(false); // 是否小休
|
|
|
-//签入
|
|
|
-const onDutyFn = async () => {
|
|
|
- if (AppConfigInfo.value.isNeedTelNo || AppConfigInfo.value.isTelNeedVerify) {
|
|
|
- // 需要选择分机号或者输入密码 打开弹窗选择分机号
|
|
|
- dutyFormRef.value?.resetFields();
|
|
|
- state.dutyDialogVisible = true;
|
|
|
- } else {
|
|
|
- ElMessageBox.confirm(`确定要签入,是否继续?`, '提示', {
|
|
|
- confirmButtonText: '确认',
|
|
|
- cancelButtonText: '取消',
|
|
|
- type: 'warning',
|
|
|
- draggable: true,
|
|
|
- cancelButtonClass: 'default-button',
|
|
|
- autofocus: false,
|
|
|
- })
|
|
|
- .then(() => {
|
|
|
- state.loading = true;
|
|
|
- dutyOn({ telNo: userInfos.value.defaultTelNo })
|
|
|
- .then((res: any) => {
|
|
|
- currentTel.value.password = res.result.telPwd;
|
|
|
- currentTel.value.telNo = res.result.telNo;
|
|
|
- currentTel.value.queue = res.result.queueId;
|
|
|
- // 不需要选择分机号和密码 直接签入 传入默认分机号
|
|
|
- websocket_connect(); //开启消息监听
|
|
|
- startDutyTimer(res.result.second); // 开启计时 签入时长
|
|
|
- isRest.value = res.result.isRest;
|
|
|
- state.loading = false;
|
|
|
- })
|
|
|
- .catch(() => {})
|
|
|
- .finally(() => {
|
|
|
- state.loading = false;
|
|
|
- });
|
|
|
- })
|
|
|
- .catch(() => {
|
|
|
- state.loading = false;
|
|
|
- });
|
|
|
- }
|
|
|
-};
|
|
|
-// 确认签入
|
|
|
-const clickOnDuty = (formEl: FormInstance | undefined) => {
|
|
|
- if (!formEl) return;
|
|
|
- formEl.validate((valid: boolean) => {
|
|
|
- if (!valid) return;
|
|
|
- state.loading = true;
|
|
|
- let request = {};
|
|
|
- if (AppConfigInfo.value.isNeedTelNo && AppConfigInfo.value.isTelNeedVerify) {
|
|
|
- // 需要分机和密码
|
|
|
- request = {
|
|
|
- telNo: state.dutyForm.telNo,
|
|
|
- telPwd: state.dutyForm.password,
|
|
|
- };
|
|
|
- } else if (AppConfigInfo.value.isNeedTelNo) {
|
|
|
- //需要分机号
|
|
|
- request = {
|
|
|
- telNo: state.dutyForm.telNo,
|
|
|
- };
|
|
|
- } else if (AppConfigInfo.value.isTelNeedVerify) {
|
|
|
- // 需要密码
|
|
|
- request = {
|
|
|
- telNo: state.dutyForm.telNo,
|
|
|
- telPwd: userInfos.value.defaultTelNo,
|
|
|
- };
|
|
|
- }
|
|
|
- dutyOn(request)
|
|
|
- .then((res: any) => {
|
|
|
- if (AppConfigInfo.value.isNeedTelNo && AppConfigInfo.value.isTelNeedVerify) {
|
|
|
- // 需要分机和密码
|
|
|
- currentTel.value.password = state.dutyForm.password;
|
|
|
- currentTel.value.telNo = state.dutyForm.telNo;
|
|
|
- currentTel.value.queue = res.result.queueId;
|
|
|
- } else if (AppConfigInfo.value.isNeedTelNo) {
|
|
|
- //需要分机号
|
|
|
- currentTel.value.password = res.result.telPwd;
|
|
|
- currentTel.value.telNo = res.result.telNo;
|
|
|
- currentTel.value.queue = res.result.queueId;
|
|
|
- } else if (AppConfigInfo.value.isTelNeedVerify) {
|
|
|
- // 需要密码
|
|
|
- currentTel.value.password = state.dutyForm.password;
|
|
|
- currentTel.value.telNo = res.result.telNo;
|
|
|
- currentTel.value.queue = res.result.queueId;
|
|
|
- }
|
|
|
- websocket_connect(); //开启消息监听
|
|
|
- startDutyTimer(res.result.second); // 开启计时 签入时长
|
|
|
- isRest.value = res.result.isRest;
|
|
|
- state.loading = false;
|
|
|
- state.dutyDialogVisible = false;
|
|
|
- })
|
|
|
- .catch(() => {
|
|
|
- // dutyOff();
|
|
|
- // 重置所有状态
|
|
|
- useTelStatusStore.resetState();
|
|
|
- console.log('呼叫中心:签入错误111');
|
|
|
- })
|
|
|
- .finally(() => {
|
|
|
- state.loading = false;
|
|
|
- state.dutyDialogVisible = false;
|
|
|
- });
|
|
|
- });
|
|
|
-};
|
|
|
-
|
|
|
// 链接呼叫中心
|
|
|
const websocket_connect = () => {
|
|
|
console.log('链接呼叫中心');
|
|
@@ -1020,9 +945,9 @@ const onMessage = async (event: any) => {
|
|
|
} else if (data.state == 'busy') {
|
|
|
console.log(data.state, '其他状态');
|
|
|
/* // 设置振铃中
|
|
|
- useTelStatusStore.setPhoneControlState(TelStates.ring);
|
|
|
- sendMsg('busy');
|
|
|
- console.log('呼叫中心:转接中....');*/
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.ring);
|
|
|
+ sendMsg('busy');
|
|
|
+ console.log('呼叫中心:转接中....');*/
|
|
|
} else {
|
|
|
console.log(data.state, '其他状态1');
|
|
|
}
|
|
@@ -1279,6 +1204,108 @@ const holdStatus = (holdStatus: string) => {
|
|
|
break;
|
|
|
}
|
|
|
};
|
|
|
+const dutyFormRef = ref<RefType>();
|
|
|
+const currentTel = ref<any>({}); // 当前分机
|
|
|
+const isRest = ref<boolean>(false); // 是否小休
|
|
|
+//签入
|
|
|
+const onDutyFn = async () => {
|
|
|
+ if (AppConfigInfo.value.isNeedTelNo || AppConfigInfo.value.isTelNeedVerify) {
|
|
|
+ // 需要选择分机号或者输入密码 打开弹窗选择分机号
|
|
|
+ dutyFormRef.value?.resetFields();
|
|
|
+ state.dutyDialogVisible = true;
|
|
|
+ } else {
|
|
|
+ ElMessageBox.confirm(`确定要签入,是否继续?`, '提示', {
|
|
|
+ confirmButtonText: '确认',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ draggable: true,
|
|
|
+ cancelButtonClass: 'default-button',
|
|
|
+ autofocus: false,
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ state.loading = true;
|
|
|
+ dutyOn({ telNo: userInfos.value.defaultTelNo })
|
|
|
+ .then((res: any) => {
|
|
|
+ currentTel.value.password = res.result.telPwd;
|
|
|
+ currentTel.value.telNo = res.result.telNo;
|
|
|
+ currentTel.value.queue = res.result.queueId;
|
|
|
+ // 不需要选择分机号和密码 直接签入 传入默认分机号
|
|
|
+ websocket_connect(); //开启消息监听
|
|
|
+ startDutyTimer(res.result.second); // 开启计时 签入时长
|
|
|
+ isRest.value = res.result.isRest;
|
|
|
+ state.loading = false;
|
|
|
+ })
|
|
|
+ .catch(() => {})
|
|
|
+ .finally(() => {
|
|
|
+ state.loading = false;
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ state.loading = false;
|
|
|
+ });
|
|
|
+ }
|
|
|
+};
|
|
|
+// 确认签入
|
|
|
+const clickOnDuty = (formEl: FormInstance | undefined) => {
|
|
|
+ if (!formEl) return;
|
|
|
+ formEl.validate((valid: boolean) => {
|
|
|
+ if (!valid) return;
|
|
|
+ state.loading = true;
|
|
|
+ let request = {};
|
|
|
+ if (AppConfigInfo.value.isNeedTelNo && AppConfigInfo.value.isTelNeedVerify) {
|
|
|
+ // 需要分机和密码
|
|
|
+ request = {
|
|
|
+ telNo: state.dutyForm.telNo,
|
|
|
+ telPwd: state.dutyForm.password,
|
|
|
+ };
|
|
|
+ } else if (AppConfigInfo.value.isNeedTelNo) {
|
|
|
+ //需要分机号
|
|
|
+ request = {
|
|
|
+ telNo: state.dutyForm.telNo,
|
|
|
+ };
|
|
|
+ } else if (AppConfigInfo.value.isTelNeedVerify) {
|
|
|
+ // 需要密码
|
|
|
+ request = {
|
|
|
+ telNo: state.dutyForm.telNo,
|
|
|
+ telPwd: userInfos.value.defaultTelNo,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ dutyOn(request)
|
|
|
+ .then((res: any) => {
|
|
|
+ if (AppConfigInfo.value.isNeedTelNo && AppConfigInfo.value.isTelNeedVerify) {
|
|
|
+ // 需要分机和密码
|
|
|
+ currentTel.value.password = state.dutyForm.password;
|
|
|
+ currentTel.value.telNo = state.dutyForm.telNo;
|
|
|
+ currentTel.value.queue = res.result.queueId;
|
|
|
+ } else if (AppConfigInfo.value.isNeedTelNo) {
|
|
|
+ //需要分机号
|
|
|
+ currentTel.value.password = res.result.telPwd;
|
|
|
+ currentTel.value.telNo = res.result.telNo;
|
|
|
+ currentTel.value.queue = res.result.queueId;
|
|
|
+ } else if (AppConfigInfo.value.isTelNeedVerify) {
|
|
|
+ // 需要密码
|
|
|
+ currentTel.value.password = state.dutyForm.password;
|
|
|
+ currentTel.value.telNo = res.result.telNo;
|
|
|
+ currentTel.value.queue = res.result.queueId;
|
|
|
+ }
|
|
|
+ websocket_connect(); //开启消息监听
|
|
|
+ startDutyTimer(res.result.second); // 开启计时 签入时长
|
|
|
+ isRest.value = res.result.isRest;
|
|
|
+ state.loading = false;
|
|
|
+ state.dutyDialogVisible = false;
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ // dutyOff();
|
|
|
+ // 重置所有状态
|
|
|
+ useTelStatusStore.resetState();
|
|
|
+ console.log('呼叫中心:签入错误111');
|
|
|
+ })
|
|
|
+ .finally(() => {
|
|
|
+ state.loading = false;
|
|
|
+ state.dutyDialogVisible = false;
|
|
|
+ });
|
|
|
+ });
|
|
|
+};
|
|
|
// 签出
|
|
|
const offDutyFn = () => {
|
|
|
ElMessageBox.confirm(`确定要签出,是否继续?`, '提示', {
|
|
@@ -1321,6 +1348,45 @@ const offDutyFn = () => {
|
|
|
state.loading = false;
|
|
|
});
|
|
|
};
|
|
|
+// 开启外呼模式
|
|
|
+const onCallOut = () => {
|
|
|
+ ElMessageBox.confirm(`确定要开启外呼模式,是否继续?`, '提示', {
|
|
|
+ confirmButtonText: '确认',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ draggable: true,
|
|
|
+ cancelButtonClass: 'default-button',
|
|
|
+ autofocus: false,
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ // state.loading = true;
|
|
|
+ // 设置电话状态 外呼模式中
|
|
|
+ useTelStatusStore.setCallOut(true);
|
|
|
+ // 设置电话状态 保持中
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.onCallOut);
|
|
|
+ sendMsg('held');
|
|
|
+ })
|
|
|
+ .catch(() => {});
|
|
|
+};
|
|
|
+// 关闭外呼模式
|
|
|
+const onUnCallOut = () => {
|
|
|
+ ElMessageBox.confirm(`确定要关闭外呼模式,是否继续?`, '提示', {
|
|
|
+ confirmButtonText: '确认',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ draggable: true,
|
|
|
+ cancelButtonClass: 'default-button',
|
|
|
+ autofocus: false,
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ // 设置电话状态 取消外呼模式
|
|
|
+ useTelStatusStore.setCallOut(false);
|
|
|
+ // 设置电话状态 保持中
|
|
|
+ useTelStatusStore.setPhoneControlState(TelStates.dutyOn);
|
|
|
+ // state.loading = true;
|
|
|
+ })
|
|
|
+ .catch(() => {});
|
|
|
+};
|
|
|
// 挂断
|
|
|
const onHangup = () => {
|
|
|
ElMessageBox.confirm(`确定要挂断,是否继续?`, '提示', {
|
|
@@ -1740,6 +1806,7 @@ onBeforeUnmount(() => {
|
|
|
height: 100%;
|
|
|
.duty-on-time {
|
|
|
width: 100px;
|
|
|
+ margin-left: 10px;
|
|
|
&-label {
|
|
|
display: block;
|
|
|
margin-top: 13px;
|