diff --git a/apps/web-antd/src/views/iot/product/product/data.ts b/apps/web-antd/src/views/iot/product/product/data.ts index 118a55e64..98dc3fd66 100644 --- a/apps/web-antd/src/views/iot/product/product/data.ts +++ b/apps/web-antd/src/views/iot/product/product/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { IotProductCategoryApi } from '#/api/iot/product/category'; import { h } from 'vue'; @@ -12,10 +11,6 @@ import { Button } from 'ant-design-vue'; import { z } from '#/adapter/form'; import { getSimpleProductCategoryList } from '#/api/iot/product/category'; -/** 产品分类列表缓存 */ -let categoryList: IotProductCategoryApi.ProductCategory[] = []; -getSimpleProductCategoryList().then((data) => (categoryList = data)); - /** 基础表单字段(不含图标、图片、描述) */ export function useBasicFormSchema( formApi?: any, @@ -114,6 +109,15 @@ export function useBasicFormSchema( buttonStyle: 'solid', optionType: 'button', }, + // TODO @AI:枚举值。或者这里不要枚举值?对齐 vue3 + ep 版本 + defaultValue: 0, + dependencies: { + triggerFields: ['id'], + componentProps: (values) => ({ + // 编辑时设备类型不可改 + disabled: !!values.id, + }), + }, rules: 'required', }, { @@ -124,6 +128,12 @@ export function useBasicFormSchema( options: getDictOptions(DICT_TYPE.IOT_NET_TYPE, 'number'), placeholder: '请选择联网方式', }, + // 网关子设备走网关联网,不需要联网方式 + dependencies: { + triggerFields: ['deviceType'], + // TODO @AI:枚举值。或者这里不要枚举值?(也看看 vben 里,其它是不是也漏了枚举值。) + show: (values) => values.deviceType !== 2, + }, rules: 'required', }, { @@ -134,6 +144,7 @@ export function useBasicFormSchema( options: getDictOptions(DICT_TYPE.IOT_PROTOCOL_TYPE, 'string'), placeholder: '请选择协议类型', }, + defaultValue: 'mqtt', rules: 'required', }, { @@ -144,6 +155,7 @@ export function useBasicFormSchema( options: getDictOptions(DICT_TYPE.IOT_SERIALIZE_TYPE, 'string'), placeholder: '请选择序列化类型', }, + defaultValue: 'json', help: 'iot-gateway-server 默认根据接入的协议类型确定数据格式,仅 MQTT、EMQX 协议支持自定义序列化类型', rules: 'required', }, @@ -167,11 +179,7 @@ export function useAdvancedFormSchema(): VbenFormSchema[] { { fieldName: 'icon', label: '产品图标', - component: 'IconPicker', - componentProps: { - placeholder: '请选择产品图标', - prefix: 'carbon', - }, + component: 'ImageUpload', }, { fieldName: 'picUrl', @@ -204,11 +212,10 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { minWidth: 150, }, { - field: 'categoryId', + field: 'categoryName', title: '品类', minWidth: 120, - formatter: ({ cellValue }) => - categoryList.find((c) => c.id === cellValue)?.name || '未分类', + formatter: ({ row }) => row.categoryName || '未分类', }, { field: 'deviceType', diff --git a/apps/web-antd/src/views/iot/product/product/detail/modules/header.vue b/apps/web-antd/src/views/iot/product/product/detail/modules/header.vue index ca0c84399..3741e3faa 100644 --- a/apps/web-antd/src/views/iot/product/product/detail/modules/header.vue +++ b/apps/web-antd/src/views/iot/product/product/detail/modules/header.vue @@ -3,12 +3,16 @@ import type { IotProductApi } from '#/api/iot/product/product'; import { useRouter } from 'vue-router'; +import { useAccess } from '@vben/access'; import { useVbenModal } from '@vben/common-ui'; import { ProductStatusEnum } from '@vben/constants'; import { Button, Card, Descriptions, message, Modal } from 'ant-design-vue'; -import { updateProductStatus } from '#/api/iot/product/product'; +import { + syncProductPropertyTable, + updateProductStatus, +} from '#/api/iot/product/product'; import Form from '../../modules/form.vue'; @@ -26,6 +30,7 @@ const emit = defineEmits<{ }>(); const router = useRouter(); +const { hasAccessByCodes } = useAccess(); const [FormModal, formModalApi] = useVbenModal({ connectedComponent: Form, @@ -44,8 +49,9 @@ async function copyToClipboard(text: string) { /** 跳转到设备管理 */ function goToDeviceList(productId: number) { + // TODO @AI:在检查下,vben 里面有没其他也是这种路由情况的;要尽量使用 name; router.push({ - path: '/iot/device/device', + name: 'IoTDevice', query: { productId: String(productId) }, }); } @@ -80,6 +86,18 @@ function handleUnpublish(product: IotProductApi.Product) { }, }); } + +/** 同步物模型超级表结构 */ +function handleSyncPropertyTable(product: IotProductApi.Product) { + Modal.confirm({ + title: '确认同步', + content: `确认要同步产品「${product.name}」的物模型超级表结构吗?`, + async onOk() { + await syncProductPropertyTable(product.id!); + message.success('同步成功'); + }, + }); +}