From 61a3e7e59452e1d25710c85198b3e3d63d64c990 Mon Sep 17 00:00:00 2001 From: ChenYi <296215406@outlook.com> Date: Thu, 9 Jul 2026 16:46:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AE=BE=E5=A4=87=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=87=8D=E5=A4=8D=E6=9F=A5=E8=AF=A2=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TreeModelDeviceSelect.vue | 8 ++++++-- .../iotdbdatamanagement/deviceData/index.vue | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/apps/web-antd/src/views/iotdbdatamanagement/TreeModelDeviceSelect.vue b/apps/web-antd/src/views/iotdbdatamanagement/TreeModelDeviceSelect.vue index a749b24..98d0811 100644 --- a/apps/web-antd/src/views/iotdbdatamanagement/TreeModelDeviceSelect.vue +++ b/apps/web-antd/src/views/iotdbdatamanagement/TreeModelDeviceSelect.vue @@ -104,6 +104,10 @@ const fetchData = async () => { } }; +// ioTDataType 与 props.value 两个 immediate 侦听在初值到达时序错开时会各调一次 fetchData, +// 导致 DevicePatchListAsync 重复请求。用防抖把相邻触发合并为一次,执行时读取最终 query 状态。 +const scheduleFetch = useDebounceFn(() => fetchData(), 100); + /** * 处理搜索输入 */ @@ -145,7 +149,7 @@ watch( searchInput.value = ''; pendingAutoSelectFirst.value = !!props.value; if (newVal) { - fetchData(); + scheduleFetch(); } else { options.value = []; total.value = 0; @@ -172,7 +176,7 @@ watch( query.value.pageIndex = 1; query.value.deviceAddress = newVal; pendingAutoSelectFirst.value = true; - fetchData(); + scheduleFetch(); }, { immediate: true }, ); diff --git a/apps/web-antd/src/views/iotdbdatamanagement/deviceData/index.vue b/apps/web-antd/src/views/iotdbdatamanagement/deviceData/index.vue index fd89ba7..6613f04 100644 --- a/apps/web-antd/src/views/iotdbdatamanagement/deviceData/index.vue +++ b/apps/web-antd/src/views/iotdbdatamanagement/deviceData/index.vue @@ -111,12 +111,25 @@ const isInitializing = ref(false); // 设备下拉自动选中真实路径时会连续触发多次表单值变化(原值 → 清空 → 完整路径), // 用防抖把这些变化合并为一次查询,并在执行时读取“最终”表单值, // 避免多次并发查询竞态导致空结果覆盖有数据结果。 +// 记录上一次实际发起查询的条件签名,避免“自动选中触发”与“初始化兜底触发” +// 在同一完整路径下重复投递 DeviceDataInfoPage(两次都带数据、但纯属多余)。 +const lastReloadSig = ref(''); const debouncedReload = useDebounceFn(async () => { if (!gridApi?.formApi) { return; } const values = await gridApi.formApi.getValues(); if (values.DeviceAddress && values.IoTDataType) { + const sig = [ + values.IoTDataType, + values.DeviceAddress, + values.StartCreationTime, + values.EndCreationTime, + ].join('|'); + if (sig === lastReloadSig.value) { + return; + } + lastReloadSig.value = sig; gridApi.reload(values); } }, 200); @@ -193,6 +206,9 @@ const gridOptions: VxeGridProps = { showOverflow: true, showHeaderOverflow: true, proxyConfig: { + // 关闭挂载时的自动查询:初始表单里的设备地址是路由带来的“原始地址”, + // 直接作为 DevicePath 查询必然 204;真正的查询由设备下拉自动选中真实树路径后经防抖触发。 + autoLoad: false, ajax: { query: async ({ page, sorts, filters }, formValues) => { // 确保page参数存在