瀏覽代碼

reactor:对接热点类型部门统计;

zhangchong 1 年之前
父節點
當前提交
9960d4808e

+ 12 - 1
src/api/statistics/order/index.ts

@@ -97,8 +97,19 @@ export const departmentHot = (params: object) => {
  */
 export const departmentHotDetail = (params: object) => {
 	return request({
-		url: `/api/v1/BiOrder/hot_data_list/list`,
+		url: `/api/v1/BiOrder/hotport-org-statistics`,
 		method: 'get',
 		params,
 	});
 };
+/**
+ * @description 受理量前十
+ * @param {object} params
+ */
+export const departmentTopTen = (params: object) => {
+	return request({
+		url: `/api/v1/BiOrder/accept_type_top10_list`,
+		method: 'get',
+		params,
+	});
+}

+ 3 - 2
src/layout/navBars/breadcrumb/telControl.vue

@@ -1478,15 +1478,16 @@ const connectVoiceAssistant = async (telNo: string) => {
 		const { result } = data;
 		const uid = `8#User-${result.uid}`;
 		const subscribe = `/trans/${result.orgCode}/${result.groupUid}/${uid}`;
-
 		socket.value = useSocket(import.meta.env.VITE_VOICE_ASSISTANT_SOCKET_URL, { uid, subscribe });
 		socket.value.on('open', () => {
 			socket.value.send({ id: '', type: 1, from: uid, to: 'sys', timestamps: new Date().getTime(), body: result.userName });
-			console.log('坐席辅助:连接成功');
+      console.log('坐席辅助连接成功')
+      ElMessage.success('坐席辅助连接成功');
 		});
 		socket.value.on('message', wsReceive);
 	} catch (err) {
 		console.log(err, '坐席辅助链接失败');
+    ElMessage.error('坐席辅助链接失败');
 	}
 };
 // 坐席辅助关闭

+ 114 - 0
src/views/statistics/order/acceptTopTen.vue

@@ -0,0 +1,114 @@
+<template>
+	<div class="statistics-order-center-container layout-pd">
+		<!-- 搜索  -->
+		<el-card shadow="never">
+			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+				<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="queryList"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+					/>
+				</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-form-item>
+			</el-form>
+		</el-card>
+		<el-card shadow="never">
+			<!-- 表格 -->
+			<el-table
+				:data="state.tableData"
+				v-loading="state.loading"
+				show-summary
+				row-key="userId"
+				ref="multipleTableRef"
+				@selection-change="handleSelectionChange"
+				@sort-change="sortChange"
+			>
+				<el-table-column type="selection" width="55" align="center" />
+				<el-table-column prop="name" label="省一级热点名称" show-overflow-tooltip align="center"></el-table-column>
+				<el-table-column prop="invalid" label="无效信件" show-overflow-tooltip align="center" sortable="custom"></el-table-column>
+				<el-table-column prop="repeat" label="重复信件" show-overflow-tooltip align="center" sortable="custom"></el-table-column>
+				<el-table-column prop="subtotal" label="所有信件" show-overflow-tooltip align="center" sortable="custom"></el-table-column>
+				<template #empty>
+					<Empty />
+				</template>
+			</el-table>
+		</el-card>
+	</div>
+</template>
+<script setup lang="ts" name="statisticsOrderAcceptTop10">
+import { onMounted, reactive, ref } from 'vue';
+import { ElButton, FormInstance } from 'element-plus';
+import { throttle } from '@/utils/tools';
+import { departmentTopTen } from '@/api/statistics/order';
+import { shortcuts } from '@/utils/constants';
+import dayjs from 'dayjs';
+// 定义变量内容
+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')], // 时间默认今天开始到今天结束
+	},
+	tableData: [], //表单
+	loading: false, // 加载
+	total: 0, // 总数
+});
+/** 获取列表 */
+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,
+	};
+	departmentTopTen(request)
+		.then((res: any) => {
+			state.tableData = res.result?.items ?? [];
+			state.total = res.result?.total ?? 0;
+			state.loading = false;
+		})
+		.catch(() => {
+			state.loading = false;
+		});
+}, 300);
+// 排序
+const sortChange = (val: any) => {
+	state.queryParams.SortField = val.order ? val.prop : null;
+	// 0 升序 1 降序
+	state.queryParams.SortRule = val.order ? (val.order == 'descending' ? 1 : 0) : null;
+	queryList();
+};
+/** 重置按钮操作 */
+const resetQuery = throttle((formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+}, 300);
+// 表格多选
+const multipleTableRef = ref<RefType>();
+const multipleSelection = ref<any>([]);
+const handleSelectionChange = (val: any[]) => {
+	multipleSelection.value = val;
+};
+
+onMounted(() => {
+	queryList();
+});
+</script>

+ 97 - 111
src/views/statistics/order/orgHotspot.vue

@@ -1,138 +1,124 @@
 <template>
-  <div class="statistics-order-center-container layout-pd">
-    <!-- 搜索  -->
-    <el-card shadow="never">
-      <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent  inline>
-        <el-form-item label="姓名" prop="Keyword">
-          <el-input v-model="state.queryParams.Keyword" placeholder="姓名" clearable @keyup.enter="queryList" 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="queryList"
-            value-format="YYYY-MM-DD[T]HH:mm:ss"
-          />
-        </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-form-item>
-      </el-form>
-    </el-card>
-    <el-card shadow="never">
-      <!-- 表格 -->
-      <el-table
-        :data="state.tableData"
-        v-loading="state.loading"
-        show-summary
-        row-key="userId"
-        ref="multipleTableRef"
-        @selection-change="handleSelectionChange"
-        @sort-change="sortChange"
-      >
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column prop="userName" label="姓名" show-overflow-tooltip align="center"></el-table-column>
-        <el-table-column label="有效件" align="center">
-          <el-table-column prop="centreArchive" label="中心归档件" show-overflow-tooltip align="center" sortable="custom"></el-table-column>
-          <el-table-column prop="centreCareOf" label="转办信件" show-overflow-tooltip align="center" sortable="custom"></el-table-column>
-          <!--          <el-table-column prop="addNum" label="待转办信件" show-overflow-tooltip align="center" sortable="custom"></el-table-column>-->
-        </el-table-column>
-        <el-table-column prop="invalid" label="无效信件" show-overflow-tooltip align="center" sortable="custom"></el-table-column>
-        <el-table-column prop="repeat" label="重复信件" show-overflow-tooltip align="center" sortable="custom"></el-table-column>
-        <el-table-column prop="subtotal" label="所有信件" show-overflow-tooltip align="center" sortable="custom"></el-table-column>
-        <template #empty>
-          <Empty />
-        </template>
-      </el-table>
-      <!-- 分页 -->
-      <pagination
-        :total="state.total"
-        v-model:page="state.queryParams.PageIndex"
-        v-model:limit="state.queryParams.PageSize"
-        @pagination="queryList"
-      />
-    </el-card>
-  </div>
+	<div class="statistics-order-center-container layout-pd">
+		<!-- 搜索  -->
+		<el-card shadow="never">
+			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+				<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="queryList"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+					/>
+				</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-form-item>
+			</el-form>
+		</el-card>
+		<el-card shadow="never">
+			<!-- 表格 -->
+			<el-table :data="state.tableData" show-summary row-key="OrgCode" ref="multipleTableRef" @selection-change="handleSelectionChange">
+				<el-table-column type="selection" width="55" align="center" />
+        <el-table-column prop="OrgName" label="部门名称" min-width="140"/>
+        <el-table-column prop="sum" label="小计" width="55"/>
+				<el-table-column v-for="(item, index) in columns" :key="index" :prop="item.id" :label="item.hotSpotName" min-width="100">
+					<template #default="{ row, column }">
+						{{ row[column.property] }}
+					</template>
+				</el-table-column>
+				<template #empty>
+					<Empty />
+				</template>
+			</el-table>
+		</el-card>
+	</div>
 </template>
 <script setup lang="ts" name="statisticsOrderOrgHotspot">
 import { onMounted, reactive, ref } from 'vue';
 import { ElButton, FormInstance } from 'element-plus';
 import { throttle } from '@/utils/tools';
-import { centerList } from '@/api/statistics/order';
+import { departmentHotDetail } from '@/api/statistics/order';
 import { shortcuts } from '@/utils/constants';
 import dayjs from 'dayjs';
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref
 const state = reactive(<any>{
-  queryParams: {
-    // 查询条件
-    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')], // 时间默认今天开始到今天结束
-  },
-  tableData: [], //表单
-  loading: false, // 加载
-  total: 0, // 总数
+	queryParams: {
+		// 查询条件
+		crTime: [dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')], // 时间默认今天开始到今天结束
+	},
+	tableData: [], //表单
+	loading: false, // 加载
+	total: 0, // 总数
 });
+
+const columns = ref([]); // 表头
 /** 获取列表 */
 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,
-    DelayState: state.queryParams.DelayState,
-    PageIndex: state.queryParams.PageIndex,
-    PageSize: state.queryParams.PageSize,
-    Keyword: state.queryParams.Keyword,
-    SortField: state.queryParams.SortField,
-    SortRule: state.queryParams.SortRule,
-  };
-  centerList(request)
-    .then((res: any) => {
-      state.tableData = res.result?.items ?? [];
-      state.total = res.result?.total ?? 0;
-      state.loading = false;
-    })
-    .catch(() => {
-      state.loading = false;
-    });
+	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,
+	};
+	departmentHotDetail(request)
+		.then((res: any) => {
+			columns.value = res.result?.hotSpot ?? [];
+			state.tableData = res.result?.data ?? [];
+			// 判断部门名称是否重复 重复的合并数据 并去除重复数据
+			const arr = [];
+			state.tableData.forEach((item: any) => {
+				const index = arr.findIndex((v: any) => v.OrgName === item.OrgName);
+				if (index === -1) {
+					arr.push(item);
+				} else {
+					arr[index] = Object.assign(arr[index], item);
+				}
+			});
+			// 添加合计
+			arr.forEach((item: any) => {
+				item.sum = 0;
+				columns.value.forEach((v: any) => {
+					if (v.id !== 'sum' && v.id !== 'OrgName') {
+						item.sum += item[v.id];
+					}
+				});
+			});
+			state.tableData = arr;
+			state.loading = false;
+		})
+		.catch(() => {
+			state.loading = false;
+		});
 }, 300);
-// 排序
-const sortChange = (val: any) => {
-  state.queryParams.SortField = val.order ? val.prop : null;
-  // 0 升序 1 降序
-  state.queryParams.SortRule = val.order ? (val.order == 'descending' ? 1 : 0) : null;
-  queryList();
-};
 /** 重置按钮操作 */
 const resetQuery = throttle((formEl: FormInstance | undefined) => {
-  if (!formEl) return;
-  formEl.resetFields();
-  queryList();
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
 }, 300);
 // 表格多选
 const multipleTableRef = ref<RefType>();
 const multipleSelection = ref<any>([]);
 const handleSelectionChange = (val: any[]) => {
-  multipleSelection.value = val;
+	multipleSelection.value = val;
 };
 
 onMounted(() => {
-  queryList();
+	queryList();
 });
 </script>

+ 1 - 0
src/views/statistics/order/specials.vue

@@ -126,6 +126,7 @@ const handleDetail = (row: any) => {
 			cause: row.cause,
 			startTime: startTime ?? 'null',
 			endTime: endTime ?? 'null',
+      tagsViewName: `特提统计明细(${row.cause})`,
 		},
 	});
 };

+ 8 - 6
src/views/statistics/order/visitDiscontent.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="OrgName">
 					<el-input v-model="state.queryParams.OrgName" placeholder="部门名称" clearable @keyup.enter="queryList" class="keyword-input" />
 				</el-form-item>
@@ -29,11 +29,12 @@
 		</el-card>
 		<el-card shadow="never">
 			<!-- 表格 -->
-			<el-table :data="tableData" show-summary border>
+			<el-table :data="tableData" show-summary border row-key="OrgCode" ref="multipleTableRef" @selection-change="handleSelectionChange">
+				<el-table-column type="selection" width="55" align="center" />
+				<el-table-column prop="OrgName" label="部门名称" align="center" />
 				<el-table-column v-for="(item, index) in columns" :key="index" :prop="item.dicDataValue" :label="item.dicDataName" align="center">
-					<template #default="{ row, column, $index }">
-						<span v-if="column.property === 'OrgName'">{{ row?.OrgName }}</span>
-						<el-button type="primary" @click="handleDetail(row, row[column.property])" link v-else>{{ row[column.property] }}</el-button>
+					<template #default="{ row, column }">
+						<el-button type="primary" @click="handleDetail(row, row[column.property])" link>{{ row[column.property] }}</el-button>
 					</template>
 				</el-table-column>
 				<template #empty>
@@ -87,7 +88,6 @@ const queryList = throttle(() => {
 	departmentUnsatisfied(request)
 		.then((res: any) => {
 			columns.value = res.result?.dicReason ?? [];
-			columns.value.unshift({ dicDataName: '部门名称', dicDataValue: 'OrgName' });
 			tableData.value = res.result?.data ?? [];
 			// 判断部门名称是否重复 重复的合并数据 并去除重复数据
 			const arr = [];
@@ -124,6 +124,7 @@ const handleDetail = (row: any, column) => {
 	if (!column) return ElMessage.warning('暂无数据');
 	// 获取键名
 	const columnKey = Object.keys(row).find((item) => row[item] === column);
+	const columnName = columns.value.find((item) => item.dicDataValue === columnKey)?.dicDataName;
 	let startTime = null;
 	let endTime = null;
 	if (state.queryParams?.crTime) {
@@ -137,6 +138,7 @@ const handleDetail = (row: any, column) => {
 			startTime: startTime ?? 'null',
 			endTime: endTime ?? 'null',
 			orgId: row?.OrgCode,
+			tagsViewName: `满意度统计明细(${row.OrgName}-${columnName})`,
 		},
 	});
 };

+ 7 - 10
src/views/todo/seats/accept/Voice-assistant.vue

@@ -35,22 +35,18 @@
 						<el-text tag="b" size="large">通话小结</el-text>
 					</div>
 					<el-scrollbar class="h100 transition-box-content" noresize ref="scrollbarRef" max-height="180px">
-						<div class="call-item">
-							<el-text tag="b" class="call-item-label">来电号码:</el-text>
-							<p class="call-item-value">{{ recognizeList.call_number }}</p>
-						</div>
 						<div class="call-item">
 							<el-text tag="b" class="call-item-label">客户姓名:</el-text>
 							<p class="call-item-value">{{ recognizeList?.name }}</p>
 						</div>
-						<div class="call-item">
+						<!--						<div class="call-item">
 							<el-text tag="b" class="call-item-label">年龄:</el-text>
 							<p class="call-item-value">{{ recognizeList?.age }}</p>
 						</div>
 						<div class="call-item">
 							<el-text tag="b" class="call-item-label">性别:</el-text>
 							<p class="call-item-value">{{ recognizeList?.sex }}</p>
-						</div>
+						</div>-->
 						<div class="call-item">
 							<el-text tag="b" class="call-item-label">身份证号:</el-text>
 							<p class="call-item-value">{{ recognizeList?.id_card }}</p>
@@ -63,11 +59,11 @@
 							<el-text tag="b" class="call-item-label">公司名称:</el-text>
 							<p class="call-item-value">{{ recognizeList?.company_name }}</p>
 						</div>
-						<div class="call-item">
+						<!--						<div class="call-item">
 							<el-text tag="b" class="call-item-label">通话小结:</el-text>
 							<p class="call-item-value">{{ recognizeList?.call_detail_content }}</p>
 						</div>
-						<div class="call-item">
+            <div class="call-item">
 							<el-text tag="b" class="call-item-label">受理类型:</el-text>
 							<p class="call-item-value">{{ recognizeList?.acceptance_type }}</p>
 						</div>
@@ -78,7 +74,7 @@
 						<div class="call-item">
 							<el-text tag="b" class="call-item-label">热点分类:</el-text>
 							<p class="call-item-value">{{ recognizeList?.hotspot_classification }}</p>
-						</div>
+						</div>-->
 						<div class="call-item">
 							<el-text tag="b" class="call-item-label">事件目的:</el-text>
 							<p class="call-item-value">{{ recognizeList?.event_purpose }}</p>
@@ -271,7 +267,8 @@ const subscribe = () => {
 	// 接受消息
 	mittBus.on('wsReceive', (message: any) => {
 		const data = JSON.parse(message.data);
-		if (data.body.content.callId === route.params.callId) { // 判断是否是当前通话
+		if (data.body.content.callId === route.params.callId) {
+			// 判断是否是当前通话
 			wsReceive(message);
 		}
 	});

+ 4 - 4
src/views/todo/visit/index.vue

@@ -17,15 +17,15 @@
 		<el-card shadow="never">
 			<!-- 功能按钮 -->
 			<div class="mb20">
-				<el-button type="primary" @click="onTextMessageFollowUp" :disabled="!multipleSelection.length" v-auth="'todo:visit:textMessage'">
+<!--				<el-button type="primary" @click="onTextMessageFollowUp" :disabled="!multipleSelection.length" v-auth="'todo:visit:textMessage'">
 					<SvgIcon name="ele-Message" class="mr5" />短信回访</el-button
-				>
+				>-->
 				<el-button type="primary" @click="multiplePeople" :disabled="!multipleSelection.length" v-auth="'todo:visit:multiplePeople'">
 					<SvgIcon name="ele-User" class="mr5" />分配回访人</el-button
 				>
-				<el-button type="primary" @click="smartFollowUp" :disabled="!multipleSelection.length" v-auth="'todo:visit:smart'">
+<!--				<el-button type="primary" @click="smartFollowUp" :disabled="!multipleSelection.length" v-auth="'todo:visit:smart'">
 					<SvgIcon name="iconfont icon-diannao1" class="mr5" />智能回访</el-button
-				>
+				>-->
 			</div>
 			<!-- 表格 -->
 			<el-table :data="state.tableData" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">