From f131a34f1ee29c7a45b5a9798b3ecf8ec87e3ab6 Mon Sep 17 00:00:00 2001 From: ChenYi <296215406@outlook.com> Date: Wed, 16 Jul 2025 15:07:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=AE=BE=E5=A4=87=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=8B=E6=8B=89=E6=A1=86=E5=88=86=E9=A1=B5=E6=90=9C?= =?UTF-8?q?=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/adapter/component/index.ts | 5 + .../dataManger/deviceData/DeviceSelect.vue | 160 ++++++++++++++++++ .../dataManger/deviceData/index copy.vue | 120 +++++++++++++ .../src/views/dataManger/deviceData/index.vue | 42 +++-- .../src/views/dataManger/deviceData/schema.ts | 39 +---- 5 files changed, 315 insertions(+), 51 deletions(-) create mode 100644 apps/web-antd/src/views/dataManger/deviceData/DeviceSelect.vue create mode 100644 apps/web-antd/src/views/dataManger/deviceData/index copy.vue diff --git a/apps/web-antd/src/adapter/component/index.ts b/apps/web-antd/src/adapter/component/index.ts index d452d52..8632bf2 100644 --- a/apps/web-antd/src/adapter/component/index.ts +++ b/apps/web-antd/src/adapter/component/index.ts @@ -111,6 +111,7 @@ export type ComponentType = | 'CheckboxGroup' | 'DatePicker' | 'DefaultButton' + | 'DeviceSelect' | 'Divider' | 'IconPicker' | 'Input' @@ -168,6 +169,10 @@ async function initComponentAdapter() { Checkbox, CheckboxGroup, DatePicker, + // 自定义设备选择组件 + DeviceSelect: defineAsyncComponent(() => + import('../../views/dataManger/deviceData/DeviceSelect.vue') + ), // 自定义默认按钮 DefaultButton: (props, { attrs, slots }) => { return h(Button, { ...props, attrs, type: 'default' }, slots); diff --git a/apps/web-antd/src/views/dataManger/deviceData/DeviceSelect.vue b/apps/web-antd/src/views/dataManger/deviceData/DeviceSelect.vue new file mode 100644 index 0000000..b05f0cb --- /dev/null +++ b/apps/web-antd/src/views/dataManger/deviceData/DeviceSelect.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/apps/web-antd/src/views/dataManger/deviceData/index copy.vue b/apps/web-antd/src/views/dataManger/deviceData/index copy.vue new file mode 100644 index 0000000..e123cf9 --- /dev/null +++ b/apps/web-antd/src/views/dataManger/deviceData/index copy.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/apps/web-antd/src/views/dataManger/deviceData/index.vue b/apps/web-antd/src/views/dataManger/deviceData/index.vue index 3959c64..6be133e 100644 --- a/apps/web-antd/src/views/dataManger/deviceData/index.vue +++ b/apps/web-antd/src/views/dataManger/deviceData/index.vue @@ -20,8 +20,10 @@ defineOptions({ // 存储设备信息选项的完整数据 const deviceOptions = ref([]); +// 当前选中的设备信息 +const selectedDeviceInfo = ref(null); -// 获取设备信息的完整数据 +// 获取设备信息的完整数据(用于根据设备ID获取设备信息) const fetchDeviceOptions = async () => { try { const { data } = await postMetersPage({ @@ -45,6 +47,12 @@ const getDeviceInfoById = (deviceId: string) => { return deviceOptions.value.find((device) => device.id === deviceId); }; +// 处理设备选择变化 +const handleDeviceChange = (deviceInfo: any) => { + selectedDeviceInfo.value = deviceInfo; + console.log('设备选择变化:', deviceInfo); +}; + const route = useRoute(); const { DeviceType, DeviceId, FocusAddress, SystemName } = route.query; @@ -122,6 +130,10 @@ const formOptions: VbenFormProps = { }, 0); } }, + // 添加事件处理函数 + events: { + handleDeviceChange, + }, }; const gridOptions: VxeGridProps = { @@ -173,20 +185,20 @@ const gridOptions: VxeGridProps = { // 处理DeviceId,当设备类型为集中器(10)时,使用focusId let finalDeviceId = formValues.DeviceId || DeviceId; let finalFocusAddress = formValues.FocusAddress; - if (formValues.DeviceId) { - const deviceInfo = getDeviceInfoById(formValues.DeviceId); - if (deviceInfo) { - finalFocusAddress = deviceInfo.focusAddress; - if (deviceTypeNumber === 10) { - // 集中器类型使用focusId - if (deviceInfo.focusId) { - finalDeviceId = deviceInfo.focusId; - } - } else { - // 其他设备类型使用meterId - if (deviceInfo.meterId) { - finalDeviceId = deviceInfo.meterId; - } + + // 优先使用选中的设备信息 + const deviceInfo = selectedDeviceInfo.value || (formValues.DeviceId ? getDeviceInfoById(formValues.DeviceId) : null); + if (deviceInfo) { + finalFocusAddress = deviceInfo.focusAddress; + if (deviceTypeNumber === 10) { + // 集中器类型使用focusId + if (deviceInfo.focusId) { + finalDeviceId = deviceInfo.focusId; + } + } else { + // 其他设备类型使用meterId + if (deviceInfo.meterId) { + finalDeviceId = deviceInfo.meterId; } } } diff --git a/apps/web-antd/src/views/dataManger/deviceData/schema.ts b/apps/web-antd/src/views/dataManger/deviceData/schema.ts index fae0742..7de5b20 100644 --- a/apps/web-antd/src/views/dataManger/deviceData/schema.ts +++ b/apps/web-antd/src/views/dataManger/deviceData/schema.ts @@ -106,46 +106,13 @@ export const querySchema = computed(() => [ }, }, { - component: 'ApiSelect', + component: 'DeviceSelect', fieldName: 'DeviceId', label: $t('abp.log.deviceInfo'), componentProps: { - api: postMetersPage, - params: { - body: { - pageIndex: 1, - pageSize: 1000, // 获取足够多的数据用于下拉选择 - }, - }, - labelField: 'meterName', - valueField: 'id', // 使用id作为值,这样可以获取完整的对象 - optionsPropName: 'options', - immediate: true, - showSearch: true, - allowClear: true, placeholder: $t('common.pleaseSelect') + $t('abp.log.deviceInfo'), - filterOption: false, // 禁用本地过滤,使用服务端搜索 - optionFilterProp: 'label', // 根据 label 进行过滤 - afterFetch: (res: any) => { - // 确保返回的是数组格式 - if (Array.isArray(res)) { - return res; - } - // 如果是包装在 items 中的,提取出来 - if (res && Array.isArray(res.items)) { - return res.items; - } - // 如果是包装在 data 中的,提取出来 - if (res && Array.isArray(res.data)) { - return res.data; - } - // 如果是包装在 data.items 中的,提取出来 - if (res && res.data && Array.isArray(res.data.items)) { - return res.data.items; - } - // 如果都不是,返回空数组 - return []; - }, + allowClear: true, + onDeviceChange: 'handleDeviceChange', }, }, ]);