Browse Source

reactor:对接受理类型统计周期明细;

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

+ 0 - 3
.env.development

@@ -37,6 +37,3 @@ VITE_RECORD_PREFIX=http://222.213.23.229:10085
 # 录音下载地址前缀
 VITE_RECORD_DOWNLOAD_PREFIX=http://222.213.23.229:10085
 
-# 日志服务器地址
-VITE_LOG_SERVER_URL=http://110.188.24.182:50112
-

+ 1 - 4
.env.production

@@ -35,7 +35,4 @@ VITE_VOICE_ASSISTANT_SOCKET_URL=ws://182.151.41.101:19005
 VITE_RECORD_PREFIX=http://222.213.23.229:10085
 
 # 录音下载地址前缀
-VITE_RECORD_DOWNLOAD_PREFIX=http://222.213.23.229:10085
-
-# 日志服务器地址
-VITE_LOG_SERVER_URL=http://110.188.24.182:50112
+VITE_RECORD_DOWNLOAD_PREFIX=http://222.213.23.229:10085

+ 1 - 4
.env.st

@@ -35,7 +35,4 @@ VITE_VOICE_ASSISTANT_SOCKET_URL=ws://182.151.41.101:19005
 VITE_RECORD_PREFIX=http://222.213.23.229:10085
 
 # 录音下载地址前缀
-VITE_RECORD_DOWNLOAD_PREFIX=http://222.213.23.229:10085
-
-# 日志服务器地址
-VITE_LOG_SERVER_URL=http://110.188.24.182:50112
+VITE_RECORD_DOWNLOAD_PREFIX=http://222.213.23.229:10085

+ 1 - 4
.env.yibin

@@ -35,7 +35,4 @@ VITE_VOICE_ASSISTANT_SOCKET_URL=ws://218.6.151.146:50108
 VITE_RECORD_PREFIX=http://218.6.151.146:50104
 
 # 录音下载地址前缀
-VITE_RECORD_DOWNLOAD_PREFIX=http://192.168.2.212:29003
-
-# 日志服务器地址
-VITE_LOG_SERVER_URL=http://110.188.24.182:50112
+VITE_RECORD_DOWNLOAD_PREFIX=http://192.168.2.212:29003

+ 67 - 0
src/App.vue

@@ -160,4 +160,71 @@ watch(
 		deep: true,
 	}
 );
+const times = () => {
+  const performance = window.performance;
+  if (performance) {
+    setTimeout(() => { //异步获取, 同步获取时duration等值可能获取不到
+      const pnt: any = performance.getEntriesByType('navigation')[0]
+      const column = [
+        {
+          key: 'Redirect',
+          desc: '网页重定向的耗时',
+          value: pnt.redirectEnd - pnt.redirectStart,
+        },
+        {
+          key: 'AppCache',
+          desc: '检查本地缓存的耗时',
+          value: pnt.domainLookupStart - pnt.fetchStart,
+        },
+        {
+          key: 'DNS',
+          desc: 'DNS查询的耗时',
+          value: pnt.domainLookupEnd - pnt.domainLookupStart,
+        },
+        {
+          key: 'TCP',
+          desc: 'TCP连接的耗时',
+          value: pnt.connectEnd - pnt.connectStart,
+        },
+        {
+          key: 'Waiting(TTFB)',
+          desc: '从客户端发起请求到接收到响应的时间 / Time To First Byte',
+          value: pnt.responseStart - pnt.fetchStart,
+        },
+        {
+          key: '白屏时间',
+          desc: '首次渲染时间/白屏时间',
+          value: pnt.responseStart - pnt.startTime,
+        },
+        {
+          key: 'Content Download',
+          desc: '下载服务端返回数据的时间',
+          value: pnt.responseEnd - pnt.responseStart,
+        },
+        {
+          key: 'request',
+          desc: 'request请求耗时',
+          value: pnt.responseEnd - pnt.requestStart,
+        },
+        {
+          key: 'dom树',
+          desc: '解析dom树耗时',
+          value: pnt.domComplete - pnt.domInteractive,
+        },
+        {
+          key: 'DOMContentLoaded',
+          desc: 'dom加载完成的时间',
+          value: pnt.domContentLoadedEventEnd,
+        },
+        {
+          key: 'Loaded',
+          desc: '页面load的总耗时',
+          value: pnt.duration
+        },
+      ];
+      console && console.table && console.table(column);
+    }, 0)
+  }
+}
+// window.addEventListener('load', times); // onload 事件触发
 </script>

+ 28 - 15
src/api/query/countersign.ts

@@ -3,25 +3,38 @@
  * @description 业务查询-会签查询
  */
 import request from '@/utils/request';
+import qs from 'qs';
 /**
  * @description 会签列表查询
  * @param {object} params
  */
-export const countersignList = (params:object) => {
-    return request({
-        url: `/api/v1/Workflow/countersign`,
-        method: 'get',
-        params
-    });
-}
+export const countersignList = (params: object) => {
+	return request({
+		url: `/api/v1/Workflow/countersign`,
+		method: 'get',
+		params,
+	});
+};
 /**
- * @description 会签详情
+ * @description 会签列表
  * @param {object} params
  */
-export const countersignData = (params:object) => {
-    return request({
-        url: `/api/v1/Workflow/order-countersign`,
-        method: 'get',
-        params
-    });
-}
+export const countersignData = (params: object) => {
+	return request({
+		url: `/api/v1/Workflow/order-countersign`,
+		method: 'get',
+		params,
+      paramsSerializer: (params: any) => qs.stringify(params),
+	});
+};
+/**
+ * @description 会签列表基础信息
+ * @param {object} params
+ */
+export const countersignBase = (params?: object) => {
+	return request({
+		url: `/api/v1/Workflow/order-countersign-base-data`,
+		method: 'get',
+		params
+	});
+};

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

@@ -124,3 +124,14 @@ export const departmentAcceptType = (params: object) => {
 		params,
 	});
 };
+/**
+ * @description 部门受理类型统计周期明细
+ * @param {object} params
+ */
+export const departmentAcceptTypeDetail = (params: object) => {
+	return request({
+		url: `/api/v1/BiOrder/department_acceptance_type_order_list`,
+		method: 'get',
+		params,
+	});
+};

+ 2 - 0
src/components/ProTable/index.vue

@@ -25,6 +25,7 @@
 			</div>
 		</div>
 		<!-- 表格主体 -->
+<!--    :scrollbar-always-on="true" 滚动条一直展示-->
 		<el-table
 			ref="tableRef"
 			v-bind="$attrs"
@@ -33,6 +34,7 @@
 			:row-key="rowKey"
 			@selection-change="selectionChange"
 			v-loading="loading"
+      :scrollbar-always-on="true"
 		>
 			<!-- 默认插槽 -->
 			<slot />

+ 1 - 1
src/layout/main/columns.vue

@@ -33,7 +33,7 @@ const { themeConfig } = storeToRefs(storesThemeConfig);
 // 重置滚动条高度
 const updateScrollbar = () => {
 	// 更新父级 scrollbar
-	layoutScrollbarRef.value.update();
+	layoutScrollbarRef.value?.update();
 	// 更新子级 scrollbar
 	layoutMainRef.value.layoutMainScrollbarRef.update();
 };

+ 1 - 1
src/layout/main/defaults.vue

@@ -32,7 +32,7 @@ const { themeConfig } = storeToRefs(storesThemeConfig);
 // 重置滚动条高度
 const updateScrollbar = () => {
 	// 更新父级 scrollbar
-	layoutScrollbarRef.value.update();
+	layoutScrollbarRef.value?.update();
 	// 更新子级 scrollbar
 	layoutMainRef.value.layoutMainScrollbarRef?.update();
 };

+ 4 - 10
src/layout/navBars/breadcrumb/telControl.vue

@@ -862,7 +862,7 @@ const onConnect = () => {
 
 	pingTimer.value = setInterval(() => {
 		ola.ping();
-	}, 5000);
+	}, 3000);
 
 	// ola.logout(currentTel.value.telNo); //连接之后,先登出一次,防止其他地方已经登陆
 	let array_ola_queue: EmptyArrayType = []; // 队列
@@ -874,7 +874,8 @@ const onConnect = () => {
 		ola.login(array_ola_queue, currentTel.value.telNo, { type: 'onhook' });
 		connectVoiceAssistant(currentTel.value.telNo); // 坐席助手开启
 	}
-	Local.set('telNo', currentTel.value.telNo);
+
+  Local.set('telNo', currentTel.value.telNo);
 };
 // 业务系统发送消息
 const sendMsg = (msg: any) => {
@@ -1593,8 +1594,6 @@ const connectVoiceAssistant = async (telNo: string) => {
 			ElMessage.success('坐席辅助连接成功');
 		});
 		socket.value.on('message', wsReceive);
-    socket.value.on('close', wsClose);
-    console.log(socket.value);
 	} catch (err) {
 		console.log(err, '坐席辅助链接失败');
 		ElMessage.error('坐席辅助链接失败');
@@ -1608,7 +1607,7 @@ const seatAssistOff = () => {
 		socket.value = null;
 	}
 };
-// 坐席辅助推送消息
+// 推送消息
 const wsReceive = (message: any) => {
 	try {
 		const data = JSON.parse(message.data);
@@ -1621,10 +1620,6 @@ const wsReceive = (message: any) => {
 		return;
 	}
 };
-// 坐席辅助关闭
-const wsClose = (e) => {
-	console.log(e, '坐席辅助关闭')
-};
 // 刷新页面呼叫中心链接
 const callCenterConnect = async () => {
 	const currentTelNo = Local.get('currentTelNo');
@@ -1697,7 +1692,6 @@ onMounted(async () => {
 	clearInterval(pingTimer.value); // 清除心跳定时器
 	clearInterval(onDutyTimer.value); // 清除签入时长定时器
 	clearInterval(talkTimer.value); // 清除通话时长定时器
-	Local.remove('telNo');
 	await getTelsLists(); // 查询所有分机
 	await callCenterConnect(); // 呼叫中心链接
 	// 加入分组

+ 4 - 3
src/layout/navBars/tagsView/tagsView.vue

@@ -264,8 +264,9 @@ const closeCurrentTagsView = (path: string) => {
 	state.tagsViewList.map((v: RouteItem, k: number, arr: any) => {
 		if (!v.meta?.isAffix) {
 			if (getThemeConfig.value.isShareTagsView ? v.path === path : v.url === path) {
-				storesKeepALiveNames.delCachedView(v);
 				state.tagsViewList.splice(k, 1);
+        const fi = state.tagsViewList.filter((i: any) => i.name === v.name);
+        if(!fi) storesKeepALiveNames.delCachedView(v); // 动态路由会有多个 如果有多个不清除缓存
 				setTimeout(() => {
 					if (state.tagsViewList.length === k && getThemeConfig.value.isShareTagsView ? state.routePath === path : state.routeActive === path) {
 						// 最后一个且高亮时
@@ -492,7 +493,7 @@ const tagsViewmoveToCurrentTag = () => {
 			}
 		}
 		// 更新滚动条,防止不出现
-		scrollbarRef.value.update();
+		scrollbarRef.value?.update();
 	});
 };
 // 获取 tagsView 的下标:用于处理 tagsView 点击时的横向滚动
@@ -590,7 +591,7 @@ onMounted(() => {
 // 路由更新时(组件内生命钩子)
 onBeforeRouteUpdate(async (to) => {
 	state.routeActive = setTagsViewHighlight(to);
-	state.routePath = to.meta.isDynamic ? to.meta.isDynamicPath : to.path;
+	state.routePath = to.meta?.isDynamic ? to.meta?.isDynamicPath : to.path;
 	await addTagsView(to.path, <any>to);
 	getTagsRefsIndex(getThemeConfig.value.isShareTagsView ? state.routePath : state.routeActive);
 });

+ 4 - 4
src/layout/routerView/parent.vue

@@ -34,8 +34,8 @@ const storesThemeConfig = useThemeConfig();
 const { keepAliveNames, cachedViews } = storeToRefs(storesKeepAliveNames);
 const { themeConfig } = storeToRefs(storesThemeConfig);
 const state = reactive<ParentViewState>({
-	refreshRouterViewKey: '', // 非 iframe tagsview 右键菜单刷新时
-	iframeRefreshKey: '', // iframe tagsview 右键菜单刷新时
+	refreshRouterViewKey: null, // 非 iframe tagsview 右键菜单刷新时
+	iframeRefreshKey: null, // iframe tagsview 右键菜单刷新时
 	keepAliveNameList: [],
 	iframeList: [],
 });
@@ -66,8 +66,8 @@ onBeforeMount(() => {
 	state.keepAliveNameList = keepAliveNames.value;
 	mittBus.on('onTagsViewRefreshRouterView', (fullPath: string) => {
 		state.keepAliveNameList = keepAliveNames.value.filter((name: string) => route.name !== name);
-		state.refreshRouterViewKey = '';
-		state.iframeRefreshKey = '';
+		state.refreshRouterViewKey = null;
+		state.iframeRefreshKey = null;
 		nextTick(() => {
 			state.refreshRouterViewKey = fullPath;
 			state.iframeRefreshKey = fullPath;

+ 31 - 2
src/router/route.ts

@@ -70,6 +70,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '工单受理',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -79,6 +80,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '知识库新增/编辑',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -88,6 +90,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '知识查看',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -97,6 +100,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '数据权限',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -106,6 +110,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '流程编辑',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -115,6 +120,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '通知阅读',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -124,6 +130,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '回访不满意原因统计明细',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -133,15 +140,17 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '特提统计明细',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
-		path: '/statistics/department/Detail:key/:tagsViewName/',
+		path: '/statistics/department/Detail/:key/:tagsViewName?',
 		name: 'statisticsDepartmentSatisfiedDetail',
 		component: () => import('@/views/statistics/department/detailSatisfied.vue'),
 		meta: {
 			title: '部门满意度统计明细',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -151,15 +160,17 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '部门满意度统计明细部门',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
-		path: '/statistics/center/detailTelFrequently/:tagsViewName/:FromPhone',
+		path: '/statistics/center/detailTelFrequently/:FromPhone/:tagsViewName?',
 		name: 'telFrequentlyDetail',
 		component: () => import('@/views/statistics/center/detailTelFrequently.vue'),
 		meta: {
 			title: '高频来电统计明细',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -169,6 +180,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '高频事项预警统计明细',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -178,6 +190,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '部门超期统计明细',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -187,6 +200,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '事项分类统计明细',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -196,6 +210,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '执法部门办件统计明细',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -205,6 +220,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '执法部门办件统计明细',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -214,6 +230,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '区域分类统计明细',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -223,6 +240,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '部门满意度统计明细',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -232,6 +250,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 		meta: {
 			title: '部门满意度统计明细部门',
 			isKeepAlive: true,
+			isDynamic:true
 		},
 	},
 	{
@@ -243,6 +262,16 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 			isKeepAlive: true,
 		},
 	},
+	{
+		path: '/statistics/order/detailAcceptType/:id/:tagsViewName?',
+		name: 'statisticsDetailAcceptType',
+		component: () => import('@/views/statistics/order/detailAcceptType.vue'),
+		meta: {
+			title: '部门受理类型统计周期明细',
+			isKeepAlive: true,
+			isDynamic:true
+		},
+	},
 ];
 
 /**

+ 1 - 1
src/stores/keepAliveNames.ts

@@ -23,7 +23,7 @@ export const useKeepALiveNames = defineStore('keepALiveNames', {
 		},
 		async delCachedView(view: any) {
 			const index = this.cachedViews?.indexOf(view.name);
-			index > -1 && this.cachedViews.splice(index, 1);
+			index > -1 && this.cachedViews?.splice(index, 1);
 		},
 		async delOthersCachedViews(view: any) {
 			if (view.meta.isKeepAlive) this.cachedViews = [view.name];

+ 2 - 2
src/types/layout.d.ts

@@ -40,8 +40,8 @@ declare type TagsViewState<T = any> = {
 
 // navBars parent
 declare type ParentViewState<T = any> = {
-	refreshRouterViewKey: string;
-	iframeRefreshKey: string;
+	refreshRouterViewKey: string|null;
+	iframeRefreshKey: string|null;
 	keepAliveNameList: string[];
 	iframeList: T[];
 };

+ 17 - 2
src/views/business/countersign/index.vue

@@ -58,7 +58,7 @@
 					<transition name="el-zoom-in-top">
 						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
 							<el-form-item label="会签类型" prop="CounterSignType">
-								<el-select v-model="state.queryParams.CounterSignType" placeholder="会签类型" class="w100" @change="handleQuery">
+								<el-select v-model="state.queryParams.CounterSignType" placeholder="会签类型" class="w100" @change="handleQuery" clearable>
 									<el-option v-for="item in state.counterSignTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
 								</el-select>
 							</el-form-item>
@@ -141,7 +141,7 @@ import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import { ElButton, FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
 import { useRouter } from 'vue-router';
-import { countersignData } from '@/api/query/countersign';
+import { countersignBase, countersignData } from "@/api/query/countersign";
 import { storeToRefs } from 'pinia';
 import { useUserInfo } from '@/stores/userInfo';
 // 引入组件
@@ -216,6 +216,9 @@ const state = reactive<any>({
 	tableData: [], //表单
 	loading: false, // 加载
 	total: 0, // 总数
+  acceptTypeOptions:[],// 受理类型
+  channelOptions:[],// 来源方式
+  counterSignTypeOptions:[],// 会签类型
 });
 const fastSearch = ref('InitiatedCountersignature');
 const fastSearchChange = (val: any) => {
@@ -278,7 +281,19 @@ const onRecord = (row) => {
 	};
 	auditRecordRef.value.openDialog(params);
 };
+// 查询基础信息
+const baseInfo = async () => {
+  try {
+    const {result} = await countersignBase();
+    state.acceptTypeOptions = result.acceptTypeOptions;
+    state.channelOptions = result.channelOptions;
+    state.counterSignTypeOptions = result.counterSignType;
+  }catch (e){
+    console.log(e)
+  }
+}
 onMounted(() => {
+  baseInfo();
 	queryList();
 });
 </script>

+ 3 - 3
src/views/business/discern/apply.vue

@@ -25,7 +25,7 @@
 					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
 						<el-form-item label="来源渠道" prop="SourceChannel">
 							<el-select v-model="state.queryParams.SourceChannel" placeholder="请选择来源渠道" clearable class="w100" @change="handleQuery">
-								<el-option v-for="item in state.channelOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+								<el-option v-for="item in state.sourceChannelOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -41,7 +41,7 @@
 					<transition name="el-zoom-in-top" v-show="!searchCol">
 						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
 							<el-form-item label="会签类型" prop="CounterSignType">
-								<el-select v-model="state.queryParams.CounterSignType" placeholder="会签类型" class="w100" @change="handleQuery">
+								<el-select v-model="state.queryParams.CounterSignType" placeholder="会签类型" class="w100" @change="handleQuery" clearable>
 									<el-option v-for="item in state.counterSignTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
 								</el-select>
 							</el-form-item>
@@ -385,7 +385,7 @@ const getBaseData = async () => {
 	state.screenType = res.result?.screenType ?? [];
 	state.counterSignTypeOptions = res.result?.counterSignType ?? [];
 	state.acceptTypeOptions = res.result?.acceptType ?? [];
-	state.sourceChannelOptions = res.result?.salesChannel ?? [];
+	state.sourceChannelOptions = res.result?.sourceChannel ?? [];
 	state.visitSatisfaction = res.result?.visitSatisfaction ?? [];
 	state.dissatisfiedReason = res.result?.dissatisfiedReason ?? [];
 };

+ 1 - 1
src/views/judicial/statistics/detailDepartmentSub.vue

@@ -46,7 +46,7 @@ import { onMounted, reactive, ref } from 'vue';
 import { FormInstance } from 'element-plus';
 import { shortcuts } from '@/utils/constants';
 import dayjs from 'dayjs';
-import { departmentStatistics, departmentStatisticsDepartmentDetail } from '@/api/judicial';
+import { departmentStatisticsDepartmentDetail } from '@/api/judicial';
 import { useRoute, useRouter } from 'vue-router';
 // 定义变量内容
 

+ 1 - 2
src/views/statistics/center/frequentlyTel.vue

@@ -126,8 +126,7 @@ const linkDetail = (row: any) => {
 	router.push({
 		name: 'telFrequentlyDetail',
 		params: {
-			FromPhone: row.callnum,
-			tagsViewName: '高频来电统计详情',
+			FromPhone: row.callnum
 		},
 		state: {
 			StartDate,

+ 0 - 36
src/views/statistics/department/detailSatisfied.vue

@@ -1,41 +1,5 @@
 <template>
 	<div class="statistics-department-satisfaction-detail-container layout-pd">
-		<!-- 搜索  -->
-		<!--		<el-card shadow="never">
-			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
-				<el-form-item label="部门名称" prop="OrgName">
-					<el-input v-model="state.queryParams.OrgName" placeholder="部门名称" clearable @keyup.enter="handleQuery" class="keyword-input" />
-				</el-form-item>
-				<el-form-item label="时间段" prop="crTime">
-					<el-date-picker
-						v-model="state.queryParams.crTime"
-						type="datetimerange"
-						unlink-panels
-						range-separator="至"
-						start-placeholder="开始时间"
-						end-placeholder="结束时间"
-						:shortcuts="shortcuts"
-						@change="handleQuery"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
-					/>
-				</el-form-item>
-				<el-form-item label="类型" prop="TypeId">
-					<el-select v-model="state.queryParams.TypeId" placeholder="类型" @change="handleQuery">
-						<el-option label="办件结果" value="1" />
-						<el-option label="办件态度" value="2" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="电话线路" prop="LineNum">
-					<el-input v-model="state.queryParams.LineNum" placeholder="电话线路" clearable @keyup.enter="handleQuery" class="keyword-input" />
-				</el-form-item>
-				<el-form-item>
-					<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-					<el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading">
-						<SvgIcon name="ele-Refresh" class="mr5" />重置
-					</el-button>
-				</el-form-item>
-			</el-form>
-		</el-card>-->
 		<el-card shadow="never">
 			<ProTable
 				ref="proTableRef"

+ 5 - 14
src/views/statistics/department/detailSatisfiedOrg.vue

@@ -127,6 +127,7 @@ import { FormInstance } from 'element-plus';
 import { departmentSatisfactionOrg } from '@/api/statistics/department';
 import dayjs from 'dayjs';
 import { useRouter } from 'vue-router';
+import { guid } from "@/utils/tools";
 
 // 表格配置项
 const columns = ref<any[]>([
@@ -214,8 +215,6 @@ const state = reactive({
 		PageIndex: 1,
 		PageSize: 10,
 		TypeId: '1', //
-		LineNum: null,
-		crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
 	},
 	tableData: [], //表单
 	loading: false, // 加载
@@ -326,25 +325,17 @@ const getSummaries = (param: any) => {
 };
 const router = useRouter();
 // 点击数字
-const onDetail = (key: string, row, type: string) => {
-	let StartDate = null;
-	let EndDate = null;
-	if (state.queryParams?.crTime) {
-		StartDate = state.queryParams?.crTime[0];
-		EndDate = state.queryParams?.crTime[1];
-	}
+const onDetail = (key: string, row) => {
 	router.push({
 		name: 'statisticsDepartmentSatisfiedDetail',
 		params: {
-			key: key,
-			tagsViewName: '部门满意度统计明细',
+			key: guid()
 		},
 		state: {
-			StartDate,
-			EndDate,
+      StartDate: historyParams.StartDate,
+      EndDate: historyParams.EndDate,
 			OrgCode: row.orgCode,
 			TypeId: state.queryParams.TypeId,
-			LineNum: state.queryParams.LineNum,
 			DateValue: key,
 		},
 	});

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

@@ -132,6 +132,7 @@ import { departmentSatisfaction } from '@/api/statistics/department';
 import { shortcuts } from '@/utils/constants';
 import dayjs from 'dayjs';
 import { useRouter } from 'vue-router';
+import { guid } from "@/utils/tools";
 
 // 表格配置项
 const columns = ref<any[]>([
@@ -351,8 +352,7 @@ const onDetailOrg = (row: any) => {
 			LineNum: state.queryParams.LineNum,
 		},
 		params: {
-			key: row.orgCode,
-			tagsViewName: '部门满意度统计明细',
+			key: guid()
 		},
 	});
 };
@@ -367,8 +367,7 @@ const onDetail = (key: string, row, type: string) => {
 	router.push({
 		name: 'statisticsDepartmentSatisfiedDetail',
 		params: {
-			key: key,
-			tagsViewName: '部门满意度统计明细',
+			key: guid()
 		},
 		state: {
 			StartDate,

+ 146 - 25
src/views/statistics/order/departmentAcceptType.vue

@@ -21,7 +21,7 @@
 						:shortcuts="shortcuts"
 						@change="handleQuery"
 						value-format="YYYY-MM-DD"
-            :clearable="false"
+						:clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>
@@ -52,13 +52,15 @@
 		</el-card>
 	</div>
 </template>
-<script setup lang="ts" name="statisticsOrderDepartmentAcceptType">
+<script setup lang="tsx" name="statisticsOrderDepartmentAcceptType">
 import { onMounted, reactive, ref } from 'vue';
 import { FormInstance } from 'element-plus';
 import { departmentAcceptType } from '@/api/statistics/order';
 import { shortcuts } from '@/utils/constants';
 import dayjs from 'dayjs';
 import ProTable from '@/components/ProTable/index.vue';
+import { useRouter } from 'vue-router';
+import { guid } from "@/utils/tools";
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref
 const columns = reactive<any[]>([
@@ -69,7 +71,18 @@ const columns = reactive<any[]>([
 		label: '所有类型',
 		align: 'center',
 		_children: [
-			{ prop: 'allCount', label: '总件数', align: 'center' },
+			{
+				prop: 'allCount',
+				label: '总件数',
+				align: 'center',
+				render: (scope) => {
+					return (
+						<el-button type="primary" link onClick={() => linkDetail(scope.row, scope)}>
+							{scope.row.allCount}
+						</el-button>
+					);
+				},
+			},
 			{ prop: 'allTimes', label: '总时长', align: 'center' },
 			{ prop: 'averageTime', label: '总平均', align: 'center' },
 		],
@@ -79,9 +92,21 @@ const columns = reactive<any[]>([
 		label: '咨询类',
 		align: 'center',
 		_children: [
-			{ prop: 'zxAllCount', label: '咨询件数', align: 'center' },
-			{ prop: 'zxAllTimes', label: '咨询时长', align: 'center' },
-			{ prop: 'zxAverageTime', label: '咨询平均', align: 'center' },
+			{
+				prop: 'zxAllCount',
+				label: '咨询件数',
+				align: 'center',
+				minWidth: 100,
+				render: (scope) => {
+					return (
+						<el-button type="primary" link onClick={() => linkDetail(scope.row, scope)}>
+							{scope.row.zxAllCount}
+						</el-button>
+					);
+				},
+			},
+			{ prop: 'zxAllTimes', label: '咨询时长', minWidth: 100, align: 'center' },
+			{ prop: 'zxAverageTime', label: '咨询平均', minWidth: 100, align: 'center' },
 		],
 	},
 	{
@@ -89,9 +114,21 @@ const columns = reactive<any[]>([
 		label: '举报类',
 		align: 'center',
 		_children: [
-			{ prop: 'jbAllCount', label: '举报件数', align: 'center' },
-			{ prop: 'jbAllTimes', label: '举报时长', align: 'center' },
-			{ prop: 'jbAverageTime', label: '举报平均', align: 'center' },
+			{
+				prop: 'jbAllCount',
+				label: '举报件数',
+				align: 'center',
+				minWidth: 100,
+				render: (scope) => {
+					return (
+						<el-button type="primary" link onClick={() => linkDetail(scope.row, scope)}>
+							{scope.row.jbAllCount}
+						</el-button>
+					);
+				},
+			},
+			{ prop: 'jbAllTimes', label: '举报时长', minWidth: 100, align: 'center' },
+			{ prop: 'jbAverageTime', label: '举报平均', minWidth: 100, align: 'center' },
 		],
 	},
 	{
@@ -99,9 +136,21 @@ const columns = reactive<any[]>([
 		label: '投诉类',
 		align: 'center',
 		_children: [
-			{ prop: 'tsAllCount', label: '投诉件数', align: 'center' },
-			{ prop: 'tsAllTimes', label: '投诉时长', align: 'center' },
-			{ prop: 'tsAverageTime', label: '投诉平均', align: 'center' },
+			{
+				prop: 'tsAllCount',
+				label: '投诉件数',
+				align: 'center',
+				minWidth: 100,
+				render: (scope) => {
+					return (
+						<el-button type="primary" link onClick={() => linkDetail(scope.row, scope)}>
+							{scope.row.tsAllCount}
+						</el-button>
+					);
+				},
+			},
+			{ prop: 'tsAllTimes', label: '投诉时长', minWidth: 100, align: 'center' },
+			{ prop: 'tsAverageTime', label: '投诉平均', minWidth: 100, align: 'center' },
 		],
 	},
 	{
@@ -109,23 +158,70 @@ const columns = reactive<any[]>([
 		label: '求助类',
 		align: 'center',
 		_children: [
-			{ prop: 'qzAllCount', label: '求助件数', align: 'center' },
-			{ prop: 'qzAllTimes', label: '求助时长', align: 'center' },
-			{ prop: 'qzAverageTime', label: '求助平均', align: 'center' },
+			{
+				prop: 'qzAllCount',
+				label: '求助件数',
+				align: 'center',
+				minWidth: 100,
+				render: (scope) => {
+					return (
+						<el-button type="primary" link onClick={() => linkDetail(scope.row, scope)}>
+							{scope.row.qzAllCount}
+						</el-button>
+					);
+				},
+			},
+			{ prop: 'qzAllTimes', label: '求助时长', minWidth: 100, align: 'center' },
+			{ prop: 'qzAverageTime', label: '求助平均', minWidth: 100, align: 'center' },
 		],
 	},
 	{
 		prop: 'jyType',
 		label: '建议类',
 		align: 'center',
+		minWidth: 100,
 		_children: [
-			{ prop: 'jyAllCount', label: '建议件数', align: 'center' },
-			{ prop: 'jyAllTimes', label: '建议时长', align: 'center' },
-			{ prop: 'jyAverageTime', label: '建议平均', align: 'center' },
+			{
+				prop: 'jyAllCount',
+				label: '建议件数',
+				align: 'center',
+				minWidth: 100,
+				render: (scope) => {
+					return (
+						<el-button type="primary" link onClick={() => linkDetail(scope.row, scope)}>
+							{scope.row.jyAllCount}
+						</el-button>
+					);
+				},
+			},
+			{ prop: 'jyAllTimes', label: '建议时长', minWidth: 100, align: 'center' },
+			{ prop: 'jyAverageTime', label: '建议平均', minWidth: 100, align: 'center' },
 		],
-	},
+	},{
+    prop: 'yjType',
+    label: '意见类',
+    align: 'center',
+    minWidth: 100,
+    _children: [
+      {
+        prop: 'yjAllCount',
+        label: '意见件数',
+        align: 'center',
+        minWidth: 100,
+        render: (scope) => {
+          return (
+            <el-button type="primary" link onClick={() => linkDetail(scope.row, scope)}>
+              {scope.row.yjAllCount}
+            </el-button>
+          );
+        },
+      },
+      { prop: 'yjAllTimes', label: '意见时长', minWidth: 100, align: 'center' },
+      { prop: 'yjAverageTime', label: '意见平均', minWidth: 100, align: 'center' },
+    ],
+  },
 ]);
-const state = reactive(<any>{
+const state = reactive({
 	queryParams: {
 		// 查询条件
 		TypeCode: '0', // 关键词
@@ -137,8 +233,8 @@ const state = reactive(<any>{
 });
 /** 搜索按钮操作 */
 const handleQuery = () => {
-  // state.queryParams.PageIndex = 1;
-  queryList();
+	// state.queryParams.PageIndex = 1;
+	queryList();
 };
 /** 获取列表 */
 const queryList = () => {
@@ -163,14 +259,39 @@ const queryList = () => {
 		.catch(() => {
 			state.loading = false;
 		});
-}
+};
 // 排序
 /** 重置按钮操作 */
-const resetQuery =(formEl: FormInstance | undefined) => {
+const resetQuery = (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
 	queryList();
-}
+};
+// 跳转详情
+const router = useRouter();
+const linkDetail = (row: any, scope: any) => {
+	const prefix = scope.column.property.slice(0, 2);
+	const AcceptTypeCode = row[`${prefix}AcceptanceTypeCode`] ?? null; // 受理类型
+	let StartDate = null;
+	let EndDate = null;
+	if (state.queryParams?.crTime) {
+		StartDate = state.queryParams?.crTime[0];
+		EndDate = state.queryParams?.crTime[1];
+	}
+	router.push({
+		name: 'statisticsDetailAcceptType',
+		params: {
+			id: guid(),
+		},
+		state: {
+			StartDate,
+			EndDate,
+			AcceptTypeCode,
+			TypeCode: state.queryParams.TypeCode,
+      OrgCode: row?.orgCode,
+		},
+	});
+};
 onMounted(() => {
 	queryList();
 });

+ 148 - 0
src/views/statistics/order/detailAcceptType.vue

@@ -0,0 +1,148 @@
+<template>
+  <div class="statistics-order-detail-accept-type layout-pd">
+    <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"
+        @export-current="exportCurrent"
+        @export-all="exportAll"
+        :key="Math.random()"
+      >
+        <template #expiredStatus="{ row }">
+          <span :class="'overdue-status-' + row.expiredStatus" :title="row.expiredStatusText"></span>
+        </template>
+        <template #isProvince="{ row }">
+          <span>{{ row.isProvince ? '省工单' : '市工单' }}</span>
+        </template>
+        <template #title="{ row }">
+          <order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+        </template>
+        <template #employeeName="{ row }">
+					<span
+          >{{ row.acceptorName }} <span v-if="row.acceptorStaffNo">[{{ row.acceptorStaffNo }}]</span>
+					</span>
+        </template>
+        <!-- 表格操作 -->
+        <template #operation="{ row }">
+          <order-detail :order="row" @updateList="queryList" />
+        </template>
+      </ProTable>
+    </el-card>
+  </div>
+</template>
+<script setup lang="tsx" name="statisticsDetailAcceptType">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import type { FormInstance } from 'element-plus';
+import other from '@/utils/other';
+import { useRoute, useRouter } from 'vue-router';
+import { formatDate } from '@/utils/formatTime';
+import { departmentAcceptTypeDetail } from '@/api/statistics/order';
+
+// 引入组件
+const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+
+// 定义变量内容
+const state = reactive<any>({
+  queryParams: {
+    PageIndex: 1, // 当前页
+    PageSize: 10, // 每页条数
+  },
+  tableData: [], //表单
+  loading: false, // 加载
+  total: 0, // 总数
+});
+const ruleFormRef = ref<RefType>(); // 表单ref
+const route = useRoute(); // 路由
+const router = useRouter(); // 路由
+const proTableRef = ref<RefType>(); // 表格ref
+// 表格配置项
+const columns = ref<any[]>([
+  { prop: 'expiredStatus', label: '超期状态', align: 'center' },
+  { prop: 'no', label: '工单编码', width: 150 },
+  { prop: 'isProvince', label: '省/市工单', width: 100 },
+  { prop: 'actualHandleStepName', label: '办理节点', width: 150 },
+  { prop: 'statusText', label: '工单状态', width: 100 },
+  { prop: 'title', label: '工单标题', width: 300 },
+  {
+    prop: 'startTime',
+    label: '受理时间',
+    width: 170,
+    render: (scope) => {
+      return <span>{formatDate(scope.row.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+    },
+  },
+  {
+    prop: 'expiredTime',
+    label: '工单期满时间',
+    width: 170,
+    render: (scope) => {
+      return <span>{formatDate(scope.row.expiredTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+    },
+  },
+  {
+    prop: 'filedTime',
+    label: '办结时间',
+    width: 170,
+    render: (scope) => {
+      return <span>{formatDate(scope.row.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+    },
+  },
+  { prop: 'orgLevelOneName', label: '一级部门', width: 170 },
+  { prop: 'actualHandleOrgName', label: '接办部门', width: 170 },
+  { prop: 'acceptType', label: '受理类型', width: 150 },
+  { prop: 'counterSignTypeText', label: '是否会签', width: 100 },
+  { prop: 'sourceChannel', label: '来源方式', width: 100 },
+  { prop: 'hotspotName', label: '热点分类', width: 200 },
+  { prop: 'tagNames', label: '工单标签', width: 200 },
+  { prop: 'employeeName', label: '受理人', width: 120 },
+  { prop: 'operation', label: '操作', fixed: 'right', width: 90, align: 'center' },
+]);
+// 手动查询,将页码设置为1
+const handleQuery = () => {
+  state.queryParams.PageIndex = 1;
+  queryList();
+};
+const historyParams = history.state;
+/** 获取列表 */
+const queryList = () => {
+  let request = other.deepClone(state.queryParams);
+  request.StartDate = historyParams.StartDate;
+  request.EndDate = historyParams.EndDate;
+  request.OrgCode = historyParams.orgCode;
+  request.AcceptTypeCode = historyParams.AcceptTypeCode;
+  request.TypeCode = historyParams.TypeCode;
+  state.loading = true;
+  departmentAcceptTypeDetail(request)
+    .then((response: any) => {
+      state.tableData = response?.result.items ?? [];
+
+      state.total = response?.result.total;
+      state.loading = false;
+    })
+    .catch(() => {
+      state.loading = false;
+    });
+};
+/** 重置按钮操作 */
+const resetQuery = (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.resetFields();
+  queryList();
+};
+const exportCurrent = () => {
+  console.log('导出当前页', proTableRef.value);
+};
+const exportAll = () => {
+  console.log('导出全部', proTableRef.value);
+};
+onMounted(() => {
+  queryList();
+});
+</script>

+ 1 - 1
src/views/statistics/order/specialTable.vue

@@ -109,7 +109,7 @@ const queryList = () => {
 		PageIndex: state.queryParams.PageIndex,
 		PageSize: state.queryParams.PageSize,
 		Keyword: state.queryParams.Keyword,
-		Cause: route.params.cause,
+		Cause: historyParams.cause,
 		State: state.queryParams.State,
 		StartTime: historyParams.startTime,
 		EndTime: historyParams.endTime,

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

@@ -52,6 +52,7 @@ import { shortcuts } from '@/utils/constants';
 import dayjs from 'dayjs';
 import { formatDate } from '@/utils/formatTime';
 import { useRouter } from 'vue-router';
+import { guid } from "@/utils/tools";
 
 // 表格配置项
 const columns = ref<any[]>([
@@ -125,12 +126,12 @@ const handleDetail = (row: any) => {
 	router.push({
 		name: 'statisticsOrderSpecialTable',
 		params: {
-			cause: row.cause,
-			tagsViewName: `特提统计明细`,
+			cause: guid()
 		},
 		state: {
 			startTime: startTime ?? 'null',
 			endTime: endTime ?? 'null',
+      cause:row.cause
 		},
 	});
 };

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

@@ -52,6 +52,7 @@ import { departmentUnsatisfied } from '@/api/statistics/order';
 import { shortcuts } from '@/utils/constants';
 import dayjs from 'dayjs';
 import { useRouter } from 'vue-router';
+import { guid } from "@/utils/tools";
 // 定义变量内容
 
 const columns = ref([]);
@@ -148,13 +149,13 @@ const handleDetail = (row: any) => {
 	router.push({
 		name: 'statisticsOrderVisitTable',
 		params: {
-			id: columnKey,
-			tagsViewName: `回访不满意原因统计明细`,
+			id: guid()
 		},
 		state: {
 			startTime: startTime ?? 'null',
 			endTime: endTime ?? 'null',
 			orgId: row.row?.OrgCode,
+      columnKey
 		},
 	});
 };

+ 1 - 1
src/views/statistics/order/visitTable.vue

@@ -133,7 +133,7 @@ const queryList = () => {
 		PageSize: state.queryParams.PageSize,
 		Keyword: state.queryParams.Keyword,
 		OrgCode: historyParams.orgId,
-		DissatisfiedKey: route.params.id,
+		DissatisfiedKey: historyParams.columnKey,
 		StartTime: historyParams.startTime,
 		EndTime: historyParams.endTime,
 	};

+ 1 - 1
src/views/system/log/components/Detail.vue

@@ -17,7 +17,7 @@
 				</el-col>
 				<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 					<el-form-item label="操作动作:">
-						{{ state.ruleForm.nameText }}
+						{{ state.ruleForm.name }}
 					</el-form-item>
 				</el-col>
 				<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">

+ 11 - 10
src/views/system/roles/index.vue

@@ -52,8 +52,8 @@
 				</template>
 			</ProTable>
 		</el-card>
-		<role-add ref="roleAddRef" @updateList="handleQuery" :baseData="baseData"/>
-		<role-edit ref="roleEditRef" @updateList="handleQuery" :baseData="baseData"/>
+		<role-add ref="roleAddRef" @updateList="handleQuery" :baseData="baseData" />
+		<role-edit ref="roleEditRef" @updateList="handleQuery" :baseData="baseData" />
 		<role-permission ref="rolePermissionRef" @updateList="handleQuery" />
 		<role-user-list ref="roleUserListRef" />
 	</div>
@@ -64,7 +64,7 @@ import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { useRouter } from 'vue-router';
-import { delRole, getRoleBaseData, getRoleListPaged } from "@/api/system/roles";
+import { delRole, getRoleBaseData, getRoleListPaged } from '@/api/system/roles';
 import { formatDate } from '@/utils/formatTime';
 import mittBus from '@/utils/mitt';
 // 引入组件
@@ -80,6 +80,7 @@ const columns = ref<any[]>([
 	{ prop: 'name', label: '角色编码' },
 	{ prop: 'description', label: '角色说明', width: 300 },
 	{ prop: 'accountIds', label: '人员', width: 80 },
+	{ prop: 'roleTypeText', label: '角色类型', width: 120 },
 	{ prop: 'state', label: '状态', width: 80 },
 	{
 		prop: 'lastModificationTime',
@@ -197,18 +198,18 @@ const onRowDel = (row: any) => {
 		.catch(() => {});
 };
 // 获取基础信息
-const baseData = ref({})
+const baseData = ref({});
 const getBaseData = async () => {
 	try {
-    const { result } = await getRoleBaseData();
-    baseData.value = result;
-  }catch (error) {
-    console.log(error)
-  }
+		const { result } = await getRoleBaseData();
+		baseData.value = result;
+	} catch (error) {
+		console.log(error);
+	}
 };
 // 页面加载时
 onMounted(() => {
-  getBaseData();
+	getBaseData();
 	handleQuery();
 });
 </script>