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'; | ... | ... |