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 <template> 1 <template>
2 <div :class="prefixCls"> 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 <template #title> 9 <template #title>
5 <slot name="title"></slot> 10 <slot name="title"></slot>
6 </template> 11 </template>
@@ -12,7 +17,7 @@ @@ -12,7 +17,7 @@
12 <div class="p-2"> 17 <div class="p-2">
13 <CollapseTransition :enable="canExpan"> 18 <CollapseTransition :enable="canExpan">
14 <Skeleton v-if="loading" :active="loading" /> 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 <slot></slot> 21 <slot></slot>
17 </div> 22 </div>
18 </CollapseTransition> 23 </CollapseTransition>
@@ -35,6 +40,7 @@ @@ -35,6 +40,7 @@
35 import { useDesign } from '/@/hooks/web/useDesign'; 40 import { useDesign } from '/@/hooks/web/useDesign';
36 41
37 const props = defineProps({ 42 const props = defineProps({
  43 + isClose: { type: Boolean, default: true },
38 title: { type: String, default: '' }, 44 title: { type: String, default: '' },
39 loading: { type: Boolean }, 45 loading: { type: Boolean },
40 /** 46 /**
@@ -58,7 +64,7 @@ @@ -58,7 +64,7 @@
58 */ 64 */
59 lazyTime: { type: Number, default: 0 }, 65 lazyTime: { type: Number, default: 0 },
60 }); 66 });
61 - const emit = defineEmits(['expand']); 67 + const emit = defineEmits(['expand', 'change', 'hchange']);
62 68
63 const show = ref(true); 69 const show = ref(true);
64 70
@@ -69,6 +75,8 @@ @@ -69,6 +75,8 @@
69 */ 75 */
70 function handleExpand() { 76 function handleExpand() {
71 show.value = !show.value; 77 show.value = !show.value;
  78 + emit('change', !show.value);
  79 + emit('hchange', !show.value);
72 if (props.triggerWindowResize) { 80 if (props.triggerWindowResize) {
73 // 200 milliseconds here is because the expansion has animation, 81 // 200 milliseconds here is because the expansion has animation,
74 useTimeoutFn(triggerWindowResize, 200); 82 useTimeoutFn(triggerWindowResize, 200);
@@ -40,7 +40,7 @@ export const CoapSchemas: FormSchema[] = [ @@ -40,7 +40,7 @@ export const CoapSchemas: FormSchema[] = [
40 { label: 'Efento NB-IoT', value: 'EFENTO' }, 40 { label: 'Efento NB-IoT', value: 'EFENTO' },
41 ], 41 ],
42 }, 42 },
43 - colProps: { span: 22}, 43 + colProps: { span: 22 },
44 }, 44 },
45 { 45 {
46 field: 'transportPayloadType', 46 field: 'transportPayloadType',
@@ -163,9 +163,7 @@ export const CoapSchemas: FormSchema[] = [ @@ -163,9 +163,7 @@ export const CoapSchemas: FormSchema[] = [
163 colProps: { span: 22 }, 163 colProps: { span: 22 },
164 component: 'InputTextArea', 164 component: 'InputTextArea',
165 componentProps: { 165 componentProps: {
166 - autoSize: {  
167 - maxRows: 10,  
168 - }, 166 + rows: 17,
169 }, 167 },
170 defaultValue: ` 168 defaultValue: `
171 syntax ="proto3"; 169 syntax ="proto3";
@@ -193,9 +191,7 @@ export const CoapSchemas: FormSchema[] = [ @@ -193,9 +191,7 @@ export const CoapSchemas: FormSchema[] = [
193 colProps: { span: 22 }, 191 colProps: { span: 22 },
194 component: 'InputTextArea', 192 component: 'InputTextArea',
195 componentProps: { 193 componentProps: {
196 - autoSize: {  
197 - maxRows: 10,  
198 - }, 194 + rows: 9,
199 }, 195 },
200 defaultValue: ` 196 defaultValue: `
201 syntax ="proto3"; 197 syntax ="proto3";
@@ -215,9 +211,7 @@ export const CoapSchemas: FormSchema[] = [ @@ -215,9 +211,7 @@ export const CoapSchemas: FormSchema[] = [
215 colProps: { span: 22 }, 211 colProps: { span: 22 },
216 component: 'InputTextArea', 212 component: 'InputTextArea',
217 componentProps: { 213 componentProps: {
218 - autoSize: {  
219 - maxRows: 10,  
220 - }, 214 + rows: 11,
221 }, 215 },
222 defaultValue: ` 216 defaultValue: `
223 syntax ="proto3"; 217 syntax ="proto3";
@@ -238,9 +232,7 @@ export const CoapSchemas: FormSchema[] = [ @@ -238,9 +232,7 @@ export const CoapSchemas: FormSchema[] = [
238 colProps: { span: 22 }, 232 colProps: { span: 22 },
239 component: 'InputTextArea', 233 component: 'InputTextArea',
240 componentProps: { 234 componentProps: {
241 - autoSize: {  
242 - maxRows: 10,  
243 - }, 235 + rows: 9,
244 }, 236 },
245 defaultValue: ` 237 defaultValue: `
246 syntax ="proto3"; 238 syntax ="proto3";
@@ -8,16 +8,12 @@ @@ -8,16 +8,12 @@
8 <script lang="ts" setup> 8 <script lang="ts" setup>
9 import { reactive } from 'vue'; 9 import { reactive } from 'vue';
10 import { BasicForm, useForm } from '/@/components/Form'; 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 const emits = defineEmits(['prev']); 13 const emits = defineEmits(['prev']);
20 - let coapAllData = reactive({}); 14 + const coapAllData = reactive({
  15 + coapData: {},
  16 + });
21 const transportCoapData: any = reactive({ 17 const transportCoapData: any = reactive({
22 coapDeviceTypeConfiguration: { 18 coapDeviceTypeConfiguration: {
23 coapDeviceType: null, 19 coapDeviceType: null,
@@ -61,25 +57,43 @@ @@ -61,25 +57,43 @@
61 const getFormData = async () => { 57 const getFormData = async () => {
62 const val = await validate(); 58 const val = await validate();
63 if (!val) return; 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 ...transportCoapData, 94 ...transportCoapData,
81 }; 95 };
82 - return coapAllData; 96 + return coapAllData.coapData;
83 }; 97 };
84 defineExpose({ 98 defineExpose({
85 getFormData, 99 getFormData,
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 import { BasicForm, useForm } from '/@/components/Form'; 7 import { BasicForm, useForm } from '/@/components/Form';
8 import { serverSchemas } from '../index'; 8 import { serverSchemas } from '../index';
9 9
10 - const [registerServer, { getFieldsValue, setFieldsValue }] = useForm({ 10 + const [registerServer, { getFieldsValue, setFieldsValue, resetFields }] = useForm({
11 labelWidth: 180, 11 labelWidth: 180,
12 schemas: serverSchemas, 12 schemas: serverSchemas,
13 actionColOptions: { 13 actionColOptions: {
@@ -24,9 +24,11 @@ @@ -24,9 +24,11 @@
24 if (!value) return; 24 if (!value) return;
25 return value; 25 return value;
26 }; 26 };
  27 + const resetFormData = () => resetFields();
27 defineExpose({ 28 defineExpose({
28 getBootStrapFormFunc, 29 getBootStrapFormFunc,
29 editBootStrapFormFunc, 30 editBootStrapFormFunc,
  31 + resetFormData,
30 }); 32 });
31 </script> 33 </script>
32 <style lang="less" scoped></style> 34 <style lang="less" scoped></style>
@@ -284,8 +284,11 @@ export const serverSchemas: FormSchema[] = [ @@ -284,8 +284,11 @@ export const serverSchemas: FormSchema[] = [
284 { 284 {
285 field: 'securityMode', 285 field: 'securityMode',
286 component: 'Select', 286 component: 'Select',
287 - label: '安全配置模式', 287 + label: '安全配置',
288 defaultValue: 'NO_SEC', 288 defaultValue: 'NO_SEC',
  289 + helpMessage: [
  290 + 'X.509 Certificate模式和Raw Public Key模式和Pre-Shared Key模式下,port端口必须是5686',
  291 + ],
289 componentProps: { 292 componentProps: {
290 options: [ 293 options: [
291 { 294 {
@@ -312,6 +315,7 @@ export const serverSchemas: FormSchema[] = [ @@ -312,6 +315,7 @@ export const serverSchemas: FormSchema[] = [
312 field: 'shortServerId', 315 field: 'shortServerId',
313 component: 'InputNumber', 316 component: 'InputNumber',
314 label: '短服务器ID', 317 label: '短服务器ID',
  318 + helpMessage: ['短服务器ID是唯一的'],
315 required: true, 319 required: true,
316 defaultValue: 123, 320 defaultValue: 123,
317 colProps: { span: 8 }, 321 colProps: { span: 8 },
@@ -320,6 +324,7 @@ export const serverSchemas: FormSchema[] = [ @@ -320,6 +324,7 @@ export const serverSchemas: FormSchema[] = [
320 field: 'host', 324 field: 'host',
321 component: 'Input', 325 component: 'Input',
322 label: '主机', 326 label: '主机',
  327 + helpMessage: ['主机是唯一的'],
323 required: true, 328 required: true,
324 defaultValue: '0.0.0.0', 329 defaultValue: '0.0.0.0',
325 colProps: { span: 8 }, 330 colProps: { span: 8 },
@@ -328,6 +333,7 @@ export const serverSchemas: FormSchema[] = [ @@ -328,6 +333,7 @@ export const serverSchemas: FormSchema[] = [
328 field: 'port', 333 field: 'port',
329 component: 'Input', 334 component: 'Input',
330 label: '端口', 335 label: '端口',
  336 + helpMessage: ['端口必须是5685'],
331 required: true, 337 required: true,
332 defaultValue: 5685, 338 defaultValue: 5685,
333 colProps: { span: 8 }, 339 colProps: { span: 8 },
1 <template> 1 <template>
2 <div> 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 <TabPane forceRender key="1" tab="LWM2M Model"> 4 <TabPane forceRender key="1" tab="LWM2M Model">
10 <BasicForm :showResetButton="false" :showSubmitButton="false" @register="registerModel" /> 5 <BasicForm :showResetButton="false" :showSubmitButton="false" @register="registerModel" />
11 </TabPane> 6 </TabPane>
@@ -17,22 +12,27 @@ @@ -17,22 +12,27 @@
17 >包括引导服务器更新 12 >包括引导服务器更新
18 </Checkbox> 13 </Checkbox>
19 <CollapseContainer 14 <CollapseContainer
  15 + @hchange="hChange"
  16 + @change="eChange(item, index)"
20 v-for="(item, index) in dynamicBOOTSTRAP.bootstrap" 17 v-for="(item, index) in dynamicBOOTSTRAP.bootstrap"
21 :key="item" 18 :key="item"
22 :title="collapseTitle(item)" 19 :title="collapseTitle(item)"
23 class="mt-4" 20 class="mt-4"
  21 + :isClose="item.close"
24 > 22 >
25 <template #action> 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 </template> 36 </template>
37 <div style="border: 1px solid #d9d9d9; width: 100%"> 37 <div style="border: 1px solid #d9d9d9; width: 100%">
38 <div style="margin: 10px 15px"> 38 <div style="margin: 10px 15px">
@@ -89,17 +89,30 @@ @@ -89,17 +89,30 @@
89 import { modelSchemas, settingsSchemas, deviceSchemas } from './index'; 89 import { modelSchemas, settingsSchemas, deviceSchemas } from './index';
90 import BootStrapForm from './cpns/BootStrapForm.vue'; 90 import BootStrapForm from './cpns/BootStrapForm.vue';
91 import { DeleteOutlined, PlusCircleOutlined } from '@ant-design/icons-vue'; 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 import { CollapseContainer } from '/@/components/Container'; 93 import { CollapseContainer } from '/@/components/Container';
94 import { useModal } from '/@/components/Modal'; 94 import { useModal } from '/@/components/Modal';
95 import ServerConfigModal from './cpns/ServerConfigModal.vue'; 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 const collapseTitle = (item) => { 110 const collapseTitle = (item) => {
98 return `LwM2M Server Short server ID: ${item.shortServerId} Security config mode: ${item.securityMode}`; 111 return `LwM2M Server Short server ID: ${item.shortServerId} Security config mode: ${item.securityMode}`;
99 }; 112 };
100 const bootstrapServerUpdateEnable = ref(false); 113 const bootstrapServerUpdateEnable = ref(false);
101 const dynamicBOOTSTRAP: any = reactive({ 114 const dynamicBOOTSTRAP: any = reactive({
102 - bootstrap: [{ securityMode: 'NO_SEC', shortServerId: 1234 }], 115 + bootstrap: [{ securityMode: 'NO_SEC', shortServerId: 1234, close: false }],
103 }); 116 });
104 const dynamicBindRef: any = { 117 const dynamicBindRef: any = {
105 BootStrapFormItemRef: ref([]), 118 BootStrapFormItemRef: ref([]),
@@ -108,7 +121,6 @@ @@ -108,7 +121,6 @@
108 const currentSize = ref('large'); 121 const currentSize = ref('large');
109 let allObj: any = reactive({}); 122 let allObj: any = reactive({});
110 let allEchoObj: any = reactive({}); 123 let allEchoObj: any = reactive({});
111 - let allEchoStatus = ref(false);  
112 let clientLwM2mSettingsObj = reactive({}); 124 let clientLwM2mSettingsObj = reactive({});
113 let observeAttrObj = reactive({ 125 let observeAttrObj = reactive({
114 attribute: [], 126 attribute: [],
@@ -160,55 +172,28 @@ @@ -160,55 +172,28 @@
160 dynamicBOOTSTRAP.bootstrap.push({ 172 dynamicBOOTSTRAP.bootstrap.push({
161 securityMode: 'NO_SEC', 173 securityMode: 'NO_SEC',
162 shortServerId: 1234, 174 shortServerId: 1234,
  175 + close: false,
163 }); 176 });
164 } 177 }
165 }; 178 };
166 const handleRemove = (index) => { 179 const handleRemove = (index) => {
167 dynamicBOOTSTRAP.bootstrap.splice(index, 1); 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 const setFormData = (v) => { 182 const setFormData = (v) => {
209 if (v) { 183 if (v) {
210 allEchoObj = v; 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 const tempBootStrap: any = []; 199 const tempBootStrap: any = [];
@@ -249,11 +234,13 @@ @@ -249,11 +234,13 @@
249 }; 234 };
250 235
251 const resetFormData = () => { 236 const resetFormData = () => {
252 - allEchoStatus.value = false;  
253 nextTick(() => { 237 nextTick(() => {
254 resetObjectListValue(); 238 resetObjectListValue();
255 resetSettingsValue(); 239 resetSettingsValue();
256 resetDeviceValue(); 240 resetDeviceValue();
  241 + unref(dynamicBindRef.BootStrapFormItemRef).map((item) => {
  242 + item.resetFormData();
  243 + });
257 }); 244 });
258 }; 245 };
259 const selectCheckStatus = ref(false); 246 const selectCheckStatus = ref(false);
@@ -272,12 +259,14 @@ @@ -272,12 +259,14 @@
272 dynamicBOOTSTRAP.bootstrap.push({ 259 dynamicBOOTSTRAP.bootstrap.push({
273 securityMode: 'NO_SEC', 260 securityMode: 'NO_SEC',
274 shortServerId: 1234, 261 shortServerId: 1234,
  262 + close: false,
275 }); 263 });
276 break; 264 break;
277 case 'Bootstrap': 265 case 'Bootstrap':
278 dynamicBOOTSTRAP.bootstrap.push({ 266 dynamicBOOTSTRAP.bootstrap.push({
279 securityMode: 'NO_SEC', 267 securityMode: 'NO_SEC',
280 shortServerId: 1234, 268 shortServerId: 1234,
  269 + close: false,
281 }); 270 });
282 break; 271 break;
283 } 272 }
@@ -290,7 +279,6 @@ @@ -290,7 +279,6 @@
290 registerDevice, 279 registerDevice,
291 getFormData, 280 getFormData,
292 setFormData, 281 setFormData,
293 - handleChange,  
294 resetFormData, 282 resetFormData,
295 dynamicBOOTSTRAP, 283 dynamicBOOTSTRAP,
296 dynamicBindRef, 284 dynamicBindRef,
@@ -100,9 +100,7 @@ export const MqttSchemas: FormSchema[] = [ @@ -100,9 +100,7 @@ export const MqttSchemas: FormSchema[] = [
100 colProps: { span: 23 }, 100 colProps: { span: 23 },
101 component: 'InputTextArea', 101 component: 'InputTextArea',
102 componentProps: { 102 componentProps: {
103 - autoSize: {  
104 - maxRows: 10,  
105 - }, 103 + rows: 17,
106 }, 104 },
107 defaultValue: ` 105 defaultValue: `
108 syntax ="proto3"; 106 syntax ="proto3";
@@ -129,9 +127,7 @@ export const MqttSchemas: FormSchema[] = [ @@ -129,9 +127,7 @@ export const MqttSchemas: FormSchema[] = [
129 colProps: { span: 23 }, 127 colProps: { span: 23 },
130 component: 'InputTextArea', 128 component: 'InputTextArea',
131 componentProps: { 129 componentProps: {
132 - autoSize: {  
133 - maxRows: 10,  
134 - }, 130 + rows: 11,
135 }, 131 },
136 defaultValue: ` 132 defaultValue: `
137 syntax ="proto3"; 133 syntax ="proto3";
@@ -150,9 +146,7 @@ export const MqttSchemas: FormSchema[] = [ @@ -150,9 +146,7 @@ export const MqttSchemas: FormSchema[] = [
150 colProps: { span: 23 }, 146 colProps: { span: 23 },
151 component: 'InputTextArea', 147 component: 'InputTextArea',
152 componentProps: { 148 componentProps: {
153 - autoSize: {  
154 - maxRows: 10,  
155 - }, 149 + rows: 11,
156 }, 150 },
157 defaultValue: ` 151 defaultValue: `
158 syntax ="proto3"; 152 syntax ="proto3";
@@ -172,9 +166,7 @@ export const MqttSchemas: FormSchema[] = [ @@ -172,9 +166,7 @@ export const MqttSchemas: FormSchema[] = [
172 colProps: { span: 23 }, 166 colProps: { span: 23 },
173 component: 'InputTextArea', 167 component: 'InputTextArea',
174 componentProps: { 168 componentProps: {
175 - autoSize: {  
176 - maxRows: 10,  
177 - }, 169 + rows: 11,
178 }, 170 },
179 defaultValue: ` 171 defaultValue: `
180 syntax ="proto3"; 172 syntax ="proto3";
@@ -235,3 +227,19 @@ message RpcResponseMsg { @@ -235,3 +227,19 @@ message RpcResponseMsg {
235 optional string payload = 1; 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,31 +13,21 @@
13 <template #descSlot> 13 <template #descSlot>
14 <div style="width: 47rem; margin-left: 2rem"> 14 <div style="width: 47rem; margin-left: 2rem">
15 <p> 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 </p> 17 </p>
20 </div> 18 </div>
21 </template> 19 </template>
22 <template #desc1> 20 <template #desc1>
23 <div style="width: 47rem; margin-left: 2rem"> 21 <div style="width: 47rem; margin-left: 2rem">
24 <p> 22 <p>
25 - 启用时,默认情况下,平台将使用Protobuf有效载荷格式。如果解析失败,平台将尝试使用JSON负载格式。  
26 - 有助于固件更新期间的向后兼容性。例如,固件的初始版本使用Json,而新版本使用Protobuf。  
27 - 在设备组的固件更新过程中,需要同时支持Protobuf和JSON。兼容性模式会导致性能略有下降,  
28 - 因此建议在更新所有设备后禁用此模式。 23 + {{ fixedTextB }}
29 </p> 24 </p>
30 </div> 25 </div>
31 </template> 26 </template>
32 <template #desc2> 27 <template #desc2>
33 <div style="width: 47rem; margin-left: 2rem"> 28 <div style="width: 47rem; margin-left: 2rem">
34 <p> 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 </p> 31 </p>
42 </div> 32 </div>
43 </template> 33 </template>
@@ -48,17 +38,13 @@ @@ -48,17 +38,13 @@
48 <script lang="ts" setup> 38 <script lang="ts" setup>
49 import { reactive } from 'vue'; 39 import { reactive } from 'vue';
50 import { BasicForm, useForm } from '/@/components/Form'; 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 const emits = defineEmits(['prev']); 43 const emits = defineEmits(['prev']);
60 44
61 - let allMqttData: any = reactive({}); 45 + const allMqttData: any = reactive({
  46 + mqttData: {},
  47 + });
62 const transportMqttData: any = reactive({ 48 const transportMqttData: any = reactive({
63 transportPayloadTypeConfiguration: { 49 transportPayloadTypeConfiguration: {
64 transportPayloadType: null, 50 transportPayloadType: null,
@@ -94,33 +80,27 @@ @@ -94,33 +80,27 @@
94 const getFormData = async () => { 80 const getFormData = async () => {
95 let val = await validate(); 81 let val = await validate();
96 if (!val) return; 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 ...val, 100 ...val,
114 ...transportMqttData, 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 defineExpose({ 105 defineExpose({
126 getFormData, 106 getFormData,
@@ -15,15 +15,15 @@ @@ -15,15 +15,15 @@
15 <!-- 基础表单 --> 15 <!-- 基础表单 -->
16 <!-- 触发器-begin --> 16 <!-- 触发器-begin -->
17 <!-- <Divider orientation="left">触发器</Divider> --> 17 <!-- <Divider orientation="left">触发器</Divider> -->
18 - <Divider orientation="left"  
19 - ><a-tooltip> 18 + <Divider orientation="left">
  19 + <a-tooltip>
20 <template #title 20 <template #title
21 >场景联动触发的首要条件,"触发器"之间的关系为或,“执行条件”与“触发器”之间的关系为且。</template 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 <div> 27 <div>
28 <template v-for="(item, index) in triggerData" :key="item"> 28 <template v-for="(item, index) in triggerData" :key="item">
29 <TriggerOrCondition 29 <TriggerOrCondition
@@ -45,16 +45,16 @@ @@ -45,16 +45,16 @@
45 <!-- 触发器-end --> 45 <!-- 触发器-end -->
46 46
47 <!-- 执行条件-begin --> 47 <!-- 执行条件-begin -->
48 - <Divider orientation="left"  
49 - ><a-tooltip> 48 + <Divider orientation="left">
  49 + <a-tooltip>
50 <template #title 50 <template #title
51 >场景联动触发的次要条件,"执行条件"之间的关系为或, 51 >场景联动触发的次要条件,"执行条件"之间的关系为或,
52 “执行条件”与“触发器”之间的关系为且。</template 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 <div> 58 <div>
59 <template v-for="(item, index) in conditionData" :key="item"> 59 <template v-for="(item, index) in conditionData" :key="item">
60 <TriggerOrCondition 60 <TriggerOrCondition
@@ -76,15 +76,15 @@ @@ -76,15 +76,15 @@
76 <!-- 执行条件-end --> 76 <!-- 执行条件-end -->
77 77
78 <!-- 执行动作-begin --> 78 <!-- 执行动作-begin -->
79 - <Divider orientation="left"  
80 - ><a-tooltip> 79 + <Divider orientation="left">
  80 + <a-tooltip>
81 <template #title 81 <template #title
82 >触发器和执行条件都满足时,场景联动会做什么,例如:设备联动、告警通知等。</template 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 <div> 88 <div>
89 <template v-for="(item, index) in actionData" :key="item"> 89 <template v-for="(item, index) in actionData" :key="item">
90 <Action 90 <Action
@@ -637,6 +637,30 @@ @@ -637,6 +637,30 @@
637 id: unref(id), 637 id: unref(id),
638 tenantId: unref(tenantId), 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 await screenLinkPageAddApi(postAddOrEditData, unref(isUpdate)); 664 await screenLinkPageAddApi(postAddOrEditData, unref(isUpdate));
641 createMessage.success(`${unref(isUpdate) ? '编辑' : '新增'}成功`); 665 createMessage.success(`${unref(isUpdate) ? '编辑' : '新增'}成功`);
642 closeDrawer(); 666 closeDrawer();
@@ -60,7 +60,7 @@ @@ -60,7 +60,7 @@
60 import { exportPage, deleteExportManage } from '/@/api/export/exportManager'; 60 import { exportPage, deleteExportManage } from '/@/api/export/exportManager';
61 61
62 const searchInfo = reactive<Recordable>({}); 62 const searchInfo = reactive<Recordable>({});
63 - const [registerTable, { reload, setProps, setTableData }] = useTable({ 63 + const [registerTable, { reload, setProps }] = useTable({
64 title: '转换脚本列表', 64 title: '转换脚本列表',
65 api: exportPage, 65 api: exportPage,
66 columns, 66 columns,
@@ -102,24 +102,6 @@ @@ -102,24 +102,6 @@
102 102
103 // 新增或编辑 103 // 新增或编辑
104 const handleCreateOrEdit = (record: Recordable | null) => { 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 if (record) { 105 if (record) {
124 openModal(true, { 106 openModal(true, {
125 isUpdate: false, 107 isUpdate: false,