Ver Fonte

reactor:自贡图标更换;

zhangchong há 8 meses atrás
pai
commit
d628ca927a

BIN
src/assets/images/ZiGong/change_pwd_header.png


BIN
src/assets/images/ZiGong/favicon.ico


BIN
src/assets/images/ZiGong/login_bg.png


BIN
src/assets/images/ZiGong/logo.png


BIN
src/assets/images/ZiGong/logoMini.png


BIN
src/assets/images/default/login_bg.png


BIN
src/assets/images/logo.png


BIN
src/assets/images/logoMini.png


+ 88 - 35
src/components/ProTable/index.vue

@@ -68,14 +68,14 @@
 		>
 			<!-- 默认插槽 -->
 			<slot />
-			<template v-for="item in tableColumns" :key="item">
+			<template v-for="item in tableColumns">
 				<!-- selection || radio || index || expand || sort -->
 				<el-table-column
 					v-if="item.type && columnTypes.includes(item.type)"
 					v-bind="item"
 					:align="item.align ?? 'left'"
 					:reserve-selection="item.type == 'selection'"
-          :key="item.prop"
+					:key="item.prop"
 				>
 					<template #default="scope">
 						<!-- expand -->
@@ -107,14 +107,20 @@
 		</el-table>
 		<!-- 分页组件 -->
 		<slot name="pagination">
-			<PaginationEl
-				v-if="pagination"
-				@pagination="onRefresh"
-				:total="total"
-				v-model:current-page="pageIndex"
-				v-model:page-size="pageSize"
-				:layout="paginationLayout"
-			/>
+			<div class="pagination-container">
+				<el-pagination
+					:background="background"
+					v-model:current-page="pageIndex"
+					v-model:page-size="pageSize"
+					:layout="pageLayout"
+					:total="total"
+					:page-sizes="pageSizes"
+					@size-change="handleSizeChange"
+					@current-change="handleCurrentChange"
+					:disabled="loading"
+					:key="pageLayout"
+				/>
+			</div>
 		</slot>
 	</div>
 	<!-- 列设置 -->
@@ -126,7 +132,6 @@ import { ref, provide, onMounted, unref, computed, reactive, PropType, watch } f
 import { ElMessageBox, ElTable } from 'element-plus';
 import { useSelection } from '@/hooks/useSelection';
 import { ColumnProps, TypeProps } from '@/components/ProTable/interface';
-import PaginationEl from './components/Pagination.vue';
 import ColSettingCom from './components/ColSetting.vue';
 import TableColumn from './components/TableColumn.vue';
 import { downloadFileByStream } from '@/utils/tools';
@@ -150,21 +155,6 @@ const props = defineProps({
 		type: Boolean,
 		default: true,
 	},
-	total: {
-		// 分页组件的 total ==> 非必传(默认为0)
-		type: Number,
-		default: 0,
-	},
-	pageIndex: {
-		// 分页组件的 currentPage ==> 非必传(默认为1)
-		type: Number,
-		default: 1,
-	},
-	pageSize: {
-		// 分页组件的 pageSize ==> 非必传(默认为10)
-		type: Number,
-		default: 10,
-	},
 	border: {
 		// 是否带有纵向边框 ==> 非必传(默认为false)
 		type: Boolean,
@@ -191,11 +181,6 @@ const props = defineProps({
 		type: String,
 		default: '',
 	},
-	paginationLayout: {
-		// 分页组件布局
-		type: String,
-		default: 'total, sizes, prev, pager, next, jumper',
-	},
 	exportWithParent: {
 		// 导出是否带有子父级关系
 		type: Boolean,
@@ -216,6 +201,32 @@ const props = defineProps({
 		type: Boolean,
 		default: false,
 	},
+	total: {
+		type: Number,
+		default: 0,
+	},
+	pageIndex: {
+		type: Number,
+		default: 1,
+	},
+	pageSize: {
+		type: Number,
+		default: 10,
+	},
+	pageSizes: {
+		type: Array,
+		default() {
+			return [10, 20, 50, 100, 200];
+		},
+	},
+	layout: {
+		type: String,
+		default: 'total, sizes, prev, pager, next, jumper',
+	},
+	background: {
+		type: Boolean,
+		default: false,
+	},
 });
 const emit = defineEmits([
 	'dargSort',
@@ -228,6 +239,8 @@ const emit = defineEmits([
 	'update:pageSize',
 	'update:pageIndex',
 	'update:radio',
+	'update:total',
+	'pagination',
 ]);
 const pageSize = computed({
 	get() {
@@ -245,6 +258,26 @@ const pageIndex = computed({
 		emit('update:pageIndex', val);
 	},
 });
+const handleSizeChange = (val: any) => {
+	pageSize.value = val;
+	/**
+	 * 场景:API返回总数为25条,按照10条每页,一共有3页。选了2的页数之后,然后把size选择成30条,
+	 * 这个时候,分页就会同时触发size选择函数以及current选择函数。{page: 2, size: 30},{page: 1, size: 30}请求两次,会导致列表会有暂无数据的情况
+	 * 解决办法:如果当前页大于最大页数,就把当前页设置成最大页数
+	 */
+	// 获取最大页数
+	let pageMax = Math.ceil(props.total / val);
+	if (pageIndex.value > pageMax) {
+		pageIndex.value = pageMax;
+	}
+	onRefresh();
+	emit('pagination', { page: pageIndex.value, limit: val });
+};
+const handleCurrentChange = (val: any) => {
+	pageIndex.value = val;
+	onRefresh();
+	emit('pagination', { page: val, limit: pageSize.value });
+};
 const radio = computed({
 	get() {
 		return props.radio;
@@ -270,9 +303,24 @@ const { selectionChange, selectedList, selectedListIds, isSelected } = useSelect
 // 清空选中数据列表
 const clearSelection = () => tableRef.value!.clearSelection();
 // 初始化表格数据 && 拖拽排序
+const pageLayout = ref(props.layout);
+// 监听 props.value 的变化,并更新 localValue
+watch(
+	() => props.layout,
+	(newValue) => {
+		pageLayout.value = newValue;
+	}
+);
 onMounted(() => {
-	useResizeObserver(tableRef, () => {
-		tableRef.value.doLayout();
+	useResizeObserver(tableRef, (entries) => {
+		const entry = entries[0];
+		const { width } = entry.contentRect;
+		if (width < 992) {
+			pageLayout.value = 'total , prev, next';
+		} else {
+			pageLayout.value = 'total, sizes, prev, pager, next, jumper';
+		}
+		tableRef.value?.doLayout();
 	});
 });
 // 处理表格数据
@@ -336,7 +384,7 @@ const searchColumns = computed(() => {
 });
 
 // 设置 搜索表单默认排序 && 搜索表单项的默认值
-searchColumns.value?.forEach((column, index) => {});
+searchColumns.value?.forEach(() => {});
 
 // 列设置 ==> 需要过滤掉不需要设置的列
 const colRef = ref();
@@ -364,7 +412,7 @@ const updateColSetting = (test: ColumnProps[]) => {
 // 递归获取isShow的列保持子父级关系
 const findItems = (tree: any, conditionFn: (item: any) => boolean, parent: any = null) => {
 	let results: [] = [];
-	for (let node: any of tree) {
+	for (let node of tree) {
 		// 如果当前节点满足条件,则将其添加到结果中,并保留父级关系
 		if (conditionFn(node)) {
 			results.push(node);
@@ -633,5 +681,10 @@ const height = computed(() => {
 	.table-search-content {
 		flex-shrink: 0;
 	}
+	.pagination-container {
+		padding-top: 10px;
+		display: flex;
+		justify-content: flex-end;
+	}
 }
 </style>

+ 4 - 2
src/layout/component/aside.vue

@@ -17,11 +17,13 @@ import { useRoutesList } from '@/stores/routesList';
 import { useThemeConfig } from '@/stores/themeConfig';
 import { useTagsViewRoutes } from '@/stores/tagsViewRoutes';
 import mittBus from '@/utils/mitt';
-import { getCurrentCityConfig } from '@/utils/appConfig';
 // 引入组件
 const Logo = defineAsyncComponent(() => import('@/layout/logo/index.vue'));
 const Vertical = defineAsyncComponent(() => import('@/layout/navMenu/vertical.vue'));
-const { isShowLogo } = getCurrentCityConfig();
+// 设置 footer 显示/隐藏
+const isShowLogo = computed(() => {
+	return themeConfig.value.isShowLogo;
+});
 // 定义变量内容
 const stores = useRoutesList();
 const storesThemeConfig = useThemeConfig();

+ 9 - 12
src/layout/logo/index.vue

@@ -1,9 +1,9 @@
 <template>
 	<div class="layout-logo" :style="'height:' + height + 'px;'" v-if="setShowLogo" @click="onThemeConfigChange">
-		<img :src="getImageUrl('logo.png')" class="layout-logo-medium-img" alt="" />
+		<img :src="getImageUrl(logo)" class="layout-logo-medium-img" alt="" />
 	</div>
 	<div class="layout-logo-size" :style="'height:' + height + 'px;'" v-else @click="onThemeConfigChange">
-		<img :src="getImageUrl('logoMini.png')" class="layout-logo-size-img" alt="" />
+		<img :src="getImageUrl(logoMimi)" class="layout-logo-size-img" alt="" />
 	</div>
 </template>
 
@@ -11,25 +11,24 @@
 import { computed } from 'vue';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '@/stores/themeConfig';
-import { useUserInfo } from '@/stores/userInfo';
 import { getImageUrl } from "@/utils/tools";
 
 // 定义变量内容
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
-const storesUserInfo = useUserInfo();
-const { userInfos } = storeToRefs(storesUserInfo);
 // 设置 logo 的显示。classic 经典布局默认显示 logo
 const setShowLogo = computed(() => {
 	let { isCollapse, layout } = themeConfig.value;
 	return !isCollapse || layout === 'classic' || document.body.clientWidth < 1000;
 });
+const logo = computed(() => {
+	return `${themeConfig.value.appScope}/logo.png`;
+})
+const logoMimi = computed(() => {
+	return `${themeConfig.value.appScope}/logoMini.png`;
+})
 const height = computed(() => {
-	if (userInfos.value.showTelControl) {// 是否展示坐席话机控制面板
-		return 80;
-	} else {
-		return 80;
-	}
+	return 84
 })
 // logo 点击实现菜单展开/收起
 const onThemeConfigChange = () => {
@@ -50,7 +49,6 @@ const onThemeConfigChange = () => {
 	cursor: pointer;
 	animation: logoAnimation 0.3s ease-in-out;
 	user-select: none;
-  background-color: var(--el-color-primary);
 	span {
 		white-space: nowrap;
 		display: inline-block;
@@ -68,7 +66,6 @@ const onThemeConfigChange = () => {
 	width: 100%;
 	display: flex;
 	cursor: pointer;
-  background-color: var(--el-color-primary);
 	&-img {
 		width: 50px;
 		margin: auto;

+ 0 - 1
src/views/business/repeatEvent/components/Repeat-event-edit.vue

@@ -100,7 +100,6 @@ import { orderList } from '@/api/business/order';
 import { repeatEventAdd, repeatEventDetail, repeatEventUpdate } from '@/api/business/repeatEvent';
 import { throttle } from '@/utils/tools';
 
-const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
 const emit = defineEmits(['updateList']);
 const state = reactive({

+ 0 - 1
src/views/business/visit/component/Smart-visit-Detail.vue

@@ -51,7 +51,6 @@ import { getCurrentCityConfig } from '@/utils/appConfig';
 import {fileDownload} from "@/api/public/file";
 
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
-const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 const PlayRecord = defineAsyncComponent(() => import('@/views/tels/callLog/component/Play-record.vue')); // 播放录音
 const state = reactive({
 	queryParams: {

+ 4 - 0
src/views/login/index.vue

@@ -81,11 +81,15 @@ onMounted(async () => {
 	position: absolute;
 	bottom: 0;
 	z-index: 10;
+	color: var(--el-border-color-light) !important;
 	&-warp {
 		margin: auto;
 		text-align: center;
 		animation: error-num 0.3s ease;
 	}
+	:deep(.el-link){
+		color: var(--el-border-color-light) !important;
+	}
 }
 .login-container {
 	position: relative;

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

@@ -50,7 +50,6 @@ import { departmentUnsatisfiedDetail, orderSourceListDetailExport } from '@/api/
 // 引入组件
 const VisitDetailCom = defineAsyncComponent(() => import('@/views/business/visit/component/Visit-detail.vue')); // 回访
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
-const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref

+ 99 - 43
src/views/tels/restApply/index.vue

@@ -1,49 +1,73 @@
 <template>
-	<div class="tels-restApply-container layout-pd">
-		<el-card shadow="never">
-			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent >
-				<el-form-item label="关键词" prop="KeyWords">
-					<el-input v-model="state.queryParams.KeyWords" placeholder="坐席名称/工号" clearable @keyup.enter="queryList" />
-				</el-form-item>
-				<el-form-item label="申请时间" prop="time">
-					<el-date-picker
-						v-model="state.queryParams.time"
-						type="datetimerange"
-						range-separator="至"
-						start-placeholder="开始时间"
-						end-placeholder="结束时间"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
-						:shortcuts="shortcuts"
-            :default-time="defaultTimeStartEnd"
-						@change="
+	<div class="tels-restApply-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<ProTable
+				ref="proTableRef"
+				:columns="columns"
+				:data="state.tableData"
+				@updateTable="queryList"
+				:loading="state.loading"
+				:total="state.total"
+				v-model:page-index="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+			>
+				<template #table-search>
+					<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent >
+						<el-form-item label="关键词" prop="KeyWords">
+							<el-input v-model="state.queryParams.KeyWords" placeholder="坐席名称/工号" clearable @keyup.enter="queryList" />
+						</el-form-item>
+						<el-form-item label="申请时间" prop="time">
+							<el-date-picker
+								v-model="state.queryParams.time"
+								type="datetimerange"
+								range-separator="至"
+								start-placeholder="开始时间"
+								end-placeholder="结束时间"
+								value-format="YYYY-MM-DD[T]HH:mm:ss"
+								:shortcuts="shortcuts"
+								:default-time="defaultTimeStartEnd"
+								@change="
 							(val: any[]) => {
 								state.queryParams.BeginTime = val[0];
 								state.queryParams.EndTime = val[1];
 							}
 						"
-					/>
-				</el-form-item>
-				<el-form-item label="小休原因" prop="Reason">
-					<el-select v-model="state.queryParams.Reason" placeholder="请选择小休原因" class="w100">
-						<el-option v-for="item in state.restReason" :key="item.id" :label="item.content" :value="item.content" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="审批状态" prop="Status">
-					<el-select v-model="state.queryParams.Status" placeholder="请选择审批状态" class="w100">
-						<el-option v-for="item in state.restApplyStatus" :key="item.key" :label="item.value" :value="item.key" />
-					</el-select>
-				</el-form-item>
-				<el-form-item>
-					<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-form-item>
+						<el-form-item label="小休原因" prop="Reason">
+							<el-select v-model="state.queryParams.Reason" placeholder="请选择小休原因" class="w100">
+								<el-option v-for="item in state.restReason" :key="item.id" :label="item.content" :value="item.content" />
+							</el-select>
+						</el-form-item>
+						<el-form-item label="审批状态" prop="Status">
+							<el-select v-model="state.queryParams.Status" placeholder="请选择审批状态" class="w100">
+								<el-option v-for="item in state.restApplyStatus" :key="item.key" :label="item.value" :value="item.key" />
+							</el-select>
+						</el-form-item>
+						<el-form-item>
+							<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>
+				</template>
+				<template #restDuration="{ row }">
+					<span>{{ (row.restDuration / 60).toFixed(2) }}</span>
+				</template>
+				<template #applyStatus="{ row }">
+					<span>{{ state.restApplyStatus[row.applyStatus].value }}</span>
+				</template>
+				<template #operation="{row}">
+					<el-button link type="primary" @click="onRecord(row)" v-auth="'system:workflow:record'" title="审批记录" v-if="row.workflowId">
+						审批记录
 					</el-button>
-				</el-form-item>
-			</el-form>
-		</el-card>
-		<el-card shadow="never">
-			<!-- 表格 -->
-			<el-table :data="state.tableData" v-loading="state.loading" row-key="id">
+					<el-button link type="primary" @click="onSubmit(row)" v-auth="'system:workflow:handle'" title="审批" v-if="[0].includes(row.applyStatus)">
+						审批
+					</el-button>
+				</template>
+			</ProTable>
+<!--			<el-table :data="state.tableData" v-loading="state.loading" row-key="id">
 				<el-table-column prop="userName" label="坐席" show-overflow-tooltip>
 					<template #default="{ row }">
 						<span
@@ -67,7 +91,7 @@
 					</template>
 				</el-table-column>
 				<el-table-column prop="restDuration" label="时长(分钟)" show-overflow-tooltip>
-					<template #default="{ row }">
+					<template #restDuration="{ row }">
 						<span>{{ (row.restDuration / 60).toFixed(2) }}</span>
 					</template>
 				</el-table-column>
@@ -93,8 +117,8 @@
         :total="state.total"
         v-model:current-page="state.queryParams.PageIndex"
         v-model:page-size="state.queryParams.PageSize"
-      />
-		</el-card>
+      />-->
+		</div>
 		<!-- 流程审配 -->
 		<process-audit ref="processAuditRef" @orderProcessSuccess="orderProcessSuccess" />
 		<!-- 流转记录 -->
@@ -102,7 +126,7 @@
 	</div>
 </template>
 
-<script lang="ts" setup name="restApply">
+<script lang="tsx" setup name="restApply">
 import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
@@ -115,6 +139,38 @@ const AuditRecord = defineAsyncComponent(() => import('@/components/AuditRecord/
 const ProcessAudit = defineAsyncComponent(() => import('@/components/ProcessAudit/index.vue')); // 审批流程
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
+// 表格配置项
+const columns = ref<any[]>([
+	{ prop: 'userName', label: '坐席', minWidth: 140 },
+	{
+		prop: 'creationTime',
+		label: '申请时间',
+		minWidth: 160,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'creationTime',
+		label: '开始时间',
+		minWidth: 160,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'creationTime',
+		label: '结束时间',
+		minWidth: 160,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{ prop: 'restDuration', label: '时长(分钟)', minWidth: 90 },
+	{ prop: 'applyStatus', label: '审批状态', minWidth: 200 },
+	{ prop: 'reason', label: '小休原因', minWidth: 100 },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 140, align: 'center' },
+]);
 // 定义变量内容
 const state = reactive<any>({
 	queryParams: {