浏览代码

reactor:呼叫中心兼容;

zhangchong 9 月之前
父节点
当前提交
0661dfa646

+ 1 - 9
.env.development

@@ -16,21 +16,13 @@ VITE_FILE_PREFIX=http://open.fs.12345lm.cn
 VITE_AMAP_SECURITYJSCODE=dd12ddafb11921dbcdc5b9c4484bb4e2
 # 高德地图KEY
 VITE_AMAP_KEY=83f51df235e4008e4eaf515cff63785c
-# 呼叫中心socket地址
-VITE_CALLCENTER_SOCKET_URL=ws://222.213.23.229:29003/ola_socket
 # 智能客服登录地址
 VITE_VOICE_ASSISTANT_API_URL=http://118.121.59.30:19081
 # 智能客服socket地址
 VITE_VOICE_ASSISTANT_SOCKET_URL=ws://118.121.59.30:19005
-# 录音播放地址前缀
-VITE_RECORD_PREFIX=http://222.213.23.229:10085
-# 录音下载地址前缀
-VITE_RECORD_DOWNLOAD_PREFIX=http://222.213.23.229:10085
 # 捷通华声通话记录请求地址
 VITE_JTHS_API_URL=http://118.121.58.161:19021
 # 捷通华声AppKey
 VITE_JTHS_APPKEY=MTAwMDAx
 # 当前地州市
-VITE_CURRENT_CITY=zigong
-# 兴唐呼叫中心ws地址
-VITE_XINGTANG_SOCKET_URL=ws://123.56.10.71:7681
+VITE_CURRENT_CITY=zigong

+ 1 - 9
.env.production

@@ -16,21 +16,13 @@ VITE_FILE_PREFIX=http://open.fs.12345lm.cn
 VITE_AMAP_SECURITYJSCODE=dd12ddafb11921dbcdc5b9c4484bb4e2
 # 高德地图KEY
 VITE_AMAP_KEY=83f51df235e4008e4eaf515cff63785c
-# 呼叫中心socket地址
-VITE_CALLCENTER_SOCKET_URL=ws://222.213.23.229:29003/ola_socket
 # 智能客服登录地址
 VITE_VOICE_ASSISTANT_API_URL=http://118.121.59.30:19081
 # 智能客服socket地址
 VITE_VOICE_ASSISTANT_SOCKET_URL=ws://118.121.59.30:19005
-# 录音播放地址前缀
-VITE_RECORD_PREFIX=http://222.213.23.229:10085
-# 录音下载地址前缀
-VITE_RECORD_DOWNLOAD_PREFIX=http://222.213.23.229:10085
 # 捷通华声通话记录请求地址
 VITE_JTHS_API_URL=http://118.121.58.161:19021
 # 捷通华声AppKey
 VITE_JTHS_APPKEY=MTAwMDAx
 # 当前地州市
-VITE_CURRENT_CITY=yibin
-# 兴唐呼叫中心ws地址
-VITE_XINGTANG_SOCKET_URL=ws://123.56.10.71:7681
+VITE_CURRENT_CITY=yibin

+ 1 - 9
.env.st

@@ -16,21 +16,13 @@ VITE_FILE_PREFIX=http://open.fs.12345lm.cn
 VITE_AMAP_SECURITYJSCODE=dd12ddafb11921dbcdc5b9c4484bb4e2
 # 高德地图KEY
 VITE_AMAP_KEY=83f51df235e4008e4eaf515cff63785c
-# 呼叫中心socket地址
-VITE_CALLCENTER_SOCKET_URL=ws://222.213.23.229:29003/ola_socket
 # 智能客服登录地址
 VITE_VOICE_ASSISTANT_API_URL=http://118.121.59.30:19081
 # 智能客服socket地址
 VITE_VOICE_ASSISTANT_SOCKET_URL=ws://118.121.59.30:19005
-# 录音播放地址前缀
-VITE_RECORD_PREFIX=http://222.213.23.229:10085
-# 录音下载地址前缀
-VITE_RECORD_DOWNLOAD_PREFIX=http://222.213.23.229:10085
 # 捷通华声通话记录请求地址
 VITE_JTHS_API_URL=http://118.121.58.161:19021
 # 捷通华声AppKey
 VITE_JTHS_APPKEY=MTAwMDAx
 # 当前地州市
-VITE_CURRENT_CITY=zigong
-# 兴唐呼叫中心ws地址
-VITE_XINGTANG_SOCKET_URL=ws://123.56.10.71:7681
+VITE_CURRENT_CITY=zigong

+ 1 - 9
.env.yibin

@@ -16,21 +16,13 @@ VITE_FILE_PREFIX=http://218.6.151.146:50106
 VITE_AMAP_SECURITYJSCODE=dd12ddafb11921dbcdc5b9c4484bb4e2
 # 高德地图KEY
 VITE_AMAP_KEY=83f51df235e4008e4eaf515cff63785c
-# 呼叫中心socket地址
-VITE_CALLCENTER_SOCKET_URL=ws://218.6.151.146:50104/ola_socket
 # 智能客服登录地址
 VITE_VOICE_ASSISTANT_API_URL=http://218.6.151.146:50107
 # 智能客服socket地址
 VITE_VOICE_ASSISTANT_SOCKET_URL=ws://218.6.151.146:50108
-# 录音播放地址前缀
-VITE_RECORD_PREFIX=http://218.6.151.146:50104
-# 录音下载地址前缀
-VITE_RECORD_DOWNLOAD_PREFIX=http://192.168.2.212:29003
 # 捷通华声通话记录请求地址
 VITE_JTHS_API_URL=http://218.6.151.146:50110
 # 捷通华声AppKey
 VITE_JTHS_APPKEY=MTAwMDAx
 # 当前地州市
-VITE_CURRENT_CITY=yibin
-# 兴唐呼叫中心ws地址
-VITE_XINGTANG_SOCKET_URL=ws://123.56.10.71:7681
+VITE_CURRENT_CITY=yibin

+ 1 - 19
.env.zigong

@@ -16,27 +16,9 @@ VITE_FILE_PREFIX=http://171.94.154.2:50105/hlfs
 VITE_AMAP_SECURITYJSCODE=dd12ddafb11921dbcdc5b9c4484bb4e2
 # 高德地图KEY
 VITE_AMAP_KEY=83f51df235e4008e4eaf515cff63785c
-# 呼叫中心socket地址
-VITE_CALLCENTER_SOCKET_URL=ws://218.6.151.146:50104/ola_socket
-# 智能客服登录地址
-VITE_VOICE_ASSISTANT_API_URL=http://218.6.151.146:50107
-# 智能客服socket地址
-VITE_VOICE_ASSISTANT_SOCKET_URL=ws://218.6.151.146:50108
-# 录音播放地址前缀
-VITE_RECORD_PREFIX=http://218.6.151.146:50104
-# 录音下载地址前缀
-VITE_RECORD_DOWNLOAD_PREFIX=http://192.168.2.212:29003
 # 捷通华声通话记录请求地址
 VITE_JTHS_API_URL=http://218.6.151.146:50110
 # 捷通华声AppKey
 VITE_JTHS_APPKEY=MTAwMDAx
-# 登录背景图
-VITE_LOGIN_BG=login/login_bg.png
-# 是否开启logo
-VITE_IS_SHOW_LOGO=false
-# 底部显示文字
-VITE_FOOTER_TEXT=蜀ICP备2024053169号-1
 # 当前地州市
-VITE_CURRENT_CITY=zigong
-# 兴唐呼叫中心ws地址
-VITE_XINGTANG_SOCKET_URL=ws://123.56.10.71:7681
+VITE_CURRENT_CITY=zigong

+ 23 - 19
src/components/AudioPlayer/index.vue

@@ -70,6 +70,7 @@ import { formatDuration } from '@/utils/formatTime';
 import { ElMessage } from 'element-plus';
 import { downloadFileByStream } from '@/utils/tools';
 import { fileDownload } from '@/api/public/file';
+import { getCurrentCityConfig } from '@/utils/appConfig';
 
 // 定义父组件传过来的值
 const props = defineProps({
@@ -239,28 +240,31 @@ const mute = () => {
 	audioData.muteState = !audioData.muteState;
 };
 const loading = ref(false);
+const { recordDownLoadPrefix } = getCurrentCityConfig();
 // 下载
 const downLoad = () => {
 	loading.value = true;
-  if(props.recordingAbsolutePath){ // 有绝对路径需要拼接
-    fileDownload({ path: import.meta.env.VITE_RECORD_DOWNLOAD_PREFIX + props.recordingAbsolutePath })
-      .then((res: any) => {
-        downloadFileByStream(res, <string>props.fileName);
-        loading.value = false;
-      })
-      .catch(() => {
-        loading.value = false;
-      });
-  }else{ // 无绝对路径直接下载
-    fileDownload({ path: props.url })
-      .then((res: any) => {
-        downloadFileByStream(res, <string>props.fileName);
-        loading.value = false;
-      })
-      .catch(() => {
-        loading.value = false;
-      });
-  }
+	if (props.recordingAbsolutePath) {
+		// 有绝对路径需要拼接
+		fileDownload({ path: recordDownLoadPrefix + props.recordingAbsolutePath })
+			.then((res: any) => {
+				downloadFileByStream(res, <string>props.fileName);
+				loading.value = false;
+			})
+			.catch(() => {
+				loading.value = false;
+			});
+	} else {
+		// 无绝对路径直接下载
+		fileDownload({ path: props.url })
+			.then((res: any) => {
+				downloadFileByStream(res, <string>props.fileName);
+				loading.value = false;
+			})
+			.catch(() => {
+				loading.value = false;
+			});
+	}
 };
 nextTick(() => {
 	audioRef.value.onerror = () => {

+ 4 - 2
src/components/OrderDetail/index.vue

@@ -563,6 +563,7 @@ import { formatDate } from '@/utils/formatTime';
 import { callCenterOutbound } from '@/utils/callCenter';
 import { useUserInfo } from '@/stores/userInfo';
 import { storeToRefs } from 'pinia';
+import {getCurrentCityConfig} from "@/utils/appConfig";
 
 // 引入组件
 const OrderExpandDetail = defineAsyncComponent(() => import('@/views/business/order/components/Order-expand-detail.vue')); // 扩展信息
@@ -743,11 +744,12 @@ const handleClick = (val: string) => {
 const closeDialog = () => {
 	state.dialogVisible = false;
 };
-// 查看录音文件
+// 查看录音文件 播放录音
 const playRecordRef = ref<RefType>();
+const {recordPrefix} = getCurrentCityConfig();
 const recordFile = (obj: any) => {
 	const fileName = `工单编号-${obj.no} 录音文件`;
-	playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + obj.recordingAbsolutePath, fileName, obj.recordingAbsolutePath);
+	playRecordRef.value.openDialog(recordPrefix + obj.recordingAbsolutePath, fileName, obj.recordingAbsolutePath);
 };
 // 电话外呼
 const callPhone = (phoneNumber: number | string) => {

+ 6 - 4
src/layout/navBars/breadcrumb/ybTel.vue

@@ -544,6 +544,7 @@ import { useWebSocket } from '@/hooks/useWebsocket';
 import { olaFn } from '@/utils/olaFn';
 import { useIntervalFn, useTimeoutFn } from '@vueuse/shared/index';
 import { callCenterIsSignIn, callCenterWs,callCenterIsOnThePhone } from '@/utils/callCenter';
+import {getCurrentCityConfig} from "@/utils/appConfig";
 // 引入组件
 const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
 const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue'));
@@ -845,8 +846,9 @@ const onControlClick = (val: string) => {
 };
 // 链接呼叫中心
 const olaRef = ref();
+const {callCenterSocketUrl} = getCurrentCityConfig();
 const websocket_connect = () => {
-	olaRef.value = olaFn(import.meta.env.VITE_CALLCENTER_SOCKET_URL, {
+	olaRef.value = olaFn(callCenterSocketUrl, {
 		username: currentTel.value.telNo,
 		password: currentTel.value.password,
 		onConnected: onConnected, // 连接成功
@@ -894,7 +896,7 @@ const onConnected = () => {
 		creationTime: new Date(),
 		name,
 		remark,
-		executeUrl: import.meta.env.VITE_CALLCENTER_SOCKET_URL,
+		executeUrl: callCenterSocketUrl,
 	};
 	submitLogFn(request);
 	console.log(`${getNowDateTime()}:呼叫中心链接成功`);
@@ -910,7 +912,7 @@ const onDisconnected = (event: any) => {
 		creationTime: new Date(),
 		name,
 		remark,
-		executeUrl: import.meta.env.VITE_CALLCENTER_SOCKET_URL,
+		executeUrl: callCenterSocketUrl,
 	};
 	submitLogFn(request);
 	callCenterIsSignIn.value = false; // 签出状态
@@ -1149,7 +1151,7 @@ const onMessage = async (event: any) => {
 								creationTime: new Date(),
 								name,
 								remark,
-								executeUrl: import.meta.env.VITE_CALLCENTER_SOCKET_URL,
+								executeUrl: callCenterSocketUrl,
 							};
 							await submitLogFn(request);
 						} catch (e) {

+ 4 - 2
src/layout/navBars/breadcrumb/zgTel.vue

@@ -161,6 +161,7 @@ import { callCenterIsOnThePhone, callCenterIsSignIn, callCenterWs, currentTel }
 import mittBus from '@/utils/mitt';
 import { callCenterSignIn, callCenterSignOut, getCallCenterGroupList, getCallCenterList, getCallCenterStatus } from '@/api/callCenter';
 import { useTimeoutFn } from '@vueuse/shared/index';
+import { getCurrentCityConfig } from '@/utils/appConfig';
 const state = reactive({
 	dutyDialogVisible: false,
 	loading: false,
@@ -184,8 +185,9 @@ const state = reactive({
 });
 // ws实例对象
 const wsRef = ref();
+const { callCenterSocketUrl } = getCurrentCityConfig();
 const initWs = () => {
-	wsRef.value = useWebSocket(import.meta.env.VITE_XINGTANG_SOCKET_URL, {
+	wsRef.value = useWebSocket(callCenterSocketUrl, {
 		/*    heartbeat: {
           message: 'ping',
           interval: 5000,
@@ -1797,7 +1799,7 @@ const e_TelSignIn = async (telNo: string, groupId: string) => {
 		console.log(`${getNowDateTime()}:业务系统:签入成功`, result);
 	} catch (e) {
 		console.log(e);
-    sendSignOut(); // 签出
+		sendSignOut(); // 签出
 	}
 };
 /*

+ 21 - 2
src/utils/appConfig.ts

@@ -1,6 +1,12 @@
+/** @description 获取当前的环境变量名称 是否是正式环境
+ * */
+export const isProduction = () => {
+	return ['yibin', 'zigong'].includes(import.meta.env.VITE_MODE_NAME);
+};
 /**
  * @description 获取当前市州配置
- * @return
+ * @returns {object}
+ * @example {
  *     cityName: 'name', // 中文名称
  *     cityCode: 'code', // 6位区号
  *     cityAbbr: 'abbr', // 简写
@@ -8,6 +14,10 @@
  *     locationCenter: [lat,lng], // 地图中心点
  *     loginBg: 'loginBg', // 登录背景
  *     isShowLogo: true, // 是否显示左上角logo
+ *     callCenterSocketUrl: 'ws://218.6.151.146:50104/ola_socket', // 呼叫中心socket地址
+ *     recordPrefix: 'http://192.168.2.212:29003', // 播放录音地址前缀
+ *     recordDownLoadPrefix: 'http://192.168.2.212:29003', // 录音地址下载前缀
+ * }
  */
 export const getCurrentCityConfig = () => {
 	switch (import.meta.env.VITE_CURRENT_CITY) {
@@ -21,8 +31,11 @@ export const getCurrentCityConfig = () => {
 				recordNumber: '蜀ICP备19035032号-36', // 备案号
 				locationCenter: [104.643, 28.751694], // 地图中心点
 				loginBg: 'yibin/login_bg.png', // 登录背景
-				isShowLogo: true, // 是否显示左上角logo
+				isShowLogo: true, // 是否显示菜单左上角logo
 				favicon: 'yibin/favicon.ico',
+				callCenterSocketUrl: isProduction() ? 'ws://218.6.151.146:50104/ola_socket' : ' ws://222.213.23.229:29003/ola_socket', // 呼叫中心socket地址
+				recordPrefix: isProduction() ? 'http://218.6.151.146:50104' : 'http://222.213.23.229:10085', // 播放录音地址前缀
+				recordDownLoadPrefix: isProduction() ? 'http://192.168.2.212:29003' : 'http://222.213.23.229:10085', // 录音地址下载前缀
 			};
 		case 'zigong':
 			return {
@@ -37,6 +50,9 @@ export const getCurrentCityConfig = () => {
 				loginBg: 'login/login_bg.png',
 				isShowLogo: false,
 				favicon: 'zigong/favicon.ico',
+				callCenterSocketUrl: isProduction() ? 'ws://123.56.10.71:7681' : ' ws://123.56.10.71:7681', // 呼叫中心socket地址
+				recordPrefix: isProduction() ? 'http://123.56.10.71:8066/' : 'http://123.56.10.71:8066/', // 播放录音地址前缀
+				recordDownLoadPrefix: isProduction() ? 'http://123.56.10.71:8066/' : 'http://123.56.10.71:8066/', // 录音地址下载前缀
 			};
 		default:
 			return {
@@ -50,6 +66,9 @@ export const getCurrentCityConfig = () => {
 				loginBg: 'yibin/login_bg.png', // 登录背景
 				isShowLogo: true, // 是否显示左上角logo
 				favicon: 'yibin/favicon.ico',
+				callCenterSocketUrl: isProduction() ? 'ws://218.6.151.146:50104/ola_socket' : ' ws://222.213.23.229:29003/ola_socket', // 呼叫中心socket地址
+				recordPrefix: isProduction() ? 'http://218.6.151.146:50104' : 'http://222.213.23.229:10085', // 播放录音地址前缀
+				recordDownLoadPrefix: isProduction() ? 'http://192.168.2.212:29003' : 'http://222.213.23.229:10085', // 录音地址下载前
 			};
 	}
 };

+ 36 - 39
src/views/business/visit/component/Smart-visit-Detail.vue

@@ -22,19 +22,19 @@
 			:data="state.tableData"
 			@updateTable="queryList"
 			:loading="state.loading"
-      :total="state.total"
-      v-model:page-index="state.queryParams.PageIndex"
-      v-model:page-size="state.queryParams.PageSize"
+			:total="state.total"
+			v-model:page-index="state.queryParams.PageIndex"
+			v-model:page-size="state.queryParams.PageSize"
 			:toolButton="['refresh', 'setting', 'exportCurrent', 'exportAll']"
-      :exportMethod="getSmartVisitDetailExport"
-      :exportParams="requestParams"
+			:exportMethod="getSmartVisitDetailExport"
+			:exportParams="requestParams"
 		>
-      <template #operation="{ row }">
-        <template>
-          <el-button type="primary" @click="onPlaySoundRecording(row)" title="播放录音" link v-if="row.recordUrl">播放录音</el-button>
-          <el-button link type="primary" @click="onDownload(row)" title="下载录音" v-if="row.recordUrl"> 下载录音 </el-button>
-        </template>
-      </template>
+			<template #operation="{ row }">
+				<template>
+					<el-button type="primary" @click="onPlaySoundRecording(row)" title="播放录音" link v-if="row.recordUrl">播放录音</el-button>
+					<el-button link type="primary" @click="onDownload(row)" title="下载录音" v-if="row.recordUrl"> 下载录音 </el-button>
+				</template>
+			</template>
 			<template #title="{ row }">
 				<order-detail :order="row.order" @updateList="queryList">{{ row.order?.title }}</order-detail>
 			</template>
@@ -43,10 +43,12 @@
 </template>
 <script setup lang="tsx">
 import { formatDate } from '@/utils/formatTime';
-import {ElMessageBox, FormInstance} from 'element-plus';
+import { ElMessageBox, FormInstance } from 'element-plus';
 import { defineAsyncComponent, reactive, ref } from 'vue';
-import {getSmartVisitBaseData, getSmartVisitDetail, getSmartVisitDetailExport, getSmartVisitExport} from '@/api/smartVisit';
+import { getSmartVisitBaseData, getSmartVisitDetail, getSmartVisitDetailExport, getSmartVisitExport } from '@/api/smartVisit';
 import { downloadFileByStream } from '@/utils/tools';
+import { getCurrentCityConfig } from '@/utils/appConfig';
+import {fileDownload} from "@/api/public/file";
 
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
@@ -117,7 +119,7 @@ const columns = ref<any[]>([
 		prop: 'volved',
 		width: 170,
 	},
-  // { prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
+	// { prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
 ]);
 // 页面基础数据
 const aiOrderVisitState = ref([]);
@@ -132,7 +134,7 @@ const getBaseData = async () => {
 // 打开弹窗
 const openDialog = (row?: any) => {
 	if (row) {
-    state.dialogVisible = true;
+		state.dialogVisible = true;
 		getBaseData();
 		state.queryParams.id = row.id;
 		queryList();
@@ -144,12 +146,12 @@ const handleQuery = () => {
 	queryList();
 };
 // 查询智能回访明细表
-const requestParams = ref({})
+const requestParams = ref({});
 const queryList = async () => {
-  state.loading = true;
+	state.loading = true;
 	try {
 		state.tableData = [];
-    requestParams.value = state.queryParams;
+		requestParams.value = state.queryParams;
 		const res = await getSmartVisitDetail(state.queryParams);
 		state.tableData = res.result.items ?? [];
 		state.total = res.result.total ?? 0;
@@ -166,31 +168,26 @@ const close = () => {
 };
 // 播放录音
 const playRecordRef = ref<RefType>();
+const {recordPrefix,recordDownLoadPrefix} = getCurrentCityConfig();
 const onPlaySoundRecording = (val: any) => {
-  playRecordRef.value.openDialog(
-      import.meta.env.VITE_RECORD_PREFIX + val.recordingAbsolutePath,
-      val.recordingFileName,
-      val.recordingAbsolutePath,
-      val.cpn,
-      val.createdTime
-  );
+	playRecordRef.value.openDialog(recordPrefix + val.recordingAbsolutePath);
 };
 // 下载录音
 const onDownload = (row: any) => {
-  ElMessageBox.confirm(`您确定要下载此录音吗?`, '提示', {
-    confirmButtonText: '确认',
-    cancelButtonText: '取消',
-    type: 'warning',
-    draggable: true,
-    cancelButtonClass: 'default-button',
-    autofocus: false,
-  })
-      .then(() => {
-        fileDownload({ path: import.meta.env.VITE_RECORD_DOWNLOAD_PREFIX + row.recordingAbsolutePath }).then((res: any) => {
-          downloadFileByStream(res, row.recordingFileName);
-        });
-      })
-      .catch(() => {});
+	ElMessageBox.confirm(`您确定要下载此录音吗?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+			fileDownload({ path: recordDownLoadPrefix + row.recordingAbsolutePath }).then((res: any) => {
+				downloadFileByStream(res, row.recordingFileName);
+			});
+		})
+		.catch(() => {});
 };
 // 重置所有工单列表
 const queryParamsRef = ref<RefType>();

+ 3 - 1
src/views/business/visit/component/Visit-detail.vue

@@ -448,6 +448,7 @@ import dayjs from 'dayjs';
 import { visitDetailBaseData, visitOrder } from '@/api/business/visit';
 import mittBus from '@/utils/mitt';
 import { callCenterOutbound } from '@/utils/callCenter';
+import { getCurrentCityConfig } from '@/utils/appConfig';
 
 // 引入组件
 const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
@@ -571,9 +572,10 @@ const closeDialog = () => {
 };
 // 查看人工回访录音文件
 const playRecordRef = ref<RefType>();
+const { recordPrefix } = getCurrentCityConfig();
 const recordFile = (obj: any) => {
 	const fileName = `工单编号-${obj.orderDetail?.no} 人工回访录音文件`;
-	playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + obj.recordingAbsolutePath, fileName, obj.recordingAbsolutePath);
+	playRecordRef.value.openDialog(recordPrefix + obj.recordingAbsolutePath, fileName, obj.recordingAbsolutePath);
 };
 // 查看智能回访录音
 const onSmartRecord = () => {

+ 16 - 15
src/views/quality/done/components/Quality-inspection.vue

@@ -25,7 +25,7 @@
 							size="small"
 							type="primary"
 							class="ml8"
-							@click="recordFile(state.ruleForm?.order,'order')"
+							@click="recordFile(state.ruleForm?.order, 'order')"
 							>工单录音</el-button
 						>
 						<el-button
@@ -35,14 +35,13 @@
 							size="small"
 							type="primary"
 							class="ml8"
-							@click="recordFile(state.ruleForm?.visit,'visit')"
+							@click="recordFile(state.ruleForm?.visit, 'visit')"
 							>回访录音</el-button
 						>
 					</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="受理人:">
-            {{ state.orderDetail?.acceptorName }}</el-form-item>
+					<el-form-item label="受理人:"> {{ state.orderDetail?.acceptorName }}</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 					<el-form-item label="受理时间:"> {{ formatDate(state.orderDetail?.startTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
@@ -188,6 +187,7 @@ import { formatDate, formatDuration } from '@/utils/formatTime';
 import Other from '@/utils/other';
 import { qualityUpdate, qualityDetail } from '@/api/quality';
 import { templateList } from '@/api/quality/template';
+import { getCurrentCityConfig } from '@/utils/appConfig';
 
 // 引入组件
 const PlayRecord = defineAsyncComponent(() => import('@/views/tels/callLog/component/Play-record.vue')); // 播放录音
@@ -303,17 +303,18 @@ const closeItem = () => {
 };
 // 查看录音文件
 const playRecordRef = ref<RefType>();
-const recordFile = (obj: any,type:string) => {
-  switch (type) {
-    case 'order':
-      const fileName = `工单编号-${obj.no} 录音文件`;
-      playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + obj.recordingAbsolutePath,fileName, obj.recordingAbsolutePath,obj.fromPhone,obj.fromPhone);
-      break;
-    case 'visit':
-      const fileNames = `工单编号-${obj.order?.no} 录音文件`;
-      playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + obj.recordingAbsolutePath,fileNames, obj.recordingAbsolutePath);
-      break;
-  }
+const { recordPrefix } = getCurrentCityConfig();
+const recordFile = (obj: any, type: string) => {
+	switch (type) {
+		case 'order':
+			const fileName = `工单编号-${obj.no} 录音文件`;
+			playRecordRef.value.openDialog(recordPrefix + obj.recordingAbsolutePath, fileName, obj.recordingAbsolutePath);
+			break;
+		case 'visit':
+			const fileNames = `工单编号-${obj.order?.no} 录音文件`;
+			playRecordRef.value.openDialog(recordPrefix + obj.recordingAbsolutePath, fileNames, obj.recordingAbsolutePath);
+			break;
+	}
 };
 // 新增质检项内容
 const onAddItem = () => {

+ 4 - 2
src/views/quality/index/components/Quality-inspection.vue

@@ -186,6 +186,7 @@ import { formatDate, formatDuration } from '@/utils/formatTime';
 import { templateList } from '@/api/quality/template';
 import Other from '@/utils/other';
 import { qualityUpdate, qualityDetail } from '@/api/quality';
+import { getCurrentCityConfig } from '@/utils/appConfig';
 
 // 引入组件
 const PlayRecord = defineAsyncComponent(() => import('@/views/tels/callLog/component/Play-record.vue')); // 播放录音
@@ -296,15 +297,16 @@ const closeItem = () => {
 };
 // 查看录音文件
 const playRecordRef = ref<RefType>();
+const { recordPrefix } = getCurrentCityConfig();
 const recordFile = (obj: any, type: string) => {
 	switch (type) {
 		case 'order':
 			const fileName = `工单编号-${obj.no} 录音文件`;
-			playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + obj.recordingAbsolutePath, fileName, obj.recordingAbsolutePath);
+			playRecordRef.value.openDialog(recordPrefix + obj.recordingAbsolutePath, fileName, obj.recordingAbsolutePath);
 			break;
 		case 'visit':
 			const fileNames = `工单编号-${obj.order?.no} 录音文件`;
-			playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + obj.recordingAbsolutePath, fileNames, obj.recordingAbsolutePath);
+			playRecordRef.value.openDialog(recordPrefix + obj.recordingAbsolutePath, fileNames, obj.recordingAbsolutePath);
 			break;
 	}
 };

+ 807 - 805
src/views/tels/callLog/ybCallLog.vue

@@ -1,299 +1,299 @@
 <template>
-  <div class="tels-callLog-container layout-pd">
-    <el-card shadow="never">
-      <el-tabs v-model="state.queryParams.type" @tab-change="changeTba">
-        <el-tab-pane name="0" label="全部"></el-tab-pane>
-        <el-tab-pane name="1" label="呼入已接"></el-tab-pane>
-        <el-tab-pane name="2" label="呼出已接"></el-tab-pane>
-        <el-tab-pane name="3" label="未接"></el-tab-pane>
-        <el-tab-pane name="4" label="智能应答"></el-tab-pane>
-        <el-tab-pane name="5" label="呼入白名单"></el-tab-pane>
-        <el-tab-pane name="6" label="呼入黑名单"></el-tab-pane>
-      </el-tabs>
-      <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent label-width="20px">
-        <el-row :gutter="10">
-          <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
-            <el-form-item prop="CPN">
-              <el-input v-model="state.queryParams.CPN" placeholder="主叫号码" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
-            <el-form-item prop="CDPN">
-              <el-input v-model="state.queryParams.CDPN" placeholder="被叫号码" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="['0', '1', '2', '3', '5', '6'].includes(state.queryParams.type)">
-            <el-form-item prop="TelNo">
-              <el-input v-model="state.queryParams.TelNo" placeholder="响应分机" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-          </el-col>
+	<div class="tels-callLog-container layout-pd">
+		<el-card shadow="never">
+			<el-tabs v-model="state.queryParams.type" @tab-change="changeTba">
+				<el-tab-pane name="0" label="全部"></el-tab-pane>
+				<el-tab-pane name="1" label="呼入已接"></el-tab-pane>
+				<el-tab-pane name="2" label="呼出已接"></el-tab-pane>
+				<el-tab-pane name="3" label="未接"></el-tab-pane>
+				<el-tab-pane name="4" label="智能应答"></el-tab-pane>
+				<el-tab-pane name="5" label="呼入白名单"></el-tab-pane>
+				<el-tab-pane name="6" label="呼入黑名单"></el-tab-pane>
+			</el-tabs>
+			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent label-width="20px">
+				<el-row :gutter="10">
+					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+						<el-form-item prop="CPN">
+							<el-input v-model="state.queryParams.CPN" placeholder="主叫号码" clearable @keyup.enter="handleQuery" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+						<el-form-item prop="CDPN">
+							<el-input v-model="state.queryParams.CDPN" placeholder="被叫号码" clearable @keyup.enter="handleQuery" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="['0', '1', '2', '3', '5', '6'].includes(state.queryParams.type)">
+						<el-form-item prop="TelNo">
+							<el-input v-model="state.queryParams.TelNo" placeholder="响应分机" clearable @keyup.enter="handleQuery" />
+						</el-form-item>
+					</el-col>
 
-          <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="['0', '1', '2', '3', '5'].includes(state.queryParams.type)">
-            <el-form-item prop="UserName">
-              <el-input v-model="state.queryParams.UserName" placeholder="话务员名称" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-          </el-col>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol || ['4', '6'].includes(state.queryParams.type)">
-              <el-form-item prop="gateway">
-                <el-input v-model="state.queryParams.gateway" placeholder="中继号码" clearable @keyup.enter="handleQuery" />
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '3'].includes(state.queryParams.type)">
-              <el-form-item prop="CallDirection">
-                <el-select v-model="state.queryParams.CallDirection" placeholder="电话方向" clearable class="w100" @change="handleQuery">
-                  <el-option v-for="item in state.callDirection" :value="item.key" :key="item.key" :label="item.value" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0'].includes(state.queryParams.type)">
-              <el-form-item prop="OnState">
-                <el-select v-model="state.queryParams.OnState" placeholder="通话结果" clearable class="w100" @change="handleQuery">
-                  <el-option v-for="item in state.onState" :value="item.key" :key="item.key" :label="item.value" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol || ['4'].includes(state.queryParams.type)">
-              <el-form-item prop="EndBy">
-                <el-select v-model="state.queryParams.EndBy" placeholder="挂机类型" clearable class="w100" @change="handleQuery">
-                  <el-option v-for="item in state.endByOptions" :value="item.key" :key="item.key" :label="item.value" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3', '4', '5'].includes(state.queryParams.type)">
-              <el-form-item prop="beginIvrTime">
-                <el-date-picker
-                    v-model="state.queryParams.beginIvrTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="ivr开始开始时间"
-                    end-placeholder="ivr开始结束时间"
-                    :shortcuts="shortcuts"
-                    @change="beginIvrTimeChange"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3', '4', '5'].includes(state.queryParams.type)">
-              <el-form-item prop="endIvrTime">
-                <el-date-picker
-                    v-model="state.queryParams.endIvrTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="ivr结束开始时间"
-                    end-placeholder="ivr结束结束时间"
-                    :shortcuts="shortcuts"
-                    @change="endIvrTimeChange"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3', '5'].includes(state.queryParams.type)">
-              <el-form-item prop="beginQueueTime">
-                <el-date-picker
-                    v-model="state.queryParams.beginQueueTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="队列开始开始时间"
-                    end-placeholder="队列开始结束时间"
-                    :shortcuts="shortcuts"
-                    @change="beginQueueTimeChange"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3', '5'].includes(state.queryParams.type)">
-              <el-form-item prop="endQueueTime">
-                <el-date-picker
-                    v-model="state.queryParams.endQueueTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="队列结束开始时间"
-                    end-placeholder="队列结束结束时间"
-                    :shortcuts="shortcuts"
-                    @change="endQueueTimeChange"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3', '5'].includes(state.queryParams.type)">
-              <el-form-item prop="beginRingTime">
-                <el-date-picker
-                    v-model="state.queryParams.beginRingTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="振铃开始开始时间"
-                    end-placeholder="振铃开始结束时间"
-                    :shortcuts="shortcuts"
-                    @change="beginRingTimeChange"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3', '5'].includes(state.queryParams.type)">
-              <el-form-item prop="endRingTime">
-                <el-date-picker
-                    v-model="state.queryParams.endRingTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="振铃结束开始时间"
-                    end-placeholder="振铃结束结束时间"
-                    :shortcuts="shortcuts"
-                    @change="endRingTimeChange"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
-              <el-form-item prop="callTime">
-                <el-date-picker
-                    v-model="state.queryParams.callTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="开始开始时间"
-                    end-placeholder="开始结束时间"
-                    :shortcuts="shortcuts"
-                    @change="callTimeChange"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '2', '4', '5'].includes(state.queryParams.type)">
-              <el-form-item prop="answeredTime">
-                <el-date-picker
-                    v-model="state.queryParams.answeredTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="接通开始时间"
-                    end-placeholder="接通结束时间"
-                    :shortcuts="shortcuts"
-                    @change="answeredTimeChange"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
-              <el-form-item prop="overTime">
-                <el-date-picker
-                    v-model="state.queryParams.overTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="挂断开始时间"
-                    end-placeholder="挂断结束时间"
-                    :shortcuts="shortcuts"
-                    @change="overTimeChange"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1'].includes(state.queryParams.type)">
-              <el-form-item prop="OrderNo">
-                <el-input v-model="state.queryParams.OrderNo" placeholder="工单编码" clearable @keyup.enter="handleQuery" />
-              </el-form-item>
-            </el-col>
-          </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1'].includes(state.queryParams.type)">
-              <el-form-item prop="Title">
-                <el-input v-model="state.queryParams.Title" placeholder="工单标题" clearable @keyup.enter="handleQuery" />
-              </el-form-item>
-            </el-col>
-          </transition>
-        </el-row>
-        <div class="w100 ml20">
-          <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-          <el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading">
-            <SvgIcon name="ele-Refresh" class="mr5" />重置
-          </el-button>
-          <el-button link type="primary" @click="closeSearch" :loading="state.loading">
-            {{ searchCol ? '展开' : '收起' }}
-            <SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
-          </el-button>
-        </div>
-      </el-form>
-    </el-card>
-    <el-card shadow="never">
-      <ProTable
-          ref="proTableRef"
-          :columns="columns"
-          :data="state.tableData"
-          @updateTable="queryList"
-          :loading="state.loading"
-          :total="state.total"
-          v-model:page-index="state.queryParams.PageIndex"
-          v-model:page-size="state.queryParams.PageSize"
-          :key="Math.random()"
-      >
-        <template #operation="{ row }">
-          <template v-if="['1'].includes(state.queryParams.type)">
-            <el-button link type="primary" @click="onCreate(row)" title="创建失联工单" v-auth="'tels:callLog:connectOrder'" v-if="!row.externalId">
-              失联工单
-            </el-button>
-            <el-button link type="primary" @click="onConnect(row)" title="关联业务" v-auth="'tels:callLog:connect'" v-if="!row.externalId">
-              关联业务
-            </el-button>
-            <el-button type="primary" @click="onPlaySoundRecording(row)" title="播放录音" link v-if="row.recordingAbsolutePath">播放录音</el-button>
-            <el-button link type="primary" @click="onDownload(row)" title="下载录音" v-if="row.recordingAbsolutePath"> 下载录音 </el-button>
-          </template>
-          <template v-else>
-            <el-button type="primary" @click="onPlaySoundRecording(row)" title="播放录音" link v-if="row.recordingAbsolutePath">播放录音</el-button>
-            <el-button link type="primary" @click="onDownload(row)" title="下载录音" v-if="row.recordingAbsolutePath"> 下载录音 </el-button>
-          </template>
-        </template>
-        <template #title="{ row }">
-          <order-detail :order="row.order" @updateList="queryList">{{ row.order?.title }}</order-detail>
-        </template>
-      </ProTable>
-    </el-card>
-    <!-- 播放录音 -->
-    <play-record ref="playRecordRef" />
-    <!-- 业务关联 -->
-    <connect-business ref="connectBusinessRef" @updateList="queryList" />
-  </div>
+					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="['0', '1', '2', '3', '5'].includes(state.queryParams.type)">
+						<el-form-item prop="UserName">
+							<el-input v-model="state.queryParams.UserName" placeholder="话务员名称" clearable @keyup.enter="handleQuery" />
+						</el-form-item>
+					</el-col>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol || ['4', '6'].includes(state.queryParams.type)">
+							<el-form-item prop="gateway">
+								<el-input v-model="state.queryParams.gateway" placeholder="中继号码" clearable @keyup.enter="handleQuery" />
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '3'].includes(state.queryParams.type)">
+							<el-form-item prop="CallDirection">
+								<el-select v-model="state.queryParams.CallDirection" placeholder="电话方向" clearable class="w100" @change="handleQuery">
+									<el-option v-for="item in state.callDirection" :value="item.key" :key="item.key" :label="item.value" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0'].includes(state.queryParams.type)">
+							<el-form-item prop="OnState">
+								<el-select v-model="state.queryParams.OnState" placeholder="通话结果" clearable class="w100" @change="handleQuery">
+									<el-option v-for="item in state.onState" :value="item.key" :key="item.key" :label="item.value" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol || ['4'].includes(state.queryParams.type)">
+							<el-form-item prop="EndBy">
+								<el-select v-model="state.queryParams.EndBy" placeholder="挂机类型" clearable class="w100" @change="handleQuery">
+									<el-option v-for="item in state.endByOptions" :value="item.key" :key="item.key" :label="item.value" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3', '4', '5'].includes(state.queryParams.type)">
+							<el-form-item prop="beginIvrTime">
+								<el-date-picker
+									v-model="state.queryParams.beginIvrTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="ivr开始开始时间"
+									end-placeholder="ivr开始结束时间"
+									:shortcuts="shortcuts"
+									@change="beginIvrTimeChange"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+									:default-time="defaultTimeStartEnd"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3', '4', '5'].includes(state.queryParams.type)">
+							<el-form-item prop="endIvrTime">
+								<el-date-picker
+									v-model="state.queryParams.endIvrTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="ivr结束开始时间"
+									end-placeholder="ivr结束结束时间"
+									:shortcuts="shortcuts"
+									@change="endIvrTimeChange"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+									:default-time="defaultTimeStartEnd"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3', '5'].includes(state.queryParams.type)">
+							<el-form-item prop="beginQueueTime">
+								<el-date-picker
+									v-model="state.queryParams.beginQueueTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="队列开始开始时间"
+									end-placeholder="队列开始结束时间"
+									:shortcuts="shortcuts"
+									@change="beginQueueTimeChange"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+									:default-time="defaultTimeStartEnd"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3', '5'].includes(state.queryParams.type)">
+							<el-form-item prop="endQueueTime">
+								<el-date-picker
+									v-model="state.queryParams.endQueueTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="队列结束开始时间"
+									end-placeholder="队列结束结束时间"
+									:shortcuts="shortcuts"
+									@change="endQueueTimeChange"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+									:default-time="defaultTimeStartEnd"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3', '5'].includes(state.queryParams.type)">
+							<el-form-item prop="beginRingTime">
+								<el-date-picker
+									v-model="state.queryParams.beginRingTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="振铃开始开始时间"
+									end-placeholder="振铃开始结束时间"
+									:shortcuts="shortcuts"
+									@change="beginRingTimeChange"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+									:default-time="defaultTimeStartEnd"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3', '5'].includes(state.queryParams.type)">
+							<el-form-item prop="endRingTime">
+								<el-date-picker
+									v-model="state.queryParams.endRingTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="振铃结束开始时间"
+									end-placeholder="振铃结束结束时间"
+									:shortcuts="shortcuts"
+									@change="endRingTimeChange"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+									:default-time="defaultTimeStartEnd"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
+							<el-form-item prop="callTime">
+								<el-date-picker
+									v-model="state.queryParams.callTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="开始开始时间"
+									end-placeholder="开始结束时间"
+									:shortcuts="shortcuts"
+									@change="callTimeChange"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+									:default-time="defaultTimeStartEnd"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '2', '4', '5'].includes(state.queryParams.type)">
+							<el-form-item prop="answeredTime">
+								<el-date-picker
+									v-model="state.queryParams.answeredTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="接通开始时间"
+									end-placeholder="接通结束时间"
+									:shortcuts="shortcuts"
+									@change="answeredTimeChange"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+									:default-time="defaultTimeStartEnd"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
+							<el-form-item prop="overTime">
+								<el-date-picker
+									v-model="state.queryParams.overTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="挂断开始时间"
+									end-placeholder="挂断结束时间"
+									:shortcuts="shortcuts"
+									@change="overTimeChange"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+									:default-time="defaultTimeStartEnd"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1'].includes(state.queryParams.type)">
+							<el-form-item prop="OrderNo">
+								<el-input v-model="state.queryParams.OrderNo" placeholder="工单编码" clearable @keyup.enter="handleQuery" />
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1'].includes(state.queryParams.type)">
+							<el-form-item prop="Title">
+								<el-input v-model="state.queryParams.Title" placeholder="工单标题" clearable @keyup.enter="handleQuery" />
+							</el-form-item>
+						</el-col>
+					</transition>
+				</el-row>
+				<div class="w100 ml20">
+					<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+					<el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading">
+						<SvgIcon name="ele-Refresh" class="mr5" />重置
+					</el-button>
+					<el-button link type="primary" @click="closeSearch" :loading="state.loading">
+						{{ searchCol ? '展开' : '收起' }}
+						<SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
+					</el-button>
+				</div>
+			</el-form>
+		</el-card>
+		<el-card shadow="never">
+			<ProTable
+				ref="proTableRef"
+				:columns="columns"
+				:data="state.tableData"
+				@updateTable="queryList"
+				:loading="state.loading"
+				:total="state.total"
+				v-model:page-index="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+				:key="Math.random()"
+			>
+				<template #operation="{ row }">
+					<template v-if="['1'].includes(state.queryParams.type)">
+						<el-button link type="primary" @click="onCreate(row)" title="创建失联工单" v-auth="'tels:callLog:connectOrder'" v-if="!row.externalId">
+							失联工单
+						</el-button>
+						<el-button link type="primary" @click="onConnect(row)" title="关联业务" v-auth="'tels:callLog:connect'" v-if="!row.externalId">
+							关联业务
+						</el-button>
+						<el-button type="primary" @click="onPlaySoundRecording(row)" title="播放录音" link v-if="row.recordingAbsolutePath">播放录音</el-button>
+						<el-button link type="primary" @click="onDownload(row)" title="下载录音" v-if="row.recordingAbsolutePath"> 下载录音 </el-button>
+					</template>
+					<template v-else>
+						<el-button type="primary" @click="onPlaySoundRecording(row)" title="播放录音" link v-if="row.recordingAbsolutePath">播放录音</el-button>
+						<el-button link type="primary" @click="onDownload(row)" title="下载录音" v-if="row.recordingAbsolutePath"> 下载录音 </el-button>
+					</template>
+				</template>
+				<template #title="{ row }">
+					<order-detail :order="row.order" @updateList="queryList">{{ row.order?.title }}</order-detail>
+				</template>
+			</ProTable>
+		</el-card>
+		<!-- 播放录音 -->
+		<play-record ref="playRecordRef" />
+		<!-- 业务关联 -->
+		<connect-business ref="connectBusinessRef" @updateList="queryList" />
+	</div>
 </template>
 
 <script lang="tsx" setup name="callLog">
@@ -309,6 +309,7 @@ import { useRouter } from 'vue-router';
 import { fileDownload } from '@/api/public/file';
 import mittBus from '@/utils/mitt';
 import Other from '@/utils/other';
+import { getCurrentCityConfig } from '@/utils/appConfig';
 
 // 引入组件
 const PlayRecord = defineAsyncComponent(() => import('@/views/tels/callLog/component/Play-record.vue')); // 播放录音
@@ -320,613 +321,614 @@ const proTableRef = ref<RefType>(); // 表格ref
 const columns = ref<any[]>([]);
 // 定义变量内容
 const state = reactive<any>({
-  queryParams: {
-    PageIndex: 1, // 当前页
-    PageSize: 10, // 每页条数
-    type: '0',
-    StaffNo: null, // 分机号
-    CPN: null, // 主叫号码
-    CDPN: null, // 被叫号码
-    TelNo: null, // 响应分机
-    CallDirection: null, // 呼叫类型
-    UserName: null, // 话务员名称
-    gateway: null, //中继号码
-    OnState: null, // 结果
-    IsAiAnswered: null, // 是否智能应答
-    callTime: [], // 通话时间
-    answeredTime: [], // 接通时间
-    overTime: [], // 挂断时间段
-    beginIvrTime: [], // ivr开始时间段
-    endIvrTime: [], // ivr结束时间段
-    beginQueueTime: [], // 队列开始时间段
-    endQueueTime: [], // 队列结束时间段
-    beginRingTime: [], // 振铃开始时间段
-    endRingTime: [], // 振铃结束时间段
-    CallTimeStart: null, // 通话开始时间
-    CallTimeEnd: null, // 通话结束时间
-    OverTimeStart: null, // 挂断开始时间
-    OverTimeEnd: null, // 挂断结束时间
-    AnsweredTimeStart: null, // 接通开始时间
-    AnsweredTimeEnd: null, // 接通结束时间
-    BeginIvrTimeStart: null, // ivr开始开始时间
-    BeginIvrTimeEnd: null, // ivr开始结束时间
-    EndIvrTimeStart: null, // ivr结束开始时间
-    EndIvrTimeEnd: null, // ivr结束结束时间
-    BeginQueueTimeStart: null, // 队列开始开始时间
-    BeginQueueTimeEnd: null, // 队列开始结束时间
-    EndQueueTimeStart: null, // 队列结束开始时间
-    EndQueueTimeEnd: null, // 队列结束结束时间
-    BeginRingTimeStart: null, // 振铃开始开始时间
-    BeginRingTimeEnd: null, // 振铃开始结束时间
-    EndRingTimeStart: null, // 振铃结束开始时间
-    EndRingTimeEnd: null, // 振铃结束结束时间
-  },
-  tableData: [], // 列表数据
-  loading: false, // 加载
-  total: 0, // 总条数
-  callDirection: [],
-  onState: [],
-  endByOptions: [],
+	queryParams: {
+		PageIndex: 1, // 当前页
+		PageSize: 10, // 每页条数
+		type: '0',
+		StaffNo: null, // 分机号
+		CPN: null, // 主叫号码
+		CDPN: null, // 被叫号码
+		TelNo: null, // 响应分机
+		CallDirection: null, // 呼叫类型
+		UserName: null, // 话务员名称
+		gateway: null, //中继号码
+		OnState: null, // 结果
+		IsAiAnswered: null, // 是否智能应答
+		callTime: [], // 通话时间
+		answeredTime: [], // 接通时间
+		overTime: [], // 挂断时间段
+		beginIvrTime: [], // ivr开始时间段
+		endIvrTime: [], // ivr结束时间段
+		beginQueueTime: [], // 队列开始时间段
+		endQueueTime: [], // 队列结束时间段
+		beginRingTime: [], // 振铃开始时间段
+		endRingTime: [], // 振铃结束时间段
+		CallTimeStart: null, // 通话开始时间
+		CallTimeEnd: null, // 通话结束时间
+		OverTimeStart: null, // 挂断开始时间
+		OverTimeEnd: null, // 挂断结束时间
+		AnsweredTimeStart: null, // 接通开始时间
+		AnsweredTimeEnd: null, // 接通结束时间
+		BeginIvrTimeStart: null, // ivr开始开始时间
+		BeginIvrTimeEnd: null, // ivr开始结束时间
+		EndIvrTimeStart: null, // ivr结束开始时间
+		EndIvrTimeEnd: null, // ivr结束结束时间
+		BeginQueueTimeStart: null, // 队列开始开始时间
+		BeginQueueTimeEnd: null, // 队列开始结束时间
+		EndQueueTimeStart: null, // 队列结束开始时间
+		EndQueueTimeEnd: null, // 队列结束结束时间
+		BeginRingTimeStart: null, // 振铃开始开始时间
+		BeginRingTimeEnd: null, // 振铃开始结束时间
+		EndRingTimeStart: null, // 振铃结束开始时间
+		EndRingTimeEnd: null, // 振铃结束结束时间
+	},
+	tableData: [], // 列表数据
+	loading: false, // 加载
+	total: 0, // 总条数
+	callDirection: [],
+	onState: [],
+	endByOptions: [],
 });
 const ruleFormRef = ref<FormInstance>(); // 表单ref
 const searchCol = ref(true); // 展开/收起
 // 展开/收起
 const closeSearch = () => {
-  searchCol.value = !searchCol.value;
+	searchCol.value = !searchCol.value;
 };
 const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
-  if (val) {
-    state.queryParams[startKey] = val[0];
-    state.queryParams[endKey] = val[1];
-  } else {
-    state.queryParams[startKey] = null;
-    state.queryParams[endKey] = null;
-  }
-  handleQuery();
+	if (val) {
+		state.queryParams[startKey] = val[0];
+		state.queryParams[endKey] = val[1];
+	} else {
+		state.queryParams[startKey] = null;
+		state.queryParams[endKey] = null;
+	}
+	handleQuery();
 };
 // 通话开始和结束时间段
 const callTimeChange = (val: string[]) => {
-  handleTimeChange(val, 'CallTimeStart', 'CallTimeEnd');
+	handleTimeChange(val, 'CallTimeStart', 'CallTimeEnd');
 };
 // 接通开始和结束时间段
 const answeredTimeChange = (val: string[]) => {
-  handleTimeChange(val, 'AnsweredTimeStart', 'AnsweredTimeEnd');
+	handleTimeChange(val, 'AnsweredTimeStart', 'AnsweredTimeEnd');
 };
 // 挂断开始和结束时间段
 const overTimeChange = (val: string[]) => {
-  handleTimeChange(val, 'OverTimeStart', 'OverTimeEnd');
+	handleTimeChange(val, 'OverTimeStart', 'OverTimeEnd');
 };
 // IVR开始时间段
 const beginIvrTimeChange = (val: string[]) => {
-  handleTimeChange(val, 'BeginIvrTimeStart', 'BeginIvrTimeEnd');
+	handleTimeChange(val, 'BeginIvrTimeStart', 'BeginIvrTimeEnd');
 };
 // IVR结束时间段
 const endIvrTimeChange = (val: string[]) => {
-  handleTimeChange(val, 'EndIvrTimeStart', 'EndIvrTimeEnd');
+	handleTimeChange(val, 'EndIvrTimeStart', 'EndIvrTimeEnd');
 };
 // 队列开始时间段
 const beginQueueTimeChange = (val: string[]) => {
-  handleTimeChange(val, 'BeginQueueTimeStart', 'BeginQueueTimeEnd');
+	handleTimeChange(val, 'BeginQueueTimeStart', 'BeginQueueTimeEnd');
 };
 // 队列结束时间段
 const endQueueTimeChange = (val: string[]) => {
-  handleTimeChange(val, 'EndQueueTimeStart', 'EndQueueTimeEnd');
+	handleTimeChange(val, 'EndQueueTimeStart', 'EndQueueTimeEnd');
 };
 // 振铃开始和结束时间段
 const beginRingTimeChange = (val: string[]) => {
-  handleTimeChange(val, 'BeginRingTimeStart', 'BeginRingTimeEnd');
+	handleTimeChange(val, 'BeginRingTimeStart', 'BeginRingTimeEnd');
 };
 // 振铃结束时间段
 const endRingTimeChange = (val: string[]) => {
-  handleTimeChange(val, 'EndRingTimeStart', 'EndRingTimeEnd');
+	handleTimeChange(val, 'EndRingTimeStart', 'EndRingTimeEnd');
 };
 // 全部表头
 const allColumns = [
-  { prop: 'cpn', label: '主叫号码', width: 120 },
-  { prop: 'cdpn', label: '被叫号码', width: 120 },
-  { prop: 'order.no', label: '工单编码', width: 150 },
-  { prop: 'order.title', label: '工单标题', width: 200 },
-  { prop: 'telNo', label: '响应分机', width: 120 },
-  { prop: 'gateway', label: '中继号码', width: 120 },
-  { prop: 'mobileAreaName', label: '号码归属地', width: 120 },
-  { prop: 'userName', label: '话务员', width: 120 },
-  { prop: 'duration', label: '通话时间(秒)', width: 120 },
-  { prop: 'onStateText', label: '通话结果' },
-  { prop: 'callDirectionText', label: '电话方向' },
-  { prop: 'endByText', label: '挂机类型', width: 120 },
-  {
-    prop: 'beginIvrTime',
-    label: 'ivr开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'endIvrTime',
-    label: 'ivr结束时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.endIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'beginQueueTime',
-    label: '队列开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.beginQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'endQueueTime',
-    label: '队列结束时间',
-    width: 170,
-    render: (scope) => {
-      return <span>{formatDate(scope.row.endQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-  {
-    prop: 'beginRingTime',
-    label: '开始振铃时间',
-    width: 170,
-    render: (scope) => {
-      return <span>{formatDate(scope.row.beginRingTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-  {
-    prop: 'endRingTimg',
-    label: '结束振铃时间',
-    width: 170,
-    render: (scope) => {
-      return <span>{formatDate(scope.row.endRingTimg, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-  {
-    prop: 'createdTime',
-    label: '开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'answeredTime',
-    label: '接通时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.answeredTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  { prop: 'overTime', label: '挂断时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
-  { prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
+	{ prop: 'cpn', label: '主叫号码', width: 120 },
+	{ prop: 'cdpn', label: '被叫号码', width: 120 },
+	{ prop: 'order.no', label: '工单编码', width: 150 },
+	{ prop: 'order.title', label: '工单标题', width: 200 },
+	{ prop: 'telNo', label: '响应分机', width: 120 },
+	{ prop: 'gateway', label: '中继号码', width: 120 },
+	{ prop: 'mobileAreaName', label: '号码归属地', width: 120 },
+	{ prop: 'userName', label: '话务员', width: 120 },
+	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
+	{ prop: 'onStateText', label: '通话结果' },
+	{ prop: 'callDirectionText', label: '电话方向' },
+	{ prop: 'endByText', label: '挂机类型', width: 120 },
+	{
+		prop: 'beginIvrTime',
+		label: 'ivr开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'endIvrTime',
+		label: 'ivr结束时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.endIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'beginQueueTime',
+		label: '队列开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.beginQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'endQueueTime',
+		label: '队列结束时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.endQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'beginRingTime',
+		label: '开始振铃时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.beginRingTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'endRingTimg',
+		label: '结束振铃时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.endRingTimg, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'createdTime',
+		label: '开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'answeredTime',
+		label: '接通时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.answeredTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{ prop: 'overTime', label: '挂断时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
 ];
 // 呼入已接表头
 const inColumns = [
-  { prop: 'cpn', label: '主叫号码', width: 120 },
-  { prop: 'cdpn', label: '被叫号码', width: 120 },
-  { prop: 'order.no', label: '工单编码', width: 150 },
-  { prop: 'title', label: '工单标题', width: 300 },
-  { prop: 'telNo', label: '响应分机', width: 120 },
-  { prop: 'gateway', label: '中继号码', width: 120 },
-  { prop: 'mobileAreaName', label: '号码归属地', width: 120 },
-  { prop: 'userName', label: '话务员', width: 120 },
-  { prop: 'duration', label: '通话时间(秒)', width: 120 },
-  { prop: 'endByText', label: '挂机类型', width: 120 },
-  {
-    prop: 'beginIvrTime',
-    label: 'ivr开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'endIvrTime',
-    label: 'ivr结束时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.endIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'beginQueueTime',
-    label: '队列开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.beginQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'endQueueTime',
-    label: '队列结束时间',
-    width: 170,
-    render: (scope) => {
-      return <span>{formatDate(scope.row.endQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-  {
-    prop: 'beginRingTime',
-    label: '开始振铃时间',
-    width: 170,
-    render: (scope) => {
-      return <span>{formatDate(scope.row.beginRingTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-  {
-    prop: 'endRingTimg',
-    label: '结束振铃时间',
-    width: 170,
-    render: (scope) => {
-      return <span>{formatDate(scope.row.endRingTimg, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-  {
-    prop: 'createdTime',
-    label: '开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'answeredTime',
-    label: '接通时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.answeredTime, ' YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  { prop: 'overTime', label: '挂断结束时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
-  { prop: 'operation', label: '操作', fixed: 'right', width: 310, align: 'center' },
+	{ prop: 'cpn', label: '主叫号码', width: 120 },
+	{ prop: 'cdpn', label: '被叫号码', width: 120 },
+	{ prop: 'order.no', label: '工单编码', width: 150 },
+	{ prop: 'title', label: '工单标题', width: 300 },
+	{ prop: 'telNo', label: '响应分机', width: 120 },
+	{ prop: 'gateway', label: '中继号码', width: 120 },
+	{ prop: 'mobileAreaName', label: '号码归属地', width: 120 },
+	{ prop: 'userName', label: '话务员', width: 120 },
+	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
+	{ prop: 'endByText', label: '挂机类型', width: 120 },
+	{
+		prop: 'beginIvrTime',
+		label: 'ivr开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'endIvrTime',
+		label: 'ivr结束时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.endIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'beginQueueTime',
+		label: '队列开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.beginQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'endQueueTime',
+		label: '队列结束时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.endQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'beginRingTime',
+		label: '开始振铃时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.beginRingTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'endRingTimg',
+		label: '结束振铃时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.endRingTimg, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'createdTime',
+		label: '开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'answeredTime',
+		label: '接通时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.answeredTime, ' YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{ prop: 'overTime', label: '挂断结束时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 310, align: 'center' },
 ];
 // 呼出已接表头
 const outColumns = [
-  { prop: 'cpn', label: '主叫号码', width: 120 },
-  { prop: 'cdpn', label: '被叫号码', width: 120 },
-  { prop: 'telNo', label: '响应分机' },
-  { prop: 'gateway', label: '中继号码', width: 120 },
-  { prop: 'userName', label: '话务员' },
-  { prop: 'duration', label: '通话时间(秒)', width: 120 },
-  { prop: 'endByText', label: '挂机类型', width: 120 },
-  {
-    prop: 'createdTime',
-    label: '开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'answeredTime',
-    label: '接通时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.answeredTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  { prop: 'overTime', label: '挂断时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
-  { prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
+	{ prop: 'cpn', label: '主叫号码', width: 120 },
+	{ prop: 'cdpn', label: '被叫号码', width: 120 },
+	{ prop: 'telNo', label: '响应分机' },
+	{ prop: 'gateway', label: '中继号码', width: 120 },
+	{ prop: 'userName', label: '话务员' },
+	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
+	{ prop: 'endByText', label: '挂机类型', width: 120 },
+	{
+		prop: 'createdTime',
+		label: '开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'answeredTime',
+		label: '接通时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.answeredTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{ prop: 'overTime', label: '挂断时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
 ];
 // 未接表头
 const noColumns = [
-  { prop: 'cpn', label: '主叫号码', width: 120 },
-  { prop: 'cdpn', label: '被叫号码', width: 120 },
-  { prop: 'telNo', label: '响应分机' },
-  { prop: 'gateway', label: '中继号码', width: 120 },
-  { prop: 'mobileAreaName', label: '号码归属地', width: 120 },
-  { prop: 'userName', label: '话务员' },
-  { prop: 'callDirectionText', label: '电话方向' },
-  {
-    prop: 'beginIvrTime',
-    label: 'ivr开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'endIvrTime',
-    label: 'ivr结束时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.endIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'beginQueueTime',
-    label: '队列开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.beginQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'endQueueTime',
-    label: '队列结束时间',
-    width: 170,
-    render: (scope) => {
-      return <span>{formatDate(scope.row.endQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-  {
-    prop: 'beginRingTime',
-    label: '开始振铃时间',
-    width: 170,
-    render: (scope) => {
-      return <span>{formatDate(scope.row.beginRingTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-  {
-    prop: 'endRingTimg',
-    label: '结束振铃时间',
-    width: 170,
-    render: (scope) => {
-      return <span>{formatDate(scope.row.endRingTimg, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-  {
-    prop: 'createdTime',
-    label: '开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  { prop: 'overTime', label: '挂断时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
+	{ prop: 'cpn', label: '主叫号码', width: 120 },
+	{ prop: 'cdpn', label: '被叫号码', width: 120 },
+	{ prop: 'telNo', label: '响应分机' },
+	{ prop: 'gateway', label: '中继号码', width: 120 },
+	{ prop: 'mobileAreaName', label: '号码归属地', width: 120 },
+	{ prop: 'userName', label: '话务员' },
+	{ prop: 'callDirectionText', label: '电话方向' },
+	{
+		prop: 'beginIvrTime',
+		label: 'ivr开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'endIvrTime',
+		label: 'ivr结束时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.endIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'beginQueueTime',
+		label: '队列开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.beginQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'endQueueTime',
+		label: '队列结束时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.endQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'beginRingTime',
+		label: '开始振铃时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.beginRingTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'endRingTimg',
+		label: '结束振铃时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.endRingTimg, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'createdTime',
+		label: '开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{ prop: 'overTime', label: '挂断时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
 ];
 // 智能应答
 const smartColumns = [
-  { prop: 'cpn', label: '主叫号码', width: 120 },
-  { prop: 'cdpn', label: '被叫号码', width: 120 },
-  { prop: 'gateway', label: '中继号码', width: 120 },
-  { prop: 'mobileAreaName', label: '号码归属地', width: 120 },
-  { prop: 'duration', label: '通话时间(秒)', width: 120 },
-  { prop: 'endByText', label: '挂机类型', width: 120 },
-  {
-    prop: 'beginIvrTime',
-    label: 'ivr开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'endIvrTime',
-    label: 'ivr结束时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.endIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'createdTime',
-    label: '开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'answeredTime',
-    label: '接通时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.answeredTime, ' YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  { prop: 'overTime', label: '挂断结束时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
-  { prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
+	{ prop: 'cpn', label: '主叫号码', width: 120 },
+	{ prop: 'cdpn', label: '被叫号码', width: 120 },
+	{ prop: 'gateway', label: '中继号码', width: 120 },
+	{ prop: 'mobileAreaName', label: '号码归属地', width: 120 },
+	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
+	{ prop: 'endByText', label: '挂机类型', width: 120 },
+	{
+		prop: 'beginIvrTime',
+		label: 'ivr开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'endIvrTime',
+		label: 'ivr结束时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.endIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'createdTime',
+		label: '开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'answeredTime',
+		label: '接通时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.answeredTime, ' YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{ prop: 'overTime', label: '挂断结束时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
 ];
 // 呼入白名单表头
 const whiteColumns = [
-  { prop: 'cpn', label: '主叫号码', width: 120 },
-  { prop: 'cdpn', label: '被叫号码', width: 120 },
-  { prop: 'telNo', label: '响应分机', width: 120 },
-  { prop: 'gateway', label: '中继号码', width: 120 },
-  { prop: 'mobileAreaName', label: '号码归属地', width: 120 },
-  { prop: 'userName', label: '话务员', width: 120 },
-  { prop: 'duration', label: '通话时间(秒)', width: 120 },
-  { prop: 'onStateText', label: '通话结果' },
-  { prop: 'callDirectionText', label: '电话方向' },
-  { prop: 'endByText', label: '挂机类型', width: 120 },
-  {
-    prop: 'beginIvrTime',
-    label: 'ivr开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'endIvrTime',
-    label: 'ivr结束时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.endIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'beginQueueTime',
-    label: '队列开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.beginQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'endQueueTime',
-    label: '队列结束时间',
-    width: 170,
-    render: (scope) => {
-      return <span>{formatDate(scope.row.endQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-  {
-    prop: 'beginRingTime',
-    label: '开始振铃时间',
-    width: 170,
-    render: (scope) => {
-      return <span>{formatDate(scope.row.beginRingTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-  {
-    prop: 'endRingTimg',
-    label: '结束振铃时间',
-    width: 170,
-    render: (scope) => {
-      return <span>{formatDate(scope.row.endRingTimg, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-  {
-    prop: 'createdTime',
-    label: '开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  {
-    prop: 'answeredTime',
-    label: '接通时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.answeredTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  { prop: 'overTime', label: '挂断时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
-  { prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
+	{ prop: 'cpn', label: '主叫号码', width: 120 },
+	{ prop: 'cdpn', label: '被叫号码', width: 120 },
+	{ prop: 'telNo', label: '响应分机', width: 120 },
+	{ prop: 'gateway', label: '中继号码', width: 120 },
+	{ prop: 'mobileAreaName', label: '号码归属地', width: 120 },
+	{ prop: 'userName', label: '话务员', width: 120 },
+	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
+	{ prop: 'onStateText', label: '通话结果' },
+	{ prop: 'callDirectionText', label: '电话方向' },
+	{ prop: 'endByText', label: '挂机类型', width: 120 },
+	{
+		prop: 'beginIvrTime',
+		label: 'ivr开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'endIvrTime',
+		label: 'ivr结束时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.endIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'beginQueueTime',
+		label: '队列开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.beginQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'endQueueTime',
+		label: '队列结束时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.endQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'beginRingTime',
+		label: '开始振铃时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.beginRingTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'endRingTimg',
+		label: '结束振铃时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.endRingTimg, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'createdTime',
+		label: '开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{
+		prop: 'answeredTime',
+		label: '接通时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.answeredTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{ prop: 'overTime', label: '挂断时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
 ];
 // 呼入黑名单表头
 const blackColumns = [
-  { prop: 'cpn', label: '主叫号码', minWidth: 120 },
-  { prop: 'cdpn', label: '被叫号码', minWidth: 120 },
-  { prop: 'telNo', label: '响应分机', minWidth: 120 },
-  { prop: 'gateway', label: '中继号码', minWidth: 120 },
-  { prop: 'mobileAreaName', label: '号码归属地', minWidth: 120 },
-  { prop: 'duration', label: '通话时间(秒)', minWidth: 120 },
-  { prop: 'endByText', label: '挂机类型', minWidth: 120 },
-  {
-    prop: 'createdTime',
-    label: '开始时间',
-    width: 170,
-    render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-  },
-  { prop: 'overTime', label: '挂断结束时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
+	{ prop: 'cpn', label: '主叫号码', minWidth: 120 },
+	{ prop: 'cdpn', label: '被叫号码', minWidth: 120 },
+	{ prop: 'telNo', label: '响应分机', minWidth: 120 },
+	{ prop: 'gateway', label: '中继号码', minWidth: 120 },
+	{ prop: 'mobileAreaName', label: '号码归属地', minWidth: 120 },
+	{ prop: 'duration', label: '通话时间(秒)', minWidth: 120 },
+	{ prop: 'endByText', label: '挂机类型', minWidth: 120 },
+	{
+		prop: 'createdTime',
+		label: '开始时间',
+		width: 170,
+		render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{ prop: 'overTime', label: '挂断结束时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
 ];
 const changeTba = () => {
-  ruleFormRef.value.resetFields();
-  handleQuery();
+	ruleFormRef.value.resetFields();
+	handleQuery();
 };
 // 手动查询,将页码设置为1
 const handleQuery = () => {
-  state.queryParams.PageIndex = 1;
-  queryList();
+	state.queryParams.PageIndex = 1;
+	queryList();
 };
 /** 通话记录列表 */
 const queryList = async () => {
-  state.loading = true;
-  try {
-    let request = Other.deepClone(state.queryParams);
-    request.CallTimeStart = state.queryParams.callTime === null ? null : state.queryParams.callTime[0];
-    request.CallTimeEnd = state.queryParams.callTime === null ? null : state.queryParams.callTime[1];
-    Reflect.deleteProperty(request, 'callTime'); // 通话开始和结束时间段
-    request.AnsweredTimeStart = state.queryParams.answeredTime === null ? null : state.queryParams.answeredTime[0];
-    request.AnsweredTimeEnd = state.queryParams.answeredTime === null ? null : state.queryParams.answeredTime[1];
-    Reflect.deleteProperty(request, 'answeredTime'); //接通开始和结束时间段
-    request.OverTimeStart = state.queryParams.overTime === null ? null : state.queryParams.overTime[0];
-    request.OverTimeEnd = state.queryParams.overTime === null ? null : state.queryParams.overTime[1];
-    Reflect.deleteProperty(request, 'overTime'); //挂断开始和结束时间段
-    request.BeginIvrTimeStart = state.queryParams.beginIvrTime === null ? null : state.queryParams.beginIvrTime[0];
-    request.BeginIvrTimeEnd = state.queryParams.beginIvrTime === null ? null : state.queryParams.beginIvrTime[1];
-    Reflect.deleteProperty(request, 'beginIvrTime'); //IVR开始时间段
-    request.EndIvrTimeStart = state.queryParams.endIvrTime === null ? null : state.queryParams.endIvrTime[0];
-    request.EndIvrTimeEnd = state.queryParams.endIvrTime === null ? null : state.queryParams.endIvrTime[1];
-    Reflect.deleteProperty(request, 'endIvrTime'); //IVR结束时间段
-    request.BeginQueueTimeStart = state.queryParams.beginQueueTime === null ? null : state.queryParams.beginQueueTime[0];
-    request.BeginQueueTimeEnd = state.queryParams.beginQueueTime === null ? null : state.queryParams.beginQueueTime[1];
-    Reflect.deleteProperty(request, 'beginQueueTime'); //队列开始时间段
-    request.EndQueueTimeStart = state.queryParams.endQueueTime === null ? null : state.queryParams.endQueueTime[0];
-    request.EndQueueTimeEnd = state.queryParams.endQueueTime === null ? null : state.queryParams.endQueueTime[1];
-    Reflect.deleteProperty(request, 'endQueueTime'); //队列结束时间段
-    request.BeginRingTimeStart = state.queryParams.beginRingTime === null ? null : state.queryParams.beginRingTime[0];
-    request.BeginRingTimeEnd = state.queryParams.beginRingTime === null ? null : state.queryParams.beginRingTime[1];
-    Reflect.deleteProperty(request, 'beginRingTime'); //振铃开始和结束时间段
-    request.EndRingTimeStart = state.queryParams.endRingTime === null ? null : state.queryParams.endRingTime[0];
-    request.EndRingTimeEnd = state.queryParams.endRingTime === null ? null : state.queryParams.endRingTime[1];
-    Reflect.deleteProperty(request, 'endRingTime'); //振铃结束时间段
-    Reflect.deleteProperty(request, 'type'); // 删除无用的参数
+	state.loading = true;
+	try {
+		let request = Other.deepClone(state.queryParams);
+		request.CallTimeStart = state.queryParams.callTime === null ? null : state.queryParams.callTime[0];
+		request.CallTimeEnd = state.queryParams.callTime === null ? null : state.queryParams.callTime[1];
+		Reflect.deleteProperty(request, 'callTime'); // 通话开始和结束时间段
+		request.AnsweredTimeStart = state.queryParams.answeredTime === null ? null : state.queryParams.answeredTime[0];
+		request.AnsweredTimeEnd = state.queryParams.answeredTime === null ? null : state.queryParams.answeredTime[1];
+		Reflect.deleteProperty(request, 'answeredTime'); //接通开始和结束时间段
+		request.OverTimeStart = state.queryParams.overTime === null ? null : state.queryParams.overTime[0];
+		request.OverTimeEnd = state.queryParams.overTime === null ? null : state.queryParams.overTime[1];
+		Reflect.deleteProperty(request, 'overTime'); //挂断开始和结束时间段
+		request.BeginIvrTimeStart = state.queryParams.beginIvrTime === null ? null : state.queryParams.beginIvrTime[0];
+		request.BeginIvrTimeEnd = state.queryParams.beginIvrTime === null ? null : state.queryParams.beginIvrTime[1];
+		Reflect.deleteProperty(request, 'beginIvrTime'); //IVR开始时间段
+		request.EndIvrTimeStart = state.queryParams.endIvrTime === null ? null : state.queryParams.endIvrTime[0];
+		request.EndIvrTimeEnd = state.queryParams.endIvrTime === null ? null : state.queryParams.endIvrTime[1];
+		Reflect.deleteProperty(request, 'endIvrTime'); //IVR结束时间段
+		request.BeginQueueTimeStart = state.queryParams.beginQueueTime === null ? null : state.queryParams.beginQueueTime[0];
+		request.BeginQueueTimeEnd = state.queryParams.beginQueueTime === null ? null : state.queryParams.beginQueueTime[1];
+		Reflect.deleteProperty(request, 'beginQueueTime'); //队列开始时间段
+		request.EndQueueTimeStart = state.queryParams.endQueueTime === null ? null : state.queryParams.endQueueTime[0];
+		request.EndQueueTimeEnd = state.queryParams.endQueueTime === null ? null : state.queryParams.endQueueTime[1];
+		Reflect.deleteProperty(request, 'endQueueTime'); //队列结束时间段
+		request.BeginRingTimeStart = state.queryParams.beginRingTime === null ? null : state.queryParams.beginRingTime[0];
+		request.BeginRingTimeEnd = state.queryParams.beginRingTime === null ? null : state.queryParams.beginRingTime[1];
+		Reflect.deleteProperty(request, 'beginRingTime'); //振铃开始和结束时间段
+		request.EndRingTimeStart = state.queryParams.endRingTime === null ? null : state.queryParams.endRingTime[0];
+		request.EndRingTimeEnd = state.queryParams.endRingTime === null ? null : state.queryParams.endRingTime[1];
+		Reflect.deleteProperty(request, 'endRingTime'); //振铃结束时间段
+		Reflect.deleteProperty(request, 'type'); // 删除无用的参数
 
-    switch (state.queryParams.type) {
-      case '0': // 全部
-        columns.value = allColumns;
-        break;
-      case '1': // 呼入已接
-        columns.value = inColumns;
-        request.CallDirection = 0;
-        request.OnState = 1;
-        break;
-      case '2': // 呼出已接
-        columns.value = outColumns;
-        request.CallDirection = 1;
-        request.OnState = 1;
-        break;
-      case '3': // 未接
-        columns.value = noColumns;
-        request.OnState = 2;
-        break;
-      case '4': // 智能应答
-        columns.value = smartColumns;
-        request.IsAiAnswered = true;
-        request.OnState = 1;
-        request.CallDirection = 0;
-        break;
-      case '5': // 呼入白名单
-        columns.value = whiteColumns;
-        request.PhoneTypes = 1; // 呼入VIP
-        request.CallDirection = 0; // 来电
-        break;
-      case '6': // 呼入黑名单
-        columns.value = blackColumns;
-        request.PhoneTypes = 2; // 呼入黑名单
-        break;
-      default:
-        columns.value = allColumns;
-        break;
-    }
-    const response = await callLogPaged(request);
-    state.tableData = response.result?.items ?? [];
-    state.total = response.result?.total ?? 0;
-    state.loading = false;
-  } catch (e) {
-    state.loading = false;
-    console.log(e);
-  }
+		switch (state.queryParams.type) {
+			case '0': // 全部
+				columns.value = allColumns;
+				break;
+			case '1': // 呼入已接
+				columns.value = inColumns;
+				request.CallDirection = 0;
+				request.OnState = 1;
+				break;
+			case '2': // 呼出已接
+				columns.value = outColumns;
+				request.CallDirection = 1;
+				request.OnState = 1;
+				break;
+			case '3': // 未接
+				columns.value = noColumns;
+				request.OnState = 2;
+				break;
+			case '4': // 智能应答
+				columns.value = smartColumns;
+				request.IsAiAnswered = true;
+				request.OnState = 1;
+				request.CallDirection = 0;
+				break;
+			case '5': // 呼入白名单
+				columns.value = whiteColumns;
+				request.PhoneTypes = 1; // 呼入VIP
+				request.CallDirection = 0; // 来电
+				break;
+			case '6': // 呼入黑名单
+				columns.value = blackColumns;
+				request.PhoneTypes = 2; // 呼入黑名单
+				break;
+			default:
+				columns.value = allColumns;
+				break;
+		}
+		const response = await callLogPaged(request);
+		state.tableData = response.result?.items ?? [];
+		state.total = response.result?.total ?? 0;
+		state.loading = false;
+	} catch (e) {
+		state.loading = false;
+		console.log(e);
+	}
 };
 /** 重置按钮操作 */
 const resetQuery = (formEl: FormInstance | undefined) => {
-  if (!formEl) return;
-  formEl.resetFields();
-  queryList();
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
 };
 // 播放录音
 const playRecordRef = ref<RefType>();
+const { recordPrefix, recordDownLoadPrefix } = getCurrentCityConfig();
 const onPlaySoundRecording = (val: any) => {
-  playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + val.recordingAbsolutePath, val.recordingFileName, val.recordingAbsolutePath);
+	playRecordRef.value.openDialog(recordPrefix + val.recordingAbsolutePath, val.recordingFileName, val.recordingAbsolutePath);
 };
 // 下载录音
 const onDownload = (row: any) => {
-  ElMessageBox.confirm(`您确定要下载此录音吗?`, '提示', {
-    confirmButtonText: '确认',
-    cancelButtonText: '取消',
-    type: 'warning',
-    draggable: true,
-    cancelButtonClass: 'default-button',
-    autofocus: false,
-  })
-      .then(() => {
-        fileDownload({ path: import.meta.env.VITE_RECORD_DOWNLOAD_PREFIX + row.recordingAbsolutePath }).then((res: any) => {
-          downloadFileByStream(res, row.recordingFileName);
-        });
-      })
-      .catch(() => {});
+	ElMessageBox.confirm(`您确定要下载此录音吗?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+			fileDownload({ path: recordDownLoadPrefix + row.recordingAbsolutePath }).then((res: any) => {
+				downloadFileByStream(res, row.recordingFileName);
+			});
+		})
+		.catch(() => {});
 };
 // 关联业务
 const connectBusinessRef = ref<RefType>();
 const onConnect = (row: any) => {
-  connectBusinessRef.value.openDialog(row);
+	connectBusinessRef.value.openDialog(row);
 };
 // 失联工单
 const router = useRouter();
 const onCreate = (row: any) => {
-  router.push({
-    name: 'orderAccept',
-    query: {
-      createBy: 'tel',
-      fromTel: row.cpn,
-      callId: row.otherAccept,
-      transfer: row.gateway,
-      telArea: '',
-    },
-  });
+	router.push({
+		name: 'orderAccept',
+		query: {
+			createBy: 'tel',
+			fromTel: row.cpn,
+			callId: row.otherAccept,
+			transfer: row.gateway,
+			telArea: '',
+		},
+	});
 };
 // 基础信息
 const getBaseData = async () => {
-  const response = await callBaseData();
-  state.callDirection = response.result.callDirection;
-  state.onState = response.result.onState;
-  state.endByOptions = response.result.endBy;
+	const response = await callBaseData();
+	state.callDirection = response.result.callDirection;
+	state.onState = response.result.onState;
+	state.endByOptions = response.result.endBy;
 };
 onMounted(() => {
-  getBaseData();
-  queryList();
+	getBaseData();
+	queryList();
 });
 onActivated(() => {
-  mittBus.on('clearCachePage', () => {
-    //清除缓存
-    queryList();
-  });
+	mittBus.on('clearCachePage', () => {
+		//清除缓存
+		queryList();
+	});
 });
 onBeforeUnmount(() => {
-  mittBus.off('clearCachePage');
+	mittBus.off('clearCachePage');
 });
 </script>
 <style lang="scss" scoped>
 .arrow {
-  transition: transform var(--el-transition-duration);
-  cursor: pointer;
+	transition: transform var(--el-transition-duration);
+	cursor: pointer;
 }
 .arrow.is-reverse {
-  transform: rotateZ(-180deg);
+	transform: rotateZ(-180deg);
 }
 </style>

+ 37 - 35
src/views/tels/callLog/zgCallLog.vue

@@ -2,7 +2,7 @@
 	<div class="tels-callLog-container layout-pd">
 		<el-card shadow="never">
 			<el-tabs v-model="state.queryParams.type" @tab-change="changeTba">
-<!--				<el-tab-pane name="0" label="全部"></el-tab-pane>-->
+				<!--				<el-tab-pane name="0" label="全部"></el-tab-pane>-->
 				<el-tab-pane name="1" label="呼入列表"></el-tab-pane>
 				<el-tab-pane name="2" label="呼出列表"></el-tab-pane>
 				<el-tab-pane name="3" label="未接列表"></el-tab-pane>
@@ -103,19 +103,19 @@
 				:pagination="false"
 			>
 				<template #operation="{ row }">
-					<template v-if="['1'].includes(state.queryParams.type)">
+					<template v-if="['1', '2'].includes(state.queryParams.type)">
 						<el-button link type="primary" @click="onCreate(row)" title="创建失联工单" v-auth="'tels:callLog:connectOrder'" v-if="!row.externalId">
 							失联工单
 						</el-button>
-						<el-button link type="primary" @click="onConnect(row)" title="关联业务" v-auth="'tels:callLog:connect'" v-if="!row.externalId">
+						<!--						<el-button link type="primary" @click="onConnect(row)" title="关联业务" v-auth="'tels:callLog:connect'" v-if="!row.externalId">
 							关联业务
-						</el-button>
-						<el-button type="primary" @click="onPlaySoundRecording(row)" title="播放录音" link v-if="row.recordingAbsolutePath">播放录音</el-button>
-						<el-button link type="primary" @click="onDownload(row)" title="下载录音" v-if="row.recordingAbsolutePath"> 下载录音 </el-button>
+						</el-button>-->
+						<el-button type="primary" @click="onPlaySoundRecording(row)" title="播放录音" link v-if="row.audioFile">播放录音</el-button>
+						<el-button link type="primary" @click="onDownload(row)" title="下载录音" v-if="row.audioFile"> 下载录音 </el-button>
 					</template>
 					<template v-else>
-						<el-button type="primary" @click="onPlaySoundRecording(row)" title="播放录音" link v-if="row.recordingAbsolutePath">播放录音</el-button>
-						<el-button link type="primary" @click="onDownload(row)" title="下载录音" v-if="row.recordingAbsolutePath"> 下载录音 </el-button>
+						<el-button type="primary" @click="onPlaySoundRecording(row)" title="播放录音" link v-if="row.audioFile">播放录音</el-button>
+						<el-button link type="primary" @click="onDownload(row)" title="下载录音" v-if="row.audioFile"> 下载录音 </el-button>
 					</template>
 				</template>
 				<template #title="{ row }">
@@ -153,6 +153,7 @@ import { fileDownload } from '@/api/public/file';
 import mittBus from '@/utils/mitt';
 import Other from '@/utils/other';
 import { getCallCenterCallRecord, getCallCenterCallRecordBaseData } from '@/api/callCenter';
+import { getCurrentCityConfig } from '@/utils/appConfig';
 
 // 引入组件
 const PlayRecord = defineAsyncComponent(() => import('@/views/tels/callLog/component/Play-record.vue')); // 播放录音
@@ -198,10 +199,10 @@ const allColumns = [
 	{ prop: 'toNo', label: '被叫号码', width: 120 },
 	{ prop: 'order.no', label: '工单编码', width: 150 },
 	{ prop: 'order.title', label: '工单标题', width: 200 },
-  { prop: 'telNo', label: '响应分机' },
+	{ prop: 'telNo', label: '响应分机' },
 	{ prop: 'mobileAreaName', label: '号码归属地', width: 120 },
 	{ prop: 'userName', label: '话务员', width: 120 },
-  { prop: 'groupId', label: '功能组号码', width: 120 },
+	{ prop: 'groupId', label: '功能组号码', width: 120 },
 	{ prop: 'duration', label: '通话时长(秒)', width: 120 },
 	{ prop: 'onStateText', label: '通话结果' },
 	{ prop: 'directionText', label: '电话方向' },
@@ -224,14 +225,14 @@ const inColumns = [
 	{ prop: 'telNo', label: '响应分机' },
 	{ prop: 'mobileAreaName', label: '号码归属地', width: 120 },
 	{ prop: 'userName', label: '话务员', width: 120 },
-  { prop: 'groupId', label: '功能组号码', width: 120 },
+	{ prop: 'groupId', label: '功能组号码', width: 120 },
 	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
-	{ prop: 'hangupBy', label: '挂断状态', width: 120 },
+	{ prop: 'endByText', label: '挂断状态', width: 120 },
 	{
-		prop: 'createdTime',
+		prop: 'beginIvrTime',
 		label: '开始时间',
 		width: 160,
-		render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+		render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
 	},
 	{
 		prop: 'answeredTime',
@@ -239,22 +240,22 @@ const inColumns = [
 		width: 160,
 		render: (scope) => <span>{formatDate(scope.row.answeredTime, ' YYYY-mm-dd HH:MM:SS')}</span>,
 	},
-	{ prop: 'overTime', label: '挂断时间', width: 160, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
-	{ prop: 'operation', label: '操作', fixed: 'right', width: 310, align: 'center' },
+	{ prop: 'endTime', label: '挂断时间', width: 160, render: (scope) => <span>{formatDate(scope.row.endTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 240, align: 'center' },
 ];
 // 呼出列表表头(已接通)
 const outColumns = [
 	{ prop: 'fromNo', label: '主叫号码', width: 120 },
 	{ prop: 'toNo', label: '被叫号码', width: 120 },
 	{ prop: 'telNo', label: '响应分机' },
-  { prop: 'hangupBy', label: '挂断状态', width: 120 },
-  { prop: 'groupId', label: '功能组号码', width: 120 },
+	{ prop: 'endByText', label: '挂断状态', width: 120 },
+	{ prop: 'groupId', label: '功能组号码', width: 120 },
 	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
 	{
-		prop: 'createdTime',
+		prop: 'beginIvrTime',
 		label: '开始时间',
 		width: 160,
-		render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+		render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
 	},
 	{
 		prop: 'answeredTime',
@@ -262,23 +263,23 @@ const outColumns = [
 		width: 160,
 		render: (scope) => <span>{formatDate(scope.row.answeredTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
 	},
-	{ prop: 'overTime', label: '挂断时间', width: 160, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
-	{ prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
+	{ prop: 'endTime', label: '挂断时间', width: 160, render: (scope) => <span>{formatDate(scope.row.endTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 240, align: 'center' },
 ];
 // 未接表头
 const noColumns = [
-  { prop: 'callDirectionText', label: '呼叫方向' },
+	{ prop: 'directionText', label: '呼叫方向' },
 	{ prop: 'fromNo', label: '主叫号码', width: 120 },
-	{ prop: 'cdpn', label: '被叫号码', width: 120 },
+	{ prop: 'toNo', label: '被叫号码', width: 120 },
 	{ prop: 'telNo', label: '响应分机' },
-  { prop: 'groupId', label: '功能组号码', width: 120 },
+	{ prop: 'groupId', label: '功能组号码', width: 120 },
 	{
-		prop: 'createdTime',
+		prop: 'beginIvrTime',
 		label: '开始时间',
 		width: 160,
-		render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+		render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
 	},
-	{ prop: 'overTime', label: '挂断时间', width: 160, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
+	{ prop: 'endTime', label: '挂断时间', width: 160, render: (scope) => <span>{formatDate(scope.row.endTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
 ];
 const changeTba = () => {
 	ruleFormRef.value.resetFields();
@@ -347,7 +348,7 @@ const queryList = async (isQuery: boolean = false) => {
 				totalSize.value = totalTable.value.length;
 				state.tableData = getNeedArr(totalTable.value, currentSize.value)[currentPage.value - 1]; //当前页的表格数据
 			} else {
-        if(response?.result.length) queryIndex.value++;
+				if (response?.result.length) queryIndex.value++;
 				totalTable.value = totalTable.value.concat(response?.result);
 				totalSize.value = totalTable.value.length;
 				state.tableData = getNeedArr(totalTable.value, currentSize.value)[currentPage.value - 1]; //当前页的表格数据
@@ -366,8 +367,9 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 };
 // 播放录音
 const playRecordRef = ref<RefType>();
+const { recordPrefix, recordDownLoadPrefix } = getCurrentCityConfig();
 const onPlaySoundRecording = (val: any) => {
-	playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + val.recordingAbsolutePath, val.recordingFileName, val.recordingAbsolutePath);
+	playRecordRef.value.openDialog(recordPrefix + val.audioFile);
 };
 // 下载录音
 const onDownload = (row: any) => {
@@ -380,8 +382,8 @@ const onDownload = (row: any) => {
 		autofocus: false,
 	})
 		.then(() => {
-			fileDownload({ path: import.meta.env.VITE_RECORD_DOWNLOAD_PREFIX + row.recordingAbsolutePath }).then((res: any) => {
-				downloadFileByStream(res, row.recordingFileName);
+			fileDownload({ path: recordDownLoadPrefix + row.audioFile }).then((res: any) => {
+				downloadFileByStream(res, row.audioFile);
 			});
 		})
 		.catch(() => {});
@@ -393,9 +395,9 @@ const onCreate = (row: any) => {
 		name: 'orderAccept',
 		query: {
 			createBy: 'tel',
-			fromTel: row.cpn,
-			callId: row.otherAccept,
-			transfer: row.gateway,
+			fromTel: row.fromNo,
+			callId: row.callNo,
+			transfer: row.toNo,
 			telArea: '',
 		},
 	});

+ 4 - 55
src/views/tels/phoneAction.vue

@@ -87,19 +87,13 @@
 </template>
 
 <script lang="tsx" setup name="telsPhoneAction">
-import { defineAsyncComponent, onMounted, reactive, ref, onActivated, onBeforeUnmount } from 'vue';
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import type { FormInstance } from 'element-plus';
-import { ElMessageBox } from 'element-plus';
-import { downloadFileByStream, getNeedArr } from '@/utils/tools';
-import { callBaseData, callLogPaged } from '@/api/tels/callLog';
+import { getNeedArr } from '@/utils/tools';
 import { formatDate } from '@/utils/formatTime';
 import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
-import other from '@/utils/other';
-import { useRouter } from 'vue-router';
-import { fileDownload } from '@/api/public/file';
-import mittBus from '@/utils/mitt';
 import Other from '@/utils/other';
-import { getCallCenterCallRecord, getCallCenterCallRecordBaseData, getCallCenterOperateRecord } from '@/api/callCenter';
+import { getCallCenterCallRecordBaseData, getCallCenterOperateRecord } from '@/api/callCenter';
 
 // 引入组件
 const PlayRecord = defineAsyncComponent(() => import('@/views/tels/callLog/component/Play-record.vue')); // 播放录音
@@ -189,7 +183,7 @@ const queryList = async (isQuery: boolean = false) => {
 				totalSize.value = totalTable.value.length;
 				state.tableData = getNeedArr(totalTable.value, currentSize.value)[currentPage.value - 1]; //当前页的表格数据
 			} else {
-        if(response?.result.length) queryIndex.value++;
+				if (response?.result.length) queryIndex.value++;
 				totalTable.value = totalTable.value.concat(response?.result);
 				totalSize.value = totalTable.value.length;
 				state.tableData = getNeedArr(totalTable.value, currentSize.value)[currentPage.value - 1]; //当前页的表格数据
@@ -206,42 +200,6 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 	formEl.resetFields();
 	queryList();
 };
-// 播放录音
-const playRecordRef = ref<RefType>();
-const onPlaySoundRecording = (val: any) => {
-	playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + val.recordingAbsolutePath, val.recordingFileName, val.recordingAbsolutePath);
-};
-// 下载录音
-const onDownload = (row: any) => {
-	ElMessageBox.confirm(`您确定要下载此录音吗?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-		autofocus: false,
-	})
-		.then(() => {
-			fileDownload({ path: import.meta.env.VITE_RECORD_DOWNLOAD_PREFIX + row.recordingAbsolutePath }).then((res: any) => {
-				downloadFileByStream(res, row.recordingFileName);
-			});
-		})
-		.catch(() => {});
-};
-// 失联工单
-const router = useRouter();
-const onCreate = (row: any) => {
-	router.push({
-		name: 'orderAccept',
-		query: {
-			createBy: 'tel',
-			fromTel: row.cpn,
-			callId: row.otherAccept,
-			transfer: row.gateway,
-			telArea: '',
-		},
-	});
-};
 // 基础信息
 const getBaseData = async () => {
 	try {
@@ -256,15 +214,6 @@ onMounted(() => {
 	getBaseData();
 	queryList();
 });
-onActivated(() => {
-	mittBus.on('clearCachePage', () => {
-		//清除缓存
-		queryList();
-	});
-});
-onBeforeUnmount(() => {
-	mittBus.off('clearCachePage');
-});
 </script>
 <style lang="scss" scoped>
 .arrow {