动态列处理

This commit is contained in:
ChenYi 2025-07-10 10:36:02 +08:00
parent 0d655dfc5b
commit c00d8077c1
5 changed files with 152 additions and 28 deletions

View File

@ -9,7 +9,6 @@ export const fieldNameMapping: FieldMapping = {
DeviceType: '设备类型', DeviceType: '设备类型',
DeviceId: '设备ID', DeviceId: '设备ID',
Timestamps: '时间戳', Timestamps: '时间戳',
APPData: '应用数据',
// 可以根据需要添加更多映射 // 可以根据需要添加更多映射
}; };

View File

@ -64,18 +64,6 @@ export const validateAndCleanData = (data: any[]): DynamicDeviceData[] => {
case 'DeviceId': case 'DeviceId':
cleaned[key] = value ? String(value) : ''; cleaned[key] = value ? String(value) : '';
break; break;
case 'APPData':
// 尝试解析JSON数据
try {
if (typeof value === 'string') {
cleaned[key] = JSON.parse(value);
} else {
cleaned[key] = value;
}
} catch {
cleaned[key] = value;
}
break;
default: default:
// 对于未知字段,保持原值 // 对于未知字段,保持原值
cleaned[key] = value; cleaned[key] = value;

View File

@ -31,10 +31,28 @@ const fixedColumns = computed(() => [
]); ]);
// //
const allColumns = computed(() => [ const allColumns = computed(() => {
...fixedColumns.value, const columns = [
...dynamicColumns.value, ...fixedColumns.value,
]); ...dynamicColumns.value,
];
console.log('当前所有列定义:', columns);
return columns;
});
//
const initDefaultColumns = () => {
if (dynamicColumns.value.length === 0) {
dynamicColumns.value = [
{ field: 'SystemName', title: '系统名称', minWidth: '150' },
{ field: 'DeviceType', title: '设备类型', minWidth: '150' },
{ field: 'DeviceId', title: '设备ID', minWidth: '150' },
];
}
};
//
initDefaultColumns();
const formOptions: VbenFormProps = { const formOptions: VbenFormProps = {
schema: querySchema.value, schema: querySchema.value,
@ -67,7 +85,10 @@ const gridOptions: VxeGridProps<any> = {
columns: allColumns, columns: allColumns,
height: 'auto', height: 'auto',
keepSource: true, keepSource: true,
pagerConfig: {}, pagerConfig: {
currentPage: 1,
pageSize: 20,
},
toolbarConfig: { toolbarConfig: {
custom: true, custom: true,
search: true, search: true,
@ -89,21 +110,30 @@ const gridOptions: VxeGridProps<any> = {
}, },
}); });
// console.log('API返回的原始数据:', data);
//
if (data?.items && data.items.length > 0) { if (data?.items && data.items.length > 0) {
// console.log('原始items数据:', data.items);
const cleanedData = validateAndCleanData(data.items);
// 使
const items = data.items;
// //
dynamicColumns.value = generateDynamicColumns(cleanedData); const generatedColumns = generateDynamicColumns(items);
console.log('生成的列定义:', generatedColumns);
// //
return { dynamicColumns.value = generatedColumns;
...data,
items: cleanedData, //
}; await nextTick();
console.log('返回给表格的数据:', data);
return data;
} }
console.log('没有数据或数据为空');
return data; return data;
}, },
}, },

View File

@ -0,0 +1,108 @@
<script setup lang="ts">
import type { VbenFormProps } from '#/adapter/form';
import type { VxeGridProps } from '#/adapter/vxe-table';
import { useRoute } from 'vue-router';
import { Page } from '@vben/common-ui';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { postTreeModelDeviceDataInfoPage } from '#/api-client';
import { querySchema } from './schema';
defineOptions({
name: 'DeviceDataTest',
});
const route = useRoute();
const { DeviceType, DeviceId, FocusAddress } = route.query;
const formOptions: VbenFormProps = {
schema: querySchema.value,
initialValues: {
FocusAddress: FocusAddress as string,
},
};
// 使
const testColumns = [
{ title: '序号', type: 'seq', width: 50 },
{ field: 'SystemName', title: '系统名称', minWidth: '150' },
{ field: 'ProjectId', title: '项目ID', minWidth: '150' },
{ field: 'ProjectName', title: '项目名称', minWidth: '150' },
{ field: 'IoTDataType', title: 'IoT数据类型', minWidth: '150' },
{ field: 'DeviceType', title: '设备类型', minWidth: '150' },
{ field: 'DeviceId', title: '设备ID', minWidth: '150' },
{ field: 'Timestamps', title: '时间戳', minWidth: '150' },
//
{ field: 'extraData', title: '其他数据', minWidth: '200', formatter: (value: any, row: any) => {
//
const fixedFields = ['SystemName', 'ProjectId', 'ProjectName', 'IoTDataType', 'DeviceType', 'DeviceId', 'Timestamps'];
const extraFields = Object.keys(row).filter(key => !fixedFields.includes(key));
if (extraFields.length > 0) {
return extraFields.map(field => `${field}: ${row[field]}`).join(', ');
}
return '';
}},
];
const gridOptions: VxeGridProps<any> = {
checkboxConfig: {
highlight: true,
labelField: 'name',
},
columns: testColumns,
height: 'auto',
keepSource: true,
pagerConfig: {
currentPage: 1,
pageSize: 20,
},
toolbarConfig: {
custom: true,
search: true,
},
customConfig: {
storage: true,
},
proxyConfig: {
ajax: {
query: async ({ page }, formValues) => {
const { data } = await postTreeModelDeviceDataInfoPage({
body: {
...formValues,
pageIndex: page.currentPage,
pageSize: page.pageSize,
DeviceType,
DeviceId,
FocusAddress,
},
});
console.log('测试 - API返回的原始数据:', data);
if (data?.items && data.items.length > 0) {
console.log('测试 - 第一条数据的所有字段:', Object.keys(data.items[0]));
console.log('测试 - 第一条数据:', data.items[0]);
}
return data;
},
},
},
};
const [Grid] = useVbenVxeGrid({ formOptions, gridOptions });
</script>
<template>
<Page auto-content-height>
<div class="mb-4 p-4 bg-yellow-100 border border-yellow-400 rounded">
<h3 class="text-lg font-bold mb-2">测试模式</h3>
<p>这个页面使用固定列定义来测试数据是否能正常显示</p>
<p>请查看控制台输出来了解数据结构</p>
</div>
<Grid />
</Page>
</template>

View File

@ -7,7 +7,6 @@ export interface BaseDeviceData {
DeviceType?: string; DeviceType?: string;
DeviceId?: string; DeviceId?: string;
Timestamps?: string; Timestamps?: string;
APPData?: string;
[key: string]: any; // 允许任意额外字段 [key: string]: any; // 允许任意额外字段
} }