Browse Source

feat:新增挂起外呼模式;

zhangchong 1 năm trước cách đây
mục cha
commit
bdcaa6c961

+ 190 - 118
src/layout/navBars/breadcrumb/telControl.vue

@@ -522,6 +522,7 @@ import {
 	busyOn,
 	queryBlacklist,
 	getTelStatus,
+	switchMode,
 } from '@/api/public/wex';
 import signalR from '@/utils/signalR';
 import { Local } from '@/utils/storage';
@@ -793,15 +794,23 @@ const onConnect = () => {
 
 	// ola.logout(currentTel.value.telNo); //连接之后,先登出一次,防止其他地方已经登陆
 	let array_ola_queue: EmptyArrayType = []; // 队列
-	if (currentTel.value.queue) {
+	if (currentTel.value.telModel === 2) {
+		// 外呼模式
+		let array = currentTel.value.queueCallOut.split(',');
+		for (let i = 0; i < array.length; i++) {
+			array_ola_queue[i] = array[i];
+		}
+	} else {
+		// 普通模式
 		let array = currentTel.value.queue.split(',');
 		for (let i = 0; i < array.length; i++) {
 			array_ola_queue[i] = array[i];
 		}
-		ola.login(array_ola_queue, currentTel.value.telNo, { type: 'onhook' });
-		connectVoiceAssistant(currentTel.value.telNo); // 坐席助手开启
 	}
 	Local.set('telNo', currentTel.value.telNo);
+	console.log(currentTel.value.telNo, '当前话机');
+	ola.login(array_ola_queue, currentTel.value.telNo, { type: 'onhook' });
+	connectVoiceAssistant(currentTel.value.telNo); // 坐席助手开启
 };
 // 业务系统发送消息
 const sendMsg = (msg: any) => {
@@ -826,27 +835,30 @@ const onMessage = async (event: any) => {
 			// 签入
 			// 设置分机号和坐席组
 			useTelStatusStore.setCallInfo({ telsNo: currentTel.value.telNo });
-			state.loading = true;
 			setTimeout(() => {
-				console.log('isRest', `当前分机是否正在休息${isRest.value}`);
-				if (isRest.value) {
-					// 如果是小休状态
-					ola.go_break(''); //设置忙碌
-				} else {
+				console.log(`当前话机模式:${currentTel.value.telModel} 2:外呼模式 1:普通模式`);
+				if (currentTel.value.telModel == 2) {
 					// 设置示闲状态
 					ola.go_ready();
-					console.log('呼叫中心:调用示闲');
+					// 设置外呼模式
+					useTelStatusStore.setCallOut(true);
+					// 设置话机状态 外呼模式中
+					useTelStatusStore.setPhoneControlState(TelStates.onCallOut);
+				} else {
+					console.log('isRest', `当前分机是否正在休息${isRest.value}`);
+					if (isRest.value) {
+						// 如果是小休状态
+						ola.go_break(''); //设置忙碌
+					} else {
+						// 设置示闲状态
+						ola.go_ready();
+						console.log('呼叫中心:调用示闲');
+					}
 				}
-			}, 1000);
+			}, 300);
 			console.log('呼叫中心:已签入');
 			ElMessage.success('签入成功');
-
-      // 链接成功 重置重连次数
-      reconnectAttempts = 0; // 重置重连次数
-      isReconnect.value = false; // 不需要重连了
-      setTimeout(()=>{
-        isReconnect.value = true;
-      },3000);
+			stopReconnect(); // 停止重连
 			sendMsg('login');
 		} else if (data.state == 'logout') {
 			// 签出
@@ -858,21 +870,39 @@ const onMessage = async (event: any) => {
 			isReconnect.value = false; // 不需要重连
 			seatAssistOff();
 		} else if (data.state == 'ready') {
-			// 结束计时
-			removeTimer();
-			// 设置分机号和坐席组
-			useTelStatusStore.setCallInfo({ telsNo: data.agent_extn });
-			// 设置签入状态
-			useTelStatusStore.setDutyState(true);
-			// 示闲中
-			// 设置休息状态 设置未正常状态
-			useTelStatusStore.setRest(RestStates.unRest);
-			// 设置话机状态 结束休息改为签入状态
-			useTelStatusStore.setPhoneControlState(TelStates.dutyOn);
-			state.loading = false;
-			// ElMessage.success('示闲中');
-			console.log('呼叫中心:示闲中');
-			sendMsg('ready');
+			if (currentTel.value.telModel === 2) {
+				// 外呼模式
+				// 结束计时
+				removeTimer();
+				// 设置分机号和坐席组
+				useTelStatusStore.setCallInfo({ telsNo: data.agent_extn });
+				// 设置签入状态
+				useTelStatusStore.setDutyState(true);
+				// 示闲中
+				// 设置外呼模式
+				useTelStatusStore.setCallOut(true);
+				// 设置话机状态 修改为外呼状态
+				useTelStatusStore.setPhoneControlState(TelStates.onCallOut);
+				state.loading = false;
+				console.log('呼叫中心 外呼模式:示闲中');
+				sendMsg('ready');
+			} else {
+				// 结束计时
+				removeTimer();
+				// 设置分机号和坐席组
+				useTelStatusStore.setCallInfo({ telsNo: data.agent_extn });
+				// 设置签入状态
+				useTelStatusStore.setDutyState(true);
+				// 示闲中
+				// 设置休息状态 设置未正常状态
+				useTelStatusStore.setRest(RestStates.unRest);
+				// 设置话机状态 结束休息改为签入状态
+				useTelStatusStore.setPhoneControlState(TelStates.dutyOn);
+				state.loading = false;
+				// ElMessage.success('示闲中');
+				console.log('呼叫中心:示闲中');
+				sendMsg('ready');
+			}
 		} else if (data.state == 'unready') {
 			break_reason(data.private_data);
 			sendMsg('unready'); // 发送消息 业务系统消息通知
@@ -915,39 +945,46 @@ const onMessage = async (event: any) => {
             });
       }*/
 		} else if (data.state == 'acw') {
-			console.log(call_direction.value, '呼入还是呼出');
-			if (call_direction.value === 'inbound') {
-				// 呼入需要进入话后整理
-				// 设置分机号和坐席组
-				useTelStatusStore.setCallInfo({ telsNo: data.agent_extn });
+			if (currentTel.value.telModel) {
+				// 挂机后 如果是外呼模式
+				// 呼出直接调用示闲
+				ola.go_ready(); // 示闲
+				console.log('外呼模式进入话后整理调用示闲');
+			} else {
+				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',
-					duration: 1000 * 10,
-				});
-				// 设置话后整理
-				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 {
-				// 呼出直接调用示闲
-				ola.go_ready(); // 示闲
-				console.log('呼叫中心:调用示闲');
+				}
 			}
 		} else if (data.state == 'busy') {
 			console.log(data.state, '其他状态');
@@ -1064,7 +1101,6 @@ const onMessage = async (event: any) => {
 		} else if (data.old_state == 'busy') {
 			//挂机后系统可以返回两种状态:acw 话后整理状态 ready 示闲状态,如果不需要acw,可以联系我们后台修改配置,如果需要保留,如果需要再次
 			//拨打电话的话,需要手动点击示闲按钮
-
 			// 设置分机号和坐席组
 			useTelStatusStore.setCallInfo({ telsNo: data.agent_extn });
 
@@ -1110,7 +1146,7 @@ const submitLogFn = async (event: any) => {
 // 呼叫中心链接关闭
 const isReconnect = ref(true); // 呼叫中心是否需要重连
 const onClose = async (event: any) => {
-  console.log('呼叫中心断开链接', isReconnect.value ? '需要重连' : '不需要重连');
+	console.log('呼叫中心断开链接', isReconnect.value ? '需要重连' : '不需要重连');
 	resetState();
 	if (isReconnect.value) {
 		await reConnect(); // 重新链接呼叫中心
@@ -1121,16 +1157,17 @@ const onClose = async (event: any) => {
 let reconnectAttempts = 0; // 重连次数
 let maxReconnectAttempts = 10; // 最大重连次数
 let reconnectInterval = 2; // 重连间隔
+const reconnectTimeout = ref(); // 重连定时器
 const reConnect = async () => {
-	ElNotification({
+	/*	ElNotification({
 		title: '重连提示',
 		message: `检测到与呼叫中心链接断开,${reconnectInterval}秒后将重新链接`,
 		type: 'warning',
 		duration: reconnectInterval * 1000,
-	});
+	});*/
 	console.log('开始重连', `已重连${reconnectAttempts}次,最大重连次数${maxReconnectAttempts}次,重连间隔${reconnectInterval}秒`);
 	if (reconnectAttempts < maxReconnectAttempts) {
-		setTimeout(() => {
+		reconnectTimeout.value = setTimeout(() => {
 			reconnectAttempts++;
 			websocket_connect();
 		}, reconnectInterval * 1000);
@@ -1143,6 +1180,15 @@ const reConnect = async () => {
 		console.error('已到达重连次数最高,请手动刷新重连');
 	}
 };
+// 链接成功 停止重连
+const stopReconnect = () => {
+	isReconnect.value = false;
+	clearTimeout(reconnectTimeout.value);
+	setTimeout(() => {
+		isReconnect.value = true;
+	}, 3000);
+	console.log('停止重连');
+};
 // 小休原因
 const restReason = ref(''); // 小休原因
 const break_reason = (reason: string) => {
@@ -1227,7 +1273,9 @@ const onDutyFn = async () => {
 					.then((res: any) => {
 						currentTel.value.password = res.result.telPwd;
 						currentTel.value.telNo = res.result.telNo;
-						currentTel.value.queue = res.result.queueId;
+						currentTel.value.queue = res.result.queueId; // 呼入分机组
+						currentTel.value.telModel = res.result.telModel; // 1:普通模式 2:呼出模式
+						currentTel.value.queueCallOut = res.result.queueCallOut; // 呼出分机组
 						// 不需要选择分机号和密码 直接签入 传入默认分机号
 						websocket_connect(); //开启消息监听
 						startDutyTimer(res.result.second); // 开启计时 签入时长
@@ -1240,6 +1288,7 @@ const onDutyFn = async () => {
 					});
 			})
 			.catch(() => {
+				resetState();
 				state.loading = false;
 			});
 	}
@@ -1275,17 +1324,23 @@ const clickOnDuty = (formEl: FormInstance | undefined) => {
 					// 需要分机和密码
 					currentTel.value.password = state.dutyForm.password;
 					currentTel.value.telNo = state.dutyForm.telNo;
-					currentTel.value.queue = res.result.queueId;
+					currentTel.value.queue = res.result.queueId; // 呼入分机组
+					currentTel.value.telModel = res.result.telModel; // 1:普通模式 2:呼出模式
+					currentTel.value.queueCallOut = res.result.queueCallOut; // 呼出分机组
 				} else if (AppConfigInfo.value.isNeedTelNo) {
 					//需要分机号
 					currentTel.value.password = res.result.telPwd;
 					currentTel.value.telNo = res.result.telNo;
-					currentTel.value.queue = res.result.queueId;
+					currentTel.value.queue = res.result.queueId; // 呼入分机组
+					currentTel.value.telModel = res.result.telModel; // 1:普通模式 2:呼出模式
+					currentTel.value.queueCallOut = res.result.queueCallOut; // 呼出分机组
 				} else if (AppConfigInfo.value.isTelNeedVerify) {
 					// 需要密码
 					currentTel.value.password = state.dutyForm.password;
 					currentTel.value.telNo = res.result.telNo;
-					currentTel.value.queue = res.result.queueId;
+					currentTel.value.queue = res.result.queueId; // 呼入分机组
+					currentTel.value.telModel = res.result.telModel; // 1:普通模式 2:呼出模式
+					currentTel.value.queueCallOut = res.result.queueCallOut; // 呼出分机组
 				}
 				websocket_connect(); //开启消息监听
 				startDutyTimer(res.result.second); // 开启计时 签入时长
@@ -1294,10 +1349,8 @@ const clickOnDuty = (formEl: FormInstance | undefined) => {
 				state.dutyDialogVisible = false;
 			})
 			.catch(() => {
-				// dutyOff();
-				// 重置所有状态
-				useTelStatusStore.resetState();
-				console.log('呼叫中心:签入错误111');
+				resetState(); // 重置所有状态
+				console.log('业务系统:签入错误');
 			})
 			.finally(() => {
 				state.loading = false;
@@ -1325,16 +1378,8 @@ const offDutyFn = () => {
 					setTimeout(() => {
 						ola.close();
 					}, 500);
-					// 重置所有状态
-					useTelStatusStore.resetState();
-					removeTimerOnDuty(); // 移除签入时长定时器
-					removeTimer(); // 移除通话计时器
-					clearTimeout(talkDealTimer.value); // 清除话后整理定时器
-					clearInterval(pingTimer.value); // 清除心跳定时器
-					clearInterval(onDutyTimer.value); // 清除签入时长定时器
-					clearInterval(talkTimer.value); // 清除通话时长定时器
-
 					state.dutyOnSrc = getImageUrl('phoneControls/dutyOn_blue.png'); //签入图片
+					resetState(); // 重置所有状态
 					state.loading = false;
 				})
 				.catch(() => {})
@@ -1348,7 +1393,7 @@ const offDutyFn = () => {
 };
 // 开启外呼模式
 const onCallOut = () => {
-	ElMessageBox.confirm(`确定要开启外呼模式,是否继续?`, '提示', {
+	ElMessageBox.confirm(`确定要进入外呼模式,进入外呼模式后将无法接听到来电`, '提示', {
 		confirmButtonText: '确认',
 		cancelButtonText: '取消',
 		type: 'warning',
@@ -1357,18 +1402,28 @@ const onCallOut = () => {
 		autofocus: false,
 	})
 		.then(() => {
-			// state.loading = true;
-			// 设置电话状态 外呼模式中
-			useTelStatusStore.setCallOut(true);
-			// 设置电话状态 保持中
-			useTelStatusStore.setPhoneControlState(TelStates.onCallOut);
-			sendMsg('held');
+			state.loading = true;
+			switchMode({ isCallOut: true })
+				.then(() => {
+					ola.logout(currentTel.value.telNo);
+					currentTel.value.telModel = 2;
+					websocket_connect();
+					// 设置电话状态 外呼模式中
+					useTelStatusStore.setCallOut(true);
+					// 设置电话状态 保持中
+					useTelStatusStore.setPhoneControlState(TelStates.onCallOut);
+					state.loading = false;
+					getTelStatusFn();
+				})
+				.catch(() => {
+					state.loading = false;
+				});
 		})
 		.catch(() => {});
 };
 // 关闭外呼模式
 const onUnCallOut = () => {
-	ElMessageBox.confirm(`确定要关闭外呼模式,是否继续?`, '提示', {
+	ElMessageBox.confirm(`确定要取消外呼模式,取消外呼模式后将会收到市民来电?`, '提示', {
 		confirmButtonText: '确认',
 		cancelButtonText: '取消',
 		type: 'warning',
@@ -1377,11 +1432,22 @@ const onUnCallOut = () => {
 		autofocus: false,
 	})
 		.then(() => {
-			// 设置电话状态 取消外呼模式
-			useTelStatusStore.setCallOut(false);
-			// 设置电话状态 保持中
-			useTelStatusStore.setPhoneControlState(TelStates.dutyOn);
-			// state.loading = true;
+			state.loading = true;
+			switchMode({ isCallOut: false })
+				.then(() => {
+					ola.logout(currentTel.value.telNo);
+					currentTel.value.telModel = 1;
+					websocket_connect();
+					// 设置电话状态 取消外呼模式
+					useTelStatusStore.setCallOut(false);
+					// 设置电话状态 保持中
+					useTelStatusStore.setPhoneControlState(TelStates.dutyOn);
+					state.loading = false;
+					getTelStatusFn();
+				})
+				.catch(() => {
+					state.loading = false;
+				});
 		})
 		.catch(() => {});
 };
@@ -1396,9 +1462,7 @@ const onHangup = () => {
 		autofocus: false,
 	})
 		.then(() => {
-			state.loading = true;
 			ola.hangup(); //挂断
-			state.loading = false;
 		})
 		.catch(() => {});
 };
@@ -1512,11 +1576,9 @@ const onRestEnd = () => {
 		autofocus: false,
 	})
 		.then(() => {
-			state.loading = true;
 			ola.go_ready(); // 示闲
 			busyOff(); // 结束小休(调用业务系统接口,统计需要)
 			console.log('呼叫中心:调用示闲');
-			state.loading = false;
 		})
 		.catch(() => {});
 };
@@ -1531,9 +1593,7 @@ const onHold = () => {
 		autofocus: false,
 	})
 		.then(() => {
-			state.loading = true;
 			ola.hold(); //保持
-			state.loading = false;
 		})
 		.catch(() => {});
 };
@@ -1548,10 +1608,8 @@ const onUnHold = () => {
 		autofocus: false,
 	})
 		.then(() => {
-			state.loading = true;
 			ola.unhold(); //取消保持
 			sendMsg('busy');
-			state.loading = false;
 		})
 		.catch(() => {});
 };
@@ -1568,7 +1626,6 @@ const unTalkingDeal = () => {
 		autofocus: false,
 	})
 		.then(() => {
-			state.loading = true;
 			// 设置话后整理
 			useTelStatusStore.setTalkingDeal(false);
 			// 设置话机状态 取消话后整理修改为空闲状态
@@ -1576,7 +1633,6 @@ const unTalkingDeal = () => {
 			ola.go_ready(); // 示闲
 			clearTimeout(talkDealTimer.value); // 清除话后整理定时器
 			console.log('呼叫中心:调用示闲');
-			state.loading = false;
 		})
 		.catch(() => {});
 };
@@ -1714,6 +1770,22 @@ const resetState = () => {
 	clearInterval(pingTimer.value); // 清除心跳定时器
 	clearInterval(onDutyTimer.value); // 清除签入时长定时器
 	clearInterval(talkTimer.value); // 清除通话时长定时器
+	state.loading = false;
+};
+// 获取当前分机状态
+const getTelStatusFn = async () => {
+	try {
+		const { result } = await getTelStatus();
+		currentTel.value.password = result.telPwd;
+		currentTel.value.telNo = result.telNo;
+		currentTel.value.queue = result.queueId; // 呼入分机组
+		currentTel.value.telModel = result.telModel; // 1:普通模式 2:呼出模式
+		currentTel.value.queueCallOut = result.queueCallOut; // 呼出分机组
+		startDutyTimer(result.second); // 开启计时 签入时长
+		isRest.value = result.isRest;
+	} catch (e) {
+		console.log(e);
+	}
 };
 // 刷新页面呼叫中心链接
 const callCenterConnect = async () => {
@@ -1721,19 +1793,18 @@ const callCenterConnect = async () => {
 	try {
 		// 查询当前用户状态
 		const { result } = await getTelStatus();
-		console.log(result);
 		if (result) {
 			// 查询到当前用户的状态
-      // 刷新页面
-      currentTel.value.password = result.telPwd;
-      currentTel.value.telNo = result.telNo;
-      currentTel.value.queue = result.queueId; // 呼入分机组
-      currentTel.value.telModel = result.telModel; // 1:普通模式 2:呼出模式
-      currentTel.value.queueCallOut = result.queueCallOut; // 呼出分机组
-      websocket_connect(); //开启消息监听
-      startDutyTimer(result.second); // 开启计时 签入时长
-      isRest.value = result.isRest;
-      state.loading = false;
+			// 刷新页面
+			currentTel.value.password = result.telPwd;
+			currentTel.value.telNo = result.telNo;
+			currentTel.value.queue = result.queueId; // 呼入分机组
+			currentTel.value.telModel = result.telModel; // 1:普通模式 2:呼出模式
+			currentTel.value.queueCallOut = result.queueCallOut; // 呼出分机组
+			websocket_connect(); //开启消息监听
+			startDutyTimer(result.second); // 开启计时 签入时长
+			isRest.value = result.isRest;
+			state.loading = false;
 		} else {
 			// 没有查询到当前用户上班状态  直接重置
 			resetState();
@@ -1742,6 +1813,7 @@ const callCenterConnect = async () => {
 	} catch (e) {
 		// 重置所有状态
 		resetState();
+		state.loading = false;
 	}
 };
 // 获取小休原因

+ 1 - 1
src/views/business/publish/component/Order-redo.vue

@@ -207,7 +207,7 @@ const onSubmit = (formEl: FormInstance | undefined) => {
 				return {
 					orgId: item.key,
 					orgName: item.value,
-					errorId: item.reason.dicDataValue,
+					errorId: item.reason.id,
 					errorName: item.reason.dicDataName,
 				};
 			});