366 lines
12 KiB
TypeScript
Raw Normal View History

import type { VxeGridProps } from '#/adapter/vxe-table';
2025-07-29 11:17:27 +08:00
import { computed, h } from 'vue';
import { z } from '@vben/common-ui';
2025-07-29 11:17:27 +08:00
import { postOneNetAccountListAsync, postFilesUpload } from '#/api-client';
import { $t } from '#/locales';
export const querySchema = computed(() => [
{
component: 'Input',
2025-07-28 15:24:23 +08:00
fieldName: 'productName',
label: $t('abp.OneNETManagement.ProductName'),
},
]);
2025-07-28 15:24:23 +08:00
export const tableSchema: any = computed((): VxeGridProps['columns'] => [
{ title: $t('common.seq'), type: 'seq', width: 50 },
{
field: 'oneNETAccountName',
title: $t('abp.OneNETManagement.BelongingAccountName'),
minWidth: '150',
},
{
field: 'ioTPlatformProductId',
2025-07-28 15:24:23 +08:00
title: $t('abp.OneNETManagement.OneNETProductId'),
minWidth: '150',
},
{
2025-07-28 15:24:23 +08:00
field: 'productName',
title: $t('abp.OneNETManagement.ProductName'),
minWidth: '150',
},
{
field: 'productAccesskey',
title: $t('abp.OneNETManagement.ProductAccesskey'),
minWidth: '150',
},
{
field: 'communicationAddress',
title: $t('abp.OneNETManagement.CommunicationAddress'),
minWidth: '150',
},
{
field: 'communicationAddressTLS',
title: $t('abp.OneNETManagement.CommunicationAddressTLS'),
minWidth: '150',
},
{
field: 'isEnabled',
title: $t('common.isEnable'),
minWidth: '150',
slots: { default: 'isEnable' },
},
{
title: $t('common.action'),
field: 'action',
fixed: 'right',
width: '150',
slots: { default: 'action' },
},
]);
2025-07-28 15:24:23 +08:00
export const addProductFormSchema: any = computed(() => [
2025-07-28 16:50:59 +08:00
{
component: 'ApiSelect',
fieldName: 'oneNETAccountId',
label: $t('abp.OneNETManagement.BelongingAccountName'),
componentProps: {
api: postOneNetAccountListAsync,
params: {
body: {
pageIndex: 1,
pageSize: 1000,
},
},
labelField: 'accountName',
valueField: 'oneNETAccountId',
immediate: true,
afterFetch: (res: any) => {
// 如果是 Axios 响应对象,提取 data
if (res && res.data) {
const data = res.data;
2025-07-28 16:50:59 +08:00
// 确保返回的是数组格式
if (Array.isArray(data)) {
return data;
}
// 如果是包装在 items 中的,提取出来
if (data && Array.isArray(data.items)) {
return data.items;
}
// 如果是包装在 data 中的,提取出来
if (data && Array.isArray(data.data)) {
return data.data;
}
}
2025-07-28 16:50:59 +08:00
// 如果都不是,返回空数组
return [];
},
placeholder: `${$t('common.pleaseSelect')}${$t('abp.OneNETManagement.BelongingAccountName')}`,
},
rules: z.string().min(1, {
message: `${$t('common.pleaseSelect')}${$t('abp.OneNETManagement.BelongingAccountName')}`,
}),
},
{
component: 'Input',
fieldName: 'IoTPlatformProductId',
2025-07-28 15:24:23 +08:00
label: $t('abp.OneNETManagement.OneNETProductId'),
rules: z.string().min(1, {
2025-07-28 15:24:23 +08:00
message: `${$t('common.pleaseInput')}${$t('common.info')}${$t('abp.OneNETManagement.OneNETProductId')}`,
}),
},
{
component: 'Input',
fieldName: 'productAccesskey',
label: $t('abp.OneNETManagement.ProductAccesskey'),
2025-07-28 15:24:23 +08:00
rules: z.string().min(1, {
message: `${$t('common.pleaseInput')}${$t('common.info')}${$t('abp.OneNETManagement.ProductAccesskey')}`,
2025-07-28 15:24:23 +08:00
}),
},
{
component: 'Input',
fieldName: 'communicationAddress',
label: $t('abp.OneNETManagement.CommunicationAddress'),
rules: z.string().min(1, {
message: `${$t('common.pleaseInput')}${$t('common.info')}${$t('abp.OneNETManagement.CommunicationAddress')}`,
}),
},
{
component: 'Input',
fieldName: 'CommunicationAddressTLS',
label: $t('abp.OneNETManagement.CommunicationAddressTLS'),
2025-07-28 15:24:23 +08:00
rules: z.string().min(1, {
message: `${$t('common.pleaseInput')}${$t('common.info')}${$t('abp.OneNETManagement.CommunicationAddressTLS')}`,
2025-07-28 15:24:23 +08:00
}),
},
{
component: 'Input',
2025-07-29 11:17:27 +08:00
fieldName: 'DeviceThingModelFileId',
label: $t('abp.OneNETManagement.DeviceThingModelFileName'),
componentProps: {
placeholder: '请选择文件',
readonly: true,
addonAfter: h('button', {
type: 'button',
style: 'border: none; background: #1890ff; color: white; padding: 4px 8px; border-radius: 4px; cursor: pointer;',
onClick: () => {
const input = document.createElement('input');
input.type = 'file';
input.accept = '*/*';
input.onchange = async (e: any) => {
const file = e.target.files[0];
if (file) {
try {
const result = await postFilesUpload({
body: {
files: [file]
}
});
if (result.status === 204 || result.status === 200) {
// 假设返回的是文件信息数组取第一个文件的ID
const fileInfo = result.data?.[0];
if (fileInfo && fileInfo.id) {
// 查找当前输入框并更新值
const currentInput = document.querySelector('input[placeholder="请选择文件"]');
if (currentInput) {
(currentInput as HTMLInputElement).value = fileInfo.id;
// 触发change事件
currentInput.dispatchEvent(new Event('input', { bubbles: true }));
currentInput.dispatchEvent(new Event('change', { bubbles: true }));
// 同时设置文件名到隐藏字段
const fileNameInput = document.querySelector('input[name="DeviceThingModelFileName"]') ||
document.querySelector('input[data-field="DeviceThingModelFileName"]');
if (fileNameInput) {
(fileNameInput as HTMLInputElement).value = file.name;
fileNameInput.dispatchEvent(new Event('input', { bubbles: true }));
fileNameInput.dispatchEvent(new Event('change', { bubbles: true }));
}
}
console.log('文件上传成功文件ID:', fileInfo.id, '文件名:', file.name);
} else {
console.error('文件上传成功但未获取到文件ID');
}
} else {
console.error('文件上传失败');
}
} catch (error) {
console.error('文件上传失败:', error);
}
}
};
input.click();
}
}, '选择文件'),
},
2025-07-28 15:24:23 +08:00
rules: z.string().min(1, {
2025-07-29 11:17:27 +08:00
message: `${$t('common.pleaseSelect')}${$t('abp.OneNETManagement.DeviceThingModelFileName')}`,
2025-07-28 15:24:23 +08:00
}),
},
2025-07-29 11:17:27 +08:00
{
component: 'Input',
fieldName: 'DeviceThingModelFileName',
label: '',
componentProps: {
type: 'hidden',
},
},
]);
export const editProductFormSchemaEdit: any = computed(() => [
{
2025-07-28 16:50:59 +08:00
component: 'ApiSelect',
fieldName: 'oneNETAccountId',
label: $t('abp.OneNETManagement.BelongingAccountName'),
2025-07-28 16:50:59 +08:00
componentProps: {
api: postOneNetAccountListAsync,
params: {
body: {
pageIndex: 1,
pageSize: 1000,
},
},
labelField: 'accountName',
valueField: 'oneNETAccountId',
immediate: true,
afterFetch: (res: any) => {
// 如果是 Axios 响应对象,提取 data
if (res && res.data) {
const data = res.data;
2025-07-28 16:50:59 +08:00
// 确保返回的是数组格式
if (Array.isArray(data)) {
return data;
}
// 如果是包装在 items 中的,提取出来
if (data && Array.isArray(data.items)) {
return data.items;
}
// 如果是包装在 data 中的,提取出来
if (data && Array.isArray(data.data)) {
return data.data;
}
}
2025-07-28 16:50:59 +08:00
// 如果都不是,返回空数组
return [];
},
placeholder: `${$t('common.pleaseSelect')}${$t('abp.OneNETManagement.BelongingAccountName')}`,
2025-07-28 16:50:59 +08:00
},
2025-07-28 15:24:23 +08:00
rules: z.string().min(1, {
message: `${$t('common.pleaseSelect')}${$t('abp.OneNETManagement.BelongingAccountName')}`,
2025-07-28 15:24:23 +08:00
}),
},
{
component: 'Input',
fieldName: 'IoTPlatformProductId',
label: $t('abp.OneNETManagement.OneNETProductId'),
rules: z.string().min(1, {
message: `${$t('common.pleaseInput')}${$t('common.info')}${$t('abp.OneNETManagement.OneNETProductId')}`,
}),
},
{
component: 'Input',
fieldName: 'productAccesskey',
label: $t('abp.OneNETManagement.ProductAccesskey'),
rules: z.string().min(1, {
message: `${$t('common.pleaseInput')}${$t('common.info')}${$t('abp.OneNETManagement.ProductAccesskey')}`,
}),
},
{
component: 'Input',
fieldName: 'communicationAddress',
label: $t('abp.OneNETManagement.CommunicationAddress'),
rules: z.string().min(1, {
message: `${$t('common.pleaseInput')}${$t('common.info')}${$t('abp.OneNETManagement.CommunicationAddress')}`,
}),
},
{
component: 'Input',
fieldName: 'CommunicationAddressTLS',
label: $t('abp.OneNETManagement.CommunicationAddressTLS'),
rules: z.string().min(1, {
message: `${$t('common.pleaseInput')}${$t('common.info')}${$t('abp.OneNETManagement.CommunicationAddressTLS')}`,
}),
},
{
component: 'Input',
2025-07-29 11:17:27 +08:00
fieldName: 'DeviceThingModelFileId',
label: $t('abp.OneNETManagement.DeviceThingModelFileName'),
componentProps: {
placeholder: '请选择文件',
readonly: true,
addonAfter: h('button', {
type: 'button',
style: 'border: none; background: #1890ff; color: white; padding: 4px 8px; border-radius: 4px; cursor: pointer;',
onClick: () => {
const input = document.createElement('input');
input.type = 'file';
input.accept = '*/*';
input.onchange = async (e: any) => {
const file = e.target.files[0];
if (file) {
try {
const result = await postFilesUpload({
body: {
files: [file]
}
});
if (result.status === 204 || result.status === 200) {
// 假设返回的是文件信息数组取第一个文件的ID
const fileInfo = result.data?.[0];
if (fileInfo && fileInfo.id) {
// 查找当前输入框并更新值
const currentInput = document.querySelector('input[placeholder="请选择文件"]');
if (currentInput) {
(currentInput as HTMLInputElement).value = fileInfo.id;
// 触发change事件
currentInput.dispatchEvent(new Event('input', { bubbles: true }));
currentInput.dispatchEvent(new Event('change', { bubbles: true }));
// 同时设置文件名到隐藏字段
const fileNameInput = document.querySelector('input[name="DeviceThingModelFileName"]') ||
document.querySelector('input[data-field="DeviceThingModelFileName"]');
if (fileNameInput) {
(fileNameInput as HTMLInputElement).value = file.name;
fileNameInput.dispatchEvent(new Event('input', { bubbles: true }));
fileNameInput.dispatchEvent(new Event('change', { bubbles: true }));
}
}
console.log('文件上传成功文件ID:', fileInfo.id, '文件名:', file.name);
} else {
console.error('文件上传成功但未获取到文件ID');
}
} else {
console.error('文件上传失败');
}
} catch (error) {
console.error('文件上传失败:', error);
}
}
};
input.click();
}
}, '选择文件'),
},
rules: z.string().min(1, {
2025-07-29 11:17:27 +08:00
message: `${$t('common.pleaseSelect')}${$t('abp.OneNETManagement.DeviceThingModelFileName')}`,
}),
},
2025-07-29 11:17:27 +08:00
{
component: 'Input',
fieldName: 'DeviceThingModelFileName',
label: '',
componentProps: {
type: 'hidden',
},
},
]);