Эх сурвалжийг харах

reactor:质检模板至少保留一个质检项;

zhangchong 1 жил өмнө
parent
commit
e6fcd3ecea

+ 11 - 0
src/api/statistics/call/index.ts

@@ -14,3 +14,14 @@ export const callList = (params:object) => {
         params
     });
 }
+/**
+ * @description 坐席话务统计分析
+ * @param {object} params
+ */
+export const callAgent = (params:object) => {
+    return request({
+        url: `/api/v1/BiCall/seats`,
+        method: 'get',
+        params
+    });
+}

+ 17 - 15
src/layout/navBars/breadcrumb/telControl.vue

@@ -1,19 +1,17 @@
 <template>
 	<div class="phoneControls" v-loading="state.loading">
+    <!-- 电话状态 -->
 		<div class="infos">
 			<div class="pt5" :class="talkTime ? '' : 'mt8'"><span>分机号:</span>{{ telStatusInfo.telsNo }}</div>
 			<div class="pt5" :class="talkTime ? '' : 'mt8'">
 				<span>状态:</span><b class="dutyOn_status">{{ currentStatusText }}</b>
 			</div>
 			<div class="pt5" v-if="talkTime">
-				<span>通话时长:</span><b class="color-danger">{{ formatDuration(talkTime, false) }}</b>
+				<span>通话时长:</span> <el-text tag="b" type="danger">{{ formatDuration(talkTime, false) }}</el-text>
 			</div>
 		</div>
-		<div class="duty-on-time">
-			<span class="duty-on-time-label" style="">签入时长</span>
-			<span class="color-danger duty-on-time-time"  v-if="onDutyTime"> {{ formatDuration(onDutyTime) }}</span>
-		</div>
-		<div class="btn">
+    <!--  按钮列表  -->
+		<div class="btn-container">
 			<!-- 签入 -->
 			<template v-if="telStatusInfo.isDutyOn">
 				<!-- 签出可用 -->
@@ -237,6 +235,11 @@
 				</div>
 			</template>
 		</div>
+    <!-- 签入时长 -->
+    <div class="duty-on-time">
+      <span class="duty-on-time-label">签入时长</span>
+      <el-text class="duty-on-time-time" tag="b" type="danger" v-if="onDutyTime">{{ formatDuration(onDutyTime) }}</el-text>
+    </div>
 	</div>
 	<!-- 占位标签 -->
 	<div class="seizeSeat-box"></div>
@@ -594,7 +597,7 @@ const startTimeOnDuty = (startTime?: any) => {
 	if (startTime) {
 		// 从后台获取签入时长
 		// 使用当前时间减去后台返回的签入时间
-    if(!startTime) startTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss');
+		if (!startTime) startTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss');
 		startTime = dayjs(new Date()).diff(dayjs(startTime), 'second');
 		onDutyTime.value = startTime;
 		onDutyTimer.value = setInterval(() => {
@@ -1510,16 +1513,15 @@ onMounted(async () => {
 	color: var(--hotline-color-text-main);
 	height: 100%;
 	.duty-on-time {
-		width: 80px;
-		text-align: center;
+		width: 100px;
 		&-label {
 			display: block;
-      margin-top:13px;
+			margin-top: 13px;
+		}
+		&-time {
+			display: block;
+			margin-top: 15px;
 		}
-    &-time{
-      display: block;
-      margin-top:15px;
-    }
 	}
 	.infos {
 		text-align: left;
@@ -1537,7 +1539,7 @@ onMounted(async () => {
 	}
 
 	// 按钮列表
-	.btn {
+	.btn-container {
 		display: flex;
 		width: calc(100% - 120px);
 		justify-content: space-between;

+ 1 - 2
src/views/smartVisit/index.vue

@@ -5,7 +5,7 @@
 				<el-form-item label="关键字" prop="Name">
 					<el-input
 						v-model="state.queryParams.Name"
-						placeholder="回访任务名称/回访任务编号"
+						placeholder="回访任务名称"
 						clearable
 						@keyup.enter="queryList"
 						style="width: 250px"
@@ -25,7 +25,6 @@
 			<el-table :data="state.tableData" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
 				<el-table-column type="selection" width="55" />
 				<el-table-column prop="name" label="回访任务名称" show-overflow-toolti></el-table-column>
-				<el-table-column prop="ruleUid" label="回访任务编号" show-overflow-tooltip width="300"></el-table-column>
 				<el-table-column prop="hasVisitCount" label="回访任务总数量" show-overflow-tooltip>
         </el-table-column>
         <el-table-column prop="visitedCount" label="回访任务成功数量" show-overflow-tooltip></el-table-column>

+ 25 - 31
src/views/statistics/call/seats.vue

@@ -40,14 +40,14 @@
 				ref="multipleTableRef"
 				@selection-change="handleSelectionChange"
 				@sort-change="sortChange"
-        border
+				border
 			>
 				<el-table-column type="selection" width="55" align="center" />
 				<el-table-column prop="orgName" label="坐席工号" show-overflow-tooltip align="center" width="120"></el-table-column>
 				<el-table-column prop="addNum" label="呼入总量" show-overflow-tooltip align="center" sortable="custom"></el-table-column>
 				<el-table-column prop="deleteNum" label="接通总量" show-overflow-tooltip align="center" sortable="custom"></el-table-column>
 				<el-table-column prop="deleteNum" label="呼入秒挂" show-overflow-tooltip align="center" sortable="custom"></el-table-column>
-				<el-table-column prop="deleteNum" label="呼入超时未接" show-overflow-tooltip align="center" sortable="custom"></el-table-column>
+				<el-table-column prop="deleteNum" label="呼入超时未接" show-overflow-tooltip align="center" sortable="custom" width="140"></el-table-column>
 				<el-table-column prop="deleteNum" label="接通率" show-overflow-tooltip align="center"></el-table-column>
 				<el-table-column prop="deleteNum" label="呼入平均时长" show-overflow-tooltip align="center"></el-table-column>
 				<el-table-column prop="deleteNum" label="有效接通率" show-overflow-tooltip align="center"></el-table-column>
@@ -57,9 +57,9 @@
 				<el-table-column prop="deleteNum" label="呼出接通量" show-overflow-tooltip align="center"></el-table-column>
 				<el-table-column prop="deleteNum" label="呼出接通率" show-overflow-tooltip align="center"></el-table-column>
 				<el-table-column prop="deleteNum" label="呼出平均时长" show-overflow-tooltip align="center"></el-table-column>
-				<el-table-column prop="deleteNum" label="登录时长" show-overflow-tooltip align="center"></el-table-column>
+				<!--				<el-table-column prop="deleteNum" label="登录时长" show-overflow-tooltip align="center"></el-table-column>
 				<el-table-column prop="deleteNum" label="小休+摘记时长" show-overflow-tooltip align="center"></el-table-column>
-				<el-table-column prop="deleteNum" label="工作效率" show-overflow-tooltip align="center"></el-table-column>
+				<el-table-column prop="deleteNum" label="工作效率" show-overflow-tooltip align="center"></el-table-column>-->
 				<template #empty>
 					<Empty />
 				</template>
@@ -76,10 +76,9 @@
 </template>
 <script setup lang="ts" name="statisticsCallSeats">
 import { onMounted, reactive, ref } from 'vue';
-import { ElButton, ElMessage, FormInstance } from 'element-plus';
-import { auth } from '/@/utils/authFunction';
+import { ElButton, FormInstance } from 'element-plus';
 import { throttle } from '/@/utils/tools';
-import { knowledgeList } from '/@/api/statistics/knowledge';
+import { callAgent } from '/@/api/statistics/call';
 import { shortcuts } from '/@/utils/constants';
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref
@@ -97,35 +96,30 @@ const state = reactive(<any>{
 });
 /** 获取列表 */
 const queryList = throttle(() => {
-	if (!auth('business:publish:query')) ElMessage.error('抱歉,您没有权限查看工单发布列表!');
-	else {
-		state.loading = true;
-		const request = {
-			CreationTimeStart: state.queryParams.crTime[0],
-			CreationTimeEnd: state.queryParams.crTime[1],
-			DelayState: state.queryParams.DelayState,
-			PageIndex: state.queryParams.PageIndex,
-			PageSize: state.queryParams.PageSize,
-			Keyword: state.queryParams.Keyword,
-			SortField: state.queryParams.SortField,
-			SortRule: state.queryParams.SortRule,
-		};
-		knowledgeList(request)
-			.then((res: any) => {
-				state.tableData = res.result?.items ?? [];
-				state.total = res.result?.total ?? 0;
-				state.loading = false;
-			})
-			.catch((err: any) => {
-				state.loading = false;
-			});
-	}
+	state.loading = true;
+	const request = {
+		CreationTimeStart: state.queryParams.crTime[0],
+		CreationTimeEnd: state.queryParams.crTime[1],
+		PageIndex: state.queryParams.PageIndex,
+		PageSize: state.queryParams.PageSize,
+		SortField: state.queryParams.SortField,
+		SortRule: state.queryParams.SortRule,
+	};
+	callAgent(request)
+		.then((res: any) => {
+			state.tableData = res.result?.items ?? [];
+			state.total = res.result?.total ?? 0;
+			state.loading = false;
+		})
+		.catch((err: any) => {
+			state.loading = false;
+		});
 }, 300);
 // 排序
 const sortChange = (val: any) => {
 	state.queryParams.SortField = val.prop;
 	// 0 升序 1 降序
-  state.queryParams.SortRule = val.order ? (val.order == 'descending' ? 1 : 0) : null;
+	state.queryParams.SortRule = val.order ? (val.order == 'descending' ? 1 : 0) : null;
 	queryList();
 };
 /** 重置按钮操作 */

+ 97 - 101
src/views/system/menu/index.vue

@@ -1,32 +1,40 @@
 <template>
 	<div class="system-menu-container layout-padding">
 		<div class="layout-padding-auto layout-padding-view pd20">
-      <el-row class="mb20" :gutter="10">
-        <el-col :xs="24" :sm="12" :md="18" :lg="18" :xl="18">
-          <el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent>
-            <el-form-item label="关键字" prop="keyword" class="mb0">
-              <el-input v-model="state.queryParams.keyword" placeholder="菜单名称/权限编码" clearable @keyup.enter="handleQuery" style="width: 250px" />
-            </el-form-item>
-            <el-form-item class="mb0">
-              <el-button type="primary" @click="handleQuery" :loading="state.loading" v-waves>
-                <SvgIcon name="ele-Search" class="mr5" />查询
-              </el-button>
-              <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
-            </el-form-item>
-          </el-form>
-        </el-col>
-        <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6" style="text-align: right">
-          <el-button type="primary" @click="expand">
-            <SvgIcon
-                name="ele-ArrowDownBold"
-                style="transition: transform var(--el-transition-duration)"
-                :style="state.isExpand ? 'transform: none' : 'transform: rotateZ(180deg)'"
-                class="mr5"
-            />{{ state.isExpand ? '收起' : '展开' }}</el-button
-          >
-          <el-button type="primary" @click="onOpenAddMenu" v-auth="'system:menu:add'"> <SvgIcon name="ele-Plus" class="mr5" /> 新增菜单 </el-button>
-        </el-col>
-      </el-row>
+			<el-row class="mb20" :gutter="10">
+				<el-col :xs="24" :sm="12" :md="18" :lg="18" :xl="18">
+					<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent>
+						<el-form-item label="关键字" prop="keyword" class="mb0">
+							<el-input
+								v-model="state.queryParams.keyword"
+								placeholder="菜单名称/权限编码"
+								clearable
+								@keyup.enter="handleQuery"
+								style="width: 250px"
+							/>
+						</el-form-item>
+						<el-form-item class="mb0">
+							<el-button type="primary" @click="handleQuery" :loading="state.loading" v-waves>
+								<SvgIcon name="ele-Search" class="mr5" />查询
+							</el-button>
+							<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading">
+								<SvgIcon name="ele-Refresh" class="mr5" />重置
+							</el-button>
+						</el-form-item>
+					</el-form>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6" style="text-align: right">
+					<el-button type="primary" @click="expand">
+						<SvgIcon
+							name="ele-ArrowDownBold"
+							style="transition: transform var(--el-transition-duration)"
+							:style="state.isExpand ? 'transform: none' : 'transform: rotateZ(180deg)'"
+							class="mr5"
+						/>{{ state.isExpand ? '收起' : '展开' }}</el-button
+					>
+					<el-button type="primary" @click="onOpenAddMenu" v-auth="'system:menu:add'"> <SvgIcon name="ele-Plus" class="mr5" /> 新增菜单 </el-button>
+				</el-col>
+			</el-row>
 			<!-- 表格 -->
 			<el-auto-resizer class="table" v-loading="state.loading">
 				<template #default="{ height, width }">
@@ -46,34 +54,34 @@
 				</template>
 			</el-auto-resizer>
 		</div>
-		<menu-add ref="menuAddRef" @updateList="quertyList" :menuData="getMenuDataWithOutBtn(state.menuTableData)"/>
-		<menu-edit ref="menuEditRef" @updateList="quertyList" :menuData="getMenuDataWithOutBtn(state.menuTableData)"/>
+		<menu-add ref="menuAddRef" @updateList="quertyList" :menuData="getMenuDataWithOutBtn(state.menuTableData)" />
+		<menu-edit ref="menuEditRef" @updateList="quertyList" :menuData="getMenuDataWithOutBtn(state.menuTableData)" />
 	</div>
 </template>
 
-<script setup lang="ts" name="systemMenu">
-import {defineAsyncComponent, h, onMounted, reactive, ref, watch} from 'vue';
-import {RouteRecordRaw} from 'vue-router';
-import type {FormInstance} from 'element-plus';
-import {ElButton, ElMessage, ElMessageBox, ElTag} from 'element-plus';
-import {getMenuList, removeMenu} from '/@/api/system/menu';
-import {auth} from '/@/utils/authFunction';
+<script lang="tsx" setup name="systemMenu">
+import { defineAsyncComponent, onMounted, reactive, ref, watch } from 'vue';
+import { RouteRecordRaw } from 'vue-router';
+import type { FormInstance } from 'element-plus';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { getMenuList, removeMenu } from '/@/api/system/menu';
+import { auth } from '/@/utils/authFunction';
 import MenuSvgIcon from '/@/views/system/menu/component/Menu-svgIcon.vue';
-import {throttle} from '/@/utils/tools';
+import { throttle } from '/@/utils/tools';
 import other from '/@/utils/other';
 // 引入组件
-const MenuAdd = defineAsyncComponent(() => import('/@/views/system/menu/component/Menu-add.vue'));  // 新增菜单组件
-const MenuEdit = defineAsyncComponent(() => import('/@/views/system/menu/component/Menu-edit.vue'));  // 编辑菜单组件
+const MenuAdd = defineAsyncComponent(() => import('/@/views/system/menu/component/Menu-add.vue')); // 新增菜单组件
+const MenuEdit = defineAsyncComponent(() => import('/@/views/system/menu/component/Menu-edit.vue')); // 编辑菜单组件
 
 // 定义变量内容
 const state = reactive({
-	menuTableData: <EmptyArrayType>[], // 获取所有菜单
-	staticArr: <EmptyArrayType>[],  // 静态路由
+	menuTableData: [], // 获取所有菜单
+	staticArr: [], // 静态路由
 	loading: false, // 加载状态
 	queryParams: {
-		keyword: null,  // 关键字
+		keyword: null, // 关键字
 	},
-	expandedRowKeys: <EmptyArrayType>[],  // 展开的行
+	expandedRowKeys: [], // 展开的行
 	columns: [
 		{
 			key: 'pageName',
@@ -81,18 +89,12 @@ const state = reactive({
 			title: '菜单名称',
 			width: 300,
 			cellRenderer: (data: any) => {
-
-      return
-       /* (
-          <p style="display: flex;align-items: center;">
-            <MenuSvgIcon name={data.rowData.icon} />
-            <span class="pl5">{data.rowData.pageName}</span>
-          <p/>
-      )*/
-/*				return h('p', { style: { display:'flex',alignItems:'center' } }, [
-					h(MenuSvgIcon, { name: data.rowData.icon }, ''),
-					h('span', { class: 'pl5' }, { default: () => data.rowData.pageName }),
-				]);*/
+				return (
+					<p style="dispaly:flex;align-items:center">
+						<MenuSvgIcon name={data.rowData.icon} />
+						<span className="pl5">{data.rowData.pageName}</span>
+					</p>
+				);
 			},
 		},
 		{
@@ -103,13 +105,13 @@ const state = reactive({
 			cellRenderer: ({ rowData }: any) => {
 				switch (rowData.menuType) {
 					case 1:
-						return h(ElTag, { type: 'success' }, { default: () => '目录' });
+						return <el-tag type="success">目录</el-tag>;
 					case 2:
-						return h(ElTag, { type: 'success' }, { default: () => '菜单' });
+						return <el-tag type="warning">菜单</el-tag>;
 					case 3:
-						return h(ElTag, { type: 'info' }, { default: () => '按钮' });
+						return <el-tag type="info">按钮</el-tag>;
 					default:
-						return h(ElTag, { type: 'success' }, { default: () => '按钮' });
+						return <el-tag type="info">按钮</el-tag>;
 				}
 			},
 		},
@@ -144,7 +146,7 @@ const state = reactive({
 			width: 100,
 			cellRenderer: ({ rowData }) => {
 				if ([1, 2].includes(rowData.menuType)) {
-					return h(ElTag, { type: rowData.isFast ? 'success' : 'info' }, { default: () => (rowData.isFast ? '是' : '否') });
+					return <el-tag type={rowData.isFast ? 'success' : 'info'}>{rowData.isFast ? '是' : '否'}</el-tag>;
 				}
 			},
 		},
@@ -155,7 +157,7 @@ const state = reactive({
 			width: 100,
 			cellRenderer: ({ rowData }) => {
 				if ([1, 2].includes(rowData.menuType)) {
-					return h(ElTag, { type: rowData.isHide ? 'success' : 'info' }, { default: () => (rowData.isHide ? '是' : '否') });
+					return <el-tag type={rowData.isHide ? 'success' : 'info'}>{rowData.isHide ? '是' : '否'}</el-tag>;
 				}
 			},
 		},
@@ -166,7 +168,7 @@ const state = reactive({
 			width: 100,
 			cellRenderer: ({ rowData }) => {
 				if ([1, 2].includes(rowData.menuType)) {
-					return h(ElTag, { type: rowData.isKeepAlive ? 'success' : 'info' }, { default: () => (rowData.isKeepAlive ? '是' : '否') });
+					return <el-tag type={rowData.isKeepAlive ? 'success' : 'info'}>{rowData.isKeepAlive ? '是' : '否'}</el-tag>;
 				}
 			},
 		},
@@ -177,7 +179,7 @@ const state = reactive({
 			width: 100,
 			cellRenderer: ({ rowData }) => {
 				if ([1, 2].includes(rowData.menuType)) {
-					return h(ElTag, { type: rowData.isAffix ? 'success' : 'info' }, { default: () => (rowData.isAffix ? '是' : '否') });
+					return <el-tag type={rowData.isAffix ? 'success' : 'info'}>{rowData.isAffix ? '是' : '否'}</el-tag>;
 				}
 			},
 		},
@@ -188,7 +190,7 @@ const state = reactive({
 			width: 100,
 			cellRenderer: ({ rowData }) => {
 				if ([1, 2].includes(rowData.menuType)) {
-					return h(ElTag, { type: rowData.isLink ? 'success' : 'info' }, { default: () => (rowData.isLink ? '是' : '否') });
+					return <el-tag type={rowData.isLink ? 'success' : 'info'}>{rowData.isLink ? '是' : '否'}</el-tag>;
 				}
 			},
 		},
@@ -200,34 +202,28 @@ const state = reactive({
 			align: 'center',
 			cellRenderer: (data: any) => {
 				// 权限判断
-				return h('span', { class: 'flex' }, [
-					auth('system:menu:edit')
-						? h(
-								ElButton,
-								{
-									onClick: () => onOpenEditMenu(data.rowData),
-									type: 'primary',
-									link: true,
-									title: '修改菜单',
-								},
-								{ default: () => '修改' })
-						: '',
-					auth('system:menu:delete')
-						? h(
-								ElButton,
-								{
-									onClick: () => onTableRowDel(data.rowData),
-									type: 'danger',
-									link: true,
-									title: '删除菜单',
-								},
-								{ default: () => '删除' })
-						: '',
-				]);
+				return (
+					<span class="flex">
+						{auth('system:menu:edit') ? (
+							<el-button onClick={() => onOpenEditMenu(data.rowData)} type="primary" link title="修改菜单">
+								修改
+							</el-button>
+						) : (
+							''
+						)}
+						{auth('system:menu:delete') ? (
+							<el-button onClick={() => onTableRowDel(data.rowData)} type="danger" link title="删除菜单">
+								删除
+							</el-button>
+						) : (
+							''
+						)}
+					</span>
+				);
 			},
 		},
 	],
-	isExpand: false,  // 是否展开
+	isExpand: false, // 是否展开
 });
 const ruleFormRef = ref<RefType>(); // 表单ref
 const formatTable = (list: any[], keyword: string) => {
@@ -267,7 +263,7 @@ const handleQuery = throttle(() => {
 		emptyArr = [];
 		state.menuTableData = formatTable(other.deepClone(state.staticArr), state.queryParams.keyword);
 		state.expandedRowKeys = getExpand(state.menuTableData);
-    state.isExpand = true;
+		state.isExpand = true;
 		state.loading = false;
 	} else {
 		quertyList();
@@ -280,10 +276,10 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 	quertyList();
 	state.expandedRowKeys = [];
 	emptyArr = [];
-  state.isExpand = false;
+	state.isExpand = false;
 };
 // 打开新增菜单弹窗
-const menuAddRef = ref<RefType>();  // 新增菜单弹窗
+const menuAddRef = ref<RefType>(); // 新增菜单弹窗
 const onOpenAddMenu = () => {
 	menuAddRef.value.openDialog();
 };
@@ -346,16 +342,16 @@ const quertyList = () => {
 };
 // 格式化菜单数据并排除按钮
 const getMenuDataWithOutBtn = (routes: any) => {
-  if (!routes) return [];
-  return routes.map((route: any) => {
-    const { pageName: title, children, ...rest } = route;
-    let filteredChildren = children ? children.filter((child: any) => child.menuType !== 3) : [];
-    return {
-      ...rest,
-      title,
-      children: getMenuDataWithOutBtn(filteredChildren),
-    };
-  });
+	if (!routes) return [];
+	return routes.map((route: any) => {
+		const { pageName: title, children, ...rest } = route;
+		let filteredChildren = children ? children.filter((child: any) => child.menuType !== 3) : [];
+		return {
+			...rest,
+			title,
+			children: getMenuDataWithOutBtn(filteredChildren),
+		};
+	});
 };
 
 // 页面加载时