瀏覽代碼

reactor:系统表格重构完成;

zhangchong 4 月之前
父節點
當前提交
029124f1dc

+ 1 - 1
.env.development

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

+ 0 - 17
src/router/route.ts

@@ -140,15 +140,6 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 			isKeepAlive: true,
 		},
 	},
-	{
-		path: '/statistics/order/detailVisitCount',
-		name: 'statisticsOrderDetailVisitCount',
-		component: () => import('@/views/statistics/order/detailVisitCount.vue'),
-		meta: {
-			title: '回访明细',
-			isKeepAlive: true,
-		},
-	},
 	{
 		path: '/statistics/order/specialTable',
 		name: 'statisticsOrderSpecialTable',
@@ -477,14 +468,6 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 			isKeepAlive: true,
 			isDynamic: true,
 		},
-	},{
-		path: '/statistics/center/detailCorporateSpecial',
-		name: 'statisticsCenterDetailCorporateSpecial',
-		component: () => import('@/views/statistics/center/detailCorporateSpecial.vue'),
-		meta: {
-			title: '企业专席明细',
-			isKeepAlive: true,
-		},
 	},{
 		path: '/statistics/center/detailAcceptCenter',
 		name: 'statisticsCenterDetailAcceptCenter',

+ 28 - 12
src/views/business/order/components/Order-repeat.vue

@@ -1,20 +1,35 @@
 <template>
 	<el-dialog v-model="state.dialogVisible" draggable title="重复工单" ref="dialogRef" width="60%" append-to-body>
-		<ProTable
-			ref="proTableRef"
-			:columns="columns"
-			:data="state.tableData"
-			@updateTable="queryList"
+		<vxe-table
+			border
 			:loading="state.loading"
+			:data="state.tableData"
+			:sort-config="{ remote: true }"
+			:column-config="{ resizable: true }"
+			:row-config="{ isHover: true, height: 30, useKey: true }"
+			ref="tableRef"
+			max-height="500px"
+			show-overflow
+			:scrollY="{ enabled: true, gt: 20, mode: 'wheel' }"
+		>
+			>
+			<vxe-column field="title" title="工单标题">
+				<template #default="{ row }">
+					<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+				</template>
+			</vxe-column>
+			<vxe-column field="no" title="工单编码"></vxe-column>
+			<vxe-column field="hotspotName" title="热点分类"></vxe-column>
+			<vxe-column field="currentStepName" title="当前节点"></vxe-column>
+			<vxe-column field="statusText" title="重办次数"></vxe-column>
+		</vxe-table>
+		<pagination
+			@pagination="queryList"
 			:total="state.total"
-			v-model:page-index="state.queryParams.PageIndex"
+			v-model:current-page="state.queryParams.PageIndex"
 			v-model:page-size="state.queryParams.PageSize"
-			:toolButton="false"
-		>
-			<template #title="{ row }">
-				<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
-			</template>
-		</ProTable>
+			:disabled="state.loading"
+		/>
 	</el-dialog>
 </template>
 
@@ -23,6 +38,7 @@ import { reactive, ref, defineAsyncComponent } from 'vue';
 import { duplicateOrder } from '@/api/business/order';
 
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 // 定义变量内容
 const state = reactive<any>({
 	dialogVisible: false, // 弹窗显示隐藏

+ 0 - 633
src/views/business/order/copy-index.vue

@@ -1,633 +0,0 @@
-<template>
-	<div class="business-order-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"
-				:toolButton="['refresh', 'setting', 'exportCurrent', 'exportAll']"
-				:exportMethod="exportOrder"
-				:exportParams="requestParams"
-			>
-				<template #table-search>
-					<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
-						<el-row>
-							<el-col>
-								<el-form-item label="快捷查询" prop="fastSearch">
-									<el-segmented
-										:options="[
-											{
-												value: 'all',
-												label: '全部',
-											},
-											{
-												value: 'city',
-												label: '市工单',
-											},
-											{
-												value: 'province',
-												label: '省工单',
-											},
-										]"
-										v-model="fastSearch"
-										@change="fastSearchChange"
-										:disabled="state.loading"
-									/>
-									<el-checkbox-group v-model="checkList" @change="changeCheckList" class="ml15">
-										<el-checkbox value="IsSensitiveWord" border>敏感类工单</el-checkbox>
-									</el-checkbox-group>
-								</el-form-item>
-							</el-col>
-						</el-row>
-						<el-form-item label="工单标题" prop="Keyword">
-							<el-input v-model="state.queryParams.Keyword" placeholder="工单标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
-						</el-form-item>
-						<el-form-item label="工单编码" prop="No">
-							<el-input v-model="state.queryParams.No" 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"
-								:default-time="defaultTimeStartEnd"
-							/>
-						</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="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
-						</el-form-item>
-					</el-form>
-				</template>
-				<template #tableHeader="scope">
-					<!--					<el-button
-						type="primary"
-						@click="onProvinceReturn"
-						v-auth="'business:order:returnBatch'"
-						:disabled="!scope.isSelected"
-						v-show="fastSearch === 'province'"
-						:loading="state.loading"
-						>省退回申请
-					</el-button>-->
-					<el-button type="primary" @click="onCreateRepeatEvent" :loading="state.loading">
-						<SvgIcon name="ele-Plus" class="mr5" />创建重复性事件
-					</el-button>
-					<el-button type="primary" @click="onObserve" v-auth="'business:order:observe'" :disabled="!scope.isSelected" :loading="state.loading"
-					>设置观察件
-					</el-button>
-					<el-button type="primary" @click="onEnd" v-auth="'business:order:end'" :disabled="!scope.isSelected" :loading="state.loading"
-					>设置终结件
-					</el-button>
-					<el-button type="primary" @click="onJbExport" :disabled="!scope.isSelected" :loading="state.loading" v-auth="'business:order:jbdExport'"
-					><SvgIcon name="iconfont icon-daochu" class="mr5" />交办单导出
-					</el-button>
-				</template>
-				<template #expiredStatusText="{ row }">
-					<span :class="'overdue-status-' + row.expiredStatus" :title="row.expiredStatusText"></span>
-				</template>
-				<template #title="{ row }">
-					<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
-				</template>
-				<!-- 表格操作 -->
-				<template #operation="{ row }">
-					<el-button
-						link
-						type="danger"
-						@click="onReturn(row)"
-						title="省工单退回"
-						v-auth="'business:order:return:province'"
-						v-if="
-								row.isProvince &&
-								(row.actualHandleOrgCode === '001' || row.actualHandleOrgCode === null || row.actualHandleOrgCode === '' || row.status === 0) &&
-								row.status < 300 && row.status !== 9 && !row.provinceSendBack
-							"
-					>
-						退回</el-button
-					>
-					<!--					<el-button link type="primary" @click="onSign(row)" title="签收工单" v-if="row.canSign" v-auth="'business:order:sign'"> 签收 </el-button>
-                    <el-button link type="success" @click="onOrderEdit(row)" title="编辑工单" v-if="row.canEdit" v-auth="'business:order:edit'">
-                      修改
-                    </el-button>-->
-					<order-detail :order="row" @updateList="queryList" />
-				</template>
-			</ProTable>
-		</div>
-		<!-- 编辑重复性事件 -->
-		<repeat-event-edit ref="repeatEventEditRef" @updateList="queryList" />
-		<!-- 工单省退回 -->
-		<order-return ref="orderReturnRef" @updateList="queryList" />
-		<!--	更多查询	-->
-		<el-drawer v-model="drawer" title="更多查询" size="500px">
-			<el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px">
-				<el-form-item label="敏感词" prop="SensitiveWord" v-show="checkList.includes('IsSensitiveWord')">
-					<el-input v-model="state.queryParams.SensitiveWord" placeholder="敏感词" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="来电人姓名" prop="FromName">
-					<el-input v-model="state.queryParams.FromName" placeholder="来电人姓名" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="事发地址" prop="AreaCode">
-					<el-cascader
-						:options="state.areaOptions"
-						filterable
-						:props="{ checkStrictly: true, value: 'id', label: 'areaName', emitPath: false }"
-						placeholder="请选择事发地址"
-						clearable
-						v-model="state.queryParams.AreaCode"
-						@change="handleQuery"
-						class="w100"
-					>
-					</el-cascader>
-				</el-form-item>
-				<el-form-item label="是否紧急" prop="IsUrgent">
-					<el-select v-model="state.queryParams.IsUrgent" placeholder="请选择是否紧急" clearable @change="handleQuery">
-						<el-option :value="true" label="紧急" />
-						<el-option :value="false" label="不紧急" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="转接来源" prop="TransferPhone">
-					<el-input v-model="state.queryParams.TransferPhone" placeholder="转接来源" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="工单状态" prop="Status">
-					<el-select v-model="state.queryParams.Status" placeholder="请选择工单状态" clearable @change="handleQuery">
-						<el-option v-for="item in state.orderStatusOptions" :value="item.key" :key="item.key" :label="item.value" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="受理类型" prop="AcceptType">
-					<el-select v-model="state.queryParams.AcceptType" placeholder="请选择受理类型" clearable @change="handleQuery">
-						<el-option v-for="item in state.acceptTypeOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="来源渠道" prop="Channel">
-					<el-select v-model="state.queryParams.Channel" placeholder="请选择来源渠道" clearable @change="handleQuery">
-						<el-option v-for="item in state.channelOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="热点分类" prop="Hotspot">
-					<el-input v-model="state.queryParams.Hotspot" placeholder="热点分类名称" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="接办部门" prop="ActualHandleOrgName">
-					<!--					<el-cascader
-											:options="state.orgsOptions"
-											filterable
-											:props="{ checkStrictly: true, value: 'id', label: 'name', emitPath: false }"
-											placeholder="请选择接办部门"
-											clearable
-											v-model="state.queryParams.OrgId"
-											ref="cascadeRef"
-											@change="handleQuery"
-											class="w100"
-										>
-										</el-cascader>-->
-					<el-input v-model="state.queryParams.ActualHandleOrgName" placeholder="请填写接办部门名称" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="一级部门" prop="OrgLevelOneName">
-					<el-input v-model="state.queryParams.OrgLevelOneName" placeholder="请填写一级部门名称" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="受理人" prop="NameOrNo">
-					<el-input v-model="state.queryParams.NameOrNo" placeholder="受理人/坐席工号" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="省本地编码" prop="ProvinceNo">
-					<el-input v-model="state.queryParams.ProvinceNo" placeholder="省本地编码" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="来电号码" prop="FromPhone">
-					<el-input v-model="state.queryParams.FromPhone" placeholder="来电号码" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="联系电话" prop="PhoneNo">
-					<el-input v-model="state.queryParams.PhoneNo" placeholder="联系电话" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="推送分类" prop="PushTypeCode">
-					<el-select v-model="state.queryParams.PushTypeCode" placeholder="请选择推送分类" clearable @change="handleQuery">
-						<el-option v-for="item in state.pushTypeOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="期满时间" prop="exTime">
-					<el-date-picker
-						v-model="state.queryParams.exTime"
-						type="datetimerange"
-						unlink-panels
-						range-separator="至"
-						start-placeholder="开始时间"
-						end-placeholder="结束时间"
-						:shortcuts="shortcuts"
-						@change="handleQuery"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
-						:default-time="defaultTimeStartEnd"
-					/>
-				</el-form-item>
-				<el-form-item label="接办人" prop="ActualHandlerName">
-					<el-input v-model="state.queryParams.ActualHandlerName" placeholder="接办人" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="是否甄别" prop="IsScreen">
-					<el-select v-model="state.queryParams.IsScreen" placeholder="请选择是否甄别" clearable @change="handleQuery">
-						<el-option label="是" :value="true" />
-						<el-option label="否" :value="false" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="当前节点" prop="CurrentStepCode">
-					<el-select v-model="state.queryParams.CurrentStepCode" placeholder="请选择当前节点" clearable @change="handleQuery">
-						<el-option v-for="item in state.currentStepOptions" :value="item.key" :key="item.key" :label="item.value" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="办结时间" prop="doneTime">
-					<el-date-picker
-						v-model="state.queryParams.doneTime"
-						type="datetimerange"
-						unlink-panels
-						range-separator="至"
-						start-placeholder="开始时间"
-						end-placeholder="结束时间"
-						:shortcuts="shortcuts"
-						@change="handleQuery"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
-						:default-time="defaultTimeStartEnd"
-					/>
-				</el-form-item>
-				<el-form-item label="是否超期" prop="IsOverTime">
-					<el-select v-model="state.queryParams.IsOverTime" placeholder="请选择是否超期" clearable @change="handleQuery">
-						<el-option label="是" :value="true" />
-						<el-option label="否" :value="false" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="来电主体" prop="IdentityType">
-					<el-select v-model="state.queryParams.IdentityType" placeholder="请选择来电主体" clearable @change="handleQuery">
-						<el-option v-for="item in state.identityTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
-					</el-select>
-				</el-form-item>
-			</el-form>
-			<template #footer>
-				<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-				<el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
-			</template>
-		</el-drawer>
-	</div>
-</template>
-<script setup lang="tsx" name="order">
-import { defineAsyncComponent, onMounted, reactive, ref, onActivated, onBeforeUnmount } from 'vue';
-import type { FormInstance } from 'element-plus';
-import { ElMessage, ElMessageBox, ElNotification } from 'element-plus';
-import { defaultDateThree, defaultTimeStartEnd, shortcuts } from '@/utils/constants';
-import { formatDate } from '@/utils/formatTime';
-import { exportJbOrder, exportOrder, listBaseData, orderList, provinceReturn } from '@/api/business/order';
-import { addObserve } from '@/api/query/observe';
-import { addEnd } from '@/api/query/end';
-import { treeArea } from '@/api/auxiliary/area';
-import { downloadZip } from '@/utils/tools';
-import Other from '@/utils/other';
-import mittBus from '@/utils/mitt';
-
-// 引入组件
-const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
-const RepeatEventEdit = defineAsyncComponent(() => import('@/views/business/repeatEvent/components/Repeat-event-edit.vue')); // 编辑重复性事件
-const OrderReturn = defineAsyncComponent(() => import('@/views/business/return/components/Apply.vue')); // 工单退回
-
-// 定义变量内容
-const state = reactive<any>({
-	queryParams: {
-		PageIndex: 1, // 当前页
-		PageSize: 20, // 每页条数
-		// 查询条件
-		No: null, // 工单编码
-		ProvinceNo: null, // 省本地编码
-		ActualHandlerName: null, // 接办人
-		IsScreen: null, // 是否甄别
-		CurrentStepCode: null, // 办理节点
-		IsOverTime: null, // 是否超期
-		FromName: null, // 来电人姓名
-		AreaCode: null, // 事发地址
-		FromPhone: null, // 来电号码
-		Keyword: null, // 关键字
-		Content: null, // 工单内容
-		AcceptType: null, // 受理类型
-		Channels: null, // 渠道
-		Hotspot: null, //  热点分类名称
-		OrgId: null, // 接办部门
-		ActualHandleOrgName:null, // 接办部门
-		OrgLevelOneName:null, // 一级部门
-		NameOrNo: null, // 受理坐席
-		crTime: defaultDateThree, // 生成时间
-		CreationTimeStart: null, // 创建时间 开始
-		CreationTimeEnd: null, // 创建时间 结束
-		Status: null, // 工单状态
-		TransferPhone: null, // 转接来源
-		exTime: [], // 过期时间
-		ExpiredTimeStart: null, //办理期限 开始
-		ExpiredTimeEnd: null, //办理期限 结束
-		PhoneNo: null, // 手机号
-		doneTime: [], // 办结时间
-		ActualHandleTimeStart: null,
-		ActualHandleTimeEnd: null,
-		PushTypeCode: null, //推送类型
-		IsProvinceOrder: null, // 省市工单
-		IsSensitiveWord: null, // 是否敏感词工单
-		SensitiveWord: null, // 敏感词
-		IsUrgent: null, // 是否加急
-	},
-	tableData: [], //表单
-	loading: false, // 加载
-	total: 0, // 总数
-	acceptTypeOptions: [], //受理类型
-	channelOptions: [], // 来源频道
-	orderStatusOptions: [], // 工单状态
-	currentStepOptions: [], // 办理节点
-	identityTypeOptions: [], // 来电主体
-	orgsOptions: [], // 部门
-	pushTypeOptions: [], //推送分类
-	areaOptions: [], // 省市区数据
-});
-const fastSearch = ref('all'); // tab位置
-const fastSearchChange = (val: string) => {
-	fastSearch.value = val;
-	switch (val) {
-		case 'all':
-			state.queryParams.IsProvinceOrder = null;
-			break;
-		case 'city':
-			state.queryParams.IsProvinceOrder = false;
-			break;
-		case 'province':
-			state.queryParams.IsProvinceOrder = true;
-			break;
-	}
-	handleQuery();
-};
-const checkList = ref<EmptyObjectType>([]);
-// 多选
-const changeCheckList = () => {
-	if (checkList.value.includes('IsSensitiveWord')) state.queryParams.IsSensitiveWord = true;
-	else state.queryParams.IsSensitiveWord = null;
-	handleQuery();
-};
-const proTableRef = ref<RefType>(); // 表格ref
-
-// 表格配置项
-const columns = ref<any[]>([
-	{ type: 'selection', minWidth: 40, align: 'center' },
-	{ prop: 'expiredStatusText', label: '超期状态', align: 'center', minWidth: 80 },
-	{ prop: 'no', label: '工单编码', minWidth: 140 },
-	{ prop: 'isProvinceText', label: '省/市工单', minWidth: 90 },
-	{ prop: 'reTransactNum', label: '重办次数' },
-	{
-		prop: 'isUrgentText',
-		label: '是否紧急',
-		render: (scope) => {
-			return <span class="color-danger font-bold">{scope.row.isUrgentText}</span>;
-		},
-	},
-	{ prop: 'currentStepName', label: '当前节点', minWidth: 120 },
-	{ prop: 'actualStepAcceptText', label: '受理情况' },
-	{ prop: 'statusText', label: '工单状态', minWidth: 100 },
-	{ prop: 'title', label: '工单标题', minWidth: 200 },
-	{
-		prop: 'startTime',
-		label: '受理时间',
-		minWidth: 160,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'expiredTime',
-		label: '工单期满时间',
-		minWidth: 160,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.expiredTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'filedTime',
-		label: '办结时间',
-		minWidth: 160,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{ prop: 'orgLevelOneName', label: '一级部门', minWidth: 140 },
-	{ prop: 'actualHandleOrgName', label: '接办部门', minWidth: 140 },
-	{ prop: 'acceptType', label: '受理类型', minWidth: 100 },
-	{ prop: 'counterSignTypeText', label: '是否会签', minWidth: 90 },
-	{ prop: 'sourceChannel', label: '来源渠道', minWidth: 100 },
-	{ prop: 'hotspotName', label: '热点分类', minWidth: 150 },
-	{ prop: 'acceptorName', label: '受理人', minWidth: 120 },
-	{
-		prop: 'sensitiveText',
-		label: '敏感词',
-		minWidth: 150,
-	},
-	{
-		prop: 'content',
-		label: '受理内容',
-		isShow: false,
-	},
-	{
-		prop: 'actualOpinion',
-		label: '办理结果',
-		isShow: false,
-	},
-	{ prop: 'operation', label: '操作', fixed: 'right', width: 140, align: 'center' },
-]);
-// 获取查询条件基础信息
-const getBaseData = async () => {
-	try {
-		const res: any = await listBaseData();
-		const mappings: any = {
-			acceptTypeOptions: 'acceptTypeOptions',
-			channelOptions: 'channelOptions',
-			orgsOptions: 'orgsOptions',
-			pushTypeOptions: 'pushTypeOptions',
-			orderStatusOptions: 'orderStatusOptions',
-			identityTypeOptions: 'identityTypeOptions',
-			currentStepOptions: 'currentStepOptions',
-		};
-		for (const key in mappings) {
-			state[key] = res.result?.[mappings[key]] ?? [];
-		}
-		const area = await treeArea();
-		state.areaOptions = area?.result ?? []; //省市区数据
-	} catch (error) {
-		console.log(error);
-	}
-};
-// 手动查询,将页码设置为1
-const handleQuery = () => {
-	state.queryParams.PageIndex = 1;
-	queryList();
-};
-/** 获取列表 */
-const requestParams = ref<EmptyObjectType>({});
-const queryList = () => {
-	requestParams.value = Other.deepClone(state.queryParams);
-	requestParams.value.CreationTimeStart = state.queryParams.crTime === null ? null : state.queryParams.crTime[0]; // 生成时间
-	requestParams.value.CreationTimeEnd = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
-	Reflect.deleteProperty(requestParams.value, 'crTime'); // 删除无用的参数
-	requestParams.value.ExpiredTimeStart = state.queryParams.exTime === null ? null : state.queryParams.exTime[0]; // 期满时间
-	requestParams.value.ExpiredTimeEnd = state.queryParams.exTime === null ? null : state.queryParams.exTime[1];
-	Reflect.deleteProperty(requestParams.value, 'exTime'); // 删除无用的参数
-	requestParams.value.ActualHandleTimeStart = state.queryParams.doneTime === null ? null : state.queryParams.doneTime[0]; // 办结时间
-	requestParams.value.ActualHandleTimeEnd = state.queryParams.doneTime === null ? null : state.queryParams.doneTime[1];
-	Reflect.deleteProperty(requestParams.value, 'doneTime'); // 删除无用的参数
-	state.loading = true;
-	orderList(requestParams.value)
-		.then((response: any) => {
-			state.tableData = response?.result.items ?? [];
-
-			state.total = response?.result.total;
-			state.loading = false;
-		})
-		.catch(() => {
-			state.loading = false;
-		});
-};
-/** 重置按钮操作 */
-const drawerRuleFormRef = ref();
-const ruleFormRef = ref<RefType>(); // 表单ref
-const drawer = ref(false);
-const resetQuery = (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	formEl.resetFields();
-	state.queryParams.IsSensitiveWord = null;
-	state.queryParams.IsProvinceOrder = null;
-	fastSearch.value = 'all';
-	checkList.value = [];
-	ruleFormRef.value?.resetFields();
-	queryList();
-};
-// 设置终结件
-const onObserve = () => {
-	const ids = proTableRef.value.selectedList.map((item: any) => {
-		return {
-			orderId: item.id,
-		};
-	});
-	ElMessageBox.confirm(`选择的${proTableRef.value.selectedList.length}个工单设置观察件吗?`, '提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		autofocus: false,
-	})
-		.then(() => {
-			addObserve({ orderIds: ids }).then(() => {
-				ElMessage.success('操作成功');
-				queryList();
-			});
-		})
-		.catch(() => {});
-};
-// 设置终结件
-const onEnd = () => {
-	const ids = proTableRef.value.selectedList.map((item: any) => {
-		return {
-			orderId: item.id,
-		};
-	});
-	ElMessageBox.confirm(`选择的${proTableRef.value.selectedList.length}个工单设置终结件吗?`, '提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		autofocus: false,
-	})
-		.then(() => {
-			addEnd({ orderIds: ids }).then(() => {
-				ElMessage.success('操作成功');
-				queryList();
-			});
-		})
-		.catch(() => {});
-};
-// 省退回申请
-const onProvinceReturn = () => {
-	const ids = proTableRef.value.selectedList.map((item: any) => {
-		return {
-			orderId: item.id,
-		};
-	});
-	ElMessageBox.prompt(`选择的${proTableRef.value.selectedList.length}个工单的退回原因`, '提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		draggable: true,
-		autofocus: false,
-		inputPlaceholder: '请填写退回原因,不超过50个字符',
-		inputErrorMessage: '请填写退回原因',
-		inputType: 'textarea',
-		inputValidator: (value) => {
-			if (value) return true;
-			else return '请填写退回原因';
-		},
-	})
-		.then(({ value }) => {
-			provinceReturn({ orderIds: ids, content: value }).then((res: any) => {
-				ElNotification({
-					title: '退回完成',
-					dangerouslyUseHTMLString: true,
-					message: `<div>
-  <div>总退回条数:${res.result.count}条;</>
-  <div>成功条数:${res.result.successCount}条;</div>
-  <div>失败条数:${res.result.errorCount}条;</div>
-</div>`,
-				});
-				queryList();
-			});
-		})
-		.catch(() => {});
-};
-// 创建重复性事件
-const repeatEventEditRef = ref<RefType>();
-const onCreateRepeatEvent = () => {
-	repeatEventEditRef.value.openDialog();
-};
-// 工单省退回
-const orderReturnRef = ref<RefType>(); // 工单退回ref
-const onReturn = (row: any) => {
-	orderReturnRef.value.openDialog(row);
-};
-// 交办单导出
-const onJbExport = () => {
-	const ids = proTableRef.value.selectedList.map((item: any) => item.id);
-	ElMessageBox.confirm(`您确定导出选中的${proTableRef.value.selectedList.length}个工单的交办单,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-		autofocus: false,
-	})
-		.then(() => {
-			state.loading = true;
-			exportJbOrder(ids)
-				.then((res: any) => {
-					downloadZip(res);
-					state.loading = false;
-					ElMessage.success('导出成功');
-				})
-				.catch(() => {
-					state.loading = false;
-				});
-		})
-		.catch(() => {});
-};
-onMounted(() => {
-	getBaseData();
-	queryList();
-});
-onActivated(() => {
-	mittBus.on('clearCachePage', () => {
-		//清除缓存
-		handleQuery();
-	});
-});
-onBeforeUnmount(() => {
-	mittBus.off('clearCachePage');
-});
-</script>

+ 146 - 34
src/views/business/repeatEvent/components/Repeat-event-edit.vue

@@ -37,15 +37,54 @@
 		<el-divider content-position="left">
 			<el-text tag="b" size="large"> 重复事件工单 </el-text>
 		</el-divider>
-		<ProTable ref="proTableRef" :columns="columns" :data="state.repeatTable" :loading="state.loading" :pagination="false" :tool-button="['setting']">
-			<template #tableHeader="scope">
-				<el-button type="primary" @click="onAddRepeatTable">添加 </el-button>
-				<el-button type="primary" @click="onRemoveRepeatTable" :disabled="!scope.isSelected">移除 </el-button>
+		<vxe-toolbar
+			ref="toolbarRef"
+			:loading="state.loading"
+		>
+			<template #buttons>
+				<el-button type="primary" @click="onAddRepeatTable"><SvgIcon name="ele-Plus" class="mr5"/> 添加</el-button>
+				<el-button type="danger" @click="onRemoveRepeatTable" :disabled="isChecked"><SvgIcon name="ele-Delete" class="mr5"/>移除 </el-button>
 			</template>
-			<template #title="{ row }">
-				<order-detail :order="row">{{ row.title }}</order-detail>
-			</template>
-		</ProTable>
+		</vxe-toolbar>
+		<vxe-table
+				border
+				:loading="state.loading"
+				:data="state.repeatTable"
+				:column-config="{ resizable: true }"
+				:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
+				ref="tableRef"
+				@checkbox-all="selectAllChangeEvent"
+				@checkbox-change="selectChangeEvent"
+				max-height="500"
+				show-overflow
+				:scrollY="{ enabled: true, gt: 20, mode: 'wheel' }"
+			>
+				<vxe-column type="checkbox" width="60" align="center"></vxe-column>
+				<vxe-column field="no" title="工单编码" width="140"></vxe-column>
+				<vxe-column field="isProvinceText" title="省/市工单" width="90"></vxe-column>
+				<vxe-column field="currentStepName" title="当前节点" width="100"></vxe-column>
+				<vxe-column field="statusText" title="工单状态" width="100"></vxe-column>
+				<vxe-column field="title" title="工单标题" width="200">
+					<template #default="{ row }">
+						<order-detail :order="row">{{ row.title }}</order-detail>
+					</template>
+				</vxe-column>
+				<vxe-column field="startTime" title="受理时间" width="160">
+					<template #default="{ row }">
+						{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}
+					</template>
+				</vxe-column>
+				<vxe-column field="expiredTime" title="工单期满时间" width="160">
+					<template #default="{ row }">
+						{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
+					</template>
+				</vxe-column>
+				<vxe-column field="actualHandleOrgName" title="接办部门" width="140"></vxe-column>
+				<vxe-column field="acceptType" title="受理类型" width="100"></vxe-column>
+				<vxe-column field="counterSignTypeText" title="是否会签" width="90"></vxe-column>
+				<vxe-column field="sourceChannel" title="来源渠道" width="100"></vxe-column>
+				<vxe-column field="hotspotName" title="热点分类" width="150"></vxe-column>
+			</vxe-table>
 
 		<!--   从所有工单重选择重复   -->
 		<el-dialog v-model="state.dialogVisibleAllTable" width="50%" draggable title="选择重复事件工单" append-to-body destroy-on-close>
@@ -60,25 +99,56 @@
 					</el-button>
 				</el-form-item>
 			</el-form>
-			<ProTable
-				ref="proTableRefAll"
-				:columns="columns"
-				:data="state.allTable"
+			<vxe-table
+				border
 				:loading="state.loading"
+				:data="state.allTable"
+				:column-config="{ resizable: true }"
+				:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
+				ref="tableRefAll"
+				@checkbox-all="selectAllChangeEventAll"
+				@checkbox-change="selectChangeEventAll"
+				max-height="500"
+				show-overflow
+				:scrollY="{ enabled: true, gt: 20, mode: 'wheel' }"
+			>
+				<vxe-column type="checkbox" width="60" align="center"></vxe-column>
+				<vxe-column field="no" title="工单编码" width="140"></vxe-column>
+				<vxe-column field="isProvinceText" title="省/市工单" width="90"></vxe-column>
+				<vxe-column field="currentStepName" title="当前节点" width="100"></vxe-column>
+				<vxe-column field="statusText" title="工单状态" width="100"></vxe-column>
+				<vxe-column field="title" title="工单标题" width="200">
+					<template #default="{ row }">
+						<order-detail :order="row">{{ row.title }}</order-detail>
+					</template>
+				</vxe-column>
+				<vxe-column field="startTime" title="受理时间" width="160">
+					<template #default="{ row }">
+						{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}
+					</template>
+				</vxe-column>
+				<vxe-column field="expiredTime" title="工单期满时间" width="160">
+					<template #default="{ row }">
+						{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
+					</template>
+				</vxe-column>
+				<vxe-column field="actualHandleOrgName" title="接办部门" width="140"></vxe-column>
+				<vxe-column field="acceptType" title="受理类型" width="100"></vxe-column>
+				<vxe-column field="counterSignTypeText" title="是否会签" width="90"></vxe-column>
+				<vxe-column field="sourceChannel" title="来源渠道" width="100"></vxe-column>
+				<vxe-column field="hotspotName" title="热点分类" width="150"></vxe-column>
+			</vxe-table>
+			<pagination
+				@pagination="queryListAll"
 				:total="state.totalAll"
-				v-model:page-index="state.queryParamsAll.PageIndex"
+				v-model:current-page="state.queryParamsAll.PageIndex"
 				v-model:page-size="state.queryParamsAll.PageSize"
-				:tool-button="['setting']"
-				@updateTable="queryListAll"
-			>
-				<template #title="{ row }">
-					<order-detail :order="row">{{ row.title }}</order-detail>
-				</template>
-			</ProTable>
+				:disabled="state.loading"
+			/>
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="state.dialogVisibleAllTable = false" class="default-button">取 消</el-button>
-					<el-button type="primary" @click="onSubmitAll" :loading="state.loading" :disabled="!canChoose">确 定</el-button>
+					<el-button type="primary" @click="onSubmitAll" :loading="state.loading" :disabled="isCheckedAll">确 定</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -101,8 +171,9 @@ import { repeatEventAdd, repeatEventDetail, repeatEventUpdate } from '@/api/busi
 import { throttle } from '@/utils/tools';
 
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 const emit = defineEmits(['updateList']);
-const state = reactive({
+const state = reactive<any>({
 	queryParams: {
 		// 查询条件
 		PageIndex: 1,
@@ -183,12 +254,14 @@ const handleInputConfirm = () => {
 // 创建重复事件
 const dialogTitle = ref<String>('创建重复性事件');
 const openDialog = (row?: any) => {
+	state.dialogVisible = true;
+	state.loading = true;
 	if (row) {
 		dialogTitle.value = '编辑重复性事件';
 		getDetail(row);
 	} else {
 		dialogTitle.value = '创建重复性事件';
-		state.dialogVisible = true;
+		state.loading = false;
 	}
 };
 // 查询详情
@@ -203,9 +276,10 @@ const getDetail = async (row: any) => {
 				...item?.order,
 			};
 		});
-		state.dialogVisible = true;
+		state.loading = false;
 	} catch (e) {
 		console.log(e);
+		state.loading = false;
 	}
 };
 // 打开所有工单列表选择重复工单
@@ -238,20 +312,56 @@ const resetQueryAll = (formEl: FormInstance | undefined) => {
 	formEl.resetFields();
 	queryListAll();
 };
-// 确定选择所有工单到重复工单
-const proTableRefAll = ref<RefType>();
-const canChoose = computed(() => {
-	return proTableRefAll.value?.selectedList.length;
+
+const tableRef = ref<RefType>();
+const checkTable = ref<EmptyArrayType>([]);
+const selectAllChangeEvent = ({ checked }) => {
+	if (tableRef.value) {
+		const records = tableRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '所有勾选事件' : '所有取消事件', records);
+	}
+};
+
+const selectChangeEvent = ({ checked }) => {
+	if (tableRef.value) {
+		const records = tableRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '勾选事件' : '取消事件', records);
+	}
+};
+const isChecked = computed(() => {
+	return !Boolean(checkTable.value.length);
+});
+
+const tableRefAll = ref<RefType>();
+const checkTableAll = ref<EmptyArrayType>([]);
+const selectAllChangeEventAll = ({ checked }) => {
+	if (tableRefAll.value) {
+		const records = tableRefAll.value.getCheckboxRecords();
+		checkTableAll.value = records;
+		console.log(checked ? '所有勾选事件' : '所有取消事件', records);
+	}
+};
+
+const selectChangeEventAll = ({ checked }) => {
+	if (tableRefAll.value) {
+		const records = tableRefAll.value.getCheckboxRecords();
+		checkTableAll.value = records;
+		console.log(checked ? '勾选事件' : '取消事件', records);
+	}
+};
+const isCheckedAll = computed(() => {
+	return !Boolean(checkTableAll.value.length);
 });
+
 const onSubmitAll = () => {
 	state.dialogVisibleAllTable = false;
-	state.repeatTable = removeDuplicate([...state.repeatTable, ...proTableRefAll.value?.selectedList], 'id'); // 添加时去重
+	state.repeatTable = removeDuplicate([...state.repeatTable, ...checkTableAll.value], 'id'); // 添加时去重
 };
 // 删除重复工单
-const proTableRef = ref<RefType>();
 const onRemoveRepeatTable = () => {
-	const num = proTableRef.value.selectedList.length;
-	ElMessageBox.confirm(`您确定要删除选中的【${num}】个工单,是否继续?`, '提示', {
+	ElMessageBox.confirm(`您确定要删除选中的工单,是否继续?`, '提示', {
 		confirmButtonText: '确认',
 		cancelButtonText: '取消',
 		type: 'warning',
@@ -260,10 +370,11 @@ const onRemoveRepeatTable = () => {
 		autofocus: false,
 	})
 		.then(() => {
-			proTableRef.value.selectedList.forEach((item1: any) => {
+			checkTable.value.forEach((item1: any) => {
 				state.repeatTable.forEach((item: any, index: number) => {
 					if (item.id === item1.id) {
-						proTableRef.value.element.toggleRowSelection(item, undefined);
+						tableRef.value.setCheckboxRow(item, false);
+						checkTable.value.splice(checkTable.value.indexOf(item1), 1);
 						state.repeatTable.splice(index, 1);
 					}
 				});
@@ -276,6 +387,7 @@ const close = () => {
 	ruleFormRef.value.clearValidate();
 	ruleFormRef.value.resetFields();
 };
+
 const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	await formEl.validate((valid: boolean) => {

+ 32 - 23
src/views/knowledge/components/Audit-progress.vue

@@ -1,18 +1,38 @@
 <template>
 	<div class="tels-callLog-connect-container">
 		<el-dialog v-model="state.dialogVisible" draggable title="审核记录" destroy-on-close>
-			<ProTable
-				ref="proTableRef"
-				:columns="columns"
-				:data="state.tableData"
-				@updateTable="queryList"
+			<vxe-table
+				border
 				:loading="loading"
-				:total="state.total"
-				v-model:page-index="state.queryParams.PageIndex"
-				v-model:page-size="state.queryParams.PageSize"
+				:data="state.tableData"
+				:column-config="{ resizable: true }"
+				:row-config="{ isCurrent: true, isHover: true, height: 30,useKey:true }"
+				ref="tableRef"
+				show-overflow
+				:scrollY="{ enabled: true, gt: 20,mode: 'wheel' }"
 				max-height="400"
 			>
-			</ProTable>
+				<vxe-column field="workflow.actualHandlerName" title="审核人">
+				</vxe-column>
+				<vxe-column field="workFlowApplyStatusText" title="审核状态">
+				</vxe-column>
+				<vxe-column field="workflow.actualHandlerName" title="审核人">
+				</vxe-column>
+				<vxe-column field="handleTime" title="审核时间" width="160">
+					<template #default="{ row }">
+						{{ formatDate(row.handleTime, 'YYYY-mm-dd HH:MM:SS') }}
+					</template>
+				</vxe-column>
+				<vxe-column field="actualOpinion" title="备注">
+				</vxe-column>
+			</vxe-table>
+			<pagination
+				@pagination="queryList"
+				:total="state.total"
+				v-model:current-page="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+				:disabled="state.loading"
+			/>
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="closeDialog" class="default-button">关 闭</el-button>
@@ -23,23 +43,12 @@
 </template>
 
 <script lang="tsx" setup>
-import { ref, reactive } from 'vue';
+import { ref, reactive, defineAsyncComponent } from 'vue';
 import { formatDate } from '@/utils/formatTime';
 import { knowledgeApproval } from '@/api/knowledge';
 
-const proTableRef = ref<RefType>(); // 表格ref
-// 表格配置项
-const columns = ref<any[]>([
-	{ prop: 'workflow.actualHandlerName', label: '审核人', width: 150 },
-	{ prop: 'workFlowApplyStatusText', label: '审核状态', width: 150 },
-	{
-		prop: 'handleTime',
-		label: '审核时间',
-		width: 170,
-		render: (scope: any) => formatDate(scope.row.handleTime, 'YYYY-mm-dd HH:MM:SS'),
-	},
-	{ prop: 'actualOpinion', label: '备注' },
-]);
+
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
 // 定义变量内容
 const state = reactive<any>({

+ 84 - 38
src/views/knowledge/components/Knowledge-keywords.vue

@@ -1,5 +1,5 @@
 <template>
-	<el-drawer title="知识关键词" v-model="drawerVisible" size="40%">
+	<el-drawer title="知识关键词" v-model="drawerVisible" size="40%" @opened="opened">
 		<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent>
 			<el-form-item label="关键词" prop="Tag">
 				<el-input v-model="state.queryParams.Tag" placeholder="请填写关键词" clearable @keyup.enter="handleQuery" />
@@ -9,26 +9,50 @@
 				<el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 			</el-form-item>
 		</el-form>
-    <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 #tableHeader="scope">
-        <el-button type="primary" @click="addParameter"> <SvgIcon name="ele-Plus" class="mr5" />新增 </el-button>
-        <el-button type="primary" @click="businessTagRemove" :disabled="!scope.isSelected">
-          <SvgIcon name="ele-Delete" class="mr5" />删除
-        </el-button>
-      </template>
-      <template #operation="{ row }">
-        <el-button link type="primary" @click="updateLexicon(row)" title="编辑知识库词库"> 编辑 </el-button>
-      </template>
-    </ProTable>
+		<vxe-toolbar
+			ref="toolbarRef"
+			:loading="state.loading"
+			custom
+			:refresh="{
+					queryMethod: handleQuery,
+				}"
+		>
+			<template #buttons>
+				<el-button type="primary" @click="addParameter"> <SvgIcon name="ele-Plus" class="mr5" />新增 </el-button>
+				<el-button type="danger" @click="businessTagRemove" :disabled="isChecked">
+					<SvgIcon name="ele-Delete" class="mr5" />删除
+				</el-button>
+			</template>
+		</vxe-toolbar>
+			<vxe-table
+				border
+				:loading="state.loading"
+				:data="state.tableData"
+				:column-config="{ resizable: true }"
+				:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
+				ref="tableRef"
+				@checkbox-all="selectAllChangeEvent"
+				@checkbox-change="selectChangeEvent"
+				max-height="600px"
+				show-overflow
+				:scrollY="{ enabled: true, gt: 20, mode: 'wheel' }"
+			>
+				<vxe-column type="checkbox" width="60" align="center"></vxe-column>
+				<vxe-column field="tag" title="关键词"></vxe-column>
+				<vxe-column field="synonym" title="同义词"></vxe-column>
+				<vxe-column title="操作" fixed="right" width="130" align="center">
+					<template #default="{ row }">
+						<el-button link type="primary" @click="updateLexicon(row)" title="编辑知识库词库"> 编辑 </el-button>
+					</template>
+				</vxe-column>
+			</vxe-table>
+		<pagination
+			@pagination="queryList"
+			:total="state.total"
+			v-model:current-page="state.queryParams.PageIndex"
+			v-model:page-size="state.queryParams.PageSize"
+			:disabled="state.loading"
+		/>
 
 		<template #footer>
 			<span class="dialog-footer">
@@ -43,21 +67,14 @@
 	<knowledge-lexicon-edit ref="knowledgeLexiconEditRef" @updateList="queryList" :knowledgeWordClassify="knowledgeWordClassify" />
 </template>
 <script setup lang="tsx">
-import { defineAsyncComponent, reactive, ref } from 'vue';
+import { computed, defineAsyncComponent, reactive, ref } from 'vue';
 import { knowledgeLexiconDelete, knowledgeLexiconList, orderKnowledgeBaseData } from '@/api/auxiliary/knowledgeLexicon';
 import { ElMessage, ElMessageBox, FormInstance } from "element-plus";
 
-const proTableRef = ref<RefType>(); // 表格ref
-// 表格配置项
-const columns = ref<any[]>([
-  { type: 'selection', fixed: 'left', width: 55 },
-  { prop: 'tag', label: '关键词'},
-  { prop: 'synonym', label: '同义词' },
-  { prop: 'operation', label: '操作', fixed: 'right', width: 100, align: 'center' },
-]);
 // 引入组件
 const KnowledgeLexiconAdd = defineAsyncComponent(() => import('@/views/auxiliary/knowledgeLexicon/components/Knowledge-lexicon-add.vue')); // 新增知识库词库
 const KnowledgeLexiconEdit = defineAsyncComponent(() => import('@/views/auxiliary/knowledgeLexicon/components/Knowledge-lexicon-edit.vue')); // 编辑知识库词库
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
 const emit = defineEmits(['selectKeyword']);
 
@@ -102,19 +119,22 @@ const queryList = () => {
 			state.loading = false;
 			state.tableData = res.result.items ?? [];
 			state.total = res.result.total ?? 0;
-      proTableRef.value.clearSelection();
+			tableRef.value.clearCheckboxRow();
+			checkTable.value = [];
 			if (keywordIds.value && keywordIds.value.length) {
 				for (let i of keywordIds.value) {
 					for (let j of state.tableData) {
 						if (i === j.id) {
 							setTimeout(() => {
-                proTableRef.value!.element.toggleRowSelection(j, true);
+								tableRef.value.setCheckboxRow(j, true);
+								checkTable.value = tableRef.value.getCheckboxRecords();
 							}, 100);
 						}
 					}
 				}
 			} else {
-        proTableRef.value.clearSelection();
+				tableRef.value.clearCheckboxRow();
+				checkTable.value = [];
 			}
 		})
 		.finally(() => {
@@ -139,9 +159,9 @@ const updateLexicon = (row: any) => {
 };
 // 删除词库
 const businessTagRemove = () => {
-	const ids = proTableRef.value.selectedList.map((item: any) => item.id);
-	const names = proTableRef.value.selectedList.map((item: any) => item.tag);
-	ElMessageBox.confirm(`您确定要删除:【${names}】,是否继续?`, '提示', {
+	const ids = checkTable.value.map((item: any) => item.id);
+	const name = checkTable.value.map((item: any) => item.tag);
+	ElMessageBox.confirm(`您确定要删除:【${name}】,是否继续?`, '提示', {
 		confirmButtonText: '确认',
 		cancelButtonText: '取消',
 		type: 'warning',
@@ -159,8 +179,8 @@ const businessTagRemove = () => {
 };
 // 确定选择关键词
 const onConfirm = () => {
-	const ids = proTableRef.value.selectedList.map((item: any) => item.id);
-	const name = proTableRef.value.selectedList.map((item: any) => item.tag);
+	const ids = checkTable.value.map((item: any) => item.id);
+	const name = checkTable.value.map((item: any) => item.tag);
 	emit('selectKeyword', { ids, name });
 	drawerVisible.value = false;
 };
@@ -175,6 +195,32 @@ const openDialog = (keywords: any[]) => {
 const closeDialog = () => {
 	drawerVisible.value = false;
 };
+const tableRef = ref<RefType>();
+const checkTable = ref<EmptyArrayType>([]);
+const selectAllChangeEvent = ({ checked }) => {
+	if (tableRef.value) {
+		const records = tableRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '所有勾选事件' : '所有取消事件', records);
+	}
+};
+
+const selectChangeEvent = ({ checked }) => {
+	if (tableRef.value) {
+		const records = tableRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '勾选事件' : '取消事件', records);
+	}
+};
+const isChecked = computed(() => {
+	return !Boolean(checkTable.value.length);
+});
+const toolbarRef = ref<RefType>();
+const opened = ()=>{
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
+}
 defineExpose({
 	openDialog,
 	closeDialog,

+ 0 - 60
src/views/statistics/center/corporateSpecial.vue

@@ -58,25 +58,6 @@
 					</vxe-column>
 				</vxe-table>
 			</div>
-			<ProTable
-				ref="proTableRef"
-				:columns="columns"
-				:data="state.tableData"
-				@updateTable="queryList"
-				:loading="state.loading"
-				:pagination="false"
-				role-key="orgId"
-				:toolButton="['refresh', 'setting', 'exportAll']"
-				:exportMethod="centerEnterpriseSpecialistLetterExport"
-				:exportParams="requestParams"
-				show-summary
-				:summary-method="getSummaries"
-			>
-				<template #table-search> </template>
-				<template #title="{ row }">
-					<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
-				</template>
-			</ProTable>
 		</div>
 	</div>
 </template>
@@ -90,25 +71,7 @@ import { useRouter } from 'vue-router';
 import XEUtils from 'xe-utils';
 
 // 引入组件
-const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
 const StatisticalTime = defineAsyncComponent(() => import('@/components/StatisticalTime/index.vue')); // 日期类型选择组件
-// 表格配置项
-const columns = ref<any[]>([
-	{ prop: 'userName', label: '坐席名称', minWidth: 200 },
-	{ prop: 'userNo', label: '坐席工号' },
-	{ prop: 'telCallNum', label: '话务量' },
-	{
-		prop: 'orderNum',
-		label: '工单量',
-		render: (scope) => {
-			return (
-				<el-button type="primary" link onClick={() => linkDetail(scope)}>
-					{scope.row.orderNum}
-				</el-button>
-			);
-		},
-	},
-]);
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref
 const state = reactive<any>({
@@ -154,29 +117,6 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 	statisticalTimeRef.value.reset();
 	queryList();
 };
-// 合计
-const getSummaries = (param: any) => {
-	const { columns } = param;
-	const sums: string[] = [];
-	columns.forEach((column: { property: string }, index: number) => {
-		if (index === 0) {
-			sums[index] = '合计';
-			return;
-		}
-		switch (column.property) {
-			case 'telCallNum':
-				sums[index] = state.totalCount?.telCallNum;
-				break;
-			case 'orderNum':
-				sums[index] = state.totalCount?.orderNum;
-				break;
-			default:
-				sums[index] = '';
-				break;
-		}
-	});
-	return sums;
-};
 // 计算合计
 const footerMethod = ({ columns, data }) => {
 	return [

+ 0 - 156
src/views/statistics/center/detailCorporateSpecial.vue

@@ -1,156 +0,0 @@
-<template>
-	<div class="statistics-center-detail-event-frequently 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"
-				:toolButton="['refresh', 'setting', 'exportCurrent', 'exportAll']"
-				:exportMethod="centerEnterpriseSpecialistLetterDetailExport"
-				:exportParams="requestParams"
-			>
-				<template #tableHeader="scope">
-					<el-button type="primary" @click="onJbExport" :disabled="!scope.isSelected" :loading="state.loading"
-					><SvgIcon name="iconfont icon-daochu" class="mr5" />交办单导出
-					</el-button>
-				</template>
-				<template #expiredStatusText="{ row }">
-					<span :class="'overdue-status-' + row.expiredStatus" :title="row.expiredStatusText"></span>
-				</template>
-				<template #title="{ row }">
-					<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
-				</template>
-			</ProTable>
-		</div>
-	</div>
-</template>
-<script setup lang="tsx" name="statisticsCenterDetailCorporateSpecial">
-import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
-import { useRoute } from 'vue-router';
-import { formatDate } from '@/utils/formatTime';
-import { exportJbOrder } from '@/api/business/order';
-import { centerEnterpriseSpecialistLetterDetail, centerEnterpriseSpecialistLetterDetailExport} from '@/api/statistics/center';
-import Other from "@/utils/other";
-import { downloadZip } from '@/utils/tools';
-import {ElMessageBox,ElMessage} from 'element-plus'
-
-// 引入组件
-const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
-
-// 定义变量内容
-const state = reactive<any>({
-	queryParams: {
-		PageIndex: 1, // 当前页
-		PageSize: 20, // 每页条数
-		// 查询条件
-		StartTime:null,
-		EndTime:null,
-		UserName:null,
-		UserId:null
-	},
-	tableData: [], //表单
-	loading: false, // 加载
-	total: 0, // 总数
-});
-const route = useRoute(); // 路由
-const proTableRef = ref<RefType>(); // 表格ref
-// 表格配置项
-const columns = ref<any[]>([
-	{ type: 'selection', minWidth: 40, align: 'center' },
-	{ prop: 'expiredStatusText', label: '超期状态', align: 'center',width: 80 },
-	{ prop: 'statusText', label: '工单状态', minWidth: 100 },
-	{ prop: 'sourceChannel', label: '来源渠道', width: 100 },
-	{ prop: 'currentStepName', label: '当前节点', minWidth: 120 },
-	{ prop: 'no', label: '工单编码', minWidth: 140 },
-	{ prop: 'title', label: '工单标题', minWidth: 200 },
-	{
-		prop: 'startTime',
-		label: '受理时间',
-    minWidth: 160,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'expiredTime',
-		label: '工单期满时间',
-		width: 160,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.expiredTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{ prop: 'actualHandleOrgName', label: '接办部门', width: 140 },
-	{
-		prop: 'actualHandleTime',
-		label: '接办时间',
-		width: 160,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.actualHandleTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'filedTime',
-		label: '办结时间',
-		width: 160,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{ prop: 'acceptType', label: '受理类型', width: 100 },
-	{ prop: 'hotspotName', label: '热点分类', width: 150 },
-	{ prop: 'acceptorName', label: '受理人', width: 120 },
-]);
-const routeQueryParams = route.query;
-const requestParams = ref<EmptyObjectType>({})
-/** 获取列表 */
-const queryList = () => {
-	requestParams.value = Other.deepClone(state.queryParams);
-	requestParams.value.StartTime = routeQueryParams.StartTime;
-	requestParams.value.EndTime = routeQueryParams.EndTime;
-	requestParams.value.UserId = routeQueryParams.UserId;
-	state.loading = true;
-	centerEnterpriseSpecialistLetterDetail(requestParams.value)
-		.then((response: any) => {
-			state.tableData = response?.result.items ?? [];
-
-			state.total = response?.result.total;
-			state.loading = false;
-		})
-		.catch(() => {
-			state.loading = false;
-		});
-};
-// 交办单导出
-const onJbExport = () => {
-	const ids = proTableRef.value.selectedList.map((item: any) => item.id);
-	ElMessageBox.confirm(`您确定导出选中的${proTableRef.value.selectedList.length}个工单的交办单,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-		autofocus: false,
-	})
-		.then(() => {
-			state.loading = true;
-			exportJbOrder(ids)
-				.then((res: any) => {
-					downloadZip(res);
-					state.loading = false;
-					ElMessage.success('导出成功');
-				})
-				.catch(() => {
-					state.loading = false;
-				});
-		})
-		.catch(() => {});
-};
-onMounted(() => {
-	queryList();
-});
-</script>

+ 82 - 80
src/views/statistics/order/detailSourceOrder.vue

@@ -1,40 +1,97 @@
 <template>
 	<div class="statistics-order-detail-source-order-container layout-padding">
     <div class="layout-padding-auto layout-padding-view pd20">
-			<ProTable
-				ref="proTableRef"
-				:columns="columns"
-				:data="state.tableData"
-				@updateTable="queryList"
+			<vxe-toolbar
+				ref="toolbarRef"
 				:loading="state.loading"
+				custom
+				:refresh="{
+					queryMethod: queryList,
+				}"
+				:tools="[{ toolRender: { name: 'exportCurrent' } }, { toolRender: { name: 'exportAll' } }]"
+			>
+			</vxe-toolbar>
+			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
+				<vxe-table
+					border
+					:loading="state.loading"
+					:data="state.tableData"
+					:column-config="{ resizable: true }"
+					:row-config="{ isCurrent: true, isHover: true, height: 30 }"
+					ref="tableRef"
+					height="auto"
+					auto-resize
+					show-overflow
+					:scrollY="{ enabled: true, gt: 0 }"
+					id="statisticsDetailSourceOrder"
+					:custom-config="{
+						storage: true,
+					}"
+					showHeaderOverflow
+					:params="{ exportMethod: orderSourceListDetailExport, exportParams: requestParams }"
+				>
+					<vxe-column field="expiredStatusText" title="超期状态" width="90" align="center">
+						<template #default="{ row }">
+							<span :class="'overdue-status-' + row.expiredStatus" :title="row.expiredStatusText"></span>
+						</template>
+					</vxe-column>
+					<vxe-column field="statusText" title="工单状态" width="100"></vxe-column>
+					<vxe-column field="sourceChannel" title="来源渠道" width="110"></vxe-column>
+					<vxe-column field="currentStepName" title="当前节点" width="100"></vxe-column>
+					<vxe-column field="reTransactNum" title="重办次数" width="100"></vxe-column>
+					<vxe-column field="no" title="工单编码" width="140"></vxe-column>
+					<vxe-column field="title" title="工单标题" width="200">
+						<template #default="{ row }">
+							<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+						</template>
+					</vxe-column>
+					<vxe-column field="startTime" title="受理时间" width="160">
+						<template #default="{ row }">
+							{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column field="expiredTime" title="工单期满时间" width="160">
+						<template #default="{ row }">
+							{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column field="actualHandleOrgName" title="接办部门" width="140"></vxe-column>
+					<vxe-column field="actualHandleTime" title="接办时间" width="160">
+						<template #default="{ row }">
+							{{ formatDate(row.actualHandleTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column field="filedTime" title="办结时间" width="160">
+						<template #default="{ row }">
+							{{ formatDate(row.filedTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column field="acceptType" title="受理类型" width="110"></vxe-column>
+					<vxe-column field="hotspotSpliceName" title="热点全称" width="150"></vxe-column>
+					<vxe-column field="hotspotName" title="热点分类" width="150"></vxe-column>
+					<vxe-column field="acceptorName" title="受理人" width="120"></vxe-column>
+				</vxe-table>
+			</div>
+			<pagination
+				@pagination="queryList"
 				:total="state.total"
-				v-model:page-index="state.queryParams.PageIndex"
+				v-model:current-page="state.queryParams.PageIndex"
 				v-model:page-size="state.queryParams.PageSize"
-				:key="Math.random()"
-				:toolButton="['refresh', 'setting', 'exportCurrent', 'exportAll']"
-				:exportMethod="orderSourceListDetailExport"
-				:exportParams="requestParams"
-			>
-				<template #expiredStatusText="{ row }">
-					<span :class="'overdue-status-' + row.expiredStatus" :title="row.expiredStatusText"></span>
-				</template>
-				<template #title="{ row }">
-					<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
-				</template>
-			</ProTable>
+				:disabled="state.loading"
+			/>
 		</div>
 	</div>
 </template>
 <script setup lang="tsx" name="statisticsDetailSourceOrder">
 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 { useRoute } from 'vue-router';
 import { formatDate } from '@/utils/formatTime';
 import { orderSourceListDetail, orderSourceListDetailExport } from '@/api/statistics/order';
 
 // 引入组件
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
 // 定义变量内容
 const state = reactive<any>({
@@ -46,61 +103,7 @@ const state = reactive<any>({
 	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: 'expiredStatusText', label: '超期状态', align: 'center', width: 80 },
-	{ prop: 'statusText', label: '工单状态', minWidth: 100 },
-	{ prop: 'sourceChannel', label: '来源渠道', minWidth: 100 },
-	{ prop: 'currentStepName', label: '当前节点', minWidth: 120 },
-	{ prop: 'reTransactNum', label: '重办次数' },
-	{ prop: 'no', label: '工单编码', minWidth: 140 },
-	{
-		prop: 'startTime',
-		label: '受理时间',
-		width: 160,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{ prop: 'title', label: '工单标题', minWidth: 200 },
-	{
-		prop: 'expiredTime',
-		label: '工单期满时间',
-		width: 160,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.expiredTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{ prop: 'actualHandleOrgName', label: '接办部门', width: 140 },
-	{
-		prop: 'actualHandleTime',
-		label: '接办时间',
-		width: 160,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.actualHandleTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'filedTime',
-		label: '办结时间',
-		width: 160,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{ prop: 'acceptType', label: '受理类型', minWidth: 100 },
-	{ prop: 'hotspotName', label: '热点分类', minWidth: 150 },
-	{ prop: 'acceptorName', label: '受理人', minWidth: 120 }
-]);
-// 手动查询,将页码设置为1
-const handleQuery = () => {
-	state.queryParams.PageIndex = 1;
-	queryList();
-};
 const routeQueryParams = route.query;
 const requestParams = ref({});
 /** 获取列表 */
@@ -125,13 +128,12 @@ const queryList = () => {
 			state.loading = false;
 		});
 };
-/** 重置按钮操作 */
-const resetQuery = (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	formEl.resetFields();
-	queryList();
-};
+const toolbarRef = ref<RefType>();
+const tableRef = ref<RefType>();
 onMounted(() => {
 	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
 });
 </script>

+ 0 - 170
src/views/statistics/order/detailVisitCount.vue

@@ -1,170 +0,0 @@
-<template>
-	<div class="business-visit-table-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" @submit.native.prevent inline>
-						<el-form-item label="关键字" prop="Keyword">
-							<el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
-						</el-form-item>
-						<el-form-item label="回访部门" prop="visitOrgName">
-							<el-input v-model="state.queryParams.visitOrgName" 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)" v-waves class="default-button" :loading="state.loading">
-								<SvgIcon name="ele-Refresh" class="mr5" />重置
-							</el-button>
-						</el-form-item>
-					</el-form>
-				</template>
-				<template #title="{ row }">
-					<order-detail :order="row.order" @updateList="queryList">{{ row.order?.title }}</order-detail>
-				</template>
-				<!-- 表格操作 -->
-				<template #operation="{ row }">
-					<el-button link type="primary" @click="visitDetail(row)" title="查看回访详情"> 回访详情 </el-button>
-				</template>
-			</ProTable>
-		</div>
-		<!-- 回访详情 -->
-		<visit-detail-com ref="visitDetailRef" @updateList="queryList" />
-	</div>
-</template>
-
-<script setup lang="tsx" name="statisticsOrderDetailVisitCount">
-import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
-import { FormInstance } from 'element-plus';
-import { formatDate } from '@/utils/formatTime';
-import { useRoute } from 'vue-router';
-import { departmentUnsatisfiedDetail } from '@/api/statistics/order';
-
-// 引入组件
-const VisitDetailCom = defineAsyncComponent(() => import('@/views/business/visit/components/Visit-detail.vue')); // 回访
-const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
-
-// 定义变量内容
-const ruleFormRef = ref<RefType>(); // 表单ref
-const state = reactive<any>({
-	queryParams: {
-		// 查询条件
-		PageIndex: 1,
-		PageSize: 20,
-		Keyword: null, // 关键字
-		visitOrgName: null,
-	},
-	tableData: [], //表单
-	loading: false, // 加载
-	total: 0, // 总数
-});
-const columns = ref<any[]>([
-	{ prop: 'order.no', label: '工单编码', minWidth: 140 },
-	{ prop: 'order.isProvinceText', label: '省/市工单', minWidth: 90 },
-	{ prop: 'order.title', label: '工单标题', minWidth: 200 },
-	{ prop: 'order.sourceChannel', label: '来源渠道', minWidth: 100 },
-	{ prop: 'orderVisit.visitTypeText', label: '回访方式', minWidth: 100 },
-	{ prop: 'order.acceptType', label: '受理类型', minWidth: 100 },
-	{ prop: 'order.hotspotName', label: '热点分类', minWidth: 150 },
-	{ prop: 'order.acceptorName', label: '受理人', minWidth: 120 },
-	{ prop: 'order.orgLevelOneName', label: '一级部门', minWidth: 140 },
-	{ prop: 'visitOrgName', label: '回访部门', minWidth: 140 },
-	{ prop: 'order.actualHandleOrgName', label: '接办部门', minWidth: 140 },
-	{
-		prop: 'order.startTime',
-		label: '受理时间',
-		minWidth: 160,
-		render: (scope: any) => {
-			return <span>{formatDate(scope.row.order?.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'order.filedTime',
-		label: '办结时间',
-		minWidth: 160,
-		render: (scope: any) => {
-			return <span>{formatDate(scope.row.order?.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'orderVisit.publishTime',
-		label: '发布时间',
-		minWidth: 160,
-		render: (scope: any) => {
-			return <span>{formatDate(scope.row.orderVisit?.publishTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'orderVisit.creationTime',
-		label: '回访任务创建时间',
-		minWidth: 160,
-		render: (scope: any) => {
-			return <span>{formatDate(scope.row.orderVisit?.creationTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{ prop: 'orderVisit.employeeName', label: '回访人' },
-	{
-		prop: 'orderVisit.visitTime',
-		label: '回访时间',
-		minWidth: 160,
-		render: (scope: any) => {
-			return <span>{formatDate(scope.row.orderVisit?.visitTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{ prop: 'order.counterSignTypeText', label: '是否会签', minWidth: 90 },
-	{ prop: 'orgNoSatisfiedReasonText', label: '不满意原因', minWidth: 150 },
-	{ prop: 'operation', label: '操作', fixed: 'right', width: 90, align: 'center' },
-]);
-/** 获取列表 */
-const route = useRoute();
-/** 搜索按钮操作 */
-const handleQuery = () => {
-	state.queryParams.PageIndex = 1;
-	queryList();
-};
-const routeQueryParams = route.query;
-const queryList = () => {
-	state.loading = true;
-	const request = {
-		PageIndex: state.queryParams.PageIndex,
-		PageSize: state.queryParams.PageSize,
-		Keyword: state.queryParams.Keyword,
-		OrgCode: routeQueryParams.orgId,
-		DissatisfiedKey: routeQueryParams.columnKey,
-		StartTime: routeQueryParams.startTime,
-		EndTime: routeQueryParams.endTime,
-		visitOrgName: state.queryParams.visitOrgName,
-	};
-	departmentUnsatisfiedDetail(request)
-		.then((res: any) => {
-			state.tableData = res.result?.items ?? [];
-			state.total = res.result?.total ?? 0;
-			state.loading = false;
-		})
-		.catch(() => {
-			state.loading = false;
-		});
-};
-/** 重置按钮操作 */
-const resetQuery = (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	formEl.resetFields();
-	queryList();
-};
-// 回访详情
-const visitDetailRef = ref<RefType>();
-const visitDetail = (row: any) => {
-	visitDetailRef.value.openDialog(row.orderVisit, '回访详情');
-};
-onMounted(() => {
-	queryList();
-});
-</script>

+ 43 - 28
src/views/system/config/workflow/components/Workflow-config.vue

@@ -9,23 +9,37 @@
 				<el-button @click="resetQuery(ruleDialogFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 			</el-form-item>
 		</el-form>
-		<!-- 表格 -->
-		<ProTable
-			ref="proTableRef"
-			:columns="columns"
-			:data="state.tableData"
-			@updateTable="queryList"
+		<vxe-table
+			border
 			:loading="state.loading"
+			:data="state.tableData"
+			:sort-config="{ remote: true }"
+			:column-config="{ resizable: true }"
+			:row-config="{ isHover: true, height: 30, keyField: 'id' }"
+			ref="tableRef"
+			max-height="500px"
+			show-overflow
+			:scrollY="{ enabled: true, gt: 20, mode: 'wheel' }"
+			@radio-change="radioChangeEvent"
+			:radio-config="{ labelField: 'name', highlight: true }"
+		>
+			>
+			<vxe-column type="radio" fixed="left" title="请选择"></vxe-column>
+			<vxe-column field="version" title="模板版本号"></vxe-column>
+			<vxe-column field="code" title="模板编码"></vxe-column>
+			<vxe-column field="creationTime" title="创建时间" width="160">
+				<template #default="{ row }">
+					<span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+				</template>
+			</vxe-column>
+		</vxe-table>
+		<pagination
+			@pagination="queryList"
 			:total="state.total"
-			v-model:page-index="state.queryParams.PageIndex"
+			v-model:current-page="state.queryParams.PageIndex"
 			v-model:page-size="state.queryParams.PageSize"
-			v-model:radio="state.tableRadio"
-			@current-change="handleSelectionChange"
-		>
-			<template #name="{ row }">
-				<span class="color-primary">{{ row.name }}</span>
-			</template>
-		</ProTable>
+			:disabled="state.loading"
+		/>
 		<template #footer>
 			<span class="dialog-footer">
 				<el-button @click="dialogVisible = false" class="default-button">取 消</el-button>
@@ -36,11 +50,13 @@
 </template>
 
 <script lang="tsx" setup name="workflowConfig">
-import { reactive, ref } from 'vue';
+import { defineAsyncComponent, reactive, ref } from 'vue';
 import { ElMessage, FormInstance } from 'element-plus';
 import { wfmodulesMatch, workflowList } from '@/api/system/workflow';
 import { formatDate } from '@/utils/formatTime';
 
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList', 'openDialog', 'closeDialog']);
 
@@ -80,13 +96,13 @@ const dialogTitle = ref(''); // 弹窗标题
 
 // 打开弹窗
 const openDialog = async (row: any) => {
+	dialogVisible.value = true;
 	try {
 		queryList();
 		state.rowCode = row.code;
 		if (row.definitionId) state.tableRadio = row.definitionId;
 		else state.tableRadio = '';
 		dialogTitle.value = row.name;
-		dialogVisible.value = true;
 	} catch (error) {
 		console.log(error);
 		state.loading = false;
@@ -94,9 +110,10 @@ const openDialog = async (row: any) => {
 };
 /** 搜索按钮操作 */
 const handleQuery = () => {
-  state.queryParams.PageIndex = 1;
-  queryList();
-}
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+const tableRef = ref<RefType>();
 const queryList = () => {
 	state.loading = true;
 	workflowList(state.queryParams)
@@ -104,6 +121,8 @@ const queryList = () => {
 			state.tableData = res.result?.items ?? [];
 			state.total = res.result?.total ?? 0;
 			state.loading = false;
+			const row = state.tableData.find((item) => item.id === state.tableRadio);
+			tableRef.value.setRadioRow(row);
 		})
 		.catch(() => {
 			state.loading = false;
@@ -113,22 +132,19 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
 	queryList();
-}
-
-// 选择重复件
-const handleSelectionChange = (row: any) => {
-	if (row) {
-		state.tableRadio = row.id;
-	}
 };
 
 // 关闭弹窗
 const closeDialog = () => {
 	dialogVisible.value = false;
 };
+const selectRow = ref<any>(null);
+const radioChangeEvent = ({ row }) => {
+	selectRow.value = row;
+};
 // 选择模板
 const onSubmit = () => {
-	wfmodulesMatch({ code: state.rowCode, definitionId: state.tableRadio })
+	wfmodulesMatch({ code: state.rowCode, definitionId: selectRow.value.id })
 		.then(() => {
 			ElMessage.success('操作成功');
 			emit('updateList');
@@ -136,7 +152,6 @@ const onSubmit = () => {
 		})
 		.catch(() => {});
 };
-
 //暴漏变量和方法
 defineExpose({ closeDialog, openDialog });
 </script>

+ 45 - 26
src/views/system/dataAuth/index.vue

@@ -1,15 +1,46 @@
 <template>
 	<div class="system-dataAuth-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" :pagination="false">
-				<template #tableHeader>
+			<vxe-toolbar
+				ref="toolbarRef"
+				:loading="state.loading"
+				custom
+				:refresh="{
+					queryMethod: handleQuery,
+				}"
+			>
+				<template #buttons>
 					<el-button type="primary" @click="onAddAuth"> <SvgIcon name="ele-Plus" class="mr5" />新增 </el-button>
 				</template>
-				<template #operation="{ row }">
-					<el-button link type="primary" @click="onEditAuth(row)" title="修改"> 修改 </el-button>
-					<el-button link type="danger" @click="onRowDel(row)" title="删除"> 删除 </el-button>
-				</template>
-			</ProTable>
+			</vxe-toolbar>
+			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
+				<vxe-table
+					border
+					:loading="state.loading"
+					:data="state.tableData"
+					:column-config="{ resizable: true }"
+					:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
+					ref="tableRef"
+					height="auto"
+					auto-resize
+					show-overflow
+					:scrollY="{ enabled: true, gt: 20, mode: 'wheel' }"
+					id="systemDataAuth"
+					:custom-config="{ storage: true }"
+				>
+					<vxe-column field="tableName" title="表编码"></vxe-column>
+					<vxe-column field="tableDisplay" title="表名称"></vxe-column>
+					<vxe-column field="roleDisplay" title="角色名称"></vxe-column>
+					<vxe-column field="roleCode" title="角色编码"></vxe-column>
+					<vxe-column field="accessLevelText" title="可见等级"></vxe-column>
+					<vxe-column title="操作" fixed="right" width="130" align="center">
+						<template #default="{ row }">
+							<el-button link type="primary" @click="onEditAuth(row)" title="修改"> 修改 </el-button>
+							<el-button link type="danger" @click="onRowDel(row)" title="删除"> 删除 </el-button>
+						</template>
+					</vxe-column>
+				</vxe-table>
+			</div>
 		</div>
 		<data-auth-add ref="dataAuthAddRef" @updateList="queryList" />
 		<data-auth-edit ref="dataAuthEditRef" @updateList="queryList" />
@@ -21,22 +52,12 @@ import { defineAsyncComponent, ref, reactive, onMounted } from 'vue';
 import { ElMessageBox, ElMessage} from 'element-plus';
 import { getDataAuthorityByRole, deleteDataAuth, baseData } from '@/api/system/roles';
 import { useRoute } from 'vue-router';
+import { formatDate } from '@/utils/formatTime';
 
 // 引入组件
 const DataAuthAdd = defineAsyncComponent(() => import('@/views/system/dataAuth/components/Data-auth-add.vue')); //新增数据权限
 const DataAuthEdit = defineAsyncComponent(() => import('@/views/system/dataAuth/components/Data-auth-edit.vue')); //修改数据权限
 
-const proTableRef = ref<RefType>(); // 表格ref
-// 表格配置项
-const columns = ref<any[]>([
-	{ prop: 'tableName', label: '表编码', showOverflowTooltip: true },
-	{ prop: 'tableDisplay', label: '表名称', showOverflowTooltip: true },
-	{ prop: 'roleDisplay', label: '角色名称', showOverflowTooltip: true },
-	{ prop: 'roleCode', label: '角色编码', showOverflowTooltip: true },
-	{ prop: 'accessLevelText', label: '可见等级', showOverflowTooltip: true, width: 100 },
-	{ prop: 'operation', label: '操作', fixed: 'right', width: 130, align: 'center' },
-]);
-
 // 定义变量内容
 const state = reactive({
 	roleId: '', //角色id
@@ -99,15 +120,13 @@ const getBaseData = async () => {
 		console.log(error);
 	}
 };
+const tableRef = ref<RefType>();
+const toolbarRef = ref<RefType>();
 onMounted(() => {
 	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
 	getBaseData();
 });
-</script>
-<style lang="scss" scoped>
-.system-dataAuth-container {
-	.el-table {
-		flex: 1;
-	}
-}
-</style>
+</script>

+ 33 - 30
src/views/todo/seats/accept/Company-search.vue

@@ -11,41 +11,48 @@
 				</el-button>
 			</el-form-item>
 		</el-form>
-		<ProTable
-			ref="proTableRef"
-			:columns="columns"
-			:data="state.tableData"
-			@updateTable="queryList"
+		<vxe-table
+			border
 			:loading="state.loading"
+			:data="state.tableData"
+			:sort-config="{ remote: true }"
+			:column-config="{ resizable: true }"
+			:row-config="{ isHover: true, height: 30, useKey: true }"
+			ref="tableRef"
+			max-height="500px"
+			show-overflow
+			:scrollY="{ enabled: true, gt: 20, mode: 'wheel' }"
+			@radio-change="radioChangeEvent"
+			:radio-config="{ highlight: true }"
+		>
+			>
+			<vxe-column type="radio" fixed="left" title="请选择" width="90" align="center"></vxe-column>
+			<vxe-column field="enterpriseName" title="企业名称"></vxe-column>
+			<vxe-column field="specialTeamName" title="专班名称"></vxe-column>
+		</vxe-table>
+		<pagination
+			@pagination="queryList"
 			:total="state.total"
-			v-model:page-index="state.queryParams.PageIndex"
+			v-model:current-page="state.queryParams.PageIndex"
 			v-model:page-size="state.queryParams.PageSize"
-			v-model:radio="tableRadio"
-			@current-change="handleSelectionChange"
-			row-key="enterpriseCode"
-		>
-		</ProTable>
+			:disabled="state.loading"
+		/>
 		<template #footer>
 			<span class="dialog-footer">
 				<el-button class="default-button" @click="state.dialogVisible = false">取 消</el-button>
-				<el-button type="primary" @click="selectConfirm" :disabled="!tableRadio">确 定</el-button>
+				<el-button type="primary" @click="selectConfirm" :disabled="!selectRow">确 定</el-button>
 			</span>
 		</template>
 	</el-dialog>
 </template>
 
 <script setup lang="tsx" name="orderCompanySearch">
-import { reactive, ref } from 'vue';
+import { defineAsyncComponent, reactive, ref } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { companyInfo } from '@/api/business/order';
 
-const proTableRef = ref<RefType>(); // 表格ref
-// 表格配置项
-const columns = ref<any[]>([
-	{ type: 'radio', fixed: 'left', width: 80, label: '请选择' },
-	{ prop: 'enterpriseName', label: '企业名称' },
-	{ prop: 'specialTeamName', label: '专班名称' },
-]);
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+
 // 引入组件
 const emit = defineEmits(['selectCompany']);
 // 定义变量内容
@@ -61,8 +68,6 @@ const state = reactive<any>({
 	loading: false, // 加载状态
 });
 const ruleFormRef = ref<RefType>(); // 表单ref
-const tableRadio = ref<String>(''); // 选择的单选框
-const selectRow = ref<EmptyObjectType>({}); // 选择的行
 // 打开弹窗
 const openDialog = () => {
 	queryList();
@@ -81,8 +86,8 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 };
 // 手动查询,将页码设置为1
 const handleQuery = () => {
-  state.queryParams.PageIndex = 1;
-  queryList();
+	state.queryParams.PageIndex = 1;
+	queryList();
 };
 /** 获取历史工单 */
 const queryList = () => {
@@ -97,12 +102,10 @@ const queryList = () => {
 			state.loading = false;
 		});
 };
-// 选择企业
-const handleSelectionChange = (row: any) => {
-	if (row) {
-		tableRadio.value = row.enterpriseCode;
-		selectRow.value = row;
-	}
+const tableRef = ref<RefType>();
+const selectRow = ref<any>(null);
+const radioChangeEvent = ({ row }) => {
+	selectRow.value = row;
 };
 // 确定选择历史工单
 const selectConfirm = () => {