Commit 21e79e8c57406f47f0790ca117216860d0461aab
1 parent
4b5ae137
wip: product profile detail update to description
Showing
15 changed files
with
552 additions
and
13 deletions
| ... | ... | @@ -3,6 +3,7 @@ import { |
| 3 | 3 | TDeviceConfigParams, |
| 4 | 4 | IDeviceConfigAddOrEditModel, |
| 5 | 5 | ProfileRecord, |
| 6 | + RuleChainRecord, | |
| 6 | 7 | } from '/@/api/device/model/deviceConfigModel'; |
| 7 | 8 | import { PaginationResult } from '/#/axios'; |
| 8 | 9 | |
| ... | ... | @@ -36,7 +37,7 @@ export const deviceConfigGetDetail = (id: string) => { |
| 36 | 37 | * 获取规则链 |
| 37 | 38 | */ |
| 38 | 39 | export const deviceConfigGetRuleChain = () => { |
| 39 | - return defHttp.get({ | |
| 40 | + return defHttp.get<RuleChainRecord[]>({ | |
| 40 | 41 | url: EDeviceConfigApi.DEVICE_CONFIG_GET_RULECHAIN, |
| 41 | 42 | }); |
| 42 | 43 | }; | ... | ... |
| ... | ... | @@ -241,3 +241,21 @@ export interface ProfileRecord { |
| 241 | 241 | |
| 242 | 242 | checked?: boolean; |
| 243 | 243 | } |
| 244 | + | |
| 245 | +export interface IDRecord { | |
| 246 | + entityType: string; | |
| 247 | + id: string; | |
| 248 | +} | |
| 249 | + | |
| 250 | +export interface RuleChainRecord { | |
| 251 | + id: IDRecord; | |
| 252 | + createdTime: number; | |
| 253 | + additionalInfo?: any; | |
| 254 | + tenantId: IDRecord; | |
| 255 | + name: string; | |
| 256 | + type: string; | |
| 257 | + firstRuleNodeId: IDRecord; | |
| 258 | + root: boolean; | |
| 259 | + debugMode: boolean; | |
| 260 | + configuration?: any; | |
| 261 | +} | ... | ... |
| ... | ... | @@ -54,8 +54,33 @@ export interface Configuration { |
| 54 | 54 | type: string; |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | +export interface TransportPayloadTypeConfiguration { | |
| 58 | + transportPayloadType: string; | |
| 59 | + deviceTelemetryProtoSchema: string; | |
| 60 | + deviceAttributesProtoSchema: string; | |
| 61 | + deviceRpcRequestProtoSchema: string; | |
| 62 | + deviceRpcResponseProtoSchema: string; | |
| 63 | + enableCompatibilityWithJsonPayloadFormat: boolean; | |
| 64 | + useJsonPayloadFormatForDefaultDownlinkTopics: boolean; | |
| 65 | +} | |
| 66 | + | |
| 67 | +export interface ClientSettings { | |
| 68 | + edrxCycle: string; | |
| 69 | + pagingTransmissionWindow: string; | |
| 70 | + powerMode: string; | |
| 71 | + psmActivityTimer: number; | |
| 72 | +} | |
| 73 | + | |
| 57 | 74 | export interface TransportConfiguration { |
| 58 | 75 | type: string; |
| 76 | + deviceTelemetryTopic: string; | |
| 77 | + deviceAttributesTopic: string; | |
| 78 | + transportPayloadTypeConfiguration: TransportPayloadTypeConfiguration; | |
| 79 | + clientSettings: ClientSettings; | |
| 80 | + coapDeviceTypeConfiguration: { | |
| 81 | + coapDeviceType: string; | |
| 82 | + transportPayloadTypeConfiguration: TransportPayloadTypeConfiguration; | |
| 83 | + }; | |
| 59 | 84 | } |
| 60 | 85 | |
| 61 | 86 | export interface ProvisionConfiguration { |
| ... | ... | @@ -85,6 +110,7 @@ export interface DeviceRecord { |
| 85 | 110 | image: string; |
| 86 | 111 | type: string; |
| 87 | 112 | default: boolean; |
| 113 | + defaultRuleChainId: string; | |
| 88 | 114 | } |
| 89 | 115 | |
| 90 | 116 | export interface DeviceModelOfMatterAttrs { | ... | ... |
| 1 | +import { ProfileRecord } from '../device/model/deviceConfigModel'; | |
| 1 | 2 | import { |
| 2 | 3 | CreateOtaPackageParams, |
| 3 | 4 | DefaultDeviceProfileInfo, |
| ... | ... | @@ -129,7 +130,7 @@ export const getDeviceProfileInfos = (params: GetDeviceProfileInfosParams) => { |
| 129 | 130 | }; |
| 130 | 131 | |
| 131 | 132 | export const getDeviceProfileInfoById = (id: string) => { |
| 132 | - return defHttp.get<DeviceProfileRecord>( | |
| 133 | + return defHttp.get<ProfileRecord>( | |
| 133 | 134 | { |
| 134 | 135 | url: `${Api.GET_DEVICE_PROFILE_INFO_BY_ID}/${id}`, |
| 135 | 136 | }, | ... | ... |
src/components/Widget/AuthDropDown.vue
0 → 100644
src/components/Widget/AuthIcon.vue
0 → 100644
| ... | ... | @@ -3,14 +3,13 @@ |
| 3 | 3 | <Tabs v-model:activeKey="activeKey" @change="handlePanelChange"> |
| 4 | 4 | <Tabs.TabPane key="product" tab="产品"> |
| 5 | 5 | <div class="relative"> |
| 6 | - <DeviceConfigurationStep :ifShowBtn="false" ref="DevConStRef" /> | |
| 7 | - <div class="absolute w-full h-full top-0 cursor-not-allowed"></div> | |
| 6 | + <ProductDescription ref="DevConStRef" :record="record" /> | |
| 8 | 7 | </div> |
| 9 | 8 | </Tabs.TabPane> |
| 10 | 9 | <Tabs.TabPane key="transport" tab="传输配置"> |
| 11 | - <div class="relative"> | |
| 12 | - <TransportConfigurationStep :ifShowBtn="false" ref="TransConStRef" /> | |
| 13 | - <div class="absolute w-full h-full top-0 cursor-not-allowed"></div> | |
| 10 | + <div> | |
| 11 | + <TransportDescription :record="record" /> | |
| 12 | + <!-- <TransportConfigurationStep :ifShowBtn="false" ref="TransConStRef" /> --> | |
| 14 | 13 | </div> |
| 15 | 14 | </Tabs.TabPane> |
| 16 | 15 | <Tabs.TabPane key="topic" tab="Topic"> |
| ... | ... | @@ -25,13 +24,14 @@ |
| 25 | 24 | <script lang="ts" setup> |
| 26 | 25 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; |
| 27 | 26 | import { Tabs } from 'ant-design-vue'; |
| 28 | - import DeviceConfigurationStep from './step/DeviceConfigurationStep.vue'; | |
| 29 | 27 | import TransportConfigurationStep from './step/TransportConfigurationStep.vue'; |
| 30 | 28 | import PhysicalModelManagementStep from './step/PhysicalModelManagementStep.vue'; |
| 31 | 29 | import { nextTick, ref, unref } from 'vue'; |
| 32 | 30 | import { deviceConfigGetDetail } from '/@/api/device/deviceConfigApi'; |
| 33 | 31 | import { DeviceRecord } from '/@/api/device/model/deviceModel'; |
| 34 | 32 | import TopicPanel from './step/TopicPanel.vue'; |
| 33 | + import ProductDescription from './components/ProductDescription.vue'; | |
| 34 | + import { TransportDescription } from './components/TransportDescript'; | |
| 35 | 35 | |
| 36 | 36 | defineEmits(['register']); |
| 37 | 37 | |
| ... | ... | @@ -41,12 +41,11 @@ |
| 41 | 41 | |
| 42 | 42 | const record = ref<DeviceRecord>({} as unknown as DeviceRecord); |
| 43 | 43 | |
| 44 | - const DevConStRef = ref<InstanceType<typeof DeviceConfigurationStep>>(); | |
| 44 | + const DevConStRef = ref<InstanceType<typeof ProductDescription>>(); | |
| 45 | 45 | const TransConStRef = ref<InstanceType<typeof TransportConfigurationStep>>(); |
| 46 | - // const PhysicalModManRef = ref<InstanceType<typeof PhysicalModelManagementStep>>(); | |
| 47 | 46 | |
| 48 | - const setDeviceConfFormData = async (res: Recordable) => { | |
| 49 | - unref(DevConStRef)?.setFormData(res); | |
| 47 | + const setDeviceConfFormData = async () => { | |
| 48 | + unref(DevConStRef)?.renderProductInfo(); | |
| 50 | 49 | }; |
| 51 | 50 | const setTransConfFormData = async (res: Recordable) => { |
| 52 | 51 | await nextTick(); |
| ... | ... | @@ -57,7 +56,7 @@ |
| 57 | 56 | activeKey.value = 'product'; |
| 58 | 57 | record.value = data.record; |
| 59 | 58 | record.value = await deviceConfigGetDetail(data.record.id); |
| 60 | - setDeviceConfFormData(unref(record)); | |
| 59 | + setDeviceConfFormData(); | |
| 61 | 60 | }); |
| 62 | 61 | |
| 63 | 62 | const handlePanelChange = (activeKey: ActiveKey) => { | ... | ... |
| 1 | +<script lang="ts" setup> | |
| 2 | + import { Spin, Image } from 'ant-design-vue'; | |
| 3 | + import { ref, unref, h } from 'vue'; | |
| 4 | + import { deviceConfigGetRuleChain } from '/@/api/device/deviceConfigApi'; | |
| 5 | + import { RuleChainRecord } from '/@/api/device/model/deviceConfigModel'; | |
| 6 | + import { DeviceRecord } from '/@/api/device/model/deviceModel'; | |
| 7 | + import { findDictItemByCode } from '/@/api/system/dict'; | |
| 8 | + import { SysDictItemResult } from '/@/api/system/model/dictModel'; | |
| 9 | + import { Description, useDescription } from '/@/components/Description'; | |
| 10 | + import { to } from '/@/utils/to'; | |
| 11 | + import productDefaultImage from '/@/assets/icons/product-default.svg'; | |
| 12 | + | |
| 13 | + const loading = ref(false); | |
| 14 | + | |
| 15 | + const props = defineProps<{ | |
| 16 | + record: DeviceRecord; | |
| 17 | + }>(); | |
| 18 | + | |
| 19 | + const data = ref<DeviceRecord>({} as unknown as DeviceRecord); | |
| 20 | + | |
| 21 | + const [register, { setDescProps }] = useDescription({ | |
| 22 | + layout: 'vertical', | |
| 23 | + column: 2, | |
| 24 | + schema: [ | |
| 25 | + { | |
| 26 | + field: 'image', | |
| 27 | + label: '图片', | |
| 28 | + span: 2, | |
| 29 | + render: (val) => { | |
| 30 | + return h(Image, { src: val || productDefaultImage, height: 200 }); | |
| 31 | + }, | |
| 32 | + }, | |
| 33 | + { | |
| 34 | + field: 'deviceType', | |
| 35 | + label: '设备类型', | |
| 36 | + }, | |
| 37 | + { | |
| 38 | + field: 'name', | |
| 39 | + label: '产品名称', | |
| 40 | + }, | |
| 41 | + { | |
| 42 | + field: 'ruleChain', | |
| 43 | + label: '规则链', | |
| 44 | + }, | |
| 45 | + { | |
| 46 | + field: 'queueName', | |
| 47 | + label: '处理队列', | |
| 48 | + }, | |
| 49 | + { | |
| 50 | + field: 'description', | |
| 51 | + label: '描述', | |
| 52 | + render(val) { | |
| 53 | + return h('div', { class: 'min-h-6' }, val); | |
| 54 | + }, | |
| 55 | + }, | |
| 56 | + ], | |
| 57 | + }); | |
| 58 | + | |
| 59 | + const findDeviceType = async (deviceType: string) => { | |
| 60 | + const [error, data] = await to<SysDictItemResult[]>( | |
| 61 | + findDictItemByCode({ dictCode: 'device_type' }) | |
| 62 | + ); | |
| 63 | + if (!error) { | |
| 64 | + const record = data.find((item) => item.itemValue === deviceType); | |
| 65 | + return { deviceType: record?.itemText }; | |
| 66 | + } | |
| 67 | + return {}; | |
| 68 | + }; | |
| 69 | + | |
| 70 | + const findHandleQueue = async (defaultQueueName: string) => { | |
| 71 | + const [error, data] = await to<SysDictItemResult[]>( | |
| 72 | + findDictItemByCode({ dictCode: 'queen_execute_sequence' }) | |
| 73 | + ); | |
| 74 | + if (!error) { | |
| 75 | + const record = data.find((item) => item.itemValue === defaultQueueName); | |
| 76 | + return { queueName: record?.itemText }; | |
| 77 | + } | |
| 78 | + return {}; | |
| 79 | + }; | |
| 80 | + | |
| 81 | + const findRuleChain = async (ruleChain: string) => { | |
| 82 | + const [error, data] = await to<RuleChainRecord[]>(deviceConfigGetRuleChain()); | |
| 83 | + if (!error) { | |
| 84 | + const record = data.find((item) => item.id.id === ruleChain); | |
| 85 | + return { ruleChain: record?.name }; | |
| 86 | + } | |
| 87 | + return {}; | |
| 88 | + }; | |
| 89 | + | |
| 90 | + const renderProductInfo = async () => { | |
| 91 | + try { | |
| 92 | + data.value = {} as unknown as DeviceRecord; | |
| 93 | + loading.value = true; | |
| 94 | + const { defaultRuleChainId, deviceType, defaultQueueName } = props.record; | |
| 95 | + data.value = props.record; | |
| 96 | + const values = await Promise.all([ | |
| 97 | + findDeviceType(deviceType), | |
| 98 | + findHandleQueue(defaultQueueName), | |
| 99 | + findRuleChain(defaultRuleChainId), | |
| 100 | + ]); | |
| 101 | + const value = values.reduce((prev, next) => ({ ...prev, ...next }), {}); | |
| 102 | + data.value = Object.assign(unref(data), value); | |
| 103 | + setDescProps({ data: unref(data) }); | |
| 104 | + } catch (error) { | |
| 105 | + throw error; | |
| 106 | + } finally { | |
| 107 | + loading.value = false; | |
| 108 | + } | |
| 109 | + }; | |
| 110 | + | |
| 111 | + defineExpose({ | |
| 112 | + renderProductInfo, | |
| 113 | + }); | |
| 114 | +</script> | |
| 115 | + | |
| 116 | +<template> | |
| 117 | + <Spin :spinning="loading"> | |
| 118 | + <Description class="product-description" @register="register" /> | |
| 119 | + </Spin> | |
| 120 | +</template> | |
| 121 | + | |
| 122 | +<style lang="less" scoped> | |
| 123 | + .product-description:deep(.ant-image-img) { | |
| 124 | + height: 200px !important; | |
| 125 | + } | |
| 126 | +</style> | ... | ... |
| 1 | +<script lang="ts" setup> | |
| 2 | + import { DeviceRecord } from '/@/api/device/model/deviceModel'; | |
| 3 | + import { useDescription, Description } from '/@/components/Description'; | |
| 4 | + import { Input } from 'ant-design-vue'; | |
| 5 | + import { h } from 'vue'; | |
| 6 | + import { COAPDeviceTypeEnum, PowerModeNameEnum, TransportPayloadTypeEnum } from './const'; | |
| 7 | + | |
| 8 | + type TransportConfiguration = DeviceRecord['profileData']['transportConfiguration']; | |
| 9 | + const props = defineProps<{ | |
| 10 | + record: TransportConfiguration; | |
| 11 | + }>(); | |
| 12 | + | |
| 13 | + const showProtoSchema = (data: TransportConfiguration) => { | |
| 14 | + return ( | |
| 15 | + data.coapDeviceTypeConfiguration.transportPayloadTypeConfiguration.transportPayloadType === | |
| 16 | + TransportPayloadTypeEnum.PROTOBUF && | |
| 17 | + data.coapDeviceTypeConfiguration.coapDeviceType === COAPDeviceTypeEnum.DEFAULT | |
| 18 | + ); | |
| 19 | + }; | |
| 20 | + | |
| 21 | + const showPowerModeIsPSM = (data: TransportConfiguration) => { | |
| 22 | + return data.clientSettings.powerMode === PowerModeNameEnum.PSM; | |
| 23 | + }; | |
| 24 | + | |
| 25 | + const showPowerModeIsEDRX = (data: TransportConfiguration) => { | |
| 26 | + return data.clientSettings.powerMode === PowerModeNameEnum.E_DRX; | |
| 27 | + }; | |
| 28 | + | |
| 29 | + const [register] = useDescription({ | |
| 30 | + layout: 'vertical', | |
| 31 | + column: 2, | |
| 32 | + data: props.record, | |
| 33 | + schema: [ | |
| 34 | + { | |
| 35 | + field: 'type', | |
| 36 | + label: '接入协议', | |
| 37 | + }, | |
| 38 | + { | |
| 39 | + field: 'coapDeviceType', | |
| 40 | + label: 'COAP设备类型', | |
| 41 | + render: (_, data: TransportConfiguration) => | |
| 42 | + data.coapDeviceTypeConfiguration.coapDeviceType, | |
| 43 | + }, | |
| 44 | + { | |
| 45 | + field: 'coapDeviceType', | |
| 46 | + label: 'COAP设备消息Payload', | |
| 47 | + render: (_, data: TransportConfiguration) => | |
| 48 | + data.coapDeviceTypeConfiguration.transportPayloadTypeConfiguration.transportPayloadType, | |
| 49 | + }, | |
| 50 | + { | |
| 51 | + field: 'powerMode', | |
| 52 | + label: '节能模式', | |
| 53 | + render: (_, data: TransportConfiguration) => | |
| 54 | + PowerModeNameEnum[data.clientSettings.powerMode], | |
| 55 | + }, | |
| 56 | + { | |
| 57 | + field: 'psmActivityTimer', | |
| 58 | + label: 'PSM活动计时器', | |
| 59 | + show: showPowerModeIsPSM, | |
| 60 | + render: (_, data: TransportConfiguration) => data.clientSettings.psmActivityTimer, | |
| 61 | + }, | |
| 62 | + { | |
| 63 | + field: 'edrxCycle', | |
| 64 | + label: 'eDRX循环', | |
| 65 | + show: showPowerModeIsEDRX, | |
| 66 | + render: (_, data: TransportConfiguration) => data.clientSettings.edrxCycle, | |
| 67 | + }, | |
| 68 | + { | |
| 69 | + field: 'edrxCycleTime', | |
| 70 | + label: 'eDRX循环时间单位', | |
| 71 | + show: showPowerModeIsEDRX, | |
| 72 | + render: () => '秒', | |
| 73 | + }, | |
| 74 | + { | |
| 75 | + field: 'pagingTransmissionWindow', | |
| 76 | + label: '寻呼传输窗口', | |
| 77 | + show: showPowerModeIsEDRX, | |
| 78 | + render: (_, data: TransportConfiguration) => data.clientSettings.pagingTransmissionWindow, | |
| 79 | + }, | |
| 80 | + { | |
| 81 | + field: 'pagingTransmissionWindowTime', | |
| 82 | + label: '寻呼传输窗口时间单位', | |
| 83 | + show: showPowerModeIsEDRX, | |
| 84 | + render: () => '秒', | |
| 85 | + }, | |
| 86 | + { | |
| 87 | + field: 'unit', | |
| 88 | + label: '时间单位', | |
| 89 | + show: showPowerModeIsPSM, | |
| 90 | + render: () => '秒', | |
| 91 | + }, | |
| 92 | + { | |
| 93 | + field: 'deviceTelemetryProtoSchema', | |
| 94 | + label: '遥测数据 proto schema', | |
| 95 | + span: 2, | |
| 96 | + show: showProtoSchema, | |
| 97 | + render(_, data: TransportConfiguration) { | |
| 98 | + return h(Input.TextArea, { | |
| 99 | + autoSize: true, | |
| 100 | + value: | |
| 101 | + data.coapDeviceTypeConfiguration.transportPayloadTypeConfiguration | |
| 102 | + .deviceTelemetryProtoSchema, | |
| 103 | + }); | |
| 104 | + }, | |
| 105 | + }, | |
| 106 | + { | |
| 107 | + field: 'deviceAttributesProtoSchema', | |
| 108 | + label: 'Attributes proto schema', | |
| 109 | + span: 2, | |
| 110 | + show: showProtoSchema, | |
| 111 | + render(_, data: TransportConfiguration) { | |
| 112 | + return h(Input.TextArea, { | |
| 113 | + autoSize: true, | |
| 114 | + value: | |
| 115 | + data.coapDeviceTypeConfiguration.transportPayloadTypeConfiguration | |
| 116 | + .deviceAttributesProtoSchema, | |
| 117 | + }); | |
| 118 | + }, | |
| 119 | + }, | |
| 120 | + { | |
| 121 | + field: 'deviceRpcRequestProtoSchema', | |
| 122 | + label: 'RPC 请求 proto schema', | |
| 123 | + span: 2, | |
| 124 | + show: showProtoSchema, | |
| 125 | + render(_, data: TransportConfiguration) { | |
| 126 | + return h(Input.TextArea, { | |
| 127 | + autoSize: true, | |
| 128 | + value: | |
| 129 | + data.coapDeviceTypeConfiguration.transportPayloadTypeConfiguration | |
| 130 | + .deviceRpcRequestProtoSchema, | |
| 131 | + }); | |
| 132 | + }, | |
| 133 | + }, | |
| 134 | + { | |
| 135 | + field: 'deviceRpcResponseProtoSchema', | |
| 136 | + label: 'RPC 响应 proto schema', | |
| 137 | + span: 2, | |
| 138 | + show: showProtoSchema, | |
| 139 | + render(_, data: TransportConfiguration) { | |
| 140 | + return h(Input.TextArea, { | |
| 141 | + autoSize: true, | |
| 142 | + value: | |
| 143 | + data.coapDeviceTypeConfiguration.transportPayloadTypeConfiguration | |
| 144 | + .deviceRpcResponseProtoSchema, | |
| 145 | + }); | |
| 146 | + }, | |
| 147 | + }, | |
| 148 | + ], | |
| 149 | + }); | |
| 150 | +</script> | |
| 151 | + | |
| 152 | +<template> | |
| 153 | + <Description @register="register" /> | |
| 154 | +</template> | ... | ... |
| 1 | +<script lang="ts" setup> | |
| 2 | + import { DeviceRecord } from '/@/api/device/model/deviceModel'; | |
| 3 | + import { useDescription, Description } from '/@/components/Description'; | |
| 4 | + | |
| 5 | + const props = defineProps<{ | |
| 6 | + record: DeviceRecord['profileData']['transportConfiguration']; | |
| 7 | + }>(); | |
| 8 | + | |
| 9 | + const [register] = useDescription({ | |
| 10 | + layout: 'vertical', | |
| 11 | + column: 2, | |
| 12 | + schema: [ | |
| 13 | + { | |
| 14 | + field: 'type', | |
| 15 | + label: '接入协议', | |
| 16 | + }, | |
| 17 | + ], | |
| 18 | + data: props.record, | |
| 19 | + }); | |
| 20 | +</script> | |
| 21 | + | |
| 22 | +<template> | |
| 23 | + <Description @register="register" /> | |
| 24 | +</template> | ... | ... |
| 1 | +<script lang="ts" setup> | |
| 2 | + import { DeviceRecord } from '/@/api/device/model/deviceModel'; | |
| 3 | + import { useDescription, Description } from '/@/components/Description'; | |
| 4 | + import { Input } from 'ant-design-vue'; | |
| 5 | + import { h } from 'vue'; | |
| 6 | + import { TransportPayloadTypeEnum } from './const'; | |
| 7 | + | |
| 8 | + type TransportConfiguration = DeviceRecord['profileData']['transportConfiguration']; | |
| 9 | + const props = defineProps<{ | |
| 10 | + record: TransportConfiguration; | |
| 11 | + }>(); | |
| 12 | + | |
| 13 | + const [register] = useDescription({ | |
| 14 | + layout: 'vertical', | |
| 15 | + column: 2, | |
| 16 | + data: props.record, | |
| 17 | + schema: [ | |
| 18 | + { | |
| 19 | + field: 'type', | |
| 20 | + label: '接入协议', | |
| 21 | + span: 2, | |
| 22 | + }, | |
| 23 | + { | |
| 24 | + field: 'deviceTelemetryTopic', | |
| 25 | + label: '遥测数据主题筛选器', | |
| 26 | + }, | |
| 27 | + { | |
| 28 | + field: 'deviceAttributesTopic', | |
| 29 | + label: '属性主题过滤器', | |
| 30 | + }, | |
| 31 | + { | |
| 32 | + field: 'transportPayloadType', | |
| 33 | + label: 'MQTT设备Payload', | |
| 34 | + render(_, data: TransportConfiguration) { | |
| 35 | + return data.transportPayloadTypeConfiguration.transportPayloadType; | |
| 36 | + }, | |
| 37 | + }, | |
| 38 | + { | |
| 39 | + field: 'enableCompatibilityWithJsonPayloadFormat', | |
| 40 | + label: '启用与其他有效负载格式的兼容性', | |
| 41 | + render(_, data: TransportConfiguration) { | |
| 42 | + return data.transportPayloadTypeConfiguration.enableCompatibilityWithJsonPayloadFormat | |
| 43 | + ? '启用' | |
| 44 | + : '关闭'; | |
| 45 | + }, | |
| 46 | + }, | |
| 47 | + { | |
| 48 | + field: 'deviceTelemetryProtoSchema', | |
| 49 | + label: '遥测数据 proto schema', | |
| 50 | + span: 2, | |
| 51 | + show: (data: TransportConfiguration) => | |
| 52 | + data.transportPayloadTypeConfiguration.transportPayloadType === | |
| 53 | + TransportPayloadTypeEnum.PROTOBUF, | |
| 54 | + render(_, data: TransportConfiguration) { | |
| 55 | + return h(Input.TextArea, { | |
| 56 | + autoSize: true, | |
| 57 | + value: data.transportPayloadTypeConfiguration.deviceTelemetryProtoSchema, | |
| 58 | + }); | |
| 59 | + }, | |
| 60 | + }, | |
| 61 | + { | |
| 62 | + field: 'deviceAttributesProtoSchema', | |
| 63 | + label: 'Attributes proto schema', | |
| 64 | + span: 2, | |
| 65 | + show: (data: TransportConfiguration) => | |
| 66 | + data.transportPayloadTypeConfiguration.transportPayloadType === | |
| 67 | + TransportPayloadTypeEnum.PROTOBUF, | |
| 68 | + render(_, data: TransportConfiguration) { | |
| 69 | + return h(Input.TextArea, { | |
| 70 | + autoSize: true, | |
| 71 | + value: data.transportPayloadTypeConfiguration.deviceAttributesProtoSchema, | |
| 72 | + }); | |
| 73 | + }, | |
| 74 | + }, | |
| 75 | + { | |
| 76 | + field: 'deviceRpcRequestProtoSchema', | |
| 77 | + label: 'RPC 请求 proto schema', | |
| 78 | + span: 2, | |
| 79 | + show: (data: TransportConfiguration) => | |
| 80 | + data.transportPayloadTypeConfiguration.transportPayloadType === | |
| 81 | + TransportPayloadTypeEnum.PROTOBUF, | |
| 82 | + render(_, data: TransportConfiguration) { | |
| 83 | + return h(Input.TextArea, { | |
| 84 | + autoSize: true, | |
| 85 | + value: data.transportPayloadTypeConfiguration.deviceRpcRequestProtoSchema, | |
| 86 | + }); | |
| 87 | + }, | |
| 88 | + }, | |
| 89 | + { | |
| 90 | + field: 'deviceRpcResponseProtoSchema', | |
| 91 | + label: 'RPC 响应 proto schema', | |
| 92 | + span: 2, | |
| 93 | + show: (data: TransportConfiguration) => | |
| 94 | + data.transportPayloadTypeConfiguration.transportPayloadType === | |
| 95 | + TransportPayloadTypeEnum.PROTOBUF, | |
| 96 | + render(_, data: TransportConfiguration) { | |
| 97 | + return h(Input.TextArea, { | |
| 98 | + autoSize: true, | |
| 99 | + value: data.transportPayloadTypeConfiguration.deviceRpcResponseProtoSchema, | |
| 100 | + }); | |
| 101 | + }, | |
| 102 | + }, | |
| 103 | + ], | |
| 104 | + }); | |
| 105 | +</script> | |
| 106 | + | |
| 107 | +<template> | |
| 108 | + <Description @register="register" /> | |
| 109 | +</template> | ... | ... |
| 1 | +<script lang="ts" setup> | |
| 2 | + import { computed } from 'vue'; | |
| 3 | + import COAPDescription from './COAPDescription.vue'; | |
| 4 | + import { TransportTypeEnum } from './const'; | |
| 5 | + import DefaultConfiguration from './DefaultConfiguration.vue'; | |
| 6 | + import MQTTConfiguration from './MQTTConfiguration.vue'; | |
| 7 | + import { DeviceRecord } from '/@/api/device/model/deviceModel'; | |
| 8 | + | |
| 9 | + const props = defineProps<{ | |
| 10 | + record: DeviceRecord; | |
| 11 | + }>(); | |
| 12 | + | |
| 13 | + const getTransportInfo = computed(() => { | |
| 14 | + const { record } = props; | |
| 15 | + return record.profileData.transportConfiguration; | |
| 16 | + }); | |
| 17 | +</script> | |
| 18 | + | |
| 19 | +<template> | |
| 20 | + <section> | |
| 21 | + <DefaultConfiguration | |
| 22 | + :record="getTransportInfo" | |
| 23 | + v-if="getTransportInfo.type === TransportTypeEnum.DEFAULT" | |
| 24 | + /> | |
| 25 | + | |
| 26 | + <MQTTConfiguration | |
| 27 | + :record="getTransportInfo" | |
| 28 | + v-if="getTransportInfo.type === TransportTypeEnum.MQTT" | |
| 29 | + /> | |
| 30 | + | |
| 31 | + <COAPDescription | |
| 32 | + :record="getTransportInfo" | |
| 33 | + v-if="getTransportInfo.type === TransportTypeEnum.COAP" | |
| 34 | + /> | |
| 35 | + </section> | |
| 36 | +</template> | ... | ... |
| 1 | +export enum TransportTypeEnum { | |
| 2 | + DEFAULT = 'DEFAULT', | |
| 3 | + MQTT = 'MQTT', | |
| 4 | + COAP = 'COAP', | |
| 5 | + LWM2M = 'LWM2M', | |
| 6 | + SNMP = 'SNMP', | |
| 7 | +} | |
| 8 | + | |
| 9 | +export enum TransportPayloadTypeEnum { | |
| 10 | + PROTOBUF = 'PROTOBUF', | |
| 11 | + JSON = 'JSON', | |
| 12 | +} | |
| 13 | + | |
| 14 | +export enum COAPDeviceTypeEnum { | |
| 15 | + DEFAULT = 'DEFAULT', | |
| 16 | + EFENTO = 'EFENTO', | |
| 17 | +} | |
| 18 | + | |
| 19 | +export enum COAPDeviceTypeNameEnum { | |
| 20 | + DEFAULT = '默认', | |
| 21 | + EFENTO = 'Efento NB-IoT', | |
| 22 | +} | |
| 23 | + | |
| 24 | +export enum PowerModeNameEnum { | |
| 25 | + PSM = 'Power Saving Mode (PSM)', | |
| 26 | + DRX = 'Discontinuous Reception (DRX)', | |
| 27 | + E_DRX = 'Extended Discontinuous Reception (eDRX)', | |
| 28 | +} | |
| 29 | + | |
| 30 | +export enum TimeUnitEnum { | |
| 31 | + MILLISECONDS = 'milliseconds', | |
| 32 | + SECOND = 'second', | |
| 33 | + MINUTE = 'minute', | |
| 34 | + HOUR = 'hour', | |
| 35 | +} | ... | ... |
| 1 | +export { default as TransportDescription } from './TransportDescription.vue'; | ... | ... |