Ver código fonte

reactor:录音播放和下载地址调整;报表时间段调整;知识库新增不通过查看审核记录;

zhangchong 1 ano atrás
pai
commit
7b3d2a3deb
42 arquivos alterados com 344 adições e 665 exclusões
  1. 2 2
      .env.development
  2. 2 2
      .env.production
  3. 2 2
      .env.st
  4. 2 2
      .env.yibin
  5. 12 0
      src/api/knowledge/index.ts
  6. 34 76
      src/api/public/file.ts
  7. 2 2
      src/components/AnnexList/index.vue
  8. 5 4
      src/components/AudioPlayer/index.vue
  9. 3 3
      src/components/OrderDetail/index.vue
  10. 1 1
      src/router/index.ts
  11. 1 1
      src/utils/signalR.tsx
  12. 70 40
      src/utils/tools.ts
  13. 6 6
      src/views/business/visit/component/Visit-detail.vue
  14. 19 14
      src/views/knowledge/component/Audit-progress.vue
  15. 1 1
      src/views/knowledge/index/index.vue
  16. 5 5
      src/views/quality/done/components/Quality-inspection.vue
  17. 16 16
      src/views/quality/index/components/Quality-inspection.vue
  18. 3 3
      src/views/statistics/call/hotNumber.vue
  19. 4 4
      src/views/statistics/call/index.vue
  20. 3 3
      src/views/statistics/call/seatsRest.vue
  21. 3 3
      src/views/statistics/call/talkTime.vue
  22. 2 2
      src/views/statistics/call/telephone.vue
  23. 3 3
      src/views/statistics/call/telephonist.vue
  24. 26 21
      src/views/statistics/call/transferOut.vue
  25. 8 8
      src/views/statistics/center/report.vue
  26. 3 3
      src/views/statistics/department/delay.vue
  27. 14 2
      src/views/statistics/department/detailSatisfied.vue
  28. 3 3
      src/views/statistics/department/handle.vue
  29. 3 9
      src/views/statistics/department/orgSatisfied.vue
  30. 3 3
      src/views/statistics/department/overdue.vue
  31. 3 3
      src/views/statistics/department/satisfied.vue
  32. 3 3
      src/views/statistics/order/acceptTopTen.vue
  33. 3 3
      src/views/statistics/order/centerCount.vue
  34. 0 346
      src/views/statistics/order/centerReport.vue
  35. 3 3
      src/views/statistics/order/departmentAcceptType.vue
  36. 18 18
      src/views/statistics/order/hotspotCount.vue
  37. 3 3
      src/views/statistics/order/hotspotSubclass.vue
  38. 3 3
      src/views/statistics/order/orgHotspot.vue
  39. 3 3
      src/views/statistics/order/specials.vue
  40. 17 11
      src/views/statistics/order/visitCount.vue
  41. 3 3
      src/views/statistics/order/visitDiscontent.vue
  42. 24 22
      src/views/tels/callLog/index.vue

+ 2 - 2
.env.development

@@ -31,6 +31,6 @@ VITE_VOICE_ASSISTANT_API_URL=http://182.151.41.101:19081
 # 智能客服socket地址
 VITE_VOICE_ASSISTANT_SOCKET_URL=ws://182.151.41.101:19005
 
-# 路由地址前缀
-VITE_ROUTER_BASE=/
+# 录音地址前缀
+VITE_RECORD_PREFIX=http://222.213.23.229:10085
 

+ 2 - 2
.env.production

@@ -31,5 +31,5 @@ VITE_VOICE_ASSISTANT_API_URL=http://182.151.41.101:19081
 # 智能客服socket地址
 VITE_VOICE_ASSISTANT_SOCKET_URL=ws://182.151.41.101:19005
 
-# 路由地址前缀
-VITE_ROUTER_BASE=/
+# 录音地址前缀
+VITE_RECORD_PREFIX=http://222.213.23.229:10085

+ 2 - 2
.env.st

@@ -31,6 +31,6 @@ VITE_VOICE_ASSISTANT_API_URL=http://182.151.41.101:19081
 # 智能客服socket地址
 VITE_VOICE_ASSISTANT_SOCKET_URL=ws://182.151.41.101:19005
 
-# 路由地址前缀
-VITE_ROUTER_BASE=/
+# 录音地址前缀
+VITE_RECORD_PREFIX=http://222.213.23.229:10085
 

+ 2 - 2
.env.yibin

@@ -31,5 +31,5 @@ VITE_VOICE_ASSISTANT_API_URL=http://218.6.151.146:50107
 # 智能客服socket地址
 VITE_VOICE_ASSISTANT_SOCKET_URL=ws://218.6.151.146:50108
 
-# 路由地址前缀
-VITE_ROUTER_BASE=/
+# 录音地址前缀
+VITE_RECORD_PREFIX=http://218.6.151.146:50104

+ 12 - 0
src/api/knowledge/index.ts

@@ -212,3 +212,15 @@ export const knowledgeTitle = (params: object) => {
 		params,
 	});
 };
+/**
+ * @description  获取知识库审批信息
+ * @param {object} params
+ * @return {*}
+ */
+export const knowledgeApproval = (params: object) => {
+	return request({
+		url: `/api/v1/Knowledge/audit_log`,
+		method: 'get',
+		params
+	});
+}

+ 34 - 76
src/api/public/file.ts

@@ -1,93 +1,51 @@
 /*
  * @Author: zc
- * @description 附件管理
+ * @description 文件管理 导入 导出
  */
 import request from '@/utils/request';
-/**
- * @description 附件列表
- * @param {object}  params
- */
-export const fileList = (params: object) => {
-    return request({
-        url: `/api/v1/File/list`,
-        method: 'get',
-        params,
-    });
-};
-/**
- * @description 新增附件
- * @param {object}  data
- */
-export const fileAdd = (data: object) => {
-    return request({
-        url: `/api/v1/File`,
-        method: 'post',
-        data,
-    });
-};
-/**
- * @description 删除附件
- * @param {object}  data
- */
-export const fileDelete = (data: object) => {
-    return request({
-        url: `/api/v1/File`,
-        method: 'delete',
-        data,
-    });
-};
-/**
- * @description 更新附件
- * @param {object}  data
- */
-export const fileUpdate = (data: object) => {
-    return request({
-        url: `/api/v1/File`,
-        method: 'put',
-        data,
-    });
-};
-/**
- * @description 附件详情
- * @param {string}  id
- */
-export const fileDetail = (id: string) => {
-    return request({
-        url: `/${id}`,
-        method: 'get',
-    });
-};
 /**
  * @description 获取模板类型
  */
 export const fileTemplateType = () => {
-    return request({
-        url: `/api/v1/Order/import-basedata`,
-        method: 'get',
-    });
-}
+	return request({
+		url: `/api/v1/Order/import-basedata`,
+		method: 'get',
+	});
+};
 /**
  * @description 下载导入模板
  */
 export const fileTemplateDownload = () => {
-    return request({
-        url: `/api/v1/Order/download-order-template`,
-        method: 'get',
-        responseType: 'blob',
-        headers: { 'content-type': 'audio/mpeg' },
-    });
-}
+	return request({
+		url: `/api/v1/Order/download-order-template`,
+		method: 'get',
+		responseType: 'blob',
+		headers: { 'content-type': 'audio/mpeg' },
+	});
+};
 /**
  * @description 导入
  * @param {object}  data
  */
 export const fileImport = (data: object) => {
-    return request({
-        url: `/api/v1/Order/import-order`,
-        method: 'post',
-        headers: {
-            'Content-Type':'multipart/form-data'
-        },
-        data,
-    });
-}
+	return request({
+		url: `/api/v1/Order/import-order`,
+		method: 'post',
+		headers: {
+			'Content-Type': 'multipart/form-data',
+		},
+		data,
+	});
+};
+/**
+ * @description 下载文件
+ * @param {object}  params
+ */
+export const fileDownload = (params: object) => {
+	return request({
+		url: `/api/v1/File/download-proxy`,
+		method: 'get',
+		responseType: 'blob',
+		params,
+	});
+};

+ 2 - 2
src/components/AnnexList/index.vue

@@ -54,7 +54,7 @@
 </template>
 <script setup lang="ts" name="annexList">
 import { computed, ref, watch } from 'vue';
-import { checkFile, downloadFile, fileType } from '@/utils/tools';
+import { checkFile, downloadFileBySrc, fileType } from "@/utils/tools";
 import { ElButton, ElMessage, ElMessageBox } from 'element-plus';
 import Other from '@/utils/other';
 const emit = defineEmits(['update:modelValue', 'update:format']);
@@ -178,7 +178,7 @@ const handleDownload = (uploadFile: any) => {
 		.then(() => {
 			const fileName = uploadFile.name;
 			const url = import.meta.env.VITE_FILE_PREFIX + path;
-			downloadFile(url, fileName);
+      downloadFileBySrc(url, fileName);
 		})
 		.catch(() => {});
 };

+ 5 - 4
src/components/AudioPlayer/index.vue

@@ -73,7 +73,8 @@
 import { reactive, ref, computed, watch, nextTick } from 'vue';
 import { formatDuration } from '@/utils/formatTime';
 import { ElMessage } from 'element-plus';
-import { downloadFile } from '@/utils/tools';
+import { downloadFileBySrc, downloadFileByStream } from "@/utils/tools";
+import { fileDownload } from "@/api/public/file";
 
 // 定义父组件传过来的值
 const props = defineProps({
@@ -239,9 +240,9 @@ const mute = () => {
 };
 // 下载
 const downLoad = () => {
-	downloadFile(props.url, props.fileName);
-	// window.open(props.url);
-	// downloadFile({ name: props?.fileName ?? '', url: props.url })
+  fileDownload({path:props.url}).then((res:any) => {
+    downloadFileByStream(res, <string>props.fileName);
+  });
 };
 nextTick(() => {
 	audioRef.value.onerror = () => {

+ 3 - 3
src/components/OrderDetail/index.vue

@@ -40,8 +40,8 @@
 										size="small"
 										type="primary"
 										class="ml8"
-										@click="recordFile(state.ruleForm.recordingFileUrl)"
-										v-if="state.ruleForm.recordingFileUrl"
+										@click="recordFile(state.ruleForm?.recordingAbsolutePath)"
+										v-if="state.ruleForm?.recordingAbsolutePath"
 										>录音文件</el-button
 									>
 								</el-form-item>
@@ -662,7 +662,7 @@ const closeDialog = () => {
 // 查看录音文件
 const playRecordRef = ref<RefType>();
 const recordFile = (url: string) => {
-	playRecordRef.value.openDialog(url);
+	playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + url);
 };
 // 电话外呼
 const callPhone = (number: number | string) => {

+ 1 - 1
src/router/index.ts

@@ -30,7 +30,7 @@ const { isRequestRoutes } = themeConfig.value;
  * @link 参考:https://next.router.vuejs.org/zh/api/#createrouter
  */
 export const router = createRouter({
-	history: createWebHistory(import.meta.env.VITE_ROUTER_BASE),
+	history: createWebHistory(),
 	/**
 	 * 说明:
 	 * 1、notFoundAndNoPower 默认添加 404、401 界面,防止一直提示 No match found for location with path 'xxx'

+ 1 - 1
src/utils/signalR.tsx

@@ -32,7 +32,7 @@ async function judge() {
 		dangerouslyUseHTMLString: true,
 		message: messageContent(),
 		customClass: 'updateTips',
-		duration: 50 * 1000,
+		duration: 0,
 	});
 }
 /**

+ 70 - 40
src/utils/tools.ts

@@ -1,4 +1,5 @@
-import axios from "axios";
+import axios from 'axios';
+
 /**
  * @description 防抖
  * @param func    功能函数(即要防抖的函数)
@@ -144,33 +145,62 @@ export function excludeSelfById(arr: Array<any>, id: string) {
 	});
 }
 /**
- * @description 下载文件
+ * @description 下载文件流
+ * @param res 文件流
+ * @param filename 文件名
+ */
+export function downloadFileByStream(res: Blob, filename: string) {
+	// 创建blob对象,解析流数据
+	const blob = new Blob([res], {
+		// 设置返回的文件类型
+		// type: 'application/pdf;charset=UTF-8' 表示下载文档为pdf,如果是word则设置为msword,excel为excel
+		type: res.type,
+	});
+	// 这里就是创建一个a标签,等下用来模拟点击事件
+	const a = document.createElement('a');
+	// 兼容webkix浏览器,处理webkit浏览器中href自动添加blob前缀,默认在浏览器打开而不是下载
+	const URL = window.URL || window.webkitURL;
+	// 根据解析后的blob对象创建URL 对象
+	// 下载链接
+	a.href = URL.createObjectURL(blob);
+	// 下载文件名,如果后端没有返回,可以自己写a.download = '文件.pdf'
+	a.download = filename;
+	document.body.appendChild(a);
+	// 点击a标签,进行下载
+	a.click();
+	// 收尾工作,在内存中移除URL 对象
+	document.body.removeChild(a);
+}
+/**
+ * @description 根据地址下载文件
  * @param src 文件地址
  * @param filename 文件名
  */
-export function downloadFile(src: string, filename: string) {
-	if(!src) {
-		return
+export function downloadFileBySrc(src: string, filename: string) {
+	if (!src) {
+		return;
 	}
-	let fileName: string = filename || '' // 文件名
+	let fileName: string = filename || ''; // 文件名
 	axios({
 		method: 'get',
 		url: src,
 		responseType: 'blob',
 		headers: { 'content-type': 'audio/mpeg' },
-	}).then((res: any) => {
-		let blob:Blob = new Blob([res.data], { type: res.data.type }) // 创建blob 设置blob文件类型 data 设置为后端返回的文件(例如mp3,jpeg) type:这里设置后端返回的类型 为 mp3
-		let down: HTMLAnchorElement = document.createElement('a') // 创建A标签
-		let href:string = window.URL.createObjectURL(blob) // 创建下载的链接
-		down.href = href // 下载地址
-		down.download = fileName // 下载文件名
-		document.body.appendChild(down)
-		down.click() // 模拟点击A标签
-		document.body.removeChild(down) // 下载完成移除元素
-		window.URL.revokeObjectURL(href) // 释放blob对象
-	}).catch(function (error) {
-		console.log(error)
 	})
+		.then((res: any) => {
+			let blob: Blob = new Blob([res.data], { type: res.data.type }); // 创建blob 设置blob文件类型 data 设置为后端返回的文件(例如mp3,jpeg) type:这里设置后端返回的类型 为 mp3
+			let down: HTMLAnchorElement = document.createElement('a'); // 创建A标签
+			let href: string = window.URL.createObjectURL(blob); // 创建下载的链接
+			down.href = href; // 下载地址
+			down.download = fileName; // 下载文件名
+			document.body.appendChild(down);
+			down.click(); // 模拟点击A标签
+			document.body.removeChild(down); // 下载完成移除元素
+			window.URL.revokeObjectURL(href); // 释放blob对象
+		})
+		.catch(function (error) {
+			console.log(error);
+		});
 }
 /**
  * @description 把后端返回的文件转换为前端需要的文件数据格式
@@ -202,8 +232,8 @@ export function transformFile(data: Array<any>[]) {
 	});
 }
 /**
-* @description 递归查找 callValue 对应的 enum 值
-* */
+ * @description 递归查找 callValue 对应的 enum 值
+ * */
 export function findItemNested(enumData: any, callValue: any, value: string, children: string) {
 	return enumData.reduce((accumulator: any, current: any) => {
 		if (accumulator) return accumulator;
@@ -212,25 +242,25 @@ export function findItemNested(enumData: any, callValue: any, value: string, chi
 	}, null);
 }
 /**
-* @description 根据枚举列表查询当需要的数据(如果指定了 label 和 value 的 key值,会自动识别格式化)
-* @param {String} callValue 当前单元格值
-* @param {Array} enumData 字典列表
-* @param {Array} fieldNames label && value && children 的 key 值
-* @param {String} type 过滤类型(目前只有 tag)
-* @returns {String}
-* */
-export function filterEnum(callValue: any, enumData?: any, fieldNames?: any, type?: "tag") {
-	const value = fieldNames?.value ?? "value";
-	const label = fieldNames?.label ?? "label";
-	const children = fieldNames?.children ?? "children";
+ * @description 根据枚举列表查询当需要的数据(如果指定了 label 和 value 的 key值,会自动识别格式化)
+ * @param {String} callValue 当前单元格值
+ * @param {Array} enumData 字典列表
+ * @param {Array} fieldNames label && value && children 的 key 值
+ * @param {String} type 过滤类型(目前只有 tag)
+ * @returns {String}
+ * */
+export function filterEnum(callValue: any, enumData?: any, fieldNames?: any, type?: 'tag') {
+	const value = fieldNames?.value ?? 'value';
+	const label = fieldNames?.label ?? 'label';
+	const children = fieldNames?.children ?? 'children';
 	let filterData: { [key: string]: any } = {};
 	// 判断 enumData 是否为数组
 	if (Array.isArray(enumData)) filterData = findItemNested(enumData, callValue, value, children);
 	// 判断是否输出的结果为 tag 类型
-	if (type == "tag") {
-		return filterData?.tagType ? filterData.tagType : "";
+	if (type == 'tag') {
+		return filterData?.tagType ? filterData.tagType : '';
 	} else {
-		return filterData ? filterData[label] : "--";
+		return filterData ? filterData[label] : '--';
 	}
 }
 
@@ -240,7 +270,7 @@ export function filterEnum(callValue: any, enumData?: any, fieldNames?: any, typ
  * @returns {String}
  * */
 export function handleProp(prop: string) {
-	const propArr = prop.split(".");
+	const propArr = prop.split('.');
 	if (propArr.length == 1) return prop;
 	return propArr[propArr.length - 1];
 }
@@ -257,8 +287,8 @@ export function isArray(val: any): val is Array<any> {
  * */
 export function formatValue(callValue: any) {
 	// 如果当前值为数组,使用 / 拼接(根据需求自定义)
-	if (isArray(callValue)) return callValue.length ? callValue.join(" / ") : "";
-	return callValue ?? "";
+	if (isArray(callValue)) return callValue.length ? callValue.join(' / ') : '';
+	return callValue ?? '';
 }
 
 /**
@@ -268,7 +298,7 @@ export function formatValue(callValue: any) {
  * @returns {*}
  * */
 export function handleRowAccordingToProp(row: { [key: string]: any }, prop: string) {
-	if (!prop.includes(".")) return row[prop] ?? "";
-	prop.split(".").forEach(item => (row = row[item] ?? ""));
+	if (!prop.includes('.')) return row[prop] ?? '';
+	prop.split('.').forEach((item) => (row = row[item] ?? ''));
 	return row;
-}
+}

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

@@ -81,8 +81,8 @@
 										size="small"
 										type="primary"
 										class="ml8"
-										@click="recordFile(state.recordingFileUrl)"
-										v-if="state.recordingFileUrl"
+										@click="recordFile(state.recordingAbsolutePath)"
+										v-if="state.recordingAbsolutePath"
 										>录音文件</el-button
 									>
 								</el-form-item>
@@ -361,7 +361,7 @@ const state = reactive<any>({
 	},
 	orderDetail: {}, // 工单详情
 	orderVisitModel: {}, // 回访详情
-	recordingFileUrl: '', // 录音文件
+	recordingAbsolutePath: '', // 录音文件
 });
 const ruleFormRef = ref<RefType>();
 
@@ -388,7 +388,7 @@ const getBaseData = async (id: string) => {
 		visitId.value = res.result?.orderVisitModel?.id ?? '';
 		state.orderDetail = res.result?.orderVisitModel?.order ?? {};
 		state.orderVisitModel = res.result?.orderVisitModel ?? {};
-		state.recordingFileUrl = res.result?.recordingFileUrl ?? '';
+		state.recordingAbsolutePath = res.result?.recordingAbsolutePath ?? '';
 		if (res.result?.orderVisitModel?.isPutThrough !== null) {
 			state.ruleForm.isPutThrough = !res.result?.orderVisitModel?.isPutThrough ?? false;
 		} else {
@@ -459,7 +459,7 @@ const closeDialog = () => {
 // 查看录音文件
 const playRecordRef = ref<RefType>();
 const recordFile = (url: string) => {
-	playRecordRef.value.openDialog(url);
+	playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + url);
 };
 // 呼叫
 const onCall = (phoneNumber: string) => {
@@ -517,7 +517,7 @@ const callId = ref<string>('');
 onMounted(() => {
 	mittBus.on('outboundConnect', (data) => {
 		console.log(data, '外呼已经接通辣');
-    if(data.dnis === state.orderDetail.contact) callId.value = data.call_id;
+		if (data.dnis === state.orderDetail.contact) callId.value = data.call_id;
 	});
 });
 onBeforeUnmount(() => {

+ 19 - 14
src/views/knowledge/component/Audit-progress.vue

@@ -25,24 +25,29 @@
 <script lang="tsx" setup>
 import { ref, reactive } from 'vue';
 import { formatDate } from '@/utils/formatTime';
-import { callLogOrder } from '@/api/tels/callLog';
+import { knowledgeApproval } from '@/api/knowledge';
 
 const proTableRef = ref<RefType>(); // 表格ref
 // 表格配置项
 const columns = ref<any[]>([
-	{ prop: 'no', label: '审核人', width: 150 },
-	{ prop: 'actualHandleStepName', label: '审核状态', width: 150 },
-	{ prop: 'startTime', label: '审核时间', width: 170, render: (scope: any) => formatDate(scope.row.startTime, 'YYYY-mm-dd HH:MM:SS') },
-	{ prop: 'orgLevelOneName', label: '备注' },
+	{ prop: 'workflow.actualHandlerName', label: '审核人', width: 150 },
+	{ prop: 'workFlowApplyStatusText', label: '审核状态', width: 150 },
+	{
+		prop: 'workflow.actualHandleTime',
+		label: '审核时间',
+		width: 170,
+		render: (scope: any) => formatDate(scope.row.workflow.actualHandleTime, 'YYYY-mm-dd HH:MM:SS'),
+	},
+	{ prop: 'actualOpinion', label: '备注' },
 ]);
 
 // 定义变量内容
 const state = reactive<any>({
 	queryParams: {
-		// 查询条件
-		PageIndex: 1, // 当前页
-		PageSize: 10, // 每页条数
-		Keyword: null, // 关键字
+		// 查询参数
+		PageIndex: 1,
+		PageSize: 10,
+		id: null, // 标签
 	},
 	tableData: [],
 	total: 0,
@@ -50,17 +55,17 @@ const state = reactive<any>({
 });
 const loading = ref<Boolean>(false);
 // 打开弹窗
-const openDialog = (val: any) => {
-	state.currentCall = val;
+const openDialog = (id: string) => {
+	state.queryParams.id = id;
 	queryList();
 	state.dialogVisible = true;
 };
 const queryList = () => {
 	loading.value = true;
-	callLogOrder(state.queryParams)
+	knowledgeApproval(state.queryParams)
 		.then((res: any) => {
-			/*state.tableData = res.result?.items ?? [];
-			state.total = res.result?.total ?? 0;*/
+			state.tableData = res.result?.items ?? [];
+			state.total = res.result?.total ?? 0;
 			loading.value = false;
 		})
 		.catch(() => {

+ 1 - 1
src/views/knowledge/index/index.vue

@@ -594,7 +594,7 @@ const onRowDel = (row: any) => {
 // 查看审核记录
 const auditProgressRef = ref<RefType>(); //审核记录ref
 const onprogress = (row: any) => {
-	auditProgressRef.value.openDialog(row);
+	auditProgressRef.value.openDialog(row.id);
 };
 onMounted(() => {
 	getKnowledgeType();

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

@@ -21,21 +21,21 @@
 						<el-button
 							plain
 							title="工单录音文件"
-							v-if="state.ruleForm?.order?.recordingFileUrl"
+							v-if="state.ruleForm?.order?.recordingAbsolutePath"
 							size="small"
 							type="primary"
 							class="ml8"
-							@click="recordFile(state.ruleForm?.order?.recordingFileUrl)"
+							@click="recordFile(state.ruleForm?.order?.recordingAbsolutePath)"
 							>工单录音</el-button
 						>
 						<el-button
 							plain
 							title="回访录音文件"
-							v-if="state.ruleForm?.visit?.recordingFileUrl"
+							v-if="state.ruleForm?.visit?.recordingAbsolutePath"
 							size="small"
 							type="primary"
 							class="ml8"
-							@click="recordFile(state.ruleForm?.visit?.recordingFileUrl)"
+							@click="recordFile(state.ruleForm?.visit?.recordingAbsolutePath)"
 							>回访录音</el-button
 						>
 					</el-form-item>
@@ -307,7 +307,7 @@ const closeItem = () => {
 // 查看录音文件
 const playRecordRef = ref<RefType>();
 const recordFile = (url: string) => {
-	playRecordRef.value.openDialog(url);
+	playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + url);
 };
 // 新增质检项内容
 const onAddItem = () => {

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

@@ -21,21 +21,21 @@
 						<el-button
 							plain
 							title="工单录音文件"
-							v-if="state.orderDetail.recordingFileUrl"
+							v-if="state.orderDetail.recordingAbsolutePath"
 							size="small"
 							type="primary"
 							class="ml8"
-							@click="recordFile(state.orderDetail.recordingFileUrl)"
+							@click="recordFile(state.orderDetail.recordingAbsolutePath)"
 							>工单录音</el-button
 						>
 						<el-button
 							plain
 							title="回访录音文件"
-							v-if="state.visit.recordingFileUrl"
+							v-if="state.visit.recordingAbsolutePath"
 							size="small"
 							type="primary"
 							class="ml8"
-							@click="recordFile(state.visit.recordingFileUrl)"
+							@click="recordFile(state.visit.recordingAbsolutePath)"
 							>回访录音</el-button
 						>
 					</el-form-item>
@@ -301,7 +301,7 @@ const closeItem = () => {
 // 查看录音文件
 const playRecordRef = ref<RefType>();
 const recordFile = (url: string) => {
-	playRecordRef.value.openDialog(url);
+	playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + url);
 };
 // 新增质检项内容
 const onAddItem = () => {
@@ -326,8 +326,8 @@ const changeProject = (val: any) => {
 const onEditItem = (row: any) => {
 	dialogTitleItem.value = '编辑扣分项';
 	state.ruleItemForm = Other.deepClone(row);
-	state.ruleItemForm.value = formatDuration(state.ruleItemForm.second, false,true);
-  state.ruleItemForm.endValue = formatDuration(state.ruleItemForm.endSecond, false,true);
+	state.ruleItemForm.value = formatDuration(state.ruleItemForm.second, false, true);
+	state.ruleItemForm.endValue = formatDuration(state.ruleItemForm.endSecond, false, true);
 	state.dialogVisibleItem = true;
 	getEnableAcceptType();
 };
@@ -336,7 +336,7 @@ const formatSecond = (val: string) => {
 	if (!val) return 0;
 	const minute = Number(val.split(':')[0]);
 	const second = Number(val.split(':')[1]);
-	return (minute * 60 + second)*1000;
+	return (minute * 60 + second) * 1000;
 };
 // 选择开始扣分时间点
 const selectSecond = (val: any) => {
@@ -344,7 +344,7 @@ const selectSecond = (val: any) => {
 };
 // 选择结束扣分时间点
 const selectSecondEnd = (val: any) => {
-  state.ruleItemForm.endSecond = formatSecond(val);
+	state.ruleItemForm.endSecond = formatSecond(val);
 };
 // 扣分项保存
 const ruleItemFormRef = ref<RefType>();
@@ -389,8 +389,8 @@ const onDeleteItem = (row: any) => {
 		.then(() => {
 			tableData.value = tableData.value.filter((v: any) => v.name !== row.name);
 			setTimeout(() => {
-        getEnableAcceptType();
-      }, 0);
+				getEnableAcceptType();
+			}, 0);
 		})
 		.catch(() => {});
 };
@@ -401,11 +401,11 @@ const getEnableAcceptType = () => {
 		projectArray.value.forEach((v: any) => {
 			v.disabled = array.includes(v.name);
 		});
-	}else{
-    projectArray.value.forEach((v: any) => {
-      v.disabled = false;
-    });
-  }
+	} else {
+		projectArray.value.forEach((v: any) => {
+			v.disabled = false;
+		});
+	}
 };
 // 保存
 const onSubmit = (formEl: FormInstance | undefined) => {

+ 3 - 3
src/views/statistics/call/hotNumber.vue

@@ -9,14 +9,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item label-width="0">
@@ -87,7 +87,7 @@ const state = reactive({
 	queryParams: {
 		// 查询条件
 		gateway: null, // 热线号码
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')],
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')],
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 4 - 4
src/views/statistics/call/index.vue

@@ -9,14 +9,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item label-width="0">
@@ -36,7 +36,7 @@
 				:loading="state.loading"
 				:pagination="false"
 				show-summary
-        border
+				border
 			>
 			</ProTable>
 		</el-card>
@@ -64,7 +64,7 @@ const state = reactive({
 	queryParams: {
 		// 查询条件
 		Keyword: null, // 关键词
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], //
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], //
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 3 - 3
src/views/statistics/call/seatsRest.vue

@@ -12,14 +12,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item label-width="0">
@@ -78,7 +78,7 @@ const state = reactive({
 		UserName: null, // 坐席名称
 		SortField: 'restDuration', // 排序字段
 		SortRule: 1, // 排序规则
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')],
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')],
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 3 - 3
src/views/statistics/call/talkTime.vue

@@ -6,14 +6,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item label-width="0">
@@ -65,7 +65,7 @@ const state = reactive({
 	queryParams: {
 		// 查询条件
 		Keyword: null, // 关键词
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], //
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], //
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 2 - 2
src/views/statistics/call/telephone.vue

@@ -8,14 +8,14 @@
 						<el-form-item label="时间段" prop="crTime">
 							<el-date-picker
 								v-model="state.queryParams.crTime"
-								type="datetimerange"
+								type="daterange"
 								unlink-panels
 								range-separator="至"
 								start-placeholder="开始时间"
 								end-placeholder="结束时间"
 								:shortcuts="shortcuts"
 								@change="queryList"
-								value-format="YYYY-MM-DD[T]HH:mm:ss"
+								value-format="YYYY-MM-DD"
 							/>
 						</el-form-item>
 					</el-col>

+ 3 - 3
src/views/statistics/call/telephonist.vue

@@ -6,14 +6,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item>
@@ -88,7 +88,7 @@ const state = reactive({
 		PageIndex: 1,
 		PageSize: 10,
 		Keyword: null, // 关键词
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 26 - 21
src/views/statistics/call/transferOut.vue

@@ -2,7 +2,7 @@
 	<div class="statistics-call-transfer-out-container layout-pd">
 		<!-- 搜索  -->
 		<el-card shadow="never">
-			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent  inline>
+			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
 				<el-form-item label="外线号码" prop="CDPN">
 					<el-input v-model="state.queryParams.CDPN" placeholder="外线号码" clearable @keyup.enter="queryList" class="keyword-input" />
 				</el-form-item>
@@ -12,14 +12,14 @@
 				<el-form-item label="转外线时间" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item label-width="0">
@@ -31,17 +31,17 @@
 			</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"
-      >
-      </ProTable>
+			<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"
+			>
+			</ProTable>
 		</el-card>
 	</div>
 </template>
@@ -57,12 +57,17 @@ import dayjs from 'dayjs';
 const proTableRef = ref<RefType>(); // 表格ref
 // 表格配置项
 const columns = ref<any[]>([
-    { type: 'index', fixed: 'left', width: 55, label: '序号', align: 'center' },
-  { prop: 'cdpn', label: '外线号码', align: 'center' },
-  { prop: 'cpn', label: '来电号码', align: 'center' },
-  { prop: 'telNo', label: '转接分机号', align: 'center' },
-  { prop: 'createdTime', label: '转外线时间', align: 'center',render: (scope) =>  <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
-  { prop: 'userName', label: '受理人', align: 'center' },
+	{ type: 'index', fixed: 'left', width: 55, label: '序号', align: 'center' },
+	{ prop: 'cdpn', label: '外线号码', align: 'center' },
+	{ prop: 'cpn', label: '来电号码', align: 'center' },
+	{ prop: 'telNo', label: '转接分机号', align: 'center' },
+	{
+		prop: 'createdTime',
+		label: '转外线时间',
+		align: 'center',
+		render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+	},
+	{ prop: 'userName', label: '受理人', align: 'center' },
 ]);
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref
@@ -72,7 +77,7 @@ const state = reactive({
 		PageIndex: 1,
 		PageSize: 10,
 		Keyword: null, // 关键词
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 8 - 8
src/views/statistics/center/report.vue

@@ -14,7 +14,7 @@
         <el-form-item prop="crTime" v-if="state.queryParams.dateType === 'datetimerange'" label="时间">
           <el-date-picker
             v-model="state.queryParams.crTime"
-            type="datetimerange"
+            type="daterange"
             unlink-panels
             range-separator="至"
             start-placeholder="开始时间"
@@ -26,7 +26,7 @@
 								changeDateType('datetimerange');
 							}
 						"
-            value-format="YYYY-MM-DD[T]HH:mm:ss"
+            value-format="YYYY-MM-DD"
             :clearable="false"
           />
         </el-form-item>
@@ -216,7 +216,7 @@ const state = reactive(<any>{
   queryParams: {
     dateType: 'date', //
     time: dayjs(new Date()).format('YYYY-MM-DD'), // 时间默认今天
-    crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+    crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
   },
   loading: false, // 加载
 });
@@ -231,7 +231,7 @@ const changeDateType = (val: string) => {
       formats.value = 'YYYY-MM-DD';
       dates.value = dayjs(state.queryParams.time).format('YYYY-MM-DD');
       tableTitle.value = '12345市民服务热线办理工作日统计';
-      state.queryParams.crTime = [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')];
+      state.queryParams.crTime = [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')];
       queryList();
       break;
     case 'month':
@@ -241,7 +241,7 @@ const changeDateType = (val: string) => {
         .endOf('month')
         .format('YYYY-MM-DD')}`;
       tableTitle.value = '12345市民服务热线办理工作月统计';
-      state.queryParams.crTime = [dayjs().startOf('month').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('month').format('YYYY-MM-DD HH:mm:ss')];
+      state.queryParams.crTime = [dayjs().startOf('month').format('YYYY-MM-DD'), dayjs().endOf('month').format('YYYY-MM-DD')];
       queryList();
       break;
     case 'week':
@@ -251,7 +251,7 @@ const changeDateType = (val: string) => {
         .endOf('week')
         .format('YYYY-MM-DD')}`;
       tableTitle.value = '12345市民服务热线办理工作周统计';
-      state.queryParams.crTime = [dayjs().startOf('week').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('week').format('YYYY-MM-DD HH:mm:ss')];
+      state.queryParams.crTime = [dayjs().startOf('week').format('YYYY-MM-DD'), dayjs().endOf('week').format('YYYY-MM-DD')];
       queryList();
       break;
     case 'datetimerange':
@@ -264,7 +264,7 @@ const changeDateType = (val: string) => {
       formats.value = 'YYYY-MM-DD';
       dates.value = dayjs(state.queryParams.time).format('YYYY-MM-DD');
       tableTitle.value = '12345市民服务热线办理工作日统计';
-      state.queryParams.crTime = [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')];
+      state.queryParams.crTime = [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')];
       queryList();
       break;
   }
@@ -323,7 +323,7 @@ const resetQuery = throttle((formEl: FormInstance | undefined) => {
   formats.value = 'YYYY-MM-DD';
   dates.value = dayjs(state.queryParams.time).format('YYYY-MM-DD');
   tableTitle.value = '12345市民服务热线办理工作日统计';
-  state.queryParams.crTime = [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')];
+  state.queryParams.crTime = [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')];
 }, 300);
 const exportTable = ref<RefType>()
 const exportWord = () => {

+ 3 - 3
src/views/statistics/department/delay.vue

@@ -9,14 +9,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item>
@@ -66,7 +66,7 @@ const state = reactive({
 	queryParams: {
 		// 查询条件
 		OrgName: null, // 关键词
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 14 - 2
src/views/statistics/department/detailSatisfied.vue

@@ -37,7 +37,16 @@
 			</el-form>
 		</el-card>-->
 		<el-card shadow="never">
-			<ProTable ref="proTableRef" :columns="columns" :data="state.tableData" @updateTable="queryList" :loading="state.loading" :pagination="false">
+			<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"
+			>
 				<template #isProvince="{ row }">
 					<span>{{ row.order?.isProvince ? '省工单' : '市工单' }}</span>
 				</template>
@@ -168,10 +177,13 @@ const queryList = throttle(() => {
 		LineNum: historyParams.LineNum,
 		OrgCode: historyParams.OrgCode,
 		DateValue: historyParams.DateValue,
+		PageIndex: state.queryParams.PageIndex,
+		PageSize: state.queryParams.PageSize,
 	};
 	departmentSatisfactionDetail(request)
 		.then((res: any) => {
-			state.tableData = res.result ?? [];
+			state.tableData = res.result?.items ?? [];
+			state.total = res.result.total ?? 0;
 			state.loading = false;
 		})
 		.catch(() => {

+ 3 - 3
src/views/statistics/department/handle.vue

@@ -9,14 +9,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item>
@@ -79,7 +79,7 @@ const state = reactive({
 	queryParams: {
 		// 查询条件
 		TypeCode: '0', // 关键词
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 3 - 9
src/views/statistics/department/orgSatisfied.vue

@@ -9,14 +9,14 @@
         <el-form-item label="时间段" prop="crTime">
           <el-date-picker
             v-model="state.queryParams.crTime"
-            type="datetimerange"
+            type="daterange"
             unlink-panels
             range-separator="至"
             start-placeholder="开始时间"
             end-placeholder="结束时间"
             :shortcuts="shortcuts"
             @change="queryList"
-            value-format="YYYY-MM-DD[T]HH:mm:ss"
+            value-format="YYYY-MM-DD"
           />
         </el-form-item>
         <el-form-item label="类型" prop="TypeId">
@@ -216,7 +216,7 @@ const state = reactive({
     PageSize: 10,
     TypeId: '1', //
     LineNum: null,
-    crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+    crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
   },
   tableData: [], //表单
   loading: false, // 加载
@@ -227,12 +227,6 @@ const state = reactive({
 const historyParams = history.state;
 const queryList = throttle(() => {
   state.loading = true;
-  let StartDate = null;
-  let EndDate = null;
-  if (state.queryParams?.crTime) {
-    StartDate = state.queryParams?.crTime[0];
-    EndDate = state.queryParams?.crTime[1];
-  }
   const request = {
     StartDate: historyParams.StartDate,
     EndDate: historyParams.EndDate,

+ 3 - 3
src/views/statistics/department/overdue.vue

@@ -9,14 +9,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item>
@@ -73,7 +73,7 @@ const state = reactive({
 		PageIndex: 1,
 		PageSize: 10,
 		Keyword: null, // 关键词
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 3 - 3
src/views/statistics/department/satisfied.vue

@@ -9,14 +9,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item label="类型" prop="TypeId">
@@ -220,7 +220,7 @@ const state = reactive({
 		PageSize: 10,
 		TypeId: '1', //
 		LineNum: null,
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 3 - 3
src/views/statistics/order/acceptTopTen.vue

@@ -6,14 +6,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item>
@@ -68,7 +68,7 @@ const ruleFormRef = ref<RefType>(); // 表单ref
 const state = reactive({
 	queryParams: {
 		// 查询条件
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 3 - 3
src/views/statistics/order/centerCount.vue

@@ -9,14 +9,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item>
@@ -76,7 +76,7 @@ const state = reactive({
 		PageIndex: 1,
 		PageSize: 10,
 		Keyword: null, // 关键词
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 0 - 346
src/views/statistics/order/centerReport.vue

@@ -1,346 +0,0 @@
-<template>
-	<div class="statistics-order-center-report-container layout-pd">
-		<!-- 搜索  -->
-		<el-card shadow="never">
-			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
-				<el-form-item prop="dateType" label="时间单位">
-					<el-select v-model="state.queryParams.dateType" placeholder="部门名称" @change="changeDateType">
-            <el-option label="日" value="date" />
-						<el-option label="周" value="week" />
-						<el-option label="月" value="month" />
-						<el-option label="自定义" value="datetimerange" />
-					</el-select>
-				</el-form-item>
-				<el-form-item prop="crTime" v-if="state.queryParams.dateType === 'datetimerange'" label="时间">
-					<el-date-picker
-						v-model="state.queryParams.crTime"
-						type="datetimerange"
-						unlink-panels
-						range-separator="至"
-						start-placeholder="开始时间"
-						end-placeholder="结束时间"
-						:shortcuts="shortcuts"
-						@change="
-							() => {
-								queryList();
-								changeDateType('datetimerange');
-							}
-						"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
-						:clearable="false"
-					/>
-				</el-form-item>
-				<el-form-item prop="time" v-else label="时间">
-					<el-date-picker
-						v-model="state.queryParams.time"
-						:type="state.queryParams.dateType"
-						placeholder="选择时间"
-						@change="
-							() => {
-								queryList();
-								changeDateType(state.queryParams.dateType);
-							}
-						"
-						:value-format="valueFormat"
-						:format="formats"
-						:clearable="false"
-					/>
-				</el-form-item>
-				<el-form-item>
-					<el-button type="primary" @click="queryList" :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 class="default-button" :loading="state.loading" @click="exportWord"><SvgIcon name="iconfont icon-daochu"/> 导出</el-button>
-				</el-form-item>
-			</el-form>
-		</el-card>
-		<el-card shadow="never">
-			<table style="min-width: 80%;height: 100%; margin: 0 auto; text-align: center" v-loading="state.loading" ref="exportTable">
-				<tbody>
-					<tr style="height: 70px">
-						<td style="vertical-align: top; text-align: center">
-							<div style="font-size: 28px; font-weight: bold">{{ tableTitle }}</div>
-							<div style="margin-top: 10px; font-size: 22px">{{ dates }}</div>
-						</td>
-					</tr>
-					<tr>
-						<td>
-							<table style="width: 100%; border: 1px solid #000000; border-collapse: collapse; padding: 0">
-								<tbody>
-									<tr style="height: 43px">
-										<td colspan="4" style="font-size: 22px; font-weight: bold; border-bottom: 1px solid #000000">一、总体情况</td>
-									</tr>
-									<tr style="height: 43px">
-										<td colspan="2" style="font-size: 22px; text-align: left; border-bottom: 1px solid #000000">
-											电话总量:{{ centerReportCallData.allCallCount }}
-										</td>
-										<td colspan="2" style="font-size: 22px; text-align: left; border-bottom: 1px solid #000000">
-											居家养老电话总量:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;居家养老呼入接通量:
-										</td>
-									</tr>
-									<tr style="height: 43px">
-										<td style="width: 25%; font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">有效</td>
-										<td style="width: 25%; font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">
-											{{ centerReportCallData.effectiveCount }}(接通)
-										</td>
-										<td style="width: 25%; font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">无效</td>
-										<td style="width: 25%; font-size: 22px; border-bottom: 1px solid #000000">{{ centerReportCallData.invalidCount }}(未接通)</td>
-									</tr>
-									<tr style="height: 43px">
-										<td style="width: 25%; font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">在IVR中挂断</td>
-										<td style="width: 25%; font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">
-											{{ centerReportCallData.ivrByeCount }}
-										</td>
-										<td style="width: 25%; font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">在队列中挂断</td>
-										<td style="width: 25%; font-size: 22px; border-bottom: 1px solid #000000">{{ centerReportCallData.queueByeCount }}</td>
-									</tr>
-									<tr style="height: 43px">
-										<td colspan="4" style="font-size: 22px; text-align: left; border-bottom: 1px solid #000000">信件回访量</td>
-									</tr>
-									<tr style="height: 43px">
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">已回访量</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">
-											{{ centerReportVisitdData.visitd }}
-										</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">待回访量</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000">{{ centerReportVisitdData.waitVisitd }}</td>
-									</tr>
-									<tr style="height: 43px">
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">坐席满意度</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">
-											{{ centerReportVisitdData.seatsRate }}%
-										</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">部门满意度</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000">{{ centerReportVisitdData.orgRate }}%</td>
-									</tr>
-									<tr style="height: 43px">
-										<td colspan="4" style="font-size: 22px; text-align: left; border-bottom: 1px solid #000000">
-											来件总计:{{ centerReportOrderData.allCallCount }}
-										</td>
-									</tr>
-									<tr style="height: 43px">
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">有效</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">
-											{{ centerReportOrderData.effectiveCount }}
-										</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">无效</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000">{{ centerReportOrderData.invalidCount }}</td>
-									</tr>
-									<tr style="height: 43px">
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">已办结信件</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">
-											{{ centerReportOrderData.completedCount }}
-										</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">在办信件</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000">{{ centerReportOrderData.inProgressCount }}</td>
-									</tr>
-									<tr style="height: 43px">
-										<td colspan="4" style="font-size: 22px; border-bottom: 1px solid #000000">信件来源</td>
-									</tr>
-									<tr style="height: 43px">
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">来源方式</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">数量</td>
-										<td colspan="2" style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">备注</td>
-									</tr>
-									<tr style="height: 43px" v-for="(item, index) in centerReportOrderSourceChannelsData" :key="index">
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{ item.name }}:</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{ item.allCountNum }}</td>
-										<td colspan="2" style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{ item.remark }}</td>
-									</tr>
-									<tr style="height: 43px">
-										<td colspan="4" style="font-size: 22px; border-bottom: 1px solid #000000">信件分类</td>
-									</tr>
-									<tr style="height: 43px" v-for="(item, index) in centerReportOrderAcceptTypesData" :key="index">
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{ item.name }}</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{ item.allCountNum }}</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">所占百分比</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000">{{ item.proportionRate }}%</td>
-									</tr>
-								</tbody>
-							</table>
-						</td>
-					</tr>
-					<tr>
-						<td style="height: 30px">&nbsp;</td>
-					</tr>
-					<tr>
-						<td style="vertical-align: top">
-							<table style="width: 100%; border: 1px solid #000000; border-collapse: collapse; padding: 0px">
-								<tbody>
-									<tr style="height: 43px">
-										<td colspan="2" style="font-size: 22px; font-weight: bold; border-bottom: 1px solid #000000">二、信件分布情况</td>
-									</tr>
-									<tr style="height: 43px">
-										<td colspan="2" style="font-size: 22px; text-align: left; border-bottom: 1px solid #000000">市本级总计:{{orgStatisticsCityAllData.orgStatisticsCountAll}}件</td>
-									</tr>
-									<tr style="height: 43px">
-										<td style="font-size: 22px; width: 40%; border-bottom: 1px solid #000000; border-right: 1px solid #000000">部门(单位)</td>
-										<td style="font-size: 22px; width: 40%; border-bottom: 1px solid #000000; border-right: 1px solid #000000">数 量</td>
-									</tr>
-									<tr style="height: 43px" v-for="(item, index) in orgStatisticsCityAllData.orgStatistics" :key="index">
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{item.name}}</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{item.allCountNum}}</td>
-									</tr>
-									<tr style="height: 43px">
-										<td colspan="2" style="font-size: 22px; text-align: left; border-bottom: 1px solid #000000">县(区)总计:{{orgStatisticsAreaAllData.orgStatisticsCountAll}}件</td>
-									</tr>
-									<tr style="height: 43px">
-										<td style="font-size: 22px; width: 40%; border-bottom: 1px solid #000000; border-right: 1px solid #000000">县(区)</td>
-										<td style="font-size: 22px; width: 40%; border-bottom: 1px solid #000000; border-right: 1px solid #000000">数 量</td>
-									</tr>
-									<tr style="height: 43px" v-for="(item, index) in orgStatisticsAreaAllData.orgStatistics" :key="index">
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{item.name}}</td>
-										<td style="font-size: 22px; border-bottom: 1px solid #000000; border-right: 1px solid #000000">{{item.allCountNum}}</td>
-									</tr>
-								</tbody>
-							</table>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-		</el-card>
-	</div>
-</template>
-<script setup lang="ts" name="statisticsOrderCenterReport">
-import { onMounted, reactive, ref } from "vue";
-import { ElButton, ElMessageBox, FormInstance } from "element-plus";
-import { throttle } from '@/utils/tools';
-import { centerReport } from '@/api/statistics/order';
-import { shortcuts } from '@/utils/constants';
-import dayjs from 'dayjs';
-import { exportAsDocx } from "@/utils/exportAsWord";
-// 定义变量内容
-const ruleFormRef = ref<RefType>(); // 表单ref
-const state = reactive(<any>{
-	queryParams: {
-		dateType: 'date', //
-		time: dayjs(new Date()).format('YYYY-MM-DD'), // 时间默认今天
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
-	},
-	loading: false, // 加载
-});
-const valueFormat = ref('YYYY-MM-DD');
-const formats = ref('YYYY-MM-DD');
-const tableTitle = ref('12345市民服务热线办理工作日统计');
-const dates = ref<string>(dayjs(state.queryParams.time).format('YYYY-MM-DD'));
-const changeDateType = (val: string) => {
-	switch (val) {
-		case 'date':
-			valueFormat.value = 'YYYY-MM-DD';
-			formats.value = 'YYYY-MM-DD';
-			dates.value = dayjs(state.queryParams.time).format('YYYY-MM-DD');
-			tableTitle.value = '12345市民服务热线办理工作日统计';
-			state.queryParams.crTime = [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')];
-			queryList();
-			break;
-		case 'month':
-			valueFormat.value = 'YYYY-MM';
-			formats.value = 'YYYY-MM';
-			dates.value = `${dayjs(state.queryParams.time).startOf('month').format('YYYY-MM-DD')} 至 ${dayjs(state.queryParams.time)
-				.endOf('month')
-				.format('YYYY-MM-DD')}`;
-			tableTitle.value = '12345市民服务热线办理工作月统计';
-			state.queryParams.crTime = [dayjs().startOf('month').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('month').format('YYYY-MM-DD HH:mm:ss')];
-			queryList();
-			break;
-		case 'week':
-			valueFormat.value = 'YYYY-MM-DD';
-			formats.value = 'YYYY 第ww周';
-			dates.value = `${dayjs(state.queryParams.time).startOf('week').format('YYYY-MM-DD')} 至 ${dayjs(state.queryParams.time)
-				.endOf('week')
-				.format('YYYY-MM-DD')}`;
-			tableTitle.value = '12345市民服务热线办理工作周统计';
-			state.queryParams.crTime = [dayjs().startOf('week').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('week').format('YYYY-MM-DD HH:mm:ss')];
-			queryList();
-			break;
-		case 'datetimerange':
-			dates.value = `${dayjs(state.queryParams.crTime[0]).format('YYYY-MM-DD')} 至 ${dayjs(state.queryParams.crTime[1]).format('YYYY-MM-DD')}`;
-			tableTitle.value = '12345市民服务热线办理工作时间段统计';
-			queryList();
-			break;
-		default:
-			valueFormat.value = 'YYYY-MM-DD';
-			formats.value = 'YYYY-MM-DD';
-			dates.value = dayjs(state.queryParams.time).format('YYYY-MM-DD');
-			tableTitle.value = '12345市民服务热线办理工作日统计';
-			state.queryParams.crTime = [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')];
-			queryList();
-			break;
-	}
-};
-const centerReportCallData = ref<EmptyObjectType>({}); // 电话统计
-const centerReportOrderData = ref<EmptyObjectType>({}); // 信件统计
-const centerReportOrderAcceptTypesData = ref<EmptyObjectType>([]); // 信件类型统计
-const centerReportOrderSourceChannelsData = ref<EmptyObjectType>([]); // 信件来源统计
-const centerReportVisitdData = ref<EmptyObjectType>({}); // 信件回访统计
-const orgStatisticsAreaAllData = ref<EmptyObjectType>({}); // 区域统计
-const orgStatisticsCityAllData = ref<EmptyObjectType>({}); // 城市统计
-/** 获取列表 */
-const queryList = throttle(() => {
-	state.loading = true;
-	let StartTime = null;
-	let EndTime = null;
-	if (state.queryParams?.crTime) {
-		StartTime = state.queryParams?.crTime[0];
-		EndTime = state.queryParams?.crTime[1];
-	}
-	const request = {
-		StartTime,
-		EndTime,
-	};
-	centerReport(request)
-		.then((res: any) => {
-			const {
-				centerReportCall,
-				centerReportOrder,
-				centerReportOrderAcceptTypes,
-				centerReportOrderSourceChannels,
-				centerReportVisitd,
-				orgStatisticsAreaAll,
-				orgStatisticsCityAll,
-			} = res.result;
-
-			centerReportCallData.value = centerReportCall;
-			centerReportOrderData.value = centerReportOrder;
-			centerReportOrderAcceptTypesData.value = centerReportOrderAcceptTypes;
-			centerReportOrderSourceChannelsData.value = centerReportOrderSourceChannels;
-			centerReportVisitdData.value = centerReportVisitd;
-			orgStatisticsAreaAllData.value = orgStatisticsAreaAll;
-			orgStatisticsCityAllData.value = orgStatisticsCityAll;
-			state.loading = false;
-		})
-		.catch(() => {
-			state.loading = false;
-		});
-}, 300);
-/** 重置按钮操作 */
-const resetQuery = throttle((formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	formEl.resetFields();
-	queryList();
-  valueFormat.value = 'YYYY-MM-DD';
-  formats.value = 'YYYY-MM-DD';
-  dates.value = dayjs(state.queryParams.time).format('YYYY-MM-DD');
-  tableTitle.value = '12345市民服务热线办理工作日统计';
-  state.queryParams.crTime = [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')];
-}, 300);
-const exportTable = ref<RefType>()
-const exportWord = () => {
-  ElMessageBox.confirm(`确定要导出(${tableTitle.value}【${dates.value}】),是否继续?`, '提示', {
-    confirmButtonText: '确认导出',
-    cancelButtonText: '取消',
-    type: 'warning',
-    draggable: true,
-    cancelButtonClass: 'default-button',
-    autofocus: false,
-  })
-    .then(() => {
-      exportAsDocx(exportTable.value, `${tableTitle.value}【${dates.value}】`);
-    })
-    .catch(() => {});
-};
-onMounted(() => {
-	queryList();
-});
-</script>

+ 3 - 3
src/views/statistics/order/departmentAcceptType.vue

@@ -13,14 +13,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item>
@@ -128,7 +128,7 @@ const state = reactive(<any>{
 	queryParams: {
 		// 查询条件
 		TypeCode: '0', // 关键词
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 18 - 18
src/views/statistics/order/hotspotCount.vue

@@ -14,28 +14,28 @@
 				<el-form-item prop="crTime" v-if="state.queryParams.dateType === 'datetimerange'" label="时间">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 						:clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item prop="hbTime" v-if="state.queryParams.dateType === 'datetimerange'" label="环比时间段">
 					<el-date-picker
 						v-model="state.queryParams.hbTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 						:clearable="false"
 					/>
 				</el-form-item>
@@ -95,8 +95,8 @@ const state = reactive({
 		// 查询条件
 		dateType: 'date', // 关键词
 		time: dayjs(new Date()).format('YYYY-MM-DD'), // 时间默认今天
-		crTime: [dayjs(new Date()).startOf('date').format('YYYY-MM-DD[T]HH:mm:ss'), dayjs(new Date()).endOf('date').format('YYYY-MM-DD[T]HH:mm:ss')], // 时间默认今天开始到今天结束
-		hbTime: [dayjs(new Date()).startOf('date').format('YYYY-MM-DD[T]HH:mm:ss'), dayjs(new Date()).endOf('date').format('YYYY-MM-DD[T]HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs(new Date()).startOf('date').format('YYYY-MM-DD'), dayjs(new Date()).endOf('date').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
+		hbTime: [dayjs(new Date()).startOf('date').format('YYYY-MM-DD'), dayjs(new Date()).endOf('date').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载
@@ -126,16 +126,16 @@ const queryList = throttle(() => {
 	let ChainEndTime = null;
 	switch (state.queryParams.dateType) {
 		case 'date':
-			StartTime = dayjs(state.queryParams.time).startOf('date').format('YYYY-MM-DD[T]HH:mm:ss');
-			EndTime = dayjs(state.queryParams.time).endOf('date').format('YYYY-MM-DD[T]HH:mm:ss');
+			StartTime = dayjs(state.queryParams.time).startOf('date').format('YYYY-MM-DD');
+			EndTime = dayjs(state.queryParams.time).endOf('date').format('YYYY-MM-DD');
 			break;
 		case 'month':
-			StartTime = dayjs(state.queryParams.time).startOf('month').format('YYYY-MM-DD[T]HH:mm:ss');
-			EndTime = dayjs(state.queryParams.time).endOf('month').format('YYYY-MM-DD[T]HH:mm:ss');
+			StartTime = dayjs(state.queryParams.time).startOf('month').format('YYYY-MM-DD');
+			EndTime = dayjs(state.queryParams.time).endOf('month').format('YYYY-MM-DD');
 			break;
 		case 'year':
-			StartTime = dayjs(state.queryParams.time).startOf('year').format('YYYY-MM-DD[T]HH:mm:ss');
-			EndTime = dayjs(state.queryParams.time).endOf('year').format('YYYY-MM-DD[T]HH:mm:ss');
+			StartTime = dayjs(state.queryParams.time).startOf('year').format('YYYY-MM-DD');
+			EndTime = dayjs(state.queryParams.time).endOf('year').format('YYYY-MM-DD');
 			break;
 		case 'datetimerange':
 			StartTime = state.queryParams?.crTime[0];
@@ -175,16 +175,16 @@ const load = (row: any, treeNode: unknown, resolve: (date: any[]) => void) => {
 	let ChainEndTime = null;
 	switch (state.queryParams.dateType) {
 		case 'date':
-			StartTime = dayjs(state.queryParams.time).startOf('date').format('YYYY-MM-DD[T]HH:mm:ss');
-			EndTime = dayjs(state.queryParams.time).endOf('date').format('YYYY-MM-DD[T]HH:mm:ss');
+			StartTime = dayjs(state.queryParams.time).startOf('date').format('YYYY-MM-DD');
+			EndTime = dayjs(state.queryParams.time).endOf('date').format('YYYY-MM-DD');
 			break;
 		case 'month':
-			StartTime = dayjs(state.queryParams.time).startOf('month').format('YYYY-MM-DD[T]HH:mm:ss');
-			EndTime = dayjs(state.queryParams.time).endOf('month').format('YYYY-MM-DD[T]HH:mm:ss');
+			StartTime = dayjs(state.queryParams.time).startOf('month').format('YYYY-MM-DD');
+			EndTime = dayjs(state.queryParams.time).endOf('month').format('YYYY-MM-DD');
 			break;
 		case 'year':
-			StartTime = dayjs(state.queryParams.time).startOf('year').format('YYYY-MM-DD[T]HH:mm:ss');
-			EndTime = dayjs(state.queryParams.time).endOf('year').format('YYYY-MM-DD[T]HH:mm:ss');
+			StartTime = dayjs(state.queryParams.time).startOf('year').format('YYYY-MM-DD');
+			EndTime = dayjs(state.queryParams.time).endOf('year').format('YYYY-MM-DD');
 			break;
 		case 'datetimerange':
 			StartTime = state.queryParams?.crTime[0];

+ 3 - 3
src/views/statistics/order/hotspotSubclass.vue

@@ -13,14 +13,14 @@
 				<el-form-item prop="crTime" label="时间段">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 						:clearable="false"
 					/>
 				</el-form-item>
@@ -71,7 +71,7 @@ const state = reactive({
 		// 查询条件
 		TypeId: '0', // 关键词
 		time: dayjs(new Date()).format('YYYY-MM-DD'), // 时间默认今天
-		crTime: [dayjs(new Date()).startOf('date').format('YYYY-MM-DD[T]HH:mm:ss'), dayjs(new Date()).endOf('date').format('YYYY-MM-DD[T]HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs(new Date()).startOf('date').format('YYYY-MM-DD'), dayjs(new Date()).endOf('date').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 3 - 3
src/views/statistics/order/orgHotspot.vue

@@ -6,14 +6,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item>
@@ -53,7 +53,7 @@ const ruleFormRef = ref<RefType>(); // 表单ref
 const state = reactive(<any>{
 	queryParams: {
 		// 查询条件
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 3 - 3
src/views/statistics/order/specials.vue

@@ -6,14 +6,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item>
@@ -72,7 +72,7 @@ const state = reactive({
 		// 查询条件
 		PageIndex: 1, // 页码
 		PageSize: 10, // 每页条数
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 17 - 11
src/views/statistics/order/visitCount.vue

@@ -9,14 +9,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item>
@@ -27,10 +27,10 @@
 				</el-form-item>
 			</el-form>
 		</el-card>
-<!--		<el-row :gutter="20">
+		<el-row :gutter="20">
 			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
 				<el-card shadow="never" v-loading="state.loading" class="statistics-item">
-					<el-statistic :value="state.data.aboutExpire">
+					<el-statistic :value="state.data.aiVisitCount">
 						<template #title>
 							<span class="color-info font14">智能回访量</span>
 						</template>
@@ -39,7 +39,7 @@
 			</el-col>
 			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
 				<el-card shadow="never" v-loading="state.loading" class="statistics-item">
-					<el-statistic :value="state.data.havExpired">
+					<el-statistic :value="state.data.aiVisitSatisfiedCount">
 						<template #title>
 							<span class="color-info font14">智能回访满意量</span>
 						</template>
@@ -48,7 +48,7 @@
 			</el-col>
 			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
 				<el-card shadow="never" v-loading="state.loading" class="statistics-item">
-					<el-statistic :value="state.data.countersignHandle">
+					<el-statistic :value="state.data.aiVisitNoSatisfiedCount">
 						<template #title>
 							<span class="color-info font14">智能回访不满意量</span>
 						</template>
@@ -57,14 +57,14 @@
 			</el-col>
 			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
 				<el-card shadow="never" v-loading="state.loading" class="statistics-item">
-					<el-statistic :value="state.data.screenAudit">
+					<el-statistic :value="state.data.aiVisitFailCount">
 						<template #title>
 							<span class="color-info font14">智能回访失败</span>
 						</template>
 					</el-statistic>
 				</el-card>
 			</el-col>
-		</el-row>-->
+		</el-row>
 		<el-card shadow="never">
 			<ProTable
 				ref="proTableRef"
@@ -103,12 +103,17 @@ const state = reactive({
 	queryParams: {
 		// 查询条件
 		VisitName: null, // 关键词
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [],
 	loading: false, // 加载
 	total: 0, // 总数
-	data: {},
+	data: {
+		aiVisitCount: 0,
+		aiVisitSatisfiedCount: 0,
+		aiVisitNoSatisfiedCount: 0,
+		aiVisitFailCount: 0,
+	},
 });
 /** 获取列表 */
 const queryList = throttle(() => {
@@ -126,7 +131,8 @@ const queryList = throttle(() => {
 	};
 	departmentVisit(request)
 		.then((res: any) => {
-			state.tableData = res.result;
+			state.tableData = res.result?.visitMeasureStatisticsModelList ?? [];
+			state.data = res.result ?? {};
 			state.loading = false;
 		})
 		.catch(() => {

+ 3 - 3
src/views/statistics/order/visitDiscontent.vue

@@ -9,14 +9,14 @@
 				<el-form-item label="时间段" prop="crTime">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
-						type="datetimerange"
+						type="daterange"
 						unlink-panels
 						range-separator="至"
 						start-placeholder="开始时间"
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="queryList"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						value-format="YYYY-MM-DD"
 					/>
 				</el-form-item>
 				<el-form-item>
@@ -62,7 +62,7 @@ const state = reactive({
 		PageIndex: 1,
 		PageSize: 10,
 		OrgName: null, // 关键词
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	loading: false, // 加载
 	tableData: [],

+ 24 - 22
src/views/tels/callLog/index.vue

@@ -24,18 +24,18 @@
 							<el-input v-model="state.queryParams.TelNo" placeholder="响应分机" clearable @keyup.enter="queryList" />
 						</el-form-item>
 					</el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
-            <el-form-item prop="gateway">
-              <el-input v-model="state.queryParams.gateway" placeholder="中继号码" clearable @keyup.enter="queryList" />
-            </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">
-						<el-form-item prop="UserName">
-							<el-input v-model="state.queryParams.UserName" placeholder="话务员名称" clearable @keyup.enter="queryList" />
+					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+						<el-form-item prop="gateway">
+							<el-input v-model="state.queryParams.gateway" placeholder="中继号码" clearable @keyup.enter="queryList" />
 						</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="UserName">
+								<el-input v-model="state.queryParams.UserName" placeholder="话务员名称" clearable @keyup.enter="queryList" />
+							</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">
@@ -162,12 +162,12 @@
 						<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.recordingFileUrl">播放录音</el-button>
-						<el-button link type="primary" @click="onDownload(row)" title="下载录音" v-if="row.recordingFileUrl"> 下载录音 </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.recordingFileUrl">播放录音</el-button>
-						<el-button link type="primary" @click="onDownload(row)" title="下载录音" v-if="row.recordingFileUrl"> 下载录音 </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>
 				<template #title="{ row }">
@@ -186,12 +186,13 @@
 import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { ElButton, ElMessageBox } from 'element-plus';
-import { downloadFile, throttle } from '@/utils/tools';
+import { downloadFileByStream, throttle } from '@/utils/tools';
 import { callBaseData, callLogPaged } from '@/api/tels/callLog';
 import { formatDate } from '@/utils/formatTime';
 import { shortcuts } from '@/utils/constants';
 import other from '@/utils/other';
 import { useRouter } from 'vue-router';
+import { fileDownload } from '@/api/public/file';
 
 // 引入组件
 const PlayRecord = defineAsyncComponent(() => import('@/views/tels/callLog/component/Play-record.vue')); // 播放录音
@@ -305,7 +306,7 @@ const allColumns = [
 	{ prop: 'cpn', label: '主叫号码', width: 120 },
 	{ prop: 'cdpn', label: '被叫号码', width: 120 },
 	{ prop: 'telNo', label: '响应分机', width: 120 },
-  { prop: 'gateway', label: '中继号码', width: 120 },
+	{ prop: 'gateway', label: '中继号码', width: 120 },
 	{ prop: 'userName', label: '话务员', width: 120 },
 	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
 	{ prop: 'onStateText', label: '通话结果' },
@@ -359,7 +360,7 @@ const inColumns = [
 	{ prop: 'cpn', label: '主叫号码', width: 120 },
 	{ prop: 'cdpn', label: '被叫号码', width: 120 },
 	{ prop: 'telNo', label: '响应分机', width: 120 },
-  { prop: 'gateway', label: '中继号码', width: 120 },
+	{ prop: 'gateway', label: '中继号码', width: 120 },
 	{ prop: 'userName', label: '话务员', width: 120 },
 	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
 	{ prop: 'endByText', label: '挂机类型', width: 120 },
@@ -411,7 +412,7 @@ const outColumns = [
 	{ prop: 'cpn', label: '主叫号码', width: 120 },
 	{ prop: 'cdpn', label: '被叫号码', width: 120 },
 	{ prop: 'telNo', label: '响应分机' },
-  { prop: 'gateway', label: '中继号码', width: 120 },
+	{ prop: 'gateway', label: '中继号码', width: 120 },
 	{ prop: 'userName', label: '话务员' },
 	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
 	{ prop: 'endByText', label: '挂机类型', width: 120 },
@@ -435,7 +436,7 @@ const noColumns = [
 	{ prop: 'cpn', label: '主叫号码', width: 120 },
 	{ prop: 'cdpn', label: '被叫号码', width: 120 },
 	{ prop: 'telNo', label: '响应分机' },
-  { prop: 'gateway', label: '中继号码', width: 120 },
+	{ prop: 'gateway', label: '中继号码', width: 120 },
 	{ prop: 'userName', label: '话务员' },
 	{ prop: 'callDirectionText', label: '电话方向' },
 	{
@@ -530,7 +531,7 @@ const resetQuery = throttle((formEl: FormInstance | undefined) => {
 // 播放录音
 const playRecordRef = ref<RefType>();
 const onPlaySoundRecording = (val: any) => {
-	playRecordRef.value.openDialog(val.recordingFileUrl);
+	playRecordRef.value.openDialog(import.meta.env.VITE_RECORD_PREFIX + val.recordingAbsolutePath);
 };
 // 下载录音
 const onDownload = (row: any) => {
@@ -543,8 +544,9 @@ const onDownload = (row: any) => {
 		autofocus: false,
 	})
 		.then(() => {
-			downloadFile(row.downRecordingFileUrl, row.recordingFileName);
-			// window.open(row.recordUrl);
+			fileDownload({ path: import.meta.env.VITE_RECORD_PREFIX + row.recordingAbsolutePath }).then((res: any) => {
+				downloadFileByStream(res, row.recordingFileName);
+			});
 		})
 		.catch(() => {});
 };