Browse Source

reactor:418 市州通用-【发布待办】中办结时间需增加排序按钮;416 优化【中心统计报表】

zhangchong 1 month ago
parent
commit
27e032e3bd

+ 1 - 1
.env.development

@@ -3,7 +3,7 @@ VITE_MODE_NAME=development
 # 防止部署多套系统到同一域名不同目录时,变量共用的问题 设置不同的前缀
 VITE_STORAGE_NAME=dev
 # 业务系统基础请求地址
-VITE_API_URL=http://110.188.24.28:50300
+VITE_API_URL=http://110.188.24.28:50100
 # 业务系统socket请求地址
 VITE_API_SOCKET_URL=http://110.188.24.28:50100/hubs/hotline
 # 业务系统文件上传上传请求地址

+ 10 - 0
src/api/business/order.ts

@@ -395,3 +395,13 @@ export const orderBatchReminder = (data: object) => {
 		data,
 	});
 };
+/**
+ * @description 获取工单所有附件
+ * @param {string} id
+ */
+export const orderAttachment = (id: string) => {
+	return request({
+		url: `/api/v1/Order/all_file/${id}`,
+		method: 'get',
+	});
+};

+ 18 - 1
src/api/public/file.ts

@@ -3,6 +3,7 @@
  * @description 文件管理 导入 导出
  */
 import request from '@/utils/request';
+import qs from 'qs';
 /**
  * @description 获取模板类型
  */
@@ -65,4 +66,20 @@ export const fileDownloadByUrl = (params: object) => {
 	},{
 		reduce_data_format:false
 	});
-};
+};
+/**
+ * @description 下载文件批量 (文件服务)
+ * @param {object}  params
+ */
+export const fileDownloadBatch = (params: object) => {
+	return request({
+		url: `/file/downloadfile_batch`,
+		method: 'get',
+		responseType: 'blob',
+		params,
+		baseURL: import.meta.env.VITE_API_UPLOAD_URL,
+		paramsSerializer: (params: any) => qs.stringify(params),
+	},{
+		reduce_data_format:false
+	});
+}

+ 11 - 0
src/api/statistics/center.ts

@@ -25,6 +25,17 @@ export const centerReportZG = (params: object) => {
     params,
   });
 }
+/**
+ * @description 中心报表统计 泸州
+ * @param {object} params
+ */
+export const centerReportLZ = (params: object) => {
+  return request({
+    url: `/api/v1/BiOrder/center_report_forms_statistics_lz`,
+    method: 'get',
+    params,
+  });
+}
 /**
  * @description 高频来电统计
  * @param {object} params

+ 205 - 0
src/components/OrderDetail/File-list.vue

@@ -0,0 +1,205 @@
+<template>
+	<vxe-toolbar
+		ref="toolbarRef"
+		:loading="state.loading"
+		:refresh="{
+			queryMethod: handleQuery,
+		}"
+	>
+		<template #buttons>
+			<el-button type="primary" @click="onUpload">上传附件</el-button>
+			<el-button type="primary" @click="onDownloadBatch" :disabled="isChecked"
+				>批量下载<span v-if="checkTable.length">({{ checkTable.length }})</span></el-button
+			>
+		</template>
+	</vxe-toolbar>
+	<vxe-table
+		border
+		:loading="state.loading"
+		:data="state.tableData"
+		:column-config="{ resizable: true }"
+		:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
+		ref="tableRef"
+		show-overflow
+		:scrollY="{ enabled: true, gt: 100 }"
+		:max-height="500"
+		@checkbox-all="selectAllChangeEvent"
+		@checkbox-change="selectChangeEvent"
+	>
+		<vxe-column type="checkbox" width="60" align="center"></vxe-column>
+		<vxe-column field="name" title="附件名称"></vxe-column>
+		<vxe-column field="type" title="附件类型"></vxe-column>
+		<vxe-column field="userName" title="上传人"></vxe-column>
+		<vxe-column field="creationTime" title="上传时间" width="160">
+			<template #default="{ row }">
+				{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+			</template>
+		</vxe-column>
+		<vxe-column title="操作" fixed="right" width="180" align="center">
+			<template #default="{ row }">
+				<el-button link type="primary" @click="onDownload(row)" title="下载"> 下载 </el-button>
+				<el-button link type="primary" @click="onPreview(row)" title="预览"> 预览 </el-button>
+				<el-button link type="danger" @click="onDelete(row)" title="预览"> 删除 </el-button>
+			</template>
+		</vxe-column>
+	</vxe-table>
+</template>
+<script setup lang="ts" name="orderDetailFileList">
+import { reactive, ref, onMounted, computed } from 'vue';
+import { throttle } from '@/utils/tools';
+import { orderAttachment } from '@/api/business/order';
+import { formatDate } from '@/utils/formatTime';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { fileDownloadBatch, fileDownloadByUrl } from '@/api/public/file';
+
+const props = defineProps({
+	orderId: {
+		type: String,
+		default: '',
+	},
+});
+const state = reactive<any>({
+	tableData: [], // 附件
+	loading: false,
+});
+/** 搜索按钮操作 */
+const handleQuery = throttle(() => {
+	queryList();
+}, 500);
+/** 获取列表 */
+const queryList = throttle(async () => {
+	state.loading = true;
+	try {
+		const { result } = await orderAttachment(props.orderId);
+		state.tableData = result;
+		state.loading = false;
+		tableRef.value?.clearCheckboxRow();
+		checkTable.value = [];
+	} catch (error: any) {
+		console.log(error);
+		state.loading = false;
+	}
+}, 300);
+// 下载
+const onDownload = (row: any) => {
+	const id = row.additions;
+	if (!id) {
+		ElMessage.error('附件不存在');
+		return;
+	}
+	// 确定是否下载
+	ElMessageBox.confirm(`确定要下载附件 ${row.fileName} 吗?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+	})
+		.then(() => {
+			fileDownloadByUrl({
+				Source: 'hotline',
+				Id: row.additions,
+			}).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 = row.fileName; // 下载文件名
+				document.body.appendChild(down);
+				down.click(); // 模拟点击A标签
+				document.body.removeChild(down); // 下载完成移除元素
+				window.URL.revokeObjectURL(href); // 释放blob对象
+			});
+		})
+		.catch(() => {});
+};
+// 预览
+const onPreview = (row: any) => {
+	const path = row.path;
+	if (!path) {
+		ElMessage.error('附件不存在');
+		return;
+	}
+	// 确定是否下载
+	const url = import.meta.env.VITE_API_UPLOAD_URL + path;
+	window.open(url);
+};
+// 删除
+const onDelete = (row: any) => {
+	console.log(row);
+	// 确定是否下载
+	ElMessageBox.confirm(`确定要删除附件 ${row.fileName} 吗?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+	})
+		.then(() => {
+			queryList();
+		})
+		.catch(() => {});
+};
+// 上传
+const onUpload = () => {
+	console.log('上传');
+};
+// 批量下载
+const onDownloadBatch = () => {
+	const ids = checkTable.value.map((item) => item.additions);
+	// 确定是否下载
+	ElMessageBox.confirm(`确定要批量下载选中的附件?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+	})
+		.then(() => {
+			fileDownloadBatch({
+				Source: 'hotline',
+				ids,
+			}).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 = new Date().getTime() + '附件.zip'; // 下载文件名
+				document.body.appendChild(down);
+				down.click(); // 模拟点击A标签
+				document.body.removeChild(down); // 下载完成移除元素
+				window.URL.revokeObjectURL(href); // 释放blob对象
+				queryList();
+			});
+		})
+		.catch(() => {});
+};
+const toolbarRef = ref<RefType>();
+const tableRef = ref<RefType>();
+const checkTable = ref<EmptyArrayType>([]);
+const selectAllChangeEvent = ({ checked }) => {
+	if (tableRef.value) {
+		const records = tableRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '所有勾选事件' : '所有取消事件', records);
+	}
+};
+
+const selectChangeEvent = ({ checked }) => {
+	if (tableRef.value) {
+		const records = tableRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '勾选事件' : '取消事件', records);
+	}
+};
+const isChecked = computed(() => {
+	return !checkTable.value.length;
+});
+onMounted(() => {
+	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
+});
+</script>

+ 1 - 0
src/components/OrderDetail/History.vue

@@ -50,6 +50,7 @@
 		:total="state.total"
 		v-model:current-page="state.queryParams.PageIndex"
 		v-model:page-size="state.queryParams.PageSize"
+		class="mt10"
 	/>
 </template>
 <script setup lang="ts" name="orderDetailHistory">

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

@@ -566,8 +566,12 @@
 		<div v-show="state.activeName === '4'">
 			<copy-order ref="copyOrderRef" :orderId="state.orderId" />
 		</div>
-		<!--  地图信息  -->
+		<!--  附件列表  -->
 		<div v-if="state.activeName === '5'">
+			<file-list :orderId="state.ruleForm.id" />
+		</div>
+		<!--  地图信息  -->
+		<div v-if="state.activeName === '6'">
 			<map-view ref="mapViewRef" v-if="mapVisible" :markData="markData" />
 		</div>
 		<template #footer>
@@ -778,6 +782,7 @@ const ProcessDetail = defineAsyncComponent(() => import('@/components/ProcessDet
 const MapView = defineAsyncComponent(() => import('@/components/OrderDetail/Map-view.vue')); // 地图标点
 const ZGSSPProcess = defineAsyncComponent(() => import('@/components/ProcessAudit/ZGSSPProcess.vue')); // 自贡随手拍办理流程
 const YBProcess = defineAsyncComponent(() => import('@/components/ProcessAudit/YBProcess.vue')); // 宜宾工单办理流程
+const FileList = defineAsyncComponent(() => import('@/components/OrderDetail/File-list.vue')); // 附件列表
 
 type ButtonType = '' | 'default' | 'success' | 'warning' | 'info' | 'text' | 'primary' | 'danger';
 const props = defineProps({
@@ -836,6 +841,10 @@ const state = reactive<any>({
 			label: '副本工单',
 			value: '4',
 		},
+	/*	{
+			label: '附件列表',
+			value: '5',
+		},*/
 	],
 	collapseArr: ['1', '2', '3', '4'], //展开列表
 	loading: false,
@@ -943,9 +952,13 @@ const openDialog = (val: any) => {
 					label: '副本工单',
 					value: '4',
 				},
+/*				{
+					label: '附件列表',
+					value: '5',
+				},*/
 			/*	{
 					label: '地图信息',
-					value: '5',
+					value: '6',
 				},*/
 			];
 		} else {
@@ -963,6 +976,10 @@ const openDialog = (val: any) => {
 					label: '回访详情',
 					value: '2',
 				},
+			/*	{
+					label: '附件列表',
+					value: '5',
+				},*/
 			];
 		}
 	} else if (['YiBin'].includes(themeConfig.value.appScope) && !userInfos.value.isCenter) {
@@ -983,6 +1000,10 @@ const openDialog = (val: any) => {
 				label: '市民画像',
 				value: '3',
 			},
+		/*	{
+				label: '附件列表',
+				value: '5',
+			},*/
 		];
 	}
 	if (val.activeName) {

+ 11 - 1
src/views/business/publish/index.vue

@@ -1,7 +1,7 @@
 <template>
 	<div class="business-publish-container layout-padding">
 		<div class="layout-padding-auto layout-padding-view pd20">
-			<vxe-grid v-bind="gridOptions"  ref="gridRef" @checkbox-all="selectAllChangeEvent" @checkbox-change="selectChangeEvent">
+			<vxe-grid v-bind="gridOptions"  v-on="gridEvents" ref="gridRef" @checkbox-all="selectAllChangeEvent" @checkbox-change="selectChangeEvent">
 				<template #form>
 					<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline :disabled="gridOptions.loading">
 						<el-form-item label="工单标题" prop="Title">
@@ -177,6 +177,8 @@ const state = reactive<any>({
 		NameOrNo:null,
 		IsOverTime:null,
     ProvinceChannel:null,
+		SortField: null,
+		SortRule: null,
 	},
 	tableData: [], //表单
 	loading: false, // 加载
@@ -287,6 +289,14 @@ const gridOptions = reactive<any>({
 		remote: true,
 	},
 });
+const gridEvents = {
+	sortChange(val: any) {
+		state.queryParams.SortField = val.order ? val.field : null;
+		// 0 升序 1 降序
+		state.queryParams.SortRule = val.order ? (val.order == 'desc' ? 1 : 0) : null;
+		handleQuery();
+	},
+};
 // 手动查询,将页码设置为1
 const handleQuery = () => {
 	state.queryParams.PageIndex = 1;

+ 54 - 38
src/views/business/publish/todo.vue

@@ -1,7 +1,7 @@
 <template>
 	<div class="business-publish-todo-container layout-padding">
 		<div class="layout-padding-auto layout-padding-view pd20">
-			<vxe-grid v-bind="gridOptions" ref="gridRef" @checkbox-all="selectAllChangeEvent" @checkbox-change="selectChangeEvent">
+			<vxe-grid v-bind="gridOptions" v-on="gridEvents" ref="gridRef" @checkbox-all="selectAllChangeEvent" @checkbox-change="selectChangeEvent">
 				<template #form>
 					<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline :disabled="gridOptions.loading">
 						<el-form-item label="数据范围" prop="QuerySelf" v-auth="'business:publish:todo:querySelf'">
@@ -173,25 +173,25 @@
 						:default-time="defaultTimeStartEnd"
 					/>
 				</el-form-item>
-				<template v-if="['ZiGong','LuZhou'].includes(themeConfig.appScope)">
+				<template v-if="['ZiGong', 'LuZhou'].includes(themeConfig.appScope)">
 					<!--					<el-form-item label="行业" prop="Channel">
 						<el-select v-model="state.queryParams.Channel" placeholder="请选择行业" clearable @change="handleQuery">
 							<el-option v-for="items in channelOptions" :key="items.dicDataValue" :label="items.dicDataName" :value="items.dicDataValue" />
 						</el-select>
 					</el-form-item>-->
-          <el-form-item label="工单标签" prop="OrderTag">
-            <el-cascader
-                :options="orderTags"
-                filterable
-                :props="{ value: 'dicDataValue', label: 'dicDataName', emitPath: false, checkStrictly: true }"
-                placeholder="请选择工单标签"
-                class="w100"
-                v-model="state.queryParams.OrderTag"
-                @change="handleQuery"
-                clearable
-            >
-            </el-cascader>
-          </el-form-item>
+					<el-form-item label="工单标签" prop="OrderTag">
+						<el-cascader
+							:options="orderTags"
+							filterable
+							:props="{ value: 'dicDataValue', label: 'dicDataName', emitPath: false, checkStrictly: true }"
+							placeholder="请选择工单标签"
+							class="w100"
+							v-model="state.queryParams.OrderTag"
+							@change="handleQuery"
+							clearable
+						>
+						</el-cascader>
+					</el-form-item>
 				</template>
 				<el-form-item label="是否超期" prop="IsOverTime">
 					<el-select v-model="state.queryParams.IsOverTime" placeholder="请选择是否超期" class="w100" clearable @change="handleQuery">
@@ -254,8 +254,10 @@ const state = reactive<any>({
 		Iszgzfw: null, // 中国政府网
 		Isgjzwfwpt: null, // 国家平台转办件
 		ProvinceChannel: null,
-    OrderTag:null,
-		Contact:null, // 联系电话
+		OrderTag: null,
+		Contact: null, // 联系电话
+		SortField: null,
+		SortRule: null,
 	},
 	tableData: [], //表单
 	loading: false, // 加载
@@ -306,7 +308,7 @@ const gridOptions = reactive<any>({
 				},
 			},
 		},
-    { field: 'acceptorName', title: '受理人', width: 120 },
+		{ field: 'acceptorName', title: '受理人', width: 120 },
 		{ field: 'no', title: '工单编码', width: 140 },
 		{ field: 'isProvinceText', title: '省/市工单', width: 90 },
 		{
@@ -323,16 +325,16 @@ const gridOptions = reactive<any>({
 			minWidth: 200,
 			slots: { default: 'order_detail' },
 		},
-    {
-      field: 'isUrgentText',
-      title: '是否紧急',
-      width: 90,
-      slots: {
-        default: ({ row }) => {
-          return <span class="color-danger font-bold">{row.isUrgentText}</span>;
-        },
-      },
-    },
+		{
+			field: 'isUrgentText',
+			title: '是否紧急',
+			width: 90,
+			slots: {
+				default: ({ row }) => {
+					return <span class="color-danger font-bold">{row.isUrgentText}</span>;
+				},
+			},
+		},
 		{ field: 'sensitiveText', title: '敏感词', width: 150 },
 		{ field: 'sourceChannel', title: '来源渠道', width: 110 },
 		{ field: 'acceptType', title: '受理类型', width: 110 },
@@ -344,18 +346,21 @@ const gridOptions = reactive<any>({
 			title: '接办时间',
 			width: 160,
 			formatter: 'formatDate',
+			sortable: true,
 		},
 		{
 			field: 'creationTime',
 			title: '受理时间',
 			width: 160,
 			formatter: 'formatDate',
+			sortable: true,
 		},
 		{
 			field: 'filedTime',
 			title: '办结时间',
 			width: 160,
 			formatter: 'formatDate',
+			sortable: true,
 		},
 		{ field: 'fwCallRecord.duration', title: '录音时长(秒)', width: 120 },
 		{
@@ -363,6 +368,7 @@ const gridOptions = reactive<any>({
 			title: '省期满时间',
 			width: 160,
 			formatter: 'formatDate',
+			sortable: true,
 		},
 		{ title: '操作', width: 90, fixed: 'right', align: 'center', slots: { default: 'action' } },
 	],
@@ -420,6 +426,14 @@ const fastSearchChange = (val: string) => {
 	}
 	handleQuery();
 };
+const gridEvents = {
+	sortChange(val: any) {
+		state.queryParams.SortField = val.order ? val.field : null;
+		// 0 升序 1 降序
+		state.queryParams.SortRule = val.order ? (val.order == 'desc' ? 1 : 0) : null;
+		handleQuery();
+	},
+};
 // 手动查询,将页码设置为1
 const handleQuery = () => {
 	state.queryParams.PageIndex = 1;
@@ -499,20 +513,22 @@ const publishMultiple = () => {
 	})
 		.then(() => {
 			gridOptions.loading = true;
-			batchPublishOrder({ ids }).then(() => {
-				gridOptions.loading = false;
-				ElMessage.success('批量发布成功');
-				/*ElNotification({
+			batchPublishOrder({ ids })
+				.then(() => {
+					gridOptions.loading = false;
+					ElMessage.success('批量发布成功');
+					/*ElNotification({
 					dangerouslyUseHTMLString: true,
 					message: `<p style="word-break: break-all;max-height: 500px;overflow: auto">${res.result}</p>`,
 					type: 'info',
 				})*/
-				handleQuery();
-			}).catch(() => {
-        gridRef.value.clearCheckboxRow();
-        checkTable.value = [];
-        gridOptions.loading = false;
-      })
+					handleQuery();
+				})
+				.catch(() => {
+					gridRef.value.clearCheckboxRow();
+					checkTable.value = [];
+					gridOptions.loading = false;
+				});
 		})
 		.catch(() => {
 			gridOptions.loading = false;

+ 18 - 15
src/views/knowledge/index/preview.vue

@@ -1,6 +1,6 @@
 <template>
-	<div class="knowledge-preview-container layout-pd">
-		<el-card shadow="never">
+	<div class="knowledge-preview-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
 			<el-skeleton :loading="loading" animated>
 				<template #template>
 					<el-skeleton-item />
@@ -105,16 +105,18 @@
 				</el-col>
 			</el-row>
 			<el-divider />
-			<el-skeleton :loading="loading" animated>
-				<template #template>
-					<el-skeleton :rows="5" />
-				</template>
-				<template #default>
-					<div class="mt5 editor-content-view">
-						<div v-html="state.info.content" class="lineHeight24"></div>
-					</div>
-				</template>
-			</el-skeleton>
+			<el-scrollbar style="overflow: hidden; width: 100%; height: 100%; flex: 1" always>
+				<el-skeleton :loading="loading" animated>
+					<template #template>
+						<el-skeleton :rows="5" />
+					</template>
+					<template #default>
+						<div class="mt5 editor-content-view">
+							<div v-html="state.info.content" class="lineHeight24"></div>
+						</div>
+					</template>
+				</el-skeleton>
+			</el-scrollbar>
 			<template v-if="state.info.knowledgeDtos && state.info.knowledgeDtos.length">
 				<el-divider />
 				<el-skeleton :loading="loading" animated>
@@ -148,7 +150,7 @@
 					</template>
 				</el-skeleton>
 			</template>
-		</el-card>
+		</div>
 		<!-- 收藏 -->
 		<el-dialog v-model="state.collectDialogVisible" draggable title="收藏知识" width="30%" @close="collectFormClose" append-to-body destroy-on-close>
 			<el-form :model="state.collectForm" label-width="80px" ref="collectFormRef" @submit.native.prevent>
@@ -191,7 +193,7 @@
 </template>
 
 <script setup lang="ts" name="knowledgePreview">
-import { reactive, onMounted, onBeforeUnmount, ref, defineAsyncComponent, computed } from 'vue';
+import { reactive, onMounted, onBeforeUnmount, ref, defineAsyncComponent, computed, onActivated } from 'vue';
 import { useRoute, useRouter } from 'vue-router';
 import { Local } from '@/utils/storage';
 import { KnowledgeInfo, knowledgeCollect, knowledgeScore, baseData, knowledgeDetailExport } from '@/api/knowledge';
@@ -388,7 +390,8 @@ onMounted(() => {
 	getInfo();
 });
 onBeforeUnmount(() => {
-	Local.remove('previewForm'); // 删除本地缓存
+	const previewForm = Local.get('previewForm');
+	if (previewForm) Local.remove('previewForm'); // 删除本地缓存
 });
 </script>
 <style lang="scss" scoped>

+ 503 - 0
src/views/statistics/center/LZAnalysis.vue

@@ -0,0 +1,503 @@
+<template>
+	<div class="statistics-center-analysis-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+				<el-form-item prop="dateType">
+					<el-segmented
+						v-model="state.queryParams.dateType"
+						:options="[
+							{ label: '按日统计', value: 'date' },
+							{ label: '按周统计', value: 'week' },
+							{ label: '按月统计', value: 'month' },
+							{ label: '按时间段统计', value: 'datetimerange' },
+						]"
+						@change="changeDateType"
+						:disabled="state.loading"
+					/>
+				</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="changeDateType('datetimerange')"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						:default-time="defaultTimeStartEnd"
+						: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="changeDateType(state.queryParams.dateType)"
+						:value-format="valueFormat"
+						:format="formats"
+						:clearable="false"
+						:default-time="defaultTimeStartEnd"
+					/>
+				</el-form-item>
+				<el-form-item label="来电主体" prop="IdentityType">
+					<el-select v-model="state.queryParams.IdentityType" placeholder="请选择来电主体" clearable @change="queryList">
+						<el-option :value="1" label="市民" />
+						<el-option :value="2" label="企业" />
+					</el-select>
+				</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" class="mr5" /> 导出</el-button
+					>
+
+					<el-popover :width="500" trigger="click">
+						<template #reference>
+							<el-button type="primary"><SvgIcon name="ele-QuestionFilled" class="mr5" /> 字段说明</el-button>
+						</template>
+						<el-descriptions title="" :column="1" border style="max-height: 400px; overflow: auto">
+							<el-descriptions-item label="电话总量">已接通量 + 未接通</el-descriptions-item>
+							<el-descriptions-item label="已接通量">呼入接通量 + 呼出接通量</el-descriptions-item>
+							<el-descriptions-item label="未接通量">呼入未接通量 + 呼出未接通量</el-descriptions-item>
+							<el-descriptions-item label="来件总计">有效 + 无效</el-descriptions-item>
+							<el-descriptions-item label="未接通量">呼入未接通量 + 呼出未接通量</el-descriptions-item>
+							<el-descriptions-item label="已回访量(电话)">回访时,通过拨打电话回访的数据;</el-descriptions-item>
+							<el-descriptions-item label="已回访量(人工)">回访时,未通过拨打电话或批量回访的数据;</el-descriptions-item>
+						</el-descriptions>
+					</el-popover>
+				</el-form-item>
+			</el-form>
+			<el-scrollbar v-loading="state.loading" class="scrollbar-view">
+				<table style="max-width: 80%; margin: 0 auto" ref="exportTableRef">
+					<tr>
+						<td>
+							<table style="width: 100%; border: 1px solid #000000; border-collapse: collapse; padding: 0">
+								<tbody>
+									<tr>
+										<th colspan="4" style="height: 70px; font-size: 26px; font-family: 微软雅黑, serif; padding: 0 20px">
+											{{ themeConfig.cityName }}12345政务服务热线 {{ tableTitle }}办理工作统计
+										</th>
+									</tr>
+									<tr>
+										<td colspan="4" style="height: 40px; padding-left: 10px; font-size: 24px; font-weight: bold; border: 1px solid #808080">
+											一、总体情况
+										</td>
+									</tr>
+									<tr>
+										<td
+											colspan="2"
+											style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080"
+											title="电话总量=已接通(呼入+呼出)+未接通(呼入+呼出)"
+										>
+											1、电话总量:{{ centerReportCallInfoDto.allCallCount }}  呼入:{{ centerReportCallInfoDto.inTotal }}  呼出:{{
+												centerReportCallInfoDto.outTotal
+											}}
+										</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; border: 1px solid #808080; color: #7d7575">
+											电话总量=已接通(呼入+呼出)+未接通(呼入+呼出)
+										</td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">已接通</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											呼入:{{ centerReportCallInfoDto.inConnectionQuantity }}&nbsp;&nbsp;呼出:{{
+												centerReportCallInfoDto.outConnectionQuantity
+											}}(接通)
+										</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">未接通</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											呼入:{{ centerReportCallInfoDto.inHanguped }}&nbsp;&nbsp;呼出:{{ centerReportCallInfoDto.outHanguped }}(未接通)
+										</td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">在IVR中挂断</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportCallInfoDto.ivrByeCount }}
+										</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">在队列中挂断</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportCallInfoDto.queueByeCount }}
+										</td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">呼入未接通</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportCallInfoDto.callInHanguped }}
+										</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">呼入电话接通率</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportCallInfoDto.inConnectionQuantityRate }}%
+										</td>
+									</tr>
+									<tr>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080" title="">
+											2、信件回访量
+										</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; border: 1px solid #808080; color: #7d7575"></td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">已回访量</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											已回访量:{{ centerReportVisitd.allVisitd }} 电话:{{ centerReportVisitd.callVisitd }} &nbsp;默认:{{
+												centerReportVisitd.otherVisitd
+											}}&nbsp;&nbsp;短信:{{ centerReportVisitd.smsVisitd }}
+										</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">待回访量</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportVisitd.waitVisitd }}
+										</td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">坐席满意度</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportVisitd.seatsRate }}%
+										</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">部门满意度</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportVisitd.orgRate }}%
+										</td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">不满意件</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportVisitd.dissatisfied }}
+										</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">满意件</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportVisitd.satisfied }}
+										</td>
+									</tr>
+									<tr>
+										<td
+											colspan="2"
+											style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080"
+											title="来件总计=有效+无效"
+										>
+											3、来件总计:{{ centerReportOrder.allCallCount }}&nbsp;&nbsp;&nbsp;&nbsp;按时办结率{{
+												centerReportOrder.onTimeCompletedCountClc
+											}}%
+										</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; border: 1px solid #808080; color: #7d7575">
+											来件总计=有效+无效
+										</td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">有效</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportOrder.effectiveCount }}
+										</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">无效</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportOrder.invalidCount }}
+										</td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">已办结信件</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											已办结总量:{{ centerReportOrder.allCompletedCount }}&nbsp;&nbsp;中心:{{
+												centerReportOrder.centerCompletedCount
+											}}&nbsp;&nbsp;部门:{{ centerReportOrder.orgCompletedCount }}
+										</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">在办信件</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											在办总量:{{ centerReportOrder.allInProgressCount }}&nbsp;&nbsp;中心:{{
+												centerReportOrder.centerInProgressCount
+											}}&nbsp;&nbsp;部门:{{ centerReportOrder.orgInProgressCount }}
+										</td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">直办件</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportOrder.centerCompletedCount }}
+										</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">直办率</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportOrder.centerCompletedCountRate }}%
+										</td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">转办件</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportOrder.orgInProgressCount }}
+										</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">转办办结件</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportOrder.orgCompletedCount }}
+										</td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">办结率</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportOrder.completedCountRate }}%
+										</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">催办总数</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ centerReportOrder.orderUrge }}
+										</td>
+									</tr>
+									<tr>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">4、信件来源</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080"></td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">来源方式</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">数量</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">备注</td>
+									</tr>
+									<tr v-for="item in centerReportOrderSourceChannels" :key="item.name">
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">{{ item.name }}</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">{{ item.countNum }}</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ item.countNumRate }}%
+										</td>
+									</tr>
+									<tr>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">5、信件分类</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080"></td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">分类名称</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">数量</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">所占百分比</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">百分率</td>
+									</tr>
+									<tr v-for="item in centerReportOrderAcceptTypes" :key="item.name">
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">{{ item.name }}</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">{{ item.countNum }}</td>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">所占百分比</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ item.proportionRate }}%
+										</td>
+									</tr>
+									<tr>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">6、专线</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080"></td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">分类名称</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">数量</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">备注</td>
+									</tr>
+									<tr v-for="item in zhuanxian" :key="item.name">
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">{{ item.name }}</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">{{ item.num }}</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ item.rate }}%
+										</td>
+									</tr>
+									<tr>
+										<td colspan="4" style="height: 40px; padding-left: 10px; font-size: 24px; font-weight: bold; border: 1px solid #808080">
+											二、信件分布情况
+										</td>
+									</tr>
+									<tr>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											1、市本级总计:{{ orgStatisticsCityAll.orgStatisticsCountAll }}件
+										</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080"></td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">部门(单位)</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">数量</td>
+										<!--										<td colspan="2" style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">办件次数</td>-->
+									</tr>
+									<tr v-for="item in orgStatisticsCityAll.orgStatistics" :key="item.orgName">
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">{{ item.orgName }}</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">{{ item.countNum }}</td>
+										<!--										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ item.handleCountNum }}
+										</td>-->
+									</tr>
+									<tr>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											2、县(区)总计:{{ orgStatisticsAreaAll.orgStatisticsCountAll }}件
+										</td>
+										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080"></td>
+									</tr>
+									<tr>
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">部门(单位)</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">数量</td>
+										<!--										<td colspan="2" style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">办件次数</td>-->
+									</tr>
+									<tr v-for="item in orgStatisticsAreaAll.orgStatistics" :key="item.orgName">
+										<td style="height: 36px; width: 17%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">{{ item.orgName }}</td>
+										<td style="height: 36px; width: 33%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">{{ item.countNum }}</td>
+										<!--										<td colspan="2" style="height: 36px; width: 50%; padding-left: 10px; font-size: 18px; border: 1px solid #808080">
+											{{ item.handleCountNum }}
+										</td>-->
+									</tr>
+								</tbody>
+							</table>
+						</td>
+					</tr>
+				</table>
+				<el-backtop target=".scrollbar-view > div" />
+			</el-scrollbar>
+		</div>
+	</div>
+</template>
+<script setup lang="ts" name="statisticsCenterLZAnalysis">
+import { onMounted, reactive, ref } from 'vue';
+import { ElMessageBox, FormInstance } from 'element-plus';
+import { centerReportLZ } from '@/api/statistics/center';
+import { defaultDate, defaultTimeStartEnd, shortcuts } from '@/utils/constants';
+import dayjs from 'dayjs';
+import { exportAsDocx } from '@/utils/exportAsWord';
+import { useThemeConfig } from '@/stores/themeConfig';
+import { storeToRefs } from 'pinia';
+// 定义变量内容
+const ruleFormRef = ref<RefType>(); // 表单ref
+const state = reactive(<any>{
+	queryParams: {
+		dateType: 'date', //
+		time: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss'), // 时间默认今天
+		crTime: defaultDate, // 时间默认今天开始到今天结束
+		IdentityType: null, // 来电主体
+	},
+	loading: false, // 加载
+});
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
+const valueFormat = ref('YYYY-MM-DD');
+const formats = ref('YYYY-MM-DD');
+const tableTitle = ref(
+	`『${dayjs(state.queryParams.time).startOf('day').format('YYYY-MM-DD HH:mm:ss')}』-『${dayjs(state.queryParams.time)
+		.endOf('day')
+		.format('YYYY-MM-DD HH:mm:ss')}』`
+);
+const changeDateType = (val: string) => {
+	switch (val) {
+		case 'date':
+			valueFormat.value = 'YYYY-MM-DD';
+			formats.value = 'YYYY-MM-DD';
+			tableTitle.value = `『${dayjs(state.queryParams.time).startOf('day').format('YYYY-MM-DD HH:mm:ss')}』-『${dayjs(state.queryParams.time)
+				.endOf('day')
+				.format('YYYY-MM-DD HH:mm:ss')}』`;
+			state.queryParams.crTime = [
+				dayjs(state.queryParams.time).startOf('day').format('YYYY-MM-DD[T]HH:mm:ss'),
+				dayjs(state.queryParams.time).endOf('day').format('YYYY-MM-DD[T]HH:mm:ss'),
+			];
+			queryList();
+			break;
+		case 'month':
+			valueFormat.value = 'YYYY-MM';
+			formats.value = 'YYYY-MM';
+			tableTitle.value = `『${dayjs(state.queryParams.time).startOf('month').format('YYYY-MM-DD HH:mm:ss')}』-『${dayjs(state.queryParams.time)
+				.endOf('month')
+				.format('YYYY-MM-DD HH:mm:ss')}』`;
+			state.queryParams.crTime = [
+				dayjs(state.queryParams.time).startOf('month').format('YYYY-MM-DD[T]HH:mm:ss'),
+				dayjs(state.queryParams.time).endOf('month').format('YYYY-MM-DD[T]HH:mm:ss'),
+			];
+			queryList();
+			break;
+		case 'week':
+			valueFormat.value = 'YYYY-MM-DD';
+			formats.value = 'YYYY 第ww周';
+			tableTitle.value = `『${dayjs(state.queryParams.time).startOf('week').format('YYYY-MM-DD HH:mm:ss')}』-『${dayjs(state.queryParams.time)
+				.endOf('week')
+				.format('YYYY-MM-DD HH:mm:ss')}』`;
+			state.queryParams.crTime = [
+				dayjs(state.queryParams.time).startOf('week').format('YYYY-MM-DD[T]HH:mm:ss'),
+				dayjs(state.queryParams.time).endOf('week').format('YYYY-MM-DD[T]HH:mm:ss'),
+			];
+			queryList();
+			break;
+		case 'datetimerange':
+			tableTitle.value = `『${dayjs(state.queryParams.crTime[0]).format('YYYY-MM-DD HH:mm:ss')}』-『${dayjs(state.queryParams.crTime[1]).format(
+				'YYYY-MM-DD HH:mm:ss'
+			)}`;
+			queryList();
+			break;
+		default:
+			valueFormat.value = 'YYYY-MM-DD[T]HH:mm:ss';
+			formats.value = 'YYYY-MM-DD[T]HH:mm:ss';
+			tableTitle.value = `『${dayjs(state.queryParams.time).startOf('day').format('YYYY-MM-DD HH:mm:ss')}』-『${dayjs(state.queryParams.time)
+				.endOf('day')
+				.format('YYYY-MM-DD HH:mm:ss')}』`;
+			state.queryParams.crTime = [
+				dayjs(state.queryParams.time).startOf('day').format('YYYY-MM-DD[T]HH:mm:ss'),
+				dayjs(state.queryParams.time).endOf('day').format('YYYY-MM-DD[T]HH:mm:ss'),
+			];
+			queryList();
+			break;
+	}
+};
+
+const zhuanxian = ref<EmptyObjectType>([]);
+
+const centerReportCallInfoDto = ref<EmptyObjectType>({}); // 话务情况
+const centerReportCall = ref<EmptyObjectType>({}); // 话务情况
+const centerReportOrder = ref<EmptyObjectType>({}); // 工单数据
+const centerReportVisitd = ref<EmptyObjectType>({}); // 信件回访量
+const centerReportOrderSourceChannels = ref<EmptyArrayType>([]); // 信件来源
+const centerReportOrderAcceptTypes = ref<EmptyArrayType>([]); // 信件分类
+const orgStatisticsCityAll = ref<EmptyObjectType>({}); // 信件分布 城市
+const orgStatisticsAreaAll = ref<EmptyObjectType>({}); // 信件分布 区县
+/** 获取列表 */
+const queryList = () => {
+	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,
+		IdentityType:state.queryParams.IdentityType,
+	};
+	centerReportLZ(request)
+		.then(({ result }) => {
+			centerReportCallInfoDto.value = result.centerReportCallInfoDto; // 话务情况
+			centerReportCall.value = result.centerReportCall; // 话务情况
+			centerReportOrder.value = result.centerReportOrder; // 工单情况
+			centerReportVisitd.value = result.centerReportVisitd; // 信件回访量
+			centerReportOrderSourceChannels.value = result.centerReportOrderSourceChannels; // 信件来源
+			centerReportOrderAcceptTypes.value = result.centerReportOrderAcceptTypes; // 信件分类
+			orgStatisticsCityAll.value = result.orgStatisticsCityAll; // 信件分布 城市
+			orgStatisticsAreaAll.value = result.orgStatisticsAreaAll; // 信件分布 区县
+			state.loading = false;
+		})
+		.catch(() => {
+			state.loading = false;
+		});
+};
+/** 重置按钮操作 */
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	valueFormat.value = 'YYYY-MM-DD[T]HH:mm:ss';
+	formats.value = 'YYYY-MM-DD';
+	tableTitle.value = `『${dayjs(state.queryParams.time).startOf('day').format('YYYY-MM-DD HH:mm:ss')}』-『${dayjs(state.queryParams.time)
+		.endOf('day')
+		.format('YYYY-MM-DD HH:mm:ss')}』`;
+	state.queryParams.crTime = [dayjs().startOf('day').format('YYYY-MM-DD[T]HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD[T]HH:mm:ss')];
+	queryList();
+};
+const exportTableRef = ref<RefType>();
+const exportWord = () => {
+	ElMessageBox.confirm(`确定要导出 ${themeConfig.value.cityName}12345政务服务热线${tableTitle.value}办理工作统计,是否继续?`, '提示', {
+		confirmButtonText: '确认导出',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+			exportAsDocx(exportTableRef.value, `${themeConfig.value.cityName}12345政务服务热线${tableTitle.value}办理工作统计`);
+		})
+		.catch(() => {});
+};
+onMounted(() => {
+	queryList();
+});
+</script>

+ 1 - 1
src/views/statistics/center/analysis.vue

@@ -10,7 +10,7 @@ import { storeToRefs } from 'pinia';
 // 引入组件
 const YiBin = defineAsyncComponent(() => import('@/views/statistics/center/YBAnalysis.vue')); // 宜宾中心报表
 const ZiGong = defineAsyncComponent(() => import('@/views/statistics/center/ZGAnalysis.vue')); // 自贡中心报表
-const LuZhou = defineAsyncComponent(() => import('@/views/statistics/center/ZGAnalysis.vue')); // 泸州中心报表
+const LuZhou = defineAsyncComponent(() => import('@/views/statistics/center/LZAnalysis.vue')); // 泸州中心报表
 
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);