Browse Source

reactor:报表时间不能清空;

zhangchong 1 năm trước cách đây
mục cha
commit
1d31753f8d
28 tập tin đã thay đổi với 589 bổ sung8 xóa
  1. 2 1
      src/components/ProTable/components/Pagination.vue
  2. 16 0
      src/views/business/order/index.vue
  3. 10 2
      src/views/business/publish/component/Order-publish-edit.vue
  4. 10 2
      src/views/business/publish/component/Order-publish.vue
  5. 220 0
      src/views/business/publish/component/Order-redo.vue
  6. 11 2
      src/views/business/publish/todo.vue
  7. 2 1
      src/views/knowledge/index/edit.vue
  8. 1 0
      src/views/statistics/call/hotNumber.vue
  9. 1 0
      src/views/statistics/call/index.vue
  10. 1 0
      src/views/statistics/call/seatsRest.vue
  11. 1 0
      src/views/statistics/call/talkTime.vue
  12. 1 0
      src/views/statistics/call/telephone.vue
  13. 1 0
      src/views/statistics/call/telephonist.vue
  14. 1 0
      src/views/statistics/call/transferOut.vue
  15. 174 0
      src/views/statistics/center/frequentlyEvent.vue
  16. 125 0
      src/views/statistics/center/frequentlyTel.vue
  17. 1 0
      src/views/statistics/department/delay.vue
  18. 1 0
      src/views/statistics/department/handle.vue
  19. 1 0
      src/views/statistics/department/overdue.vue
  20. 1 0
      src/views/statistics/department/satisfied.vue
  21. 1 0
      src/views/statistics/knowledge/data.vue
  22. 1 0
      src/views/statistics/order/acceptTopTen.vue
  23. 1 0
      src/views/statistics/order/centerCount.vue
  24. 1 0
      src/views/statistics/order/departmentAcceptType.vue
  25. 1 0
      src/views/statistics/order/orgHotspot.vue
  26. 1 0
      src/views/statistics/order/specials.vue
  27. 1 0
      src/views/statistics/order/visitCount.vue
  28. 1 0
      src/views/statistics/order/visitDiscontent.vue

+ 2 - 1
src/components/ProTable/components/Pagination.vue

@@ -7,6 +7,7 @@
 			:layout="layout"
 			:total="total"
 			:small="small"
+			:page-sizes="pageSizes"
 			@size-change="handleSizeChange"
 			@current-change="handleCurrentChange"
 		/>
@@ -32,7 +33,7 @@ const props = defineProps({
 	pageSizes: {
 		type: Array,
 		default() {
-			return [10, 20, 30, 50, 100];
+			return [10, 20, 50, 100, 200];
 		},
 	},
 	// 移动端页码按钮的数量端默认值5

+ 16 - 0
src/views/business/order/index.vue

@@ -325,6 +325,7 @@
 					<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">交办单导出 </el-button>-->
 				</template>
 				<template #expiredStatus="{ row }">
 					<span :class="'overdue-status-' + row.expiredStatus" :title="row.expiredStatusText"></span>
@@ -379,6 +380,7 @@ import { 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 { orderLexiconDelete } from '@/api/auxiliary/orderLexicon';
 
 // 引入组件
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
@@ -704,6 +706,20 @@ const exportCurrent = () => {
 const exportAll = () => {
 	console.log('导出全部', proTableRef.value);
 };
+// 交办单导出
+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(() => {})
+		.catch(() => {});
+};
 onMounted(() => {
 	getBaseData();
 	queryList();

+ 10 - 2
src/views/business/publish/component/Order-publish-edit.vue

@@ -91,14 +91,22 @@
 							></el-input>
 						</el-form-item>
 					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="门户是否公开" prop="publishState" :rules="[{ required: false, message: '请输入整改后内容', trigger: 'blur' }]">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="门户是否公开" prop="publishState">
 							<el-radio-group v-model="state.ruleForm.publishState" disabled>
 								<el-radio :label="false">不公开</el-radio>
 								<el-radio :label="true">公开</el-radio>
 							</el-radio-group>
 						</el-form-item>
 					</el-col>
+<!--          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+            <el-form-item label="门户是否公开" prop="publishState" >
+              <el-radio-group v-model="state.ruleForm.publishState" disabled>
+                <el-radio :label="true">已得到解决</el-radio>
+                <el-radio :label="false">未得到解决</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>-->
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="实际办理部门">
 							{{ state.publishDetail.actualHandleOrgName?.value }}

+ 10 - 2
src/views/business/publish/component/Order-publish.vue

@@ -126,14 +126,22 @@
 							></el-input>
 						</el-form-item>
 					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="门户是否公开" prop="publishState" :rules="[{ required: false, message: '请输入整改后内容', trigger: 'blur' }]">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="门户是否公开" prop="publishState" >
 							<el-radio-group v-model="state.ruleForm.publishState" :disabled="disabled">
 								<el-radio :label="false">不公开</el-radio>
 								<el-radio :label="true">公开</el-radio>
 							</el-radio-group>
 						</el-form-item>
 					</el-col>
+<!--          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+            <el-form-item label="处理结果" prop="publishState">
+              <el-radio-group v-model="state.ruleForm.publishState" :disabled="disabled">
+                <el-radio :label="true">已得到解决</el-radio>
+                <el-radio :label="false">未得到解决</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>-->
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="实际办理部门">
 							{{ state.publishDetail.actualHandleOrgName?.value }}

+ 220 - 0
src/views/business/publish/component/Order-redo.vue

@@ -0,0 +1,220 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" draggable title="工单重办" width="50%" append-to-body destroy-on-close @close="close">
+		<div class="collapse-container">
+			<el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+						<el-form-item label="退回节点" prop="nextStepCode" :rules="[{ required: true, message: '请选退回节点', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选退回节点" class="w100" @change="selectTrace">
+								<el-option v-for="item in steps" :value="item.key" :key="item.key" :label="item.value"> </el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.nextStepCode">
+						<el-form-item label="办理对象" prop="nextHandlers" :rules="[{ required: true, message: '请选择办理对象', trigger: 'change' }]">
+							<el-select-v2
+								v-model="state.ruleForm.nextHandlers"
+								:options="stepsItems"
+								placeholder="请选择办理对象"
+								class="w100"
+								multiple
+								clearable
+								collapse-tags
+								collapse-tags-tooltip
+								filterable
+								value-key="key"
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+						<el-form-item label="延期" prop="timeLimitCount" :rules="[{ required: false, message: '请输入延期申请数量', trigger: 'blur' }]">
+							<el-row :gutter="10">
+								<el-col :xs="24" :sm="12" :md="12" :lg="14" :xl="18">
+									<el-select
+										v-model="state.ruleForm.timeLimitCount"
+										placeholder="请选择"
+										class="w100"
+										:rules="[{ required: true, message: '请选择延期数量', trigger: 'change' }]"
+									>
+										<el-option v-for="item in delayOptions" :value="item.value" :key="item.value" :label="item.label" />
+									</el-select>
+								</el-col>
+								<el-col :xs="24" :sm="12" :md="12" :lg="10" :xl="6"> 工作日 </el-col>
+							</el-row>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="错件类别" prop="timeLimitCount" :rules="[{ required: true, message: '请选择错件类别', trigger: 'change' }]">
+							<el-row>
+								<el-col :span="24" v-for="(item, index) in state.ruleForm.visitDetails" :key="item.id" class="mb18">
+									<el-form-item
+										:prop="`visitDetails.${index}.orgHandledAttitude`"
+										:rules="[{ required: true, message: '请选择错件类别', trigger: 'change' }]"
+									>
+										<template #label>
+											{{ item.name }}
+										</template>
+										<el-select
+											v-model="item.orgHandledAttitude"
+											placeholder="请选择错件类别"
+											class="w100"
+											value-key="value"
+											@change="
+												(val) => {
+													item.orgHandledAttitude.value = val.label;
+													item.orgHandledAttitude.key = val.value;
+												}
+											"
+										>
+											<el-option v-for="items in reasonOptions" :key="items.value" :label="items.label" :value="items" />
+										</el-select>
+									</el-form-item>
+								</el-col>
+							</el-row>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="重办意见" prop="reason" :rules="[{ required: true, message: '请填写重办意见', trigger: 'blur' }]">
+							<el-input v-model="state.ruleForm.reason" type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" placeholder="请填写重办意见" />
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+		</div>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">重办</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+<script setup lang="ts" name="SpecialDialog">
+import { reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { storeToRefs } from 'pinia';
+import { useUserInfo } from '@/stores/userInfo';
+import { specialApplyBase, specialApply } from '@/api/business/special';
+
+// 引入组件
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false, // 是否显示弹窗
+	loading: false, // 是否显示加载
+	ruleForm: {
+		nextStepCode: null, // 特提节点
+		cause: null, // 特提原因
+		reason: null, // 特提理由
+		nextHandlers: [], // 处理对象
+		visitDetails: [
+			{
+				name: '热线中心',
+				orgNoSatisfiedReason: null,
+			},
+			{
+				name: '一级部门',
+				orgNoSatisfiedReason: null,
+			},
+		],
+	},
+	orderDetail: {}, // 工单详情
+	workflowId: null, // 工作流id
+});
+const ruleFormRef = ref<RefType>();
+const storesUserInfo = useUserInfo();
+const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
+const specialReason = ref<EmptyArrayType>([]); // 特提理由
+const steps = ref<EmptyArrayType>([]); // 特提节点
+const stepsItems = ref<EmptyArrayType>([]); // 处理对象
+const delayOptions = ref([
+	{ value: 1, label: '1' },
+	{ value: 3, label: '3' },
+	{ value: 5, label: '5' },
+]); // 延期
+const reasonOptions = ref<EmptyArrayType>([
+	{
+		label: 'A:不录,烧录,录入错误',
+		id: 1,
+	},
+	{
+		label: 'B:错误退回',
+		id: 2,
+	},
+]); // 错件原因
+/**
+ * @description 打开弹窗
+ * @param {object} val 工单详情
+ */
+const openDialog = async (val: any) => {
+	state.orderDetail = val;
+	state.workflowId = val.workflowId;
+	state.loading = true;
+	state.dialogVisible = true;
+	try {
+		const [baseRes] = await Promise.all([specialApplyBase(val.workflowId)]);
+		steps.value = baseRes.result?.step?.steps ?? [];
+		specialReason.value = baseRes.result.specialReason ?? [];
+	} catch (e) {
+		console.log(e);
+	} finally {
+		state.loading = false;
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+	steps.value = [];
+	stepsItems.value = [];
+};
+// 选择节点确定办理对象
+const selectTrace = (val: any) => {
+	const step = steps.value.find((item) => item.key === val);
+	state.ruleForm.nextStepName = step?.value;
+	ruleFormRef.value?.resetFields('nextHandlers');
+	stepsItems.value = step?.items ?? [];
+	stepsItems.value = stepsItems.value.map((item: any) => {
+		return {
+			value: {
+				...item,
+			},
+			label: item.value,
+		};
+	});
+};
+// 提交
+const filesFormat = ref<EmptyArrayType>([]); // 附件列表
+const onSubmit = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+		let request = {
+			...state.ruleForm,
+			workflowId: state.workflowId,
+			orderId: state.orderDetail.id,
+			files: filesFormat.value,
+		};
+		specialApply(request)
+			.then(() => {
+				state.loading = false;
+				closeDialog();
+				emit('updateList');
+				ElMessage.success('特提申请成功');
+			})
+			.catch(() => {
+				state.loading = false;
+			});
+	});
+};
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 11 - 2
src/views/business/publish/todo.vue

@@ -56,12 +56,15 @@
 				<!-- 表格操作 -->
 				<template #operation="{ row }">
 					<el-button link type="primary" @click="publish(row)" title="发布工单" v-auth="'business:publish:todo:publish'"> 发布 </el-button>
+<!--					<el-button link type="primary" @click="redo(row)" title="重办工单" v-auth="'business:publish:todo:publish'"> 重办 </el-button>-->
 					<order-detail :order="row" @updateList="queryList" />
 				</template>
 			</ProTable>
 		</el-card>
 		<!-- 工单发布详情 -->
 		<order-publish ref="orderPublishRef" @updateList="queryList" />
+		<!-- 工单重办详情 -->
+		<order-redo ref="orderRedoRef" @updateList="queryList" />
 	</div>
 </template>
 <script setup lang="tsx" name="businessPublishTodo">
@@ -71,8 +74,9 @@ import { throttle } from '@/utils/tools';
 import { formatDate } from '@/utils/formatTime';
 import { batchPublishOrder, publishList } from '@/api/todo/publish';
 // 引入组件
-const OrderPublish = defineAsyncComponent(() => import('@/views/business/publish/component/Order-publish.vue'));
+const OrderPublish = defineAsyncComponent(() => import('@/views/business/publish/component/Order-publish.vue')); // 发布
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+const OrderRedo = defineAsyncComponent(() => import('@/views/business/publish/component/Order-redo.vue')); // 重办
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref
 const state = reactive({
@@ -129,7 +133,7 @@ const columns = ref<any[]>([
 			return <span>{formatDate(scope.row.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
 		},
 	},
-	{ prop: 'operation', label: '操作', fixed: 'right', width: 140, align: 'center' },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 180, align: 'center' },
 ]);
 /** 获取列表 */
 const queryList = throttle(() => {
@@ -175,6 +179,11 @@ const orderPublishRef = ref<RefType>(); // 工单发布详情ref
 const publish = (row: any) => {
 	orderPublishRef.value.openDialog(row);
 };
+// 重办
+const orderRedoRef = ref<RefType>(); // 工单重办ref
+const redo = (row: any) => {
+	orderRedoRef.value.openDialog(row);
+};
 onMounted(() => {
 	queryList();
 });

+ 2 - 1
src/views/knowledge/index/edit.vue

@@ -373,7 +373,7 @@ const validatePass = (rule: any, value: any, callback: any) => {
 	if (value === '' || value === null) {
 		callback(new Error('请输入知识标题'));
 	} else if (Repeat.value) {
-		callback(new Error('当前知识标题存在重复标题'));
+		callback(new Error('有相似标题,请检查!'));
 	} else {
 		callback();
 	}
@@ -430,6 +430,7 @@ const onSubmitReview = async (formEl: FormInstance | undefined) => {
 	await formEl.validate((valid: boolean) => {
 		if (!valid) return;
 		state.loading = true;
+    isRepeat();
     state.ruleForm.files = filesFormat.value;
 		const submitObj = other.deepClone(state.ruleForm);
 		Reflect.deleteProperty(submitObj, 'creationTime');

+ 1 - 0
src/views/statistics/call/hotNumber.vue

@@ -17,6 +17,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item label-width="0">

+ 1 - 0
src/views/statistics/call/index.vue

@@ -17,6 +17,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item label-width="0">

+ 1 - 0
src/views/statistics/call/seatsRest.vue

@@ -20,6 +20,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item label-width="0">

+ 1 - 0
src/views/statistics/call/talkTime.vue

@@ -14,6 +14,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item label-width="0">

+ 1 - 0
src/views/statistics/call/telephone.vue

@@ -16,6 +16,7 @@
 								:shortcuts="shortcuts"
 								@change="queryList"
 								value-format="YYYY-MM-DD"
+                :clearable="false"
 							/>
 						</el-form-item>
 					</el-col>

+ 1 - 0
src/views/statistics/call/telephonist.vue

@@ -14,6 +14,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>

+ 1 - 0
src/views/statistics/call/transferOut.vue

@@ -20,6 +20,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item label-width="0">

+ 174 - 0
src/views/statistics/center/frequentlyEvent.vue

@@ -0,0 +1,174 @@
+<template>
+  <div class="statistics-center-frequently-event-container layout-pd">
+    <!-- 搜索  -->
+    <el-card shadow="never">
+      <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+        <el-form-item label="事发地址" prop="AreaCodes">
+          <el-cascader
+            :options="state.areaOptions"
+            filterable
+            :show-all-levels="false"
+            :props="{ checkStrictly: true, value: 'id', label: 'areaName', multiple: true }"
+            placeholder="请选择事发地址"
+            clearable
+            class="w100"
+            v-model="state.queryParams.AreaCodes"
+            collapse-tags
+            collapse-tags-tooltip
+            :max-collapse-tags="2"
+          >
+          </el-cascader>
+        </el-form-item>
+        <el-form-item label="受理类型" prop="AcceptTypes">
+          <el-select
+            v-model="state.queryParams.AcceptTypes"
+            placeholder="请选择受理类型"
+            multiple
+            clearable
+            class="w100"
+            collapse-tags
+            collapse-tags-tooltip
+            :max-collapse-tags="2"
+          >
+            <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="HotspotIds">
+          <hot-spot-select
+            v-model="state.queryParams.HotspotIds"
+            class="w100"
+            :hotspotExternal="state.hotspotExternal"
+            show-checkbox
+            ref="hotSpotRef"
+          />
+        </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="timeStartChangeCr"
+            value-format="YYYY-MM-DD[T]HH:mm:ss"
+          />
+        </el-form-item>
+        <el-form-item label-width="0">
+          <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+          <el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading">
+            <SvgIcon name="ele-Refresh" class="mr5" />重置
+          </el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+    <el-card shadow="never">
+      <ProTable
+        ref="proTableRef"
+        :columns="columns"
+        :data="state.tableData"
+        @updateTable="queryList"
+        :loading="state.loading"
+        :pagination="false"
+        border
+        @sort-change="sortChange"
+      >
+      </ProTable>
+    </el-card>
+  </div>
+</template>
+<script setup lang="tsx" name="statisticsCenterFrequentlyEvent">
+import { defineAsyncComponent, onMounted, reactive, ref } from "vue";
+import { ElButton, FormInstance } from 'element-plus';
+import { throttle } from '@/utils/tools';
+import { callRest } from '@/api/statistics/call';
+import { shortcuts } from '@/utils/constants';
+import dayjs from 'dayjs';
+
+const HotSpotSelect = defineAsyncComponent(() => import('@/components/Hotspot/index.vue')); // 选择热点
+const proTableRef = ref<RefType>(); // 表格ref
+// 表格配置项
+const columns = ref<any[]>([
+  { type: 'index', fixed: 'left', width: 55, label: '序号', align: 'center' },
+  { prop: 'staffNo', label: '事发地址' },
+  { prop: 'userName', label: '标题',},
+  { prop: 'restCount', label: '受理类型'  },
+  { prop: 'restCount', label: '热点分类'  },
+  { prop: 'restCount', label: '预警次数'  },
+]);
+// 定义变量内容
+const ruleFormRef = ref<RefType>(); // 表单ref
+const state = reactive({
+  queryParams: {
+    // 查询条件
+    StaffNo: null, // 工号
+    UserName: null, // 坐席名称
+    SortField: 'restDuration', // 排序字段
+    SortRule: 1, // 排序规则
+    crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')],
+  },
+  tableData: [], //表单
+  loading: false, // 加载
+  total: 0, // 总数
+});
+
+const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
+  if (val) {
+    state.queryParams[startKey] = val[0];
+    state.queryParams[endKey] = val[1];
+  } else {
+    state.queryParams[startKey] = '';
+    state.queryParams[endKey] = '';
+  }
+};
+// 受理时间
+const timeStartChangeCr = (val: string[]) => {
+  handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
+};
+
+/** 获取列表 */
+const queryList = throttle(() => {
+  state.loading = true;
+  let StartTime = null;
+  let EndTime = null;
+  if (state.queryParams?.crTime) {
+    StartTime = state.queryParams?.crTime[0];
+    EndTime = state.queryParams?.crTime[1];
+  }
+  const request = {
+    StartTime,
+    EndTime,
+    StaffNo: state.queryParams.StaffNo,
+    UserName: state.queryParams.UserName,
+    Keyword: state.queryParams.Keyword,
+    SortField: state.queryParams.SortField,
+    SortRule: state.queryParams.SortRule,
+  };
+  callRest(request)
+    .then((res: any) => {
+      state.tableData = res.result ?? [];
+      state.total = res.result?.total ?? 0;
+      state.loading = false;
+    })
+    .catch(() => {
+      state.loading = false;
+    });
+}, 300);
+// 排序
+const sortChange = (val: any) => {
+  state.queryParams.SortField = val.order ? val.prop : null;
+  // 0 升序 1 降序
+  state.queryParams.SortRule = val.order ? (val.order == 'descending' ? 1 : 0) : null;
+  queryList();
+};
+/** 重置按钮操作 */
+const resetQuery = throttle((formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.resetFields();
+  queryList();
+}, 300);
+onMounted(() => {
+  queryList();
+});
+</script>

+ 125 - 0
src/views/statistics/center/frequentlyTel.vue

@@ -0,0 +1,125 @@
+<template>
+  <div class="statistics-call-seats-rest-container layout-pd">
+    <!-- 搜索  -->
+    <el-card shadow="never">
+      <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+        <el-form-item label="姓名" prop="StaffNo">
+          <el-input v-model="state.queryParams.StaffNo" placeholder="姓名" clearable @keyup.enter="queryList" class="keyword-input" />
+        </el-form-item>
+        <el-form-item label="来电号码" prop="UserName">
+          <el-input v-model="state.queryParams.UserName" placeholder="来电号码" clearable @keyup.enter="queryList" class="keyword-input" />
+        </el-form-item>
+        <el-form-item label="时间段" prop="crTime">
+          <el-date-picker
+            v-model="state.queryParams.crTime"
+            type="daterange"
+            unlink-panels
+            range-separator="至"
+            start-placeholder="开始时间"
+            end-placeholder="结束时间"
+            :shortcuts="shortcuts"
+            @change="queryList"
+            value-format="YYYY-MM-DD"
+          />
+        </el-form-item>
+        <el-form-item label-width="0">
+          <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+          <el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading">
+            <SvgIcon name="ele-Refresh" class="mr5" />重置
+          </el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+    <el-card shadow="never">
+      <ProTable
+        ref="proTableRef"
+        :columns="columns"
+        :data="state.tableData"
+        @updateTable="queryList"
+        :loading="state.loading"
+        :pagination="false"
+        border
+        @sort-change="sortChange"
+      >
+      </ProTable>
+    </el-card>
+  </div>
+</template>
+<script setup lang="tsx" name="statisticsCenterFrequentlyTel">
+import { onMounted, reactive, ref } from 'vue';
+import { ElButton, FormInstance } from 'element-plus';
+import { throttle } from '@/utils/tools';
+import { callRest } from '@/api/statistics/call';
+import { shortcuts } from '@/utils/constants';
+
+import dayjs from 'dayjs';
+
+const proTableRef = ref<RefType>(); // 表格ref
+// 表格配置项
+const columns = ref<any[]>([
+  { type: 'index', fixed: 'left', width: 55, label: '序号', align: 'center' },
+  { prop: 'staffNo', label: '姓名' },
+  { prop: 'userName', label: '来电号码'},
+  { prop: 'restCount', label: '工单数' },
+]);
+// 定义变量内容
+const ruleFormRef = ref<RefType>(); // 表单ref
+const state = reactive({
+  queryParams: {
+    // 查询条件
+    StaffNo: null, // 工号
+    UserName: null, // 坐席名称
+    SortField: 'restDuration', // 排序字段
+    SortRule: 1, // 排序规则
+    crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')],
+  },
+  tableData: [], //表单
+  loading: false, // 加载
+  total: 0, // 总数
+});
+
+/** 获取列表 */
+const queryList = throttle(() => {
+  state.loading = true;
+  let StartTime = null;
+  let EndTime = null;
+  if (state.queryParams?.crTime) {
+    StartTime = state.queryParams?.crTime[0];
+    EndTime = state.queryParams?.crTime[1];
+  }
+  const request = {
+    StartTime,
+    EndTime,
+    StaffNo: state.queryParams.StaffNo,
+    UserName: state.queryParams.UserName,
+    Keyword: state.queryParams.Keyword,
+    SortField: state.queryParams.SortField,
+    SortRule: state.queryParams.SortRule,
+  };
+  callRest(request)
+    .then((res: any) => {
+      state.tableData = res.result ?? [];
+      state.total = res.result?.total ?? 0;
+      state.loading = false;
+    })
+    .catch(() => {
+      state.loading = false;
+    });
+}, 300);
+// 排序
+const sortChange = (val: any) => {
+  state.queryParams.SortField = val.order ? val.prop : null;
+  // 0 升序 1 降序
+  state.queryParams.SortRule = val.order ? (val.order == 'descending' ? 1 : 0) : null;
+  queryList();
+};
+/** 重置按钮操作 */
+const resetQuery = throttle((formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.resetFields();
+  queryList();
+}, 300);
+onMounted(() => {
+  queryList();
+});
+</script>

+ 1 - 0
src/views/statistics/department/delay.vue

@@ -17,6 +17,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>

+ 1 - 0
src/views/statistics/department/handle.vue

@@ -17,6 +17,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>

+ 1 - 0
src/views/statistics/department/overdue.vue

@@ -17,6 +17,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>

+ 1 - 0
src/views/statistics/department/satisfied.vue

@@ -17,6 +17,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item label="类型" prop="TypeId">

+ 1 - 0
src/views/statistics/knowledge/data.vue

@@ -17,6 +17,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>

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

@@ -14,6 +14,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>

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

@@ -17,6 +17,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>

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

@@ -21,6 +21,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>

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

@@ -14,6 +14,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>

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

@@ -14,6 +14,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>

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

@@ -17,6 +17,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>

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

@@ -17,6 +17,7 @@
 						:shortcuts="shortcuts"
 						@change="queryList"
 						value-format="YYYY-MM-DD"
+            :clearable="false"
 					/>
 				</el-form-item>
 				<el-form-item>