Sfoglia il codice sorgente

reactor:新增统计表:【智能回访数据统计】【智能回访有效性分析】;

zhangchong 4 mesi fa
parent
commit
c293b2fa0e

+ 2 - 2
package.json

@@ -17,8 +17,8 @@
 	},
 	"dependencies": {
 		"@element-plus/icons-vue": "^2.0.10",
-		"@logicflow/core": "^2.0.7",
-		"@logicflow/extension": "^2.0.11",
+		"@logicflow/core": "^2.0.9",
+		"@logicflow/extension": "^2.0.13",
 		"@microsoft/signalr": "^7.0.0",
 		"@wangeditor-next/editor": "^5.6.2",
 		"@wangeditor-next/editor-for-vue": "^5.1.14",

+ 22 - 0
src/api/statistics/center.ts

@@ -603,4 +603,26 @@ export const centerTurnExport = (data: object) => {
   }, {
     reduce_data_format: false
   });
+}
+/**
+ * @description 智能回访统计
+ * @param {object} params
+ */
+export const centerIntelligent = (params: object) => {
+  return request({
+    url: `/api/v1/BiOrder/aivisit-statistics`,
+    method: 'get',
+    params,
+  });
+}
+/**
+ * @description 智能回访有效性分析
+ * @param {object} params
+ */
+export const centerIntelligentValidity = (params: object) => {
+  return request({
+    url: `/api/v1/BiOrder/aivisit-effective-analysis`,
+    method: 'get',
+    params,
+  });
 }

+ 1 - 1
src/components/LogicFlow/PropertySetting/index.vue

@@ -30,7 +30,7 @@ const showDrawer = ref(false); // 是否显示抽屉
 const drawerRef = ref(null); // 抽屉ref
 let formData = reactive<any>({} as any); // 表单数据
 const ruleFormRef = ref<RefType>(); // 表单ref
-const NODE_NAME_LIST = ['hotline:start', 'hotline:task'] as string[];
+const NODE_NAME_LIST = ['hotline:start', 'hotline:task','hotline:end'] as string[];
 // 组件列表
 const COMPONENT_LIST: any = {
 	task,

+ 11 - 12
src/components/LogicFlow/index.vue

@@ -34,19 +34,19 @@
 				</el-row>
 			</el-form>
 			<!-- 流程图画布内容 -->
-			<div class="border w100" style="position: relative; flex: 1">
-				<div class="w100 h100" ref="lfElRef" style="height: 100%"></div>
+			<div class="border w100 h100" style="position: relative; flex: 1">
+				<div class="w100 h100" ref="lfElRef"></div>
 			</div>
-			<!-- 节点内容弹窗 -->
-			<PropertySetting
-				ref="propertySettingRef"
-				v-model="formData"
-				@change="handlePropertyChange"
-				@changeOther="handlePropertyChangeOther"
-				:baseData="baseDataResult"
-				:nodes="nodes"
-			/>
 		</div>
+		<!-- 节点内容弹窗 -->
+		<PropertySetting
+			ref="propertySettingRef"
+			v-model="formData"
+			@change="handlePropertyChange"
+			@changeOther="handlePropertyChangeOther"
+			:baseData="baseDataResult"
+			:nodes="nodes"
+		/>
 	</div>
 </template>
 <script setup lang="ts" name="hotlineFlowDesigner">
@@ -376,7 +376,6 @@ const saveOnly = throttle((formEl: FormInstance | undefined) => {
 			lf.graphModel[key] = form[key];
 		});
 		const { submitData } = getGraphData();
-
 		if (submitData.error) {
 			//错误提示
 			ElMessage.warning(submitData.error);

+ 1 - 0
src/components/LogicFlow/snakerflow/index.ts

@@ -34,6 +34,7 @@ class SnakerFlowAdapter {
       lf.graphModel.description = userData.description
       lf.graphModel.isMainHandlerShow = userData.isMainHandlerShow
       lf.graphModel.id = userData.id
+      console.log(userData,'userData')
       return userData
     }
     lf.adapterOut = (logicFlowData: any) => {

+ 4 - 4
src/components/LogicFlow/snakerflow/tool.ts

@@ -60,8 +60,8 @@ export const edgeStyleHandle = (
 };
 /**
  * 将获取到的数据转换成logic flow需要的数据
- * @param {*} data(...processInfo,nodes,edges)
  * @returns
+ * @param data
  */
 export const resDataToLogicFlow = (data: any): any => {
 	return JSON.parse(data.externalData);
@@ -69,8 +69,8 @@ export const resDataToLogicFlow = (data: any): any => {
 
 /**
  * 将LogicFlow的数据转成提交的格式
- * @param {*} data(...processInfo,nodes,edges)
  * @returns
+ * @param data
  */
 export const logicFlowJsonToSubmit = (data: any): object => {
 	let returnData = {};
@@ -123,7 +123,7 @@ export const logicFlowJsonToSubmit = (data: any): object => {
 	const formatArrayHandlerTypeItems = (node: any) => {
 		const nodeName = node.type.replace('hotline:', '');
 		let data: string[] = [];
-		if (['start', 'task'].includes(nodeName)) {
+		if (['start', 'task', 'end'].includes(nodeName)) {
 			if (node.properties.handlerTypeItems && Object.prototype.toString.call(node.properties.handlerTypeItems) === '[object String]') {
 				data = JSON.parse(node.properties.handlerTypeItems);
 			}
@@ -163,7 +163,7 @@ export const logicFlowJsonToSubmit = (data: any): object => {
 	}
 	for (let i of processObj.steps) {
 		//普通节点字段非空校验
-		if (['start', 'task','end'].includes(i.code)) {
+		if (['start', 'task', 'end'].includes(i.code)) {
 			if (!i.stepType && String(i.stepType) !== '0') {
 				return { error: `请选择${i.name}的节点类型` };
 			}

+ 136 - 0
src/views/statistics/center/aiVisit.vue

@@ -0,0 +1,136 @@
+<template>
+	<div class="statistics-center-ai-visit-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<div class="table-search-content">
+				<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+					<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>
+						<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" :loading="state.loading">
+							<SvgIcon name="ele-Refresh" class="mr5" />重置
+						</el-button>
+					</el-form-item>
+				</el-form>
+			</div>
+			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
+				<vxe-grid v-bind="gridOptions"> </vxe-grid>
+			</div>
+		</div>
+	</div>
+</template>
+<script setup lang="tsx" name="statisticsCenterAiVisit">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { FormInstance } from 'element-plus';
+import { defaultDate } from '@/utils/constants';
+import Other from '@/utils/other';
+import { centerIntelligentValidity } from '@/api/statistics/center';
+
+const StatisticalTime = defineAsyncComponent(() => import('@/components/StatisticalTime/index.vue')); // 日期类型选择组件
+// 定义变量内容
+const ruleFormRef = ref<RefType>(); // 表单ref
+const state = reactive<any>({
+	queryParams: {
+		// 查询条件
+		crTime: defaultDate, // 时间默认今天开始到今天结束
+	},
+	loading: false, // 加载
+	tableData: [],
+	total: 0, // 总数
+});
+const requestParams = ref<EmptyObjectType>({});
+const gridOptions = reactive<any>({
+	loading: false,
+	border: true,
+	showOverflow: true,
+	printConfig: {},
+	columnConfig: {
+		resizable: true,
+	},
+	scrollY: {
+		enabled: true,
+		gt: 100
+	},
+	toolbarConfig: {
+		zoom: true,
+		custom: true,
+		refresh: {
+			queryMethod: () => {
+				queryList();
+			},
+		},
+	},
+	customConfig: {
+		storage: true
+	},
+	id: 'statisticsCenterAiVisit',
+	rowConfig: { isHover: true, height: 30,isCurrent:true,useKey:true },
+	height: 'auto',
+	columns: [
+		{
+			title:'智能回访总量(不去重)',
+			field: 'aiVisitCount',
+		},
+		{
+			title:'智能回访有效量(不去重)',
+			field: 'aiVisitSuccessCount',
+		},
+		{
+			title:'智能回访无效量',
+			align:'center',
+			children:[
+				{
+					title:"拨打2次失败量",
+					field: 'aiVisitCallTwoFailCount',
+				},{
+					title:"问1个问题失败量",
+					field: 'aiVisitHaveOneAnswerCount',
+				},{
+					title:"问2个问题失败量",
+					field: 'aiVisitHaveTwoAnswerCount',
+				},{
+					title:"问3个问题失败量",
+					field: 'aiVisitHaveThreeAnswerCount',
+				},
+			]
+		}
+	],
+	data: [],
+});
+/** 搜索按钮操作 */
+const handleQuery = () => {
+	// state.queryParams.PageIndex = 1;
+	queryList();
+};
+/** 获取列表 */
+const queryList = () => {
+	state.loading = true;
+	gridOptions.loading = true;
+	requestParams.value = Other.deepClone(state.queryParams);
+	requestParams.value.StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0];
+	requestParams.value.EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
+	Reflect.deleteProperty(requestParams.value, 'crTime');
+	centerIntelligentValidity(requestParams.value)
+		.then((res: any) => {
+			gridOptions.data = [res.result]
+			state.loading = false;
+			gridOptions.loading = false;
+		})
+		.catch(() => {
+			state.loading = false;
+			gridOptions.loading = false;
+		});
+};
+/** 重置按钮操作 */
+const statisticalTimeRef = ref<RefType>();
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	statisticalTimeRef.value.reset();
+	queryList();
+};
+onMounted(() => {
+	queryList();
+});
+</script>

+ 133 - 0
src/views/statistics/center/smartVisit.vue

@@ -0,0 +1,133 @@
+<template>
+	<div class="statistics-center-smart-visit-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<div class="table-search-content">
+				<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+					<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>
+						<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" :loading="state.loading">
+							<SvgIcon name="ele-Refresh" class="mr5" />重置
+						</el-button>
+					</el-form-item>
+				</el-form>
+			</div>
+			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
+				<vxe-grid v-bind="gridOptions"> </vxe-grid>
+			</div>
+		</div>
+	</div>
+</template>
+<script setup lang="tsx" name="statisticsCenterSmartVisit">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { FormInstance } from 'element-plus';
+import { defaultDate } from '@/utils/constants';
+import Other from '@/utils/other';
+import { centerIntelligent } from '@/api/statistics/center';
+
+const StatisticalTime = defineAsyncComponent(() => import('@/components/StatisticalTime/index.vue')); // 日期类型选择组件
+// 定义变量内容
+const ruleFormRef = ref<RefType>(); // 表单ref
+const state = reactive<any>({
+	queryParams: {
+		// 查询条件
+		crTime: defaultDate, // 时间默认今天开始到今天结束
+	},
+	loading: false, // 加载
+	tableData: [],
+	total: 0, // 总数
+});
+const requestParams = ref<EmptyObjectType>({});
+const gridOptions = reactive<any>({
+	loading: false,
+	border: true,
+	showOverflow: true,
+	printConfig: {},
+	columnConfig: {
+		resizable: true,
+	},
+	scrollY: {
+		enabled: true,
+		gt: 100
+	},
+	toolbarConfig: {
+		zoom: true,
+		custom: true,
+		refresh: {
+			queryMethod: () => {
+				queryList();
+			},
+		},
+	},
+	customConfig: {
+		storage: true
+	},
+	id: 'statisticsCenterSmartVisit',
+	rowConfig: { isHover: true, height: 30,isCurrent:true,useKey:true },
+	height: 'auto',
+	columns: [
+		{
+			title:'智能回访总量',
+			field: 'aiVisitCount',
+		},
+		{
+			title:'智能回访有效量',
+			field: 'aiVisitSuccessCount',
+		},
+		{
+			title:'智能回访无效量',
+			align:'center',
+			children:[
+				{
+					title:"人工待复核量",
+					field: 'aiVisitArtificialReviewCount',
+				},{
+					title:"人工电话复核回访量",
+					field: 'aiVisitCallReviewCount',
+				},{
+					title:"人工手动复核填写量",
+					field: 'aiVisitHandReviewCount',
+				},
+			]
+		}
+	],
+	data: [],
+});
+/** 搜索按钮操作 */
+const handleQuery = () => {
+	// state.queryParams.PageIndex = 1;
+	queryList();
+};
+/** 获取列表 */
+const queryList = () => {
+	state.loading = true;
+	gridOptions.loading = true;
+	requestParams.value = Other.deepClone(state.queryParams);
+	requestParams.value.StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0];
+	requestParams.value.EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
+	Reflect.deleteProperty(requestParams.value, 'crTime');
+	centerIntelligent(requestParams.value)
+		.then((res: any) => {
+			gridOptions.data = [res.result]
+			state.loading = false;
+			gridOptions.loading = false;
+		})
+		.catch(() => {
+			state.loading = false;
+			gridOptions.loading = false;
+		});
+};
+/** 重置按钮操作 */
+const statisticalTimeRef = ref<RefType>();
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	statisticalTimeRef.value.reset();
+	queryList();
+};
+onMounted(() => {
+	queryList();
+});
+</script>

+ 15 - 2
src/views/statistics/order/detailVisitDiscontent.vue

@@ -8,9 +8,16 @@
 				<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 label="回访结果" prop="OrgProcessingResults" v-if="['YiBin'].includes(themeConfig.appScope)">
+					<el-radio-group v-model="state.queryParams.OrgProcessingResults" @change="handleQuery" :disabled="state.loading">
+						<el-radio value="">全部</el-radio>
+						<el-radio value="-1">视为满意</el-radio>
+						<el-radio value="2">不满意</el-radio>
+					</el-radio-group>
+				</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">
+					<el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading">
 						<SvgIcon name="ele-Refresh" class="mr5" />重置
 					</el-button>
 				</el-form-item>
@@ -109,14 +116,18 @@ import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import { FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
 import { useRoute } from 'vue-router';
-import { departmentUnsatisfiedDetail, departmentUnsatisfiedDetailExport } from '@/api/statistics/order';
+import { departmentUnsatisfiedDetail } from '@/api/statistics/order';
 import other from '@/utils/other';
+import { useThemeConfig } from '@/stores/themeConfig';
+import { storeToRefs } from 'pinia';
 
 // 引入组件
 const VisitDetailCom = defineAsyncComponent(() => import('@/views/business/visit/components/Visit-detail.vue')); // 回访
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref
 const state = reactive<any>({
@@ -126,6 +137,7 @@ const state = reactive<any>({
 		PageSize: 20,
 		Keyword: null, // 关键字
 		visitOrgName: null,
+		OrgProcessingResults:'',
 	},
 	tableData: [], //表单
 	loading: false, // 加载
@@ -152,6 +164,7 @@ const queryList = () => {
 		StartTime: routeQueryParams.startTime,
 		EndTime: routeQueryParams.endTime,
 		visitOrgName: state.queryParams.visitOrgName,
+		OrgProcessingResults:state.queryParams.OrgProcessingResults,
 	};
 	departmentUnsatisfiedDetail(requestParams.value)
 		.then((res: any) => {

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

@@ -9,6 +9,13 @@
 					<el-form-item label="部门名称" prop="OrgName">
 						<el-input v-model="state.queryParams.OrgName" placeholder="部门名称" clearable @keyup.enter="handleQuery" class="keyword-input" />
 					</el-form-item>
+					<el-form-item label="回访结果" prop="OrgProcessingResults" v-if="['YiBin'].includes(themeConfig.appScope)">
+						<el-radio-group v-model="state.queryParams.OrgProcessingResults" @change="handleQuery" :disabled="state.loading">
+							<el-radio value="">全部</el-radio>
+							<el-radio value="-1">视为满意</el-radio>
+							<el-radio value="2">不满意</el-radio>
+						</el-radio-group>
+					</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" :loading="state.loading">
@@ -31,6 +38,8 @@ import { defaultDate } from '@/utils/constants';
 import { useRouter } from 'vue-router';
 import Other from '@/utils/other';
 import XEUtils from 'xe-utils';
+import { useThemeConfig } from '@/stores/themeConfig';
+import { storeToRefs } from 'pinia';
 
 const StatisticalTime = defineAsyncComponent(() => import('@/components/StatisticalTime/index.vue')); // 日期类型选择组件
 // 定义变量内容
@@ -40,12 +49,14 @@ const state = reactive<any>({
 		// 查询条件
 		OrgName: null, // 关键词
 		crTime: defaultDate, // 时间默认今天开始到今天结束
+		OrgProcessingResults:'',
 	},
 	loading: false, // 加载
 	tableData: [],
 	total: 0, // 总数
 });
-
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 const requestParams = ref<EmptyObjectType>({});
 const gridOptions = reactive<any>({
 	loading: false,

+ 3 - 1
src/views/todo/seats/accept/ybAccept.vue

@@ -1198,7 +1198,9 @@ const loadForm = async () => {
 					dicDataValue: state.ruleForm.sourceChannelCode,
 					dicDataName: state.ruleForm.sourceChannel,
 				};
-				const isNumberIdentityType = parseInt(<string>route.query.identityType);
+				// 获取到的按键转为数组并且只取最后一位
+				const keyPress: string = route.query.identityType?.split('_').slice(-1)[0];
+				const isNumberIdentityType = parseInt(keyPress);
 				if ([1, 2].includes(isNumberIdentityType)) {
 					// 按键接收(1:市民 2:企业 3:智能应答)
 					state.ruleForm.identityType = isNumberIdentityType;

+ 63 - 63
yarn.lock

@@ -506,7 +506,7 @@
     "@jridgewell/resolve-uri" "^3.1.0"
     "@jridgewell/sourcemap-codec" "^1.4.14"
 
-"@logicflow/core@2.0.9", "@logicflow/core@^2.0.7":
+"@logicflow/core@2.0.9", "@logicflow/core@^2.0.9":
   version "2.0.9"
   resolved "https://registry.npmmirror.com/@logicflow/core/-/core-2.0.9.tgz#774d43ecc8b7b40ce92746ad1b84f9963177313d"
   integrity sha512-HRc3W+XbcXbq9E3wElFNkaxNBja7Ga+FK6LYbsoOGWDWzZ7gSBCaYTpKPUlQsfUK0EvztqzCuer2DRJQQ77Ylg==
@@ -520,7 +520,7 @@
     preact "^10.17.1"
     uuid "^9.0.0"
 
-"@logicflow/extension@^2.0.11":
+"@logicflow/extension@^2.0.13":
   version "2.0.13"
   resolved "https://registry.npmmirror.com/@logicflow/extension/-/extension-2.0.13.tgz#f721f5849cce06ae1186002147226905b20ef0c4"
   integrity sha512-1csZP2RYyGItvOMxVSpzrP7MguPrMRQYV+PUbm+8jZLrFbt3LcOQCNdHsEFU0cfuaiBF6Nx4qBdBeo0kog0eCw==
@@ -835,61 +835,61 @@
   integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==
 
 "@typescript-eslint/eslint-plugin@^8.14.0":
-  version "8.17.0"
-  resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz#2ee073c421f4e81e02d10e731241664b6253b23c"
-  integrity sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==
+  version "8.18.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz#0901933326aea4443b81df3f740ca7dfc45c7bea"
+  integrity sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==
   dependencies:
     "@eslint-community/regexpp" "^4.10.0"
-    "@typescript-eslint/scope-manager" "8.17.0"
-    "@typescript-eslint/type-utils" "8.17.0"
-    "@typescript-eslint/utils" "8.17.0"
-    "@typescript-eslint/visitor-keys" "8.17.0"
+    "@typescript-eslint/scope-manager" "8.18.0"
+    "@typescript-eslint/type-utils" "8.18.0"
+    "@typescript-eslint/utils" "8.18.0"
+    "@typescript-eslint/visitor-keys" "8.18.0"
     graphemer "^1.4.0"
     ignore "^5.3.1"
     natural-compare "^1.4.0"
     ts-api-utils "^1.3.0"
 
 "@typescript-eslint/parser@^8.14.0":
-  version "8.17.0"
-  resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.17.0.tgz#2ee972bb12fa69ac625b85813dc8d9a5a053ff52"
-  integrity sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==
-  dependencies:
-    "@typescript-eslint/scope-manager" "8.17.0"
-    "@typescript-eslint/types" "8.17.0"
-    "@typescript-eslint/typescript-estree" "8.17.0"
-    "@typescript-eslint/visitor-keys" "8.17.0"
+  version "8.18.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.18.0.tgz#a1c9456cbb6a089730bf1d3fc47946c5fb5fe67b"
+  integrity sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==
+  dependencies:
+    "@typescript-eslint/scope-manager" "8.18.0"
+    "@typescript-eslint/types" "8.18.0"
+    "@typescript-eslint/typescript-estree" "8.18.0"
+    "@typescript-eslint/visitor-keys" "8.18.0"
     debug "^4.3.4"
 
-"@typescript-eslint/scope-manager@8.17.0":
-  version "8.17.0"
-  resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz#a3f49bf3d4d27ff8d6b2ea099ba465ef4dbcaa3a"
-  integrity sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==
+"@typescript-eslint/scope-manager@8.18.0":
+  version "8.18.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz#30b040cb4557804a7e2bcc65cf8fdb630c96546f"
+  integrity sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==
   dependencies:
-    "@typescript-eslint/types" "8.17.0"
-    "@typescript-eslint/visitor-keys" "8.17.0"
+    "@typescript-eslint/types" "8.18.0"
+    "@typescript-eslint/visitor-keys" "8.18.0"
 
-"@typescript-eslint/type-utils@8.17.0":
-  version "8.17.0"
-  resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz#d326569f498cdd0edf58d5bb6030b4ad914e63d3"
-  integrity sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==
+"@typescript-eslint/type-utils@8.18.0":
+  version "8.18.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz#6f0d12cf923b6fd95ae4d877708c0adaad93c471"
+  integrity sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==
   dependencies:
-    "@typescript-eslint/typescript-estree" "8.17.0"
-    "@typescript-eslint/utils" "8.17.0"
+    "@typescript-eslint/typescript-estree" "8.18.0"
+    "@typescript-eslint/utils" "8.18.0"
     debug "^4.3.4"
     ts-api-utils "^1.3.0"
 
-"@typescript-eslint/types@8.17.0":
-  version "8.17.0"
-  resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.17.0.tgz#ef84c709ef8324e766878834970bea9a7e3b72cf"
-  integrity sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==
+"@typescript-eslint/types@8.18.0":
+  version "8.18.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.18.0.tgz#3afcd30def8756bc78541268ea819a043221d5f3"
+  integrity sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==
 
-"@typescript-eslint/typescript-estree@8.17.0":
-  version "8.17.0"
-  resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz#40b5903bc929b1e8dd9c77db3cb52cfb199a2a34"
-  integrity sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==
+"@typescript-eslint/typescript-estree@8.18.0":
+  version "8.18.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz#d8ca785799fbb9c700cdff1a79c046c3e633c7f9"
+  integrity sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==
   dependencies:
-    "@typescript-eslint/types" "8.17.0"
-    "@typescript-eslint/visitor-keys" "8.17.0"
+    "@typescript-eslint/types" "8.18.0"
+    "@typescript-eslint/visitor-keys" "8.18.0"
     debug "^4.3.4"
     fast-glob "^3.3.2"
     is-glob "^4.0.3"
@@ -897,22 +897,22 @@
     semver "^7.6.0"
     ts-api-utils "^1.3.0"
 
-"@typescript-eslint/utils@8.17.0":
-  version "8.17.0"
-  resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.17.0.tgz#41c05105a2b6ab7592f513d2eeb2c2c0236d8908"
-  integrity sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==
+"@typescript-eslint/utils@8.18.0":
+  version "8.18.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.18.0.tgz#48f67205d42b65d895797bb7349d1be5c39a62f7"
+  integrity sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==
   dependencies:
     "@eslint-community/eslint-utils" "^4.4.0"
-    "@typescript-eslint/scope-manager" "8.17.0"
-    "@typescript-eslint/types" "8.17.0"
-    "@typescript-eslint/typescript-estree" "8.17.0"
+    "@typescript-eslint/scope-manager" "8.18.0"
+    "@typescript-eslint/types" "8.18.0"
+    "@typescript-eslint/typescript-estree" "8.18.0"
 
-"@typescript-eslint/visitor-keys@8.17.0":
-  version "8.17.0"
-  resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz#4dbcd0e28b9bf951f4293805bf34f98df45e1aa8"
-  integrity sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==
+"@typescript-eslint/visitor-keys@8.18.0":
+  version "8.18.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz#7b6d33534fa808e33a19951907231ad2ea5c36dd"
+  integrity sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==
   dependencies:
-    "@typescript-eslint/types" "8.17.0"
+    "@typescript-eslint/types" "8.18.0"
     eslint-visitor-keys "^4.2.0"
 
 "@uppy/companion-client@^2.2.2":
@@ -1596,9 +1596,9 @@ echarts@^5.5.0:
     zrender "5.6.0"
 
 electron-to-chromium@^1.5.41:
-  version "1.5.71"
-  resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.71.tgz#d8b5dba1e55b320f2f4e9b1ca80738f53fcfec2b"
-  integrity sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==
+  version "1.5.72"
+  resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz#a732805986d3a5b5fedd438ddf4616c7d78ac2df"
+  integrity sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==
 
 element-plus@^2.7.7:
   version "2.9.0"
@@ -2395,9 +2395,9 @@ lru-cache@^5.1.1:
     yallist "^3.0.2"
 
 magic-string@^0.30.11:
-  version "0.30.14"
-  resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.14.tgz#e9bb29870b81cfc1ec3cc656552f5a7fcbf19077"
-  integrity sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==
+  version "0.30.15"
+  resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.15.tgz#d5474a2c4c5f35f041349edaba8a5cb02733ed3c"
+  integrity sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==
   dependencies:
     "@jridgewell/sourcemap-codec" "^1.5.0"
 
@@ -2532,9 +2532,9 @@ node-fetch@^2.6.7:
     whatwg-url "^5.0.0"
 
 node-releases@^2.0.18:
-  version "2.0.18"
-  resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
-  integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
+  version "2.0.19"
+  resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314"
+  integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==
 
 normalize-wheel-es@^1.2.0:
   version "1.2.0"
@@ -3298,9 +3298,9 @@ vxe-pc-ui@4.3.1:
     "@vxe-ui/core" "^4.0.16"
 
 vxe-pc-ui@^4.3.1:
-  version "4.3.23"
-  resolved "https://registry.npmmirror.com/vxe-pc-ui/-/vxe-pc-ui-4.3.23.tgz#3623fe729f3587c105251b60176735b4a99da297"
-  integrity sha512-gTNkgiBXadjGfKqP7NYfYYLizXaZCCHsqz9GYCoP2aB9QpPh6OXBW5NFNh1aA/YGPlsJW/lqYGxflZM+S0La4Q==
+  version "4.3.24"
+  resolved "https://registry.npmmirror.com/vxe-pc-ui/-/vxe-pc-ui-4.3.24.tgz#56fc924619b37f26e0e66f7c73865a1393dc85a1"
+  integrity sha512-af3Vgj9ESAJr8Jzh9qJggM79foyh57OywiVDue27JM5Px4OKPPrgJAjYwPE43HkjV1R4V8bSEx8PyTrc3e+Kfg==
   dependencies:
     "@vxe-ui/core" "^4.0.20"