Commit f0df21ba029608917a95626c91ae47e2cb951378

Authored by xp.Huang
2 parents ea07f522 907f1337

Merge branch 'ft_local_dev' into 'main'

fix:修改场景联动弹窗两次

See merge request huang/yun-teng-iot-front!349
1 1 <template>
2 2 <div :class="prefixCls">
3   - <CollapseHeader v-bind="$props" :prefixCls="prefixCls" :show="show" @expand="handleExpand">
  3 + <CollapseHeader
  4 + v-bind="$props"
  5 + :prefixCls="prefixCls"
  6 + :show="!isClose ? isClose : show"
  7 + @expand="handleExpand"
  8 + >
4 9 <template #title>
5 10 <slot name="title"></slot>
6 11 </template>
... ... @@ -12,7 +17,7 @@
12 17 <div class="p-2">
13 18 <CollapseTransition :enable="canExpan">
14 19 <Skeleton v-if="loading" :active="loading" />
15   - <div :class="`${prefixCls}__body`" v-else v-show="show">
  20 + <div :class="`${prefixCls}__body`" v-else v-show="!isClose ? isClose : show">
16 21 <slot></slot>
17 22 </div>
18 23 </CollapseTransition>
... ... @@ -35,6 +40,7 @@
35 40 import { useDesign } from '/@/hooks/web/useDesign';
36 41
37 42 const props = defineProps({
  43 + isClose: { type: Boolean, default: true },
38 44 title: { type: String, default: '' },
39 45 loading: { type: Boolean },
40 46 /**
... ... @@ -58,7 +64,7 @@
58 64 */
59 65 lazyTime: { type: Number, default: 0 },
60 66 });
61   - const emit = defineEmits(['expand']);
  67 + const emit = defineEmits(['expand', 'change', 'hchange']);
62 68
63 69 const show = ref(true);
64 70
... ... @@ -69,6 +75,8 @@
69 75 */
70 76 function handleExpand() {
71 77 show.value = !show.value;
  78 + emit('change', !show.value);
  79 + emit('hchange', !show.value);
72 80 if (props.triggerWindowResize) {
73 81 // 200 milliseconds here is because the expansion has animation,
74 82 useTimeoutFn(triggerWindowResize, 200);
... ...
... ... @@ -40,7 +40,7 @@ export const CoapSchemas: FormSchema[] = [
40 40 { label: 'Efento NB-IoT', value: 'EFENTO' },
41 41 ],
42 42 },
43   - colProps: { span: 22},
  43 + colProps: { span: 22 },
44 44 },
45 45 {
46 46 field: 'transportPayloadType',
... ... @@ -163,9 +163,7 @@ export const CoapSchemas: FormSchema[] = [
163 163 colProps: { span: 22 },
164 164 component: 'InputTextArea',
165 165 componentProps: {
166   - autoSize: {
167   - maxRows: 10,
168   - },
  166 + rows: 17,
169 167 },
170 168 defaultValue: `
171 169 syntax ="proto3";
... ... @@ -193,9 +191,7 @@ export const CoapSchemas: FormSchema[] = [
193 191 colProps: { span: 22 },
194 192 component: 'InputTextArea',
195 193 componentProps: {
196   - autoSize: {
197   - maxRows: 10,
198   - },
  194 + rows: 9,
199 195 },
200 196 defaultValue: `
201 197 syntax ="proto3";
... ... @@ -215,9 +211,7 @@ export const CoapSchemas: FormSchema[] = [
215 211 colProps: { span: 22 },
216 212 component: 'InputTextArea',
217 213 componentProps: {
218   - autoSize: {
219   - maxRows: 10,
220   - },
  214 + rows: 11,
221 215 },
222 216 defaultValue: `
223 217 syntax ="proto3";
... ... @@ -238,9 +232,7 @@ export const CoapSchemas: FormSchema[] = [
238 232 colProps: { span: 22 },
239 233 component: 'InputTextArea',
240 234 componentProps: {
241   - autoSize: {
242   - maxRows: 10,
243   - },
  235 + rows: 9,
244 236 },
245 237 defaultValue: `
246 238 syntax ="proto3";
... ...
... ... @@ -8,16 +8,12 @@
8 8 <script lang="ts" setup>
9 9 import { reactive } from 'vue';
10 10 import { BasicForm, useForm } from '/@/components/Form';
11   - import {
12   - CoapSchemas,
13   - // deviceTelemetryProtoSchemaData,
14   - // deviceAttributesProtoSchemaData,
15   - // deviceRpcRequestProtoSchemaData,
16   - // deviceRpcResponseProtoSchemaData,
17   - } from './Coap';
  11 + import { CoapSchemas } from './Coap';
18 12
19 13 const emits = defineEmits(['prev']);
20   - let coapAllData = reactive({});
  14 + const coapAllData = reactive({
  15 + coapData: {},
  16 + });
21 17 const transportCoapData: any = reactive({
22 18 coapDeviceTypeConfiguration: {
23 19 coapDeviceType: null,
... ... @@ -61,25 +57,43 @@
61 57 const getFormData = async () => {
62 58 const val = await validate();
63 59 if (!val) return;
64   - transportCoapData.coapDeviceTypeConfiguration.coapDeviceType = val.coapDeviceType;
65   - transportCoapData.coapDeviceTypeConfiguration.transportPayloadTypeConfiguration.transportPayloadType =
66   - val.transportPayloadType;
67   - transportCoapData.coapDeviceTypeConfiguration.transportPayloadTypeConfiguration.deviceTelemetryProtoSchema =
68   - val.deviceTelemetryProtoSchema;
69   - transportCoapData.coapDeviceTypeConfiguration.transportPayloadTypeConfiguration.deviceAttributesProtoSchema =
70   - val.deviceAttributesProtoSchema;
71   - transportCoapData.coapDeviceTypeConfiguration.transportPayloadTypeConfiguration.deviceRpcRequestProtoSchema =
72   - val.deviceRpcRequestProtoSchema;
73   - transportCoapData.coapDeviceTypeConfiguration.transportPayloadTypeConfiguration.deviceRpcResponseProtoSchema =
74   - val.deviceRpcResponseProtoSchema;
75   - transportCoapData.clientSettings.powerMode = val.powerMode;
76   - transportCoapData.clientSettings.edrxCycle = val.edrxCycle;
77   - transportCoapData.clientSettings.pagingTransmissionWindow = val.pagingTransmissionWindow;
78   - transportCoapData.clientSettings.psmActivityTimer = val.psmActivityTimer;
79   - coapAllData = {
  60 + for (let o in val) {
  61 + for (let u in transportCoapData) {
  62 + switch (u) {
  63 + case 'coapDeviceTypeConfiguration':
  64 + for (let t in transportCoapData.coapDeviceTypeConfiguration) {
  65 + if (t === 'coapDeviceType') {
  66 + Reflect.set(transportCoapData.coapDeviceTypeConfiguration, t, val[t]);
  67 + }
  68 + if (t === 'transportPayloadTypeConfiguration') {
  69 + for (let t in transportCoapData.coapDeviceTypeConfiguration
  70 + .transportPayloadTypeConfiguration) {
  71 + if (t === o) {
  72 + Reflect.set(
  73 + transportCoapData.coapDeviceTypeConfiguration
  74 + .transportPayloadTypeConfiguration,
  75 + t,
  76 + val[t]
  77 + );
  78 + }
  79 + }
  80 + }
  81 + }
  82 + break;
  83 + case 'clientSettings':
  84 + for (let t in transportCoapData.clientSettings) {
  85 + if (t === o) {
  86 + Reflect.set(transportCoapData.clientSettings, t, val[t]);
  87 + }
  88 + }
  89 + break;
  90 + }
  91 + }
  92 + }
  93 + coapAllData.coapData = {
80 94 ...transportCoapData,
81 95 };
82   - return coapAllData;
  96 + return coapAllData.coapData;
83 97 };
84 98 defineExpose({
85 99 getFormData,
... ...
... ... @@ -7,7 +7,7 @@
7 7 import { BasicForm, useForm } from '/@/components/Form';
8 8 import { serverSchemas } from '../index';
9 9
10   - const [registerServer, { getFieldsValue, setFieldsValue }] = useForm({
  10 + const [registerServer, { getFieldsValue, setFieldsValue, resetFields }] = useForm({
11 11 labelWidth: 180,
12 12 schemas: serverSchemas,
13 13 actionColOptions: {
... ... @@ -24,9 +24,11 @@
24 24 if (!value) return;
25 25 return value;
26 26 };
  27 + const resetFormData = () => resetFields();
27 28 defineExpose({
28 29 getBootStrapFormFunc,
29 30 editBootStrapFormFunc,
  31 + resetFormData,
30 32 });
31 33 </script>
32 34 <style lang="less" scoped></style>
... ...
... ... @@ -284,8 +284,11 @@ export const serverSchemas: FormSchema[] = [
284 284 {
285 285 field: 'securityMode',
286 286 component: 'Select',
287   - label: '安全配置模式',
  287 + label: '安全配置',
288 288 defaultValue: 'NO_SEC',
  289 + helpMessage: [
  290 + 'X.509 Certificate模式和Raw Public Key模式和Pre-Shared Key模式下,port端口必须是5686',
  291 + ],
289 292 componentProps: {
290 293 options: [
291 294 {
... ... @@ -312,6 +315,7 @@ export const serverSchemas: FormSchema[] = [
312 315 field: 'shortServerId',
313 316 component: 'InputNumber',
314 317 label: '短服务器ID',
  318 + helpMessage: ['短服务器ID是唯一的'],
315 319 required: true,
316 320 defaultValue: 123,
317 321 colProps: { span: 8 },
... ... @@ -320,6 +324,7 @@ export const serverSchemas: FormSchema[] = [
320 324 field: 'host',
321 325 component: 'Input',
322 326 label: '主机',
  327 + helpMessage: ['主机是唯一的'],
323 328 required: true,
324 329 defaultValue: '0.0.0.0',
325 330 colProps: { span: 8 },
... ... @@ -328,6 +333,7 @@ export const serverSchemas: FormSchema[] = [
328 333 field: 'port',
329 334 component: 'Input',
330 335 label: '端口',
  336 + helpMessage: ['端口必须是5685'],
331 337 required: true,
332 338 defaultValue: 5685,
333 339 colProps: { span: 8 },
... ...
1 1 <template>
2 2 <div>
3   - <Tabs
4   - v-model:activeKey="currentKey"
5   - :size="currentSize"
6   - :animated="true"
7   - @change="handleChange"
8   - >
  3 + <Tabs v-model:activeKey="currentKey" :size="currentSize" :animated="true">
9 4 <TabPane forceRender key="1" tab="LWM2M Model">
10 5 <BasicForm :showResetButton="false" :showSubmitButton="false" @register="registerModel" />
11 6 </TabPane>
... ... @@ -17,22 +12,27 @@
17 12 >包括引导服务器更新
18 13 </Checkbox>
19 14 <CollapseContainer
  15 + @hchange="hChange"
  16 + @change="eChange(item, index)"
20 17 v-for="(item, index) in dynamicBOOTSTRAP.bootstrap"
21 18 :key="item"
22 19 :title="collapseTitle(item)"
23 20 class="mt-4"
  21 + :isClose="item.close"
24 22 >
25 23 <template #action>
26   - <Button
27   - style="margin-right: 1vw"
28   - size="small"
29   - type="text"
30   - @click="handleRemove(index)"
  24 + <Popconfirm
  25 + title="您确定要删除该项?"
  26 + ok-text="确定"
  27 + cancel-text="取消"
  28 + @confirm="handleRemove(index)"
31 29 >
32   - <template #icon>
33   - <DeleteOutlined />
34   - </template>
35   - </Button>
  30 + <Button style="margin-right: 1vw" size="small" type="text">
  31 + <template #icon>
  32 + <DeleteOutlined />
  33 + </template>
  34 + </Button>
  35 + </Popconfirm>
36 36 </template>
37 37 <div style="border: 1px solid #d9d9d9; width: 100%">
38 38 <div style="margin: 10px 15px">
... ... @@ -89,17 +89,30 @@
89 89 import { modelSchemas, settingsSchemas, deviceSchemas } from './index';
90 90 import BootStrapForm from './cpns/BootStrapForm.vue';
91 91 import { DeleteOutlined, PlusCircleOutlined } from '@ant-design/icons-vue';
92   - import { Button, Checkbox } from 'ant-design-vue';
  92 + import { Button, Checkbox, Popconfirm } from 'ant-design-vue';
93 93 import { CollapseContainer } from '/@/components/Container';
94 94 import { useModal } from '/@/components/Modal';
95 95 import ServerConfigModal from './cpns/ServerConfigModal.vue';
96 96
  97 + const eChange = (_, e1) => {
  98 + if (eS) {
  99 + dynamicBOOTSTRAP.bootstrap.forEach((bootstrap, index: number) => {
  100 + if (index === e1) {
  101 + bootstrap.close = true;
  102 + }
  103 + });
  104 + }
  105 + };
  106 + let eS = false;
  107 + const hChange = (e) => {
  108 + eS = e;
  109 + };
97 110 const collapseTitle = (item) => {
98 111 return `LwM2M Server Short server ID: ${item.shortServerId} Security config mode: ${item.securityMode}`;
99 112 };
100 113 const bootstrapServerUpdateEnable = ref(false);
101 114 const dynamicBOOTSTRAP: any = reactive({
102   - bootstrap: [{ securityMode: 'NO_SEC', shortServerId: 1234 }],
  115 + bootstrap: [{ securityMode: 'NO_SEC', shortServerId: 1234, close: false }],
103 116 });
104 117 const dynamicBindRef: any = {
105 118 BootStrapFormItemRef: ref([]),
... ... @@ -108,7 +121,6 @@
108 121 const currentSize = ref('large');
109 122 let allObj: any = reactive({});
110 123 let allEchoObj: any = reactive({});
111   - let allEchoStatus = ref(false);
112 124 let clientLwM2mSettingsObj = reactive({});
113 125 let observeAttrObj = reactive({
114 126 attribute: [],
... ... @@ -160,55 +172,28 @@
160 172 dynamicBOOTSTRAP.bootstrap.push({
161 173 securityMode: 'NO_SEC',
162 174 shortServerId: 1234,
  175 + close: false,
163 176 });
164 177 }
165 178 };
166 179 const handleRemove = (index) => {
167 180 dynamicBOOTSTRAP.bootstrap.splice(index, 1);
168 181 };
169   - const handleChange = (e) => {
170   - if (allEchoStatus.value) {
171   - switch (e) {
172   - case '1':
173   - break;
174   - case '2':
175   - nextTick(() => {
176   - bootstrapServerUpdateEnable.value = allEchoObj.bootstrapServerUpdateEnable;
177   - dynamicBOOTSTRAP.bootstrap = allEchoObj.bootstrap;
178   - dynamicBOOTSTRAP.bootstrap.forEach((bootstrap, index: number) => {
179   - nextTick(() => {
180   - unref(dynamicBindRef.BootStrapFormItemRef)[index]?.editBootStrapFormFunc(bootstrap);
181   - });
182   - });
183   - });
184   - break;
185   - case '3':
186   - nextTick(() => {
187   - settingsSetFieldsValueFunc({
188   - powerMode: allEchoObj?.clientLwM2mSettings?.powerMode,
189   - psmActivityTimer: allEchoObj?.clientLwM2mSettings?.psmActivityTimer,
190   - edrxCycle: allEchoObj?.clientLwM2mSettings?.edrxCycle,
191   - pagingTransmissionWindow: allEchoObj?.clientLwM2mSettings?.pagingTransmissionWindow,
192   - fwUpdateStrategy: allEchoObj?.clientLwM2mSettings?.fwUpdateStrategy,
193   - swUpdateStrategy: allEchoObj?.clientLwM2mSettings?.swUpdateStrategy,
194   - clientOnlyObserveAfterConnect:
195   - allEchoObj?.clientLwM2mSettings?.clientOnlyObserveAfterConnect,
196   - fwUpdateResource: allEchoObj?.clientLwM2mSettings?.fwUpdateResource,
197   - swUpdateResource: allEchoObj?.clientLwM2mSettings?.swUpdateResource,
198   - compositeOperationsSupport:
199   - allEchoObj?.clientLwM2mSettings?.compositeOperationsSupport,
200   - });
201   - });
202   - break;
203   - case '4':
204   - break;
205   - }
206   - }
207   - };
208 182 const setFormData = (v) => {
209 183 if (v) {
210 184 allEchoObj = v;
211   - allEchoStatus.value = true;
  185 + settingsSetFieldsValueFunc({
  186 + ...allEchoObj?.clientLwM2mSettings,
  187 + });
  188 + nextTick(() => {
  189 + bootstrapServerUpdateEnable.value = allEchoObj.bootstrapServerUpdateEnable;
  190 + dynamicBOOTSTRAP.bootstrap = allEchoObj.bootstrap;
  191 + dynamicBOOTSTRAP.bootstrap.forEach((bootstrap, index: number) => {
  192 + nextTick(() => {
  193 + unref(dynamicBindRef.BootStrapFormItemRef)[index]?.editBootStrapFormFunc(bootstrap);
  194 + });
  195 + });
  196 + });
212 197 }
213 198 };
214 199 const tempBootStrap: any = [];
... ... @@ -249,11 +234,13 @@
249 234 };
250 235
251 236 const resetFormData = () => {
252   - allEchoStatus.value = false;
253 237 nextTick(() => {
254 238 resetObjectListValue();
255 239 resetSettingsValue();
256 240 resetDeviceValue();
  241 + unref(dynamicBindRef.BootStrapFormItemRef).map((item) => {
  242 + item.resetFormData();
  243 + });
257 244 });
258 245 };
259 246 const selectCheckStatus = ref(false);
... ... @@ -272,12 +259,14 @@
272 259 dynamicBOOTSTRAP.bootstrap.push({
273 260 securityMode: 'NO_SEC',
274 261 shortServerId: 1234,
  262 + close: false,
275 263 });
276 264 break;
277 265 case 'Bootstrap':
278 266 dynamicBOOTSTRAP.bootstrap.push({
279 267 securityMode: 'NO_SEC',
280 268 shortServerId: 1234,
  269 + close: false,
281 270 });
282 271 break;
283 272 }
... ... @@ -290,7 +279,6 @@
290 279 registerDevice,
291 280 getFormData,
292 281 setFormData,
293   - handleChange,
294 282 resetFormData,
295 283 dynamicBOOTSTRAP,
296 284 dynamicBindRef,
... ...
... ... @@ -100,9 +100,7 @@ export const MqttSchemas: FormSchema[] = [
100 100 colProps: { span: 23 },
101 101 component: 'InputTextArea',
102 102 componentProps: {
103   - autoSize: {
104   - maxRows: 10,
105   - },
  103 + rows: 17,
106 104 },
107 105 defaultValue: `
108 106 syntax ="proto3";
... ... @@ -129,9 +127,7 @@ export const MqttSchemas: FormSchema[] = [
129 127 colProps: { span: 23 },
130 128 component: 'InputTextArea',
131 129 componentProps: {
132   - autoSize: {
133   - maxRows: 10,
134   - },
  130 + rows: 11,
135 131 },
136 132 defaultValue: `
137 133 syntax ="proto3";
... ... @@ -150,9 +146,7 @@ export const MqttSchemas: FormSchema[] = [
150 146 colProps: { span: 23 },
151 147 component: 'InputTextArea',
152 148 componentProps: {
153   - autoSize: {
154   - maxRows: 10,
155   - },
  149 + rows: 11,
156 150 },
157 151 defaultValue: `
158 152 syntax ="proto3";
... ... @@ -172,9 +166,7 @@ export const MqttSchemas: FormSchema[] = [
172 166 colProps: { span: 23 },
173 167 component: 'InputTextArea',
174 168 componentProps: {
175   - autoSize: {
176   - maxRows: 10,
177   - },
  169 + rows: 11,
178 170 },
179 171 defaultValue: `
180 172 syntax ="proto3";
... ... @@ -235,3 +227,19 @@ message RpcResponseMsg {
235 227 optional string payload = 1;
236 228 }
237 229 `;
  230 +
  231 +export const fixedTextA = `支持单[+]和多级[#]通配符。 [+] is suitable for any topic filter
  232 +level。例如:v1/devices/+/telemetry or +/devices/+/attributes。 [#]可以替换 topic
  233 +filter 本身,并且必须是 topic 的最后一个符号。例如:# or v1/devices/me/#。`;
  234 +
  235 +export const fixedTextB = `启用时,默认情况下,平台将使用Protobuf有效载荷格式。如果解析失败,平台将尝试使用JSON负载格式。
  236 +有助于固件更新期间的向后兼容性。例如,固件的初始版本使用Json,而新版本使用Protobuf。
  237 +在设备组的固件更新过程中,需要同时支持Protobuf和JSON。兼容性模式会导致性能略有下降,
  238 +因此建议在更新所有设备后禁用此模式。`;
  239 +
  240 +export const fixedTextC = `启用后,平台将使用Json负载格式通过以下主题推送属性
  241 +和RPC:v1/devices/me/attributes/response/$request id、v1/devices/me/attributes、
  242 +v1/devices/me/RPC/request/$request id、v1/devices/me/RPC/response/$request id。
  243 +此设置不会影响使用新(v2)主题发送的属性和rpc订阅: v2/a/res/$request
  244 +id、v2/a、v2/r/req/$request id、v2/r/res/$request id。 其中,$request
  245 +id是整数请求标识符。`;
... ...
... ... @@ -13,31 +13,21 @@
13 13 <template #descSlot>
14 14 <div style="width: 47rem; margin-left: 2rem">
15 15 <p>
16   - 支持单[+]和多级[#]通配符。 [+] is suitable for any topic filter
17   - level。例如:v1/devices/+/telemetry or +/devices/+/attributes。 [#]可以替换 topic
18   - filter 本身,并且必须是 topic 的最后一个符号。例如:# or v1/devices/me/#。
  16 + {{ fixedTextA }}
19 17 </p>
20 18 </div>
21 19 </template>
22 20 <template #desc1>
23 21 <div style="width: 47rem; margin-left: 2rem">
24 22 <p>
25   - 启用时,默认情况下,平台将使用Protobuf有效载荷格式。如果解析失败,平台将尝试使用JSON负载格式。
26   - 有助于固件更新期间的向后兼容性。例如,固件的初始版本使用Json,而新版本使用Protobuf。
27   - 在设备组的固件更新过程中,需要同时支持Protobuf和JSON。兼容性模式会导致性能略有下降,
28   - 因此建议在更新所有设备后禁用此模式。
  23 + {{ fixedTextB }}
29 24 </p>
30 25 </div>
31 26 </template>
32 27 <template #desc2>
33 28 <div style="width: 47rem; margin-left: 2rem">
34 29 <p>
35   - 启用后,平台将使用Json负载格式通过以下主题推送属性
36   - 和RPC:v1/devices/me/attributes/response/$request\u id、v1/devices/me/attributes、
37   - v1/devices/me/RPC/request/$request\u id、v1/devices/me/RPC/response/$request\u id。
38   - 此设置不会影响使用新(v2)主题发送的属性和rpc订阅: v2/a/res/$request\u
39   - id、v2/a、v2/r/req/$request\u id、v2/r/res/$request\u id。 其中,$request\u
40   - id是整数请求标识符。
  30 + {{ fixedTextC }}
41 31 </p>
42 32 </div>
43 33 </template>
... ... @@ -48,17 +38,13 @@
48 38 <script lang="ts" setup>
49 39 import { reactive } from 'vue';
50 40 import { BasicForm, useForm } from '/@/components/Form';
51   - import {
52   - MqttSchemas,
53   - // deviceTelemetryProtoSchemaData,
54   - // deviceAttributesProtoSchemaData,
55   - // deviceRpcRequestProtoSchemaData,
56   - // deviceRpcResponseProtoSchemaData,
57   - } from './Mqtt';
  41 + import { MqttSchemas, fixedTextA, fixedTextB, fixedTextC } from './Mqtt';
58 42
59 43 const emits = defineEmits(['prev']);
60 44
61   - let allMqttData: any = reactive({});
  45 + const allMqttData: any = reactive({
  46 + mqttData: {},
  47 + });
62 48 const transportMqttData: any = reactive({
63 49 transportPayloadTypeConfiguration: {
64 50 transportPayloadType: null,
... ... @@ -94,33 +80,27 @@
94 80 const getFormData = async () => {
95 81 let val = await validate();
96 82 if (!val) return;
97   - delete val.desc;
98   - transportMqttData.transportPayloadTypeConfiguration.transportPayloadType =
99   - val.transportPayloadType;
100   - transportMqttData.transportPayloadTypeConfiguration.enableCompatibilityWithJsonPayloadFormat =
101   - val.enableCompatibilityWithJsonPayloadFormat;
102   - transportMqttData.transportPayloadTypeConfiguration.useJsonPayloadFormatForDefaultDownlinkTopics =
103   - val.useJsonPayloadFormatForDefaultDownlinkTopics;
104   - transportMqttData.transportPayloadTypeConfiguration.deviceAttributesProtoSchema =
105   - val.deviceAttributesProtoSchema;
106   - transportMqttData.transportPayloadTypeConfiguration.deviceRpcRequestProtoSchema =
107   - val.deviceRpcRequestProtoSchema;
108   - transportMqttData.transportPayloadTypeConfiguration.deviceRpcResponseProtoSchema =
109   - val.deviceRpcResponseProtoSchema;
110   - transportMqttData.transportPayloadTypeConfiguration.deviceTelemetryProtoSchema =
111   - val.deviceTelemetryProtoSchema;
112   - allMqttData = {
  83 + for (let o in val) {
  84 + for (let u in transportMqttData) {
  85 + if (u === 'transportPayloadTypeConfiguration') {
  86 + for (let t in transportMqttData.transportPayloadTypeConfiguration) {
  87 + if (t === o) {
  88 + Reflect.set(transportMqttData.transportPayloadTypeConfiguration, t, val[t]);
  89 + }
  90 + }
  91 + }
  92 + }
  93 + }
  94 + for (let i in val) {
  95 + if (i !== 'deviceAttributesTopic' && i !== 'deviceTelemetryTopic') {
  96 + Reflect.deleteProperty(val, i);
  97 + }
  98 + }
  99 + allMqttData.mqttData = {
113 100 ...val,
114 101 ...transportMqttData,
115 102 };
116   - delete allMqttData.deviceTelemetryProtoSchema;
117   - delete allMqttData.deviceAttributesProtoSchema;
118   - delete allMqttData.deviceRpcRequestProtoSchema;
119   - delete allMqttData.deviceRpcResponseProtoSchema;
120   - delete allMqttData.useJsonPayloadFormatForDefaultDownlinkTopics;
121   - delete allMqttData.enableCompatibilityWithJsonPayloadFormat;
122   - delete allMqttData.transportPayloadType;
123   - return allMqttData;
  103 + return allMqttData.mqttData;
124 104 };
125 105 defineExpose({
126 106 getFormData,
... ...
... ... @@ -15,15 +15,15 @@
15 15 <!-- 基础表单 -->
16 16 <!-- 触发器-begin -->
17 17 <!-- <Divider orientation="left">触发器</Divider> -->
18   - <Divider orientation="left"
19   - ><a-tooltip>
  18 + <Divider orientation="left">
  19 + <a-tooltip>
20 20 <template #title
21 21 >场景联动触发的首要条件,"触发器"之间的关系为或,“执行条件”与“触发器”之间的关系为且。</template
22 22 >
23   - 触发器<QuestionCircleOutlined
24   - :style="{ fontSize: '14px', marginLeft: '5px' }"
25   - /> </a-tooltip
26   - ></Divider>
  23 + 触发器
  24 + <QuestionCircleOutlined :style="{ fontSize: '14px', marginLeft: '5px' }" />
  25 + </a-tooltip>
  26 + </Divider>
27 27 <div>
28 28 <template v-for="(item, index) in triggerData" :key="item">
29 29 <TriggerOrCondition
... ... @@ -45,16 +45,16 @@
45 45 <!-- 触发器-end -->
46 46
47 47 <!-- 执行条件-begin -->
48   - <Divider orientation="left"
49   - ><a-tooltip>
  48 + <Divider orientation="left">
  49 + <a-tooltip>
50 50 <template #title
51 51 >场景联动触发的次要条件,"执行条件"之间的关系为或,
52 52 “执行条件”与“触发器”之间的关系为且。</template
53 53 >
54   - 执行条件<QuestionCircleOutlined
55   - :style="{ fontSize: '14px', marginLeft: '5px' }"
56   - /> </a-tooltip
57   - ></Divider>
  54 + 执行条件
  55 + <QuestionCircleOutlined :style="{ fontSize: '14px', marginLeft: '5px' }" />
  56 + </a-tooltip>
  57 + </Divider>
58 58 <div>
59 59 <template v-for="(item, index) in conditionData" :key="item">
60 60 <TriggerOrCondition
... ... @@ -76,15 +76,15 @@
76 76 <!-- 执行条件-end -->
77 77
78 78 <!-- 执行动作-begin -->
79   - <Divider orientation="left"
80   - ><a-tooltip>
  79 + <Divider orientation="left">
  80 + <a-tooltip>
81 81 <template #title
82 82 >触发器和执行条件都满足时,场景联动会做什么,例如:设备联动、告警通知等。</template
83 83 >
84   - 执行动作<QuestionCircleOutlined
85   - :style="{ fontSize: '14px', marginLeft: '5px' }"
86   - /> </a-tooltip
87   - ></Divider>
  84 + 执行动作
  85 + <QuestionCircleOutlined :style="{ fontSize: '14px', marginLeft: '5px' }" />
  86 + </a-tooltip>
  87 + </Divider>
88 88 <div>
89 89 <template v-for="(item, index) in actionData" :key="item">
90 90 <Action
... ... @@ -637,6 +637,30 @@
637 637 id: unref(id),
638 638 tenantId: unref(tenantId),
639 639 };
  640 + //FT change
  641 + let mustTriggerCondition = false;
  642 + let mustCondition = false;
  643 + if (postAddOrEditData?.triggers !== null && postAddOrEditData?.triggers.length > 0) {
  644 + postAddOrEditData?.triggers.some((s) => {
  645 + if (s.triggerCondition?.condition?.condition == undefined) {
  646 + mustTriggerCondition = true;
  647 + }
  648 + });
  649 + } else {
  650 + mustTriggerCondition = false;
  651 + }
  652 + if (postAddOrEditData?.doConditions !== null && postAddOrEditData?.doConditions.length > 0) {
  653 + postAddOrEditData?.doConditions.some((s) => {
  654 + if (s.triggerCondition?.condition?.condition == undefined) {
  655 + mustCondition = true;
  656 + }
  657 + });
  658 + } else {
  659 + mustCondition = false;
  660 + }
  661 + if (mustTriggerCondition) return;
  662 + if (mustCondition) return;
  663 + //FT change
640 664 await screenLinkPageAddApi(postAddOrEditData, unref(isUpdate));
641 665 createMessage.success(`${unref(isUpdate) ? '编辑' : '新增'}成功`);
642 666 closeDrawer();
... ...
... ... @@ -60,7 +60,7 @@
60 60 import { exportPage, deleteExportManage } from '/@/api/export/exportManager';
61 61
62 62 const searchInfo = reactive<Recordable>({});
63   - const [registerTable, { reload, setProps, setTableData }] = useTable({
  63 + const [registerTable, { reload, setProps }] = useTable({
64 64 title: '转换脚本列表',
65 65 api: exportPage,
66 66 columns,
... ... @@ -102,24 +102,6 @@
102 102
103 103 // 新增或编辑
104 104 const handleCreateOrEdit = (record: Recordable | null) => {
105   - setTableData([
106   - {
107   - id: 1,
108   - reportConfigName: '11',
109   - organizationName: 0,
110   - dataType: '11',
111   - executeWay: '11',
112   - executeTime: '2022-05-21',
113   - },
114   - {
115   - id: 2,
116   - reportConfigName: '11',
117   - organizationName: 0,
118   - dataType: '11',
119   - executeWay: '11',
120   - executeTime: '2022-05-21',
121   - },
122   - ]);
123 105 if (record) {
124 106 openModal(true, {
125 107 isUpdate: false,
... ...