Pārlūkot izejas kodu

reactor:346 新增【特殊号码管理】的功能;347 部分市州通用-关于【甄别管理】目录下新增和调整数据查看范围等需求;349 【提起甄别审批统计】页面新增“中心初审”审批统计

zhangchong 1 mēnesi atpakaļ
vecāks
revīzija
c6f458fb6f

+ 1 - 1
.env.development

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

+ 71 - 0
src/api/auxiliary/specialNumber.ts

@@ -0,0 +1,71 @@
+/*
+ * @Author: zc
+ * @description 辅助功能-特殊号码管理
+ */
+import request from '@/utils/request';
+/**
+ * @description 获取特殊号码列表
+ * @param {object} params
+ */
+export const getSpecialNumberList = (params?: object) => {
+	return request({
+		url: '/api/v1/Special/number/list',
+		method: 'get',
+		params,
+	});
+};
+/**
+ * @description 新增特殊号码
+ * @param {object} data
+ */
+export const addSpecialNumber = (data: object) => {
+	return request({
+		url: '/api/v1/Special/number/add',
+		method: 'post',
+		data,
+	});
+};
+/**
+ * @description 删除特殊号码
+ * @param {object} data
+ */
+export const deleteSpecialNumber = (data: object) => {
+	return request({
+		url: '/api/v1/Special/number/remove',
+		method: 'delete',
+		data,
+	});
+};
+/**
+ * @description 根据id查询特殊号码详情
+ * @param {object} params
+ */
+export const getSpecialNumberDetail = (params: object) => {
+	return request({
+		url: '/api/v1/Special/number/info',
+		method: 'get',
+		params,
+	});
+};
+/**
+ * @description 更新特殊号码
+ * @param {object} data
+ */
+export const updateSpecialNumber = (data: object) => {
+	return request({
+		url: '/api/v1/Special/number/update',
+		method: 'put',
+		data,
+	});
+};
+/**
+ * @description 根据电话号码查询特殊号码详情
+ * @param {object} params
+ */
+export const getSpecialNumberDetailByPhone = (params: object) => {
+	return request({
+		url: '/api/v1/Special/number/info/num',
+		method: 'get',
+		params,
+	});
+};

+ 17 - 1
src/layout/navBars/breadcrumb/zgTel.vue

@@ -332,7 +332,7 @@
 <script setup lang="ts" name="zgTelControl">
 import { computed, onMounted, reactive, ref } from 'vue';
 import { getNowDateTime } from '@/utils/constants';
-import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { ElMessage, ElMessageBox, ElNotification, FormInstance } from 'element-plus';
 import { useRouter } from 'vue-router';
 import { useWebSocket } from '@/hooks/useWebsocket';
 import { useIntervalFn } from '@vueuse/shared';
@@ -352,6 +352,7 @@ import XEUtils from 'xe-utils';
 import { submitLog } from '@/api/public/log';
 import { useTransition } from '@vueuse/core';
 import { busyOff, busyOn, telRestBaseData } from '@/api/public/wex';
+import { getSpecialNumberDetailByPhone } from '@/api/auxiliary/specialNumber';
 
 const globalState = useGlobalState(); // 全局变量
 const state = reactive<any>({
@@ -2089,6 +2090,21 @@ const evtCallAlerting = (data: any) => {
 					identityType: strDigit, // 按键接收(2:市民 1:企业) 默认市民
 				},
 			});
+
+			if (['ZiGong'].includes(themeConfig.value.appScope)) {
+				//  判断来电号码加0或者去0是否和
+				getSpecialNumberDetailByPhone({ PhoneNumber: strTelNumber }).then((res: any) => {
+					console.log(res, '1111');
+					// 如果来电电话在在特殊号码配置中 需要提示信息
+					if (res.notes) {
+						ElNotification({
+							title: '来电提醒',
+							message: res.notes,
+							type: 'info',
+						});
+					}
+				});
+			}
 		}
 	}
 	const request = {

+ 85 - 0
src/views/auxiliary/specialNumber/components/Number-add.vue

@@ -0,0 +1,85 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" width="800px" draggable title="新增特殊号码" @close="close" append-to-body destroy-on-close>
+		<el-form :model="state.ruleForm" label-width="100px" ref="ruleFormRef" :disabled="loading">
+			<el-form-item label="电话号码" prop="phoneNumber" :rules="[{ required: true, message: '请填写电话号码', trigger: 'blur' }]">
+				<el-input v-model="state.ruleForm.phoneNumber" placeholder="请填写电话号码" clearable></el-input>
+			</el-form-item>
+			<el-form-item label="备注" prop="notes" :rules="[{ required: true, message: '请填写备注', trigger: 'blur' }]">
+				<el-input v-model="state.ruleForm.notes" placeholder="请填写备注" type="textarea" :autosize="{ minRows: 4, maxRows: 8 }"></el-input>
+			</el-form-item>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="loading">确 定</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { throttle } from '@/utils/tools';
+import { addSpecialNumber } from '@/api/auxiliary/specialNumber';
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {
+		phoneNumber: null, // 电话号码
+		notes: null, // 备注
+	},
+});
+let loading = ref<boolean>(false); // 加载状态
+// 打开弹窗
+const ruleFormRef = ref<RefType>();
+const openDialog = async () => {
+	ruleFormRef.value?.resetFields();
+	try {
+		state.dialogVisible = true;
+	} catch (error) {
+		console.log(error);
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.resetFields();
+	ruleFormRef.value?.resetFields();
+};
+// 新增
+const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		loading.value = true;
+		const request = {
+			...state.ruleForm,
+		};
+		addSpecialNumber(request)
+			.then(() => {
+				ElMessage({
+					message: '新增成功',
+					type: 'success',
+				});
+				emit('updateList');
+			})
+			.catch((error) => {})
+			.finally(() => {
+				loading.value = false;
+				closeDialog();
+			});
+	});
+}, 300);
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 88 - 0
src/views/auxiliary/specialNumber/components/Number-edit.vue

@@ -0,0 +1,88 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" width="800px" draggable title="编辑特殊号码" @close="close" append-to-body destroy-on-close>
+		<el-form :model="state.ruleForm" label-width="100px" ref="ruleFormRef" :disabled="loading">
+			<el-form-item label="电话号码" prop="phoneNumber" :rules="[{ required: true, message: '请填写电话号码', trigger: 'blur' }]">
+				<el-input v-model="state.ruleForm.phoneNumber" placeholder="请填写电话号码" clearable></el-input>
+			</el-form-item>
+			<el-form-item label="备注" prop="notes" :rules="[{ required: true, message: '请填写备注', trigger: 'blur' }]">
+				<el-input v-model="state.ruleForm.notes" placeholder="请填写备注" type="textarea" :autosize="{ minRows: 4, maxRows: 8 }"></el-input>
+			</el-form-item>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="loading">确 定</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { throttle } from '@/utils/tools';
+import { getSpecialNumberDetail, updateSpecialNumber } from '@/api/auxiliary/specialNumber';
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {
+		phoneNumber: null, // 电话号码
+		notes: null, // 备注
+	},
+});
+let loading = ref<boolean>(false); // 加载状态
+// 打开弹窗
+const ruleFormRef = ref<RefType>();
+const openDialog = async (Id: string) => {
+	state.dialogVisible = true;
+	try {
+		const { result } = await getSpecialNumberDetail({ Id });
+		state.ruleForm = result;
+	} catch (error) {
+		console.log(error);
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.resetFields();
+	ruleFormRef.value?.resetFields();
+};
+// 新增
+const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		loading.value = true;
+		const request = {
+			...state.ruleForm,
+		};
+		updateSpecialNumber(request)
+			.then(() => {
+				ElMessage({
+					message: '修改成功',
+					type: 'success',
+				});
+				loading.value = false;
+				closeDialog();
+				emit('updateList');
+			})
+			.catch(() => {
+				// 新增失败
+				loading.value = false;
+				closeDialog();
+			});
+	});
+}, 300);
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 167 - 0
src/views/auxiliary/specialNumber/index.vue

@@ -0,0 +1,167 @@
+<template>
+	<div class="auxiliary-special-number-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent>
+				<el-form-item label="电话号码" prop="PhoneNumber">
+					<el-input v-model="state.queryParams.PhoneNumber" 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)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+				</el-form-item>
+			</el-form>
+			<vxe-toolbar
+				ref="toolbarRef"
+				:loading="state.loading"
+				custom
+				:refresh="{
+					queryMethod: handleQuery,
+				}"
+			>
+				<template #buttons>
+					<el-button type="primary" @click="onAdd" v-auth="'auxiliary:specialNumber:add'">
+						<SvgIcon name="ele-Plus" class="mr5" />新增特殊号码
+					</el-button>
+				</template>
+			</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, useKey: true }"
+					:row-config="{ isCurrent: true, isHover: true, useKey: true, height: 30 }"
+					ref="tableRef"
+					height="auto"
+					auto-resize
+					show-overflow
+					:scrollY="{ enabled: true, gt: 100 }"
+					id="auxiliarySpecialNumber"
+					:custom-config="{ storage: true }"
+					:sort-config="{ remote: true }"
+					@sort-change="sortChange"
+				>
+					<vxe-column field="phoneNumber" title="电话号码"></vxe-column>
+					<vxe-column field="notes" title="备注" min-width="200"></vxe-column>
+					<vxe-column field="creationTime" title="创建时间" width="160" sortable>
+						<template #default="{ row }">
+							{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column title="操作" fixed="right" width="130" align="center">
+						<template #default="{ row }">
+							<el-button link type="primary" @click="onEdit(row)" v-auth="'auxiliary:specialNumber:edit'" title="编辑"> 编辑 </el-button>
+							<el-button link type="danger" @click="onDelete(row)" v-auth="'auxiliary:specialNumber:delete'" title="删除"> 删除 </el-button>
+						</template>
+					</vxe-column>
+				</vxe-table>
+			</div>
+			<pagination
+				@pagination="queryList"
+				:total="state.total"
+				v-model:current-page="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+				:disabled="state.loading"
+			/>
+		</div>
+		<!--  新增  -->
+		<special-number-add ref="specialNumberAddRef" @updateList="queryList" />
+		<!--  编辑  -->
+		<special-number-edit ref="specialNumberEditRef" @updateList="queryList" />
+	</div>
+</template>
+
+<script lang="tsx" setup name="auxiliarySpecialNumber">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { formatDate } from '@/utils/formatTime';
+import { deleteSpecialNumber, getSpecialNumberList } from '@/api/auxiliary/specialNumber';
+// 引入组件
+const SpecialNumberAdd = defineAsyncComponent(() => import('@/views/auxiliary/specialNumber/components/Number-add.vue')); // 新增
+const SpecialNumberEdit = defineAsyncComponent(() => import('@/views/auxiliary/specialNumber/components/Number-edit.vue')); // 编辑
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+
+// 定义变量内容
+const state = reactive({
+	loading: false, // 加载状态
+	queryParams: {
+		// 查询参数
+		PageIndex: 1,
+		PageSize: 20,
+		PhoneNumber: null, // 电话号码
+		SortField: null,
+		SortRule: null,
+	},
+	total: 0, // 总条数
+	tableData: [], // 表格数据
+});
+const ruleFormRef = ref<any>(null); // 表单ref
+/** 搜索按钮操作 */
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+// 获取列表
+const queryList = () => {
+	state.loading = true;
+	getSpecialNumberList(state.queryParams)
+		.then((res) => {
+			state.loading = false;
+			state.tableData = res.result.items ?? [];
+			state.total = res.result.total ?? 0;
+		})
+		.finally(() => {
+			state.loading = false;
+		});
+};
+// 排序
+const sortChange = (val: any) => {
+	state.queryParams.SortField = val.order ? val.field : null;
+	// 0 升序 1 降序
+	state.queryParams.SortRule = val.order ? (val.order == 'desc' ? 1 : 0) : null;
+	queryList();
+};
+// 重置表单
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+// 新增
+const specialNumberAddRef = ref<RefType>();
+const onAdd = () => {
+	specialNumberAddRef.value.openDialog();
+};
+// 修改
+const specialNumberEditRef = ref<RefType>();
+const onEdit = (row: any) => {
+	specialNumberEditRef.value.openDialog(row.id);
+};
+// 删除
+const onDelete = (row: any) => {
+	ElMessageBox.confirm(`您确定要删除特殊号码【${row.phoneNumber}】吗?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+			deleteSpecialNumber({ id: row.id }).then(() => {
+				ElMessage.success('操作成功');
+				queryList();
+			});
+		})
+		.catch(() => {});
+};
+const tableRef = ref<RefType>();
+const toolbarRef = ref<RefType>();
+// 页面加载时
+onMounted(() => {
+	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
+});
+</script>

+ 17 - 0
src/views/business/discern/YBApply.vue

@@ -2,6 +2,22 @@
 	<div class="business-discern-apply-container layout-padding">
 		<div class="layout-padding-auto layout-padding-view pd20">
 			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline :disabled="state.loading">
+				<el-form-item label="数据范围" prop="DataScope">
+					<el-segmented
+						:options="[
+							{
+								value: 1,
+								label: '本级部门',
+							},
+							{
+								value: 0,
+								label: '全部',
+							},
+						]"
+						v-model="state.queryParams.DataScope"
+						@change="handleQuery"
+					/>
+				</el-form-item>
 				<el-form-item label="甄别退回" prop="ScreenSendBack">
 					<el-select v-model="state.queryParams.ScreenSendBack" placeholder="请选择甄别退回" @change="handleQuery">
 						<el-option :value="0" label="全部" />
@@ -269,6 +285,7 @@ const state = reactive<any>({
 		EndVisitTime: null,
 		SortField: null,
 		SortRule: null,
+		DataScope: 1, // 数据范围 默认本级部门
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 21 - 4
src/views/business/discern/ZGApply.vue

@@ -6,6 +6,22 @@
 				<el-tab-pane :name="1" label="中心话务甄别" v-if="userInfos.isCenter" :disabled="state.loading"></el-tab-pane>
 			</el-tabs>
 			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline :disabled="state.loading">
+				<el-form-item label="数据范围" prop="DataScope">
+					<el-segmented
+						:options="[
+							{
+								value: 1,
+								label: '本级部门',
+							},
+							{
+								value: 0,
+								label: '全部',
+							},
+						]"
+						v-model="state.queryParams.DataScope"
+						@change="handleQuery"
+					/>
+				</el-form-item>
 				<el-form-item label="甄别退回" prop="ScreenSendBack">
 					<el-select v-model="state.queryParams.ScreenSendBack" placeholder="请选择甄别退回" @change="handleQuery">
 						<el-option :value="0" label="全部" />
@@ -94,8 +110,8 @@
 						<template #default="{ row }">
 							{{ formatDate(row.order?.actualHandleTime, 'YYYY-mm-dd HH:MM:SS') }}
 						</template>
-          </vxe-column>
-          <vxe-column field="order.filedTime" title="办结时间" sortable width="160">
+					</vxe-column>
+					<vxe-column field="order.filedTime" title="办结时间" sortable width="160">
 						<template #default="{ row }">
 							{{ formatDate(row.order?.filedTime, 'YYYY-mm-dd HH:MM:SS') }}
 						</template>
@@ -291,6 +307,7 @@ const state = reactive<any>({
 		SortRule: null,
 		ScreenType: 0, // 部门还是中心 默认部门
 		NameOrNo: null, // 受理人
+		DataScope: 1, // 数据范围 默认本级部门
 	},
 	tableData: [], //表单
 	loading: false, // 加载
@@ -348,13 +365,13 @@ const queryList = () => {
 				state.tableData = response?.result.items ?? [];
 				state.total = response?.result.total;
 				state.loading = false;
-				tableRef.value.clearCheckboxRow();
+				tableRef.value?.clearCheckboxRow();
 				checkTable.value = [];
 				resolve(response);
 			})
 			.catch(() => {
 				state.loading = false;
-				tableRef.value.clearCheckboxRow();
+				tableRef.value?.clearCheckboxRow();
 				checkTable.value = [];
 				reject();
 			});

+ 0 - 5
src/views/snapshot/statistics/detailGridHandle.vue

@@ -108,11 +108,6 @@ const gridOptions = reactive<any>({
 				},
 			},
 		},
-		{
-			field: 'isExpired',
-			title: '是否超期',
-			width: 90,
-		},
 		{
 			field: 'creationTime',
 			title: '受理时间',

+ 3 - 2
src/views/statistics/center/discernAudit.vue

@@ -1,17 +1,18 @@
 <template>
 	<div class="statistics-center-discern-audit-container layout-padding">
 		<div class="layout-padding-auto layout-padding-view pd20">
-			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline :disabled="state.loading">
 				<el-form-item prop="crTime">
 					<statistical-time v-model="state.queryParams.crTime" @change="handleQuery" ref="statisticalTimeRef" :disabled="state.loading"/>
 				</el-form-item>
 				<el-form-item label="审批人" prop="AuditUserName">
 					<el-input v-model="state.queryParams.AuditUserName" placeholder="审批人" clearable @keyup.enter="handleQuery" class="keyword-input" />
 				</el-form-item>
-				<el-form-item label="" prop="AuditType">
+				<el-form-item  prop="AuditType">
 					<el-radio-group v-model="state.queryParams.AuditType" @change="handleQuery">
 						<el-radio value="1">中心班长</el-radio>
 						<el-radio value="2">中心领导</el-radio>
+            <el-radio value="3">中心初审</el-radio>
 					</el-radio-group>
 				</el-form-item>
 				<el-form-item label-width="0">