Commit 6996c664caf5e3737f582ff20aaee165e7e08193
Merge branch 'fix/board-control-ordres' into 'main_dev'
fix: 修改看板控制组件选择tcp时的逻辑问题 See merge request yunteng/thingskit-front!803
Showing
17 changed files
with
449 additions
and
71 deletions
... | ... | @@ -125,23 +125,25 @@ export const step1Schemas: FormSchema[] = [ |
125 | 125 | dynamicRules({ values }) { |
126 | 126 | return [ |
127 | 127 | { |
128 | - required: | |
129 | - (values?.transportType === TransportTypeEnum.TCP && | |
130 | - values?.deviceType === DeviceTypeEnum.SENSOR) || | |
131 | - values?.deviceType === DeviceTypeEnum.GATEWAY, | |
128 | + required: values?.transportType === TransportTypeEnum.TCP, | |
132 | 129 | message: '请输入设备标识符', |
133 | 130 | }, |
134 | 131 | ]; |
135 | 132 | }, |
136 | - ifShow: ({ values }) => | |
137 | - values?.transportType === TransportTypeEnum.TCP && | |
138 | - (values.deviceType === DeviceTypeEnum.SENSOR || values.deviceType === DeviceTypeEnum.GATEWAY), | |
139 | - componentProps: ({}) => { | |
133 | + // ifShow: ({ values }) => | |
134 | + // values?.transportType === TransportTypeEnum.TCP && | |
135 | + // (values.deviceType === DeviceTypeEnum.SENSOR || values.deviceType === DeviceTypeEnum.GATEWAY), | |
136 | + ifShow: ({ values }) => values?.transportType === TransportTypeEnum.TCP, | |
137 | + componentProps: ({ formActionType }) => { | |
138 | + const { setFieldsValue } = formActionType; | |
140 | 139 | return { |
141 | 140 | options: [ |
142 | 141 | { label: '自定义', value: TaskTypeEnum.CUSTOM }, |
143 | 142 | { label: 'ModBus', value: TaskTypeEnum.MODBUS_RTU }, |
144 | 143 | ], |
144 | + onChange() { | |
145 | + setFieldsValue({ addressCode: null }); | |
146 | + }, | |
145 | 147 | }; |
146 | 148 | }, |
147 | 149 | }, |
... | ... | @@ -167,11 +169,17 @@ export const step1Schemas: FormSchema[] = [ |
167 | 169 | minValue: 0, |
168 | 170 | disabledSwitch: true, |
169 | 171 | }, |
172 | + // ifShow: ({ values }) => { | |
173 | + // return ( | |
174 | + // values?.transportType === TransportTypeEnum.TCP && | |
175 | + // (values.deviceType === DeviceTypeEnum.SENSOR || | |
176 | + // values.deviceType === DeviceTypeEnum.GATEWAY) && | |
177 | + // values?.codeType === TaskTypeEnum.MODBUS_RTU | |
178 | + // ); | |
179 | + // }, | |
170 | 180 | ifShow: ({ values }) => { |
171 | 181 | return ( |
172 | 182 | values?.transportType === TransportTypeEnum.TCP && |
173 | - (values.deviceType === DeviceTypeEnum.SENSOR || | |
174 | - values.deviceType === DeviceTypeEnum.GATEWAY) && | |
175 | 183 | values?.codeType === TaskTypeEnum.MODBUS_RTU |
176 | 184 | ); |
177 | 185 | }, | ... | ... |
... | ... | @@ -122,7 +122,7 @@ |
122 | 122 | }); |
123 | 123 | }; |
124 | 124 | |
125 | - const handleCopy = (record: DataSourceType) => { | |
125 | + const handleCopy = async (record: DataSourceType) => { | |
126 | 126 | const { key } = props.componentConfig || {}; |
127 | 127 | if (key == 'HumidityComponent2' && props.dataSource.length >= 6) { |
128 | 128 | createMessage.warning('绑定的数据源不能超过6条~'); |
... | ... | @@ -134,11 +134,12 @@ |
134 | 134 | return; |
135 | 135 | } |
136 | 136 | |
137 | - const allValues = getFormValues(); | |
137 | + const allValues = await getFormValues(); | |
138 | 138 | const currentRecord = getFormValueByUUID(record.uuid); |
139 | 139 | const uuid = trackUpdate(); |
140 | 140 | const raw = toRaw(record); |
141 | 141 | |
142 | + console.log(currentRecord, 'currentRecord'); | |
142 | 143 | emit('update:dataSource', [ |
143 | 144 | ...allValues, |
144 | 145 | { componentInfo: raw.componentInfo, ...currentRecord, uuid }, | ... | ... |
... | ... | @@ -32,6 +32,10 @@ |
32 | 32 | transportType: value.transportType, |
33 | 33 | service: value.service, |
34 | 34 | command: value.command, |
35 | + openService: value.openService, | |
36 | + closeService: value.closeService, | |
37 | + openCommand: value.openCommand, | |
38 | + closeCommand: value.closeCommand, | |
35 | 39 | commandType: value.commandType, |
36 | 40 | callType: value.callType, |
37 | 41 | }, |
... | ... | @@ -45,6 +49,10 @@ |
45 | 49 | ...record, |
46 | 50 | transportType: customCommand?.transportType || (record as Recordable).transportType, |
47 | 51 | service: customCommand?.service || (record as Recordable).service, |
52 | + openService: customCommand?.openService || (record as Recordable).openService, | |
53 | + closeService: customCommand?.closeService || (record as Recordable).closeService, | |
54 | + openCommand: customCommand?.openCommand || (record as Recordable).openCommand, | |
55 | + closeCommand: customCommand?.closeCommand || (record as Recordable).closeCommand, | |
48 | 56 | command: customCommand?.command || (record as Recordable).command, |
49 | 57 | commandType: customCommand?.commandType || (record as Recordable).commandType, |
50 | 58 | callType: customCommand?.callType || (record as Recordable).callType, | ... | ... |
... | ... | @@ -2,12 +2,13 @@ |
2 | 2 | import { ComponentPropsConfigType } from '/@/views/visual/packages/index.type'; |
3 | 3 | import { option } from './config'; |
4 | 4 | import { Spin } from 'ant-design-vue'; |
5 | - import { computed, ref } from 'vue'; | |
5 | + import { computed, ref, unref } from 'vue'; | |
6 | 6 | import { useComponentScale } from '../../../hook/useComponentScale'; |
7 | 7 | import { useSendCommand } from '../../../hook/useSendCommand'; |
8 | 8 | import { DeviceName } from '/@/views/visual/commonComponents/DeviceName'; |
9 | 9 | import { DataFetchUpdateFn } from '../../../hook/socket/useSocket.type'; |
10 | 10 | import { useDataFetch } from '../../../hook/socket/useSocket'; |
11 | + import { getSendValues } from '../config'; | |
11 | 12 | |
12 | 13 | const props = defineProps<{ |
13 | 14 | config: ComponentPropsConfigType<typeof option>; |
... | ... | @@ -19,9 +20,23 @@ |
19 | 20 | |
20 | 21 | const getDesign = computed(() => { |
21 | 22 | const { option } = props.config; |
22 | - const { attribute, attributeRename, attributeName } = option; | |
23 | + const { | |
24 | + attribute, | |
25 | + attributeRename, | |
26 | + attributeName, | |
27 | + commandType, | |
28 | + extensionDesc, | |
29 | + codeType, | |
30 | + deviceCode, | |
31 | + customCommand, | |
32 | + } = option; | |
23 | 33 | return { |
24 | 34 | attribute: attributeRename || attributeName || attribute, |
35 | + extensionDesc: extensionDesc ? JSON.parse(extensionDesc) : {}, | |
36 | + commandType, | |
37 | + codeType, | |
38 | + deviceCode, | |
39 | + customCommand, | |
25 | 40 | }; |
26 | 41 | }); |
27 | 42 | |
... | ... | @@ -29,8 +44,15 @@ |
29 | 44 | const handleChange = async (event: Event) => { |
30 | 45 | const target = event.target as HTMLInputElement; |
31 | 46 | const value = target.checked; |
47 | + const { option } = props.config || {}; | |
32 | 48 | |
33 | - const flag = await sendCommand(props.config.option, value); | |
49 | + const { values, isModbusCommand, sendValue } = await getSendValues( | |
50 | + option, | |
51 | + unref(getDesign), | |
52 | + value | |
53 | + ); | |
54 | + | |
55 | + const flag = await sendCommand(values, isModbusCommand ? sendValue : value, isModbusCommand); | |
34 | 56 | if (flag) currentValue.value = value; |
35 | 57 | flag ? (currentValue.value = value) : (target.checked = !value); |
36 | 58 | }; | ... | ... |
... | ... | @@ -32,6 +32,10 @@ |
32 | 32 | transportType: value.transportType, |
33 | 33 | service: value.service, |
34 | 34 | command: value.command, |
35 | + openService: value.openService, | |
36 | + closeService: value.closeService, | |
37 | + openCommand: value.openCommand, | |
38 | + closeCommand: value.closeCommand, | |
35 | 39 | commandType: value.commandType, |
36 | 40 | callType: value.callType, |
37 | 41 | }, |
... | ... | @@ -41,14 +45,20 @@ |
41 | 45 | |
42 | 46 | const setFormValues = (record: DataSource) => { |
43 | 47 | const { customCommand } = record; |
44 | - return setFieldsValue({ | |
48 | + const values = { | |
45 | 49 | ...record, |
46 | 50 | transportType: customCommand?.transportType || (record as Recordable).transportType, |
47 | 51 | service: customCommand?.service || (record as Recordable).service, |
48 | 52 | command: customCommand?.command || (record as Recordable).command, |
53 | + openService: customCommand?.openService || (record as Recordable).openService, | |
54 | + closeService: customCommand?.closeService || (record as Recordable).closeService, | |
55 | + openCommand: customCommand?.openCommand || (record as Recordable).openCommand, | |
56 | + closeCommand: customCommand?.closeCommand || (record as Recordable).closeCommand, | |
49 | 57 | commandType: customCommand?.commandType || (record as Recordable).commandType, |
50 | 58 | callType: customCommand?.callType || (record as Recordable).callType, |
51 | - } as unknown as Partial<CommonDataSourceBindValueType>); | |
59 | + } as unknown as Partial<CommonDataSourceBindValueType>; | |
60 | + | |
61 | + return setFieldsValue(values); | |
52 | 62 | }; |
53 | 63 | |
54 | 64 | defineExpose({ | ... | ... |
... | ... | @@ -10,6 +10,7 @@ |
10 | 10 | import { DeviceName } from '/@/views/visual/commonComponents/DeviceName'; |
11 | 11 | import { DataFetchUpdateFn } from '../../../hook/socket/useSocket.type'; |
12 | 12 | import { useDataFetch } from '../../../hook/socket/useSocket'; |
13 | + import { getSendValues } from '../config'; | |
13 | 14 | |
14 | 15 | const props = defineProps<{ |
15 | 16 | config: ComponentPropsConfigType<typeof option>; |
... | ... | @@ -19,19 +20,88 @@ |
19 | 20 | |
20 | 21 | const getDesign = computed(() => { |
21 | 22 | const { option, persetOption } = props.config; |
22 | - const { componentInfo, attribute, attributeRename, attributeName } = option; | |
23 | + const { | |
24 | + componentInfo, | |
25 | + attribute, | |
26 | + attributeRename, | |
27 | + attributeName, | |
28 | + commandType, | |
29 | + extensionDesc, | |
30 | + codeType, | |
31 | + deviceCode, | |
32 | + customCommand, | |
33 | + } = option; | |
23 | 34 | const { icon: presetIcon, iconColor: presetIconColor } = persetOption || {}; |
24 | 35 | const { icon, iconColor } = componentInfo || {}; |
36 | + | |
25 | 37 | return { |
26 | 38 | icon: icon ?? presetIcon, |
27 | 39 | iconColor: iconColor || presetIconColor, |
28 | 40 | attribute: attributeRename || attributeName || attribute, |
41 | + extensionDesc: extensionDesc ? JSON.parse(extensionDesc) : {}, | |
42 | + commandType, | |
43 | + codeType, | |
44 | + deviceCode, | |
45 | + customCommand, | |
29 | 46 | }; |
30 | 47 | }); |
31 | 48 | |
32 | 49 | const { sendCommand, loading } = useSendCommand(); |
50 | + | |
33 | 51 | const handleChange = async () => { |
34 | - const flag = await sendCommand(props.config.option, unref(checked)); | |
52 | + const { option } = props.config || {}; | |
53 | + | |
54 | + const { values, isModbusCommand, sendValue } = await getSendValues( | |
55 | + option, | |
56 | + unref(getDesign), | |
57 | + unref(checked) | |
58 | + ); | |
59 | + | |
60 | + // const { values, sendValue, isModbusCommand } = getSendValues( | |
61 | + // values, | |
62 | + // unref(getDesign), | |
63 | + // unref(checked) | |
64 | + // ); | |
65 | + // const isModbusCommand = ref<boolean>(false); //判断是否是TCP设备-> 且设备标识符是modeBUs,切选择是下发命令类型是属性 | |
66 | + // const { extensionDesc, commandType, codeType, deviceCode, customCommand } = | |
67 | + // unref(getDesign) || {}; | |
68 | + // const { registerAddress, actionType } = extensionDesc || {}; | |
69 | + // const { openCommand, closeCommand, transportType } = customCommand || {}; | |
70 | + // const modBUS = ref<any>({}); | |
71 | + // const sendValue = ref(); | |
72 | + // console.log(transportType, 'transportType', codeType, 'codeType'); | |
73 | + // //判断是不是TCP类型设备 | |
74 | + // if (transportType === TransportTypeEnum.TCP) { | |
75 | + // if ( | |
76 | + // //判断TCP下发类型是否是自定义还是服务 | |
77 | + // commandType === CommandTypeEnum.CUSTOM.toString() || | |
78 | + // commandType == CommandTypeEnum.SERVICE.toString() | |
79 | + // ) { | |
80 | + // values.customCommand.command = unref(checked) ? openCommand : closeCommand; | |
81 | + // } | |
82 | + // if ( | |
83 | + // //判断命令下发类型是不是属性 | |
84 | + // commandType === CommandTypeEnum.ATTRIBUTE.toString() && | |
85 | + // codeType === TaskTypeEnum.MODBUS_RTU | |
86 | + // ) { | |
87 | + // isModbusCommand.value = true; | |
88 | + // modBUS.value = { | |
89 | + // crc: 'CRC_16_LOWER', | |
90 | + // deviceCode: deviceCode, | |
91 | + // method: actionType == '16' ? '10' : actionType, | |
92 | + // registerAddress, | |
93 | + // registerNumber: 1, | |
94 | + // registerValues: [Number(unref(checked))], | |
95 | + // }; | |
96 | + // sendValue.value = await genModbusCommand(unref(modBUS)); | |
97 | + // } | |
98 | + // } | |
99 | + | |
100 | + const flag = await sendCommand( | |
101 | + values, | |
102 | + isModbusCommand ? sendValue : unref(checked), | |
103 | + isModbusCommand | |
104 | + ); | |
35 | 105 | if (!flag) checked.value = !unref(checked); |
36 | 106 | }; |
37 | 107 | ... | ... |
... | ... | @@ -32,6 +32,10 @@ |
32 | 32 | transportType: value.transportType, |
33 | 33 | service: value.service, |
34 | 34 | command: value.command, |
35 | + openService: value.openService, | |
36 | + closeService: value.closeService, | |
37 | + openCommand: value.openCommand, | |
38 | + closeCommand: value.closeCommand, | |
35 | 39 | commandType: value.commandType, |
36 | 40 | callType: value.callType, |
37 | 41 | }, |
... | ... | @@ -45,6 +49,10 @@ |
45 | 49 | ...record, |
46 | 50 | transportType: customCommand?.transportType || (record as Recordable).transportType, |
47 | 51 | service: customCommand?.service || (record as Recordable).service, |
52 | + openService: customCommand?.openService || (record as Recordable).openService, | |
53 | + closeService: customCommand?.closeService || (record as Recordable).closeService, | |
54 | + openCommand: customCommand?.openCommand || (record as Recordable).openCommand, | |
55 | + closeCommand: customCommand?.closeCommand || (record as Recordable).closeCommand, | |
48 | 56 | command: customCommand?.command || (record as Recordable).command, |
49 | 57 | commandType: customCommand?.commandType || (record as Recordable).commandType, |
50 | 58 | callType: customCommand?.callType || (record as Recordable).callType, | ... | ... |
... | ... | @@ -2,12 +2,13 @@ |
2 | 2 | import { ComponentPropsConfigType } from '/@/views/visual/packages/index.type'; |
3 | 3 | import { option } from './config'; |
4 | 4 | import { Spin } from 'ant-design-vue'; |
5 | - import { computed, ref } from 'vue'; | |
5 | + import { computed, ref, unref } from 'vue'; | |
6 | 6 | import { useComponentScale } from '../../../hook/useComponentScale'; |
7 | 7 | import { useSendCommand } from '../../../hook/useSendCommand'; |
8 | 8 | import { DeviceName } from '/@/views/visual/commonComponents/DeviceName'; |
9 | 9 | import { DataFetchUpdateFn } from '../../../hook/socket/useSocket.type'; |
10 | 10 | import { useDataFetch } from '../../../hook/socket/useSocket'; |
11 | + import { getSendValues } from '../config'; | |
11 | 12 | |
12 | 13 | const props = defineProps<{ |
13 | 14 | config: ComponentPropsConfigType<typeof option>; |
... | ... | @@ -19,9 +20,23 @@ |
19 | 20 | |
20 | 21 | const getDesign = computed(() => { |
21 | 22 | const { option } = props.config; |
22 | - const { attribute, attributeRename, attributeName } = option; | |
23 | + const { | |
24 | + attribute, | |
25 | + attributeRename, | |
26 | + attributeName, | |
27 | + commandType, | |
28 | + extensionDesc, | |
29 | + codeType, | |
30 | + deviceCode, | |
31 | + customCommand, | |
32 | + } = option; | |
23 | 33 | return { |
24 | 34 | attribute: attributeRename || attributeName || attribute, |
35 | + extensionDesc: extensionDesc ? JSON.parse(extensionDesc) : {}, | |
36 | + commandType, | |
37 | + codeType, | |
38 | + deviceCode, | |
39 | + customCommand, | |
25 | 40 | }; |
26 | 41 | }); |
27 | 42 | |
... | ... | @@ -29,7 +44,15 @@ |
29 | 44 | const handleChange = async (event: Event) => { |
30 | 45 | const target = event.target as HTMLInputElement; |
31 | 46 | const value = target.checked; |
32 | - const flag = await sendCommand(props.config.option, value); | |
47 | + const { option } = props.config || {}; | |
48 | + | |
49 | + const { values, isModbusCommand, sendValue } = await getSendValues( | |
50 | + option, | |
51 | + unref(getDesign), | |
52 | + value | |
53 | + ); | |
54 | + | |
55 | + const flag = await sendCommand(values, isModbusCommand ? sendValue : value, isModbusCommand); | |
33 | 56 | flag ? (currentValue.value = value) : (target.checked = !value); |
34 | 57 | }; |
35 | 58 | ... | ... |
... | ... | @@ -42,10 +42,10 @@ |
42 | 42 | const { customCommand } = record; |
43 | 43 | return setFieldsValue({ |
44 | 44 | ...record, |
45 | - transportType: customCommand?.transportType, | |
46 | - service: customCommand?.service, | |
47 | - command: customCommand?.command, | |
48 | - commandType: customCommand?.commandType, | |
45 | + transportType: customCommand?.transportType || (record as Recordable).transportType, | |
46 | + service: customCommand?.service || (record as Recordable).service, | |
47 | + command: customCommand?.command || (record as Recordable).command, | |
48 | + commandType: customCommand?.commandType || (record as Recordable).command, | |
49 | 49 | } as unknown as Partial<CommonDataSourceBindValueType>); |
50 | 50 | }; |
51 | 51 | ... | ... |
... | ... | @@ -32,6 +32,10 @@ |
32 | 32 | transportType: value.transportType, |
33 | 33 | service: value.service, |
34 | 34 | command: value.command, |
35 | + openService: value.openService, | |
36 | + closeService: value.closeService, | |
37 | + openCommand: value.openCommand, | |
38 | + closeCommand: value.closeCommand, | |
35 | 39 | commandType: value.commandType, |
36 | 40 | callType: value.callType, |
37 | 41 | }, |
... | ... | @@ -45,6 +49,10 @@ |
45 | 49 | ...record, |
46 | 50 | transportType: customCommand?.transportType || (record as Recordable).transportType, |
47 | 51 | service: customCommand?.service || (record as Recordable).service, |
52 | + openService: customCommand?.openService || (record as Recordable).openService, | |
53 | + closeService: customCommand?.closeService || (record as Recordable).closeService, | |
54 | + openCommand: customCommand?.openCommand || (record as Recordable).openCommand, | |
55 | + closeCommand: customCommand?.closeCommand || (record as Recordable).closeCommand, | |
48 | 56 | command: customCommand?.command || (record as Recordable).command, |
49 | 57 | commandType: customCommand?.commandType || (record as Recordable).commandType, |
50 | 58 | callType: customCommand?.callType || (record as Recordable).callType, | ... | ... |
... | ... | @@ -13,6 +13,7 @@ |
13 | 13 | import { useReceiveMessage } from '../../../hook/useReceiveMessage'; |
14 | 14 | import { useReceiveValue } from '../../../hook/useReceiveValue'; |
15 | 15 | import { DataSource } from '/@/views/visual/palette/types'; |
16 | + import { getSendValues, CommandTypeEnumLIst } from '../config'; | |
16 | 17 | |
17 | 18 | const props = defineProps<{ |
18 | 19 | config: ComponentPropsConfigType<typeof option>; |
... | ... | @@ -55,8 +56,19 @@ |
55 | 56 | return { |
56 | 57 | dataSource: dataSource.map((item) => { |
57 | 58 | const { fontColor, icon, iconColor, unit, showDeviceName } = item.componentInfo; |
58 | - const { attribute, attributeRename, attributeName, deviceId, deviceName, deviceRename } = | |
59 | - item; | |
59 | + const { | |
60 | + attribute, | |
61 | + attributeRename, | |
62 | + attributeName, | |
63 | + deviceId, | |
64 | + deviceName, | |
65 | + deviceRename, | |
66 | + commandType, | |
67 | + extensionDesc, | |
68 | + codeType, | |
69 | + deviceCode, | |
70 | + customCommand, | |
71 | + } = item; | |
60 | 72 | return { |
61 | 73 | unit: unit ?? persetUnit, |
62 | 74 | fontColor: fontColor ?? persetFontColor, |
... | ... | @@ -67,6 +79,11 @@ |
67 | 79 | showDeviceName, |
68 | 80 | deviceName: deviceRename || deviceName, |
69 | 81 | id: deviceId, |
82 | + extensionDesc: extensionDesc ? JSON.parse(extensionDesc) : {}, | |
83 | + commandType, | |
84 | + codeType, | |
85 | + deviceCode, | |
86 | + customCommand, | |
70 | 87 | }; |
71 | 88 | }), |
72 | 89 | }; |
... | ... | @@ -76,7 +93,6 @@ |
76 | 93 | const handleChange = async (index: number, checked: Boolean) => { |
77 | 94 | const { heightPx, itemHeightRatio, itemWidthRatio, mode, widthPx, dataSource } = |
78 | 95 | props.config.option; |
79 | - | |
80 | 96 | const data = { |
81 | 97 | ...dataSource?.[index], |
82 | 98 | heightPx, |
... | ... | @@ -85,8 +101,13 @@ |
85 | 101 | mode, |
86 | 102 | widthPx, |
87 | 103 | } as DataSource; |
104 | + const { values, isModbusCommand, sendValue } = await getSendValues( | |
105 | + data, | |
106 | + unref(getDesign).dataSource[index], | |
107 | + checked | |
108 | + ); | |
88 | 109 | |
89 | - const flag = await sendCommand(data, checked); | |
110 | + const flag = await sendCommand(values, isModbusCommand ? sendValue : checked, isModbusCommand); | |
90 | 111 | if (!flag) controlList.value[index].checked = !checked; |
91 | 112 | }; |
92 | 113 | |
... | ... | @@ -135,7 +156,11 @@ |
135 | 156 | <div |
136 | 157 | class="text-gray-500 truncate ml-6" |
137 | 158 | :style="{ fontSize: getRatio ? '18px' : getRatio * 18 + 'px' }" |
138 | - >{{ `${item.deviceName} - ${item.attributeName}` }}</div | |
159 | + >{{ | |
160 | + `${item.deviceName} - ${ | |
161 | + item.commandType ? CommandTypeEnumLIst[item.commandType].name : item.attributeName | |
162 | + }` | |
163 | + }}</div | |
139 | 164 | > |
140 | 165 | </div> |
141 | 166 | ... | ... |
1 | +import { ref, unref } from 'vue'; | |
2 | +import { TransportTypeEnum } from '/@/views/device/profiles/components/TransportDescript/const'; | |
3 | +import { CommandTypeEnum } from '/@/views/rule/linkedge/config/config.data'; | |
4 | +import { TaskTypeEnum } from '/@/views/task/center/config'; | |
5 | +import { genModbusCommand } from '/@/api/task'; | |
6 | + | |
7 | +export const getSendValues = async (option, getDesign, checked) => { | |
8 | + const values: any = option; | |
9 | + const isModbusCommand = ref<boolean>(false); //判断是否是TCP设备-> 且设备标识符是modeBUs,切选择是下发命令类型是属性 | |
10 | + const { extensionDesc, commandType, codeType, deviceCode, customCommand } = getDesign || {}; | |
11 | + const { registerAddress, actionType } = extensionDesc || {}; | |
12 | + const { openCommand, closeCommand, transportType } = customCommand || {}; | |
13 | + const modBUS = ref<any>({}); | |
14 | + const sendValue = ref(); | |
15 | + //判断是不是TCP类型设备 | |
16 | + if (transportType === TransportTypeEnum.TCP) { | |
17 | + if ( | |
18 | + //判断TCP下发类型是否是自定义还是服务 | |
19 | + commandType === CommandTypeEnum.CUSTOM.toString() || | |
20 | + commandType == CommandTypeEnum.SERVICE.toString() | |
21 | + ) { | |
22 | + values.customCommand.command = checked ? openCommand : closeCommand; | |
23 | + } | |
24 | + if ( | |
25 | + //判断命令下发类型是不是属性 | |
26 | + commandType === CommandTypeEnum.ATTRIBUTE.toString() && | |
27 | + codeType === TaskTypeEnum.MODBUS_RTU | |
28 | + ) { | |
29 | + isModbusCommand.value = true; | |
30 | + modBUS.value = { | |
31 | + crc: 'CRC_16_LOWER', | |
32 | + deviceCode: deviceCode, | |
33 | + method: actionType == '16' ? '10' : actionType, | |
34 | + registerAddress, | |
35 | + registerNumber: 1, | |
36 | + registerValues: [Number(checked)], | |
37 | + }; | |
38 | + sendValue.value = await genModbusCommand(unref(modBUS)); | |
39 | + } | |
40 | + } | |
41 | + | |
42 | + return { values, sendValue: unref(sendValue), isModbusCommand: unref(isModbusCommand) }; | |
43 | +}; | |
44 | + | |
45 | +export const CommandTypeEnumLIst = { | |
46 | + '0': { CUSTOM: 0, name: '自定义' }, | |
47 | + '1': { CUSTOM: 0, name: '服务' }, | |
48 | + '2': { CUSTOM: 0, name: '属性' }, | |
49 | +}; | ... | ... |
... | ... | @@ -14,6 +14,7 @@ import { OrgTreeSelect } from '/@/views/common/OrgTreeSelect'; |
14 | 14 | import { TransportTypeEnum } from '/@/views/device/profiles/components/TransportDescript/const'; |
15 | 15 | import { CommandTypeEnum } from '/@/views/rule/linkedge/config/config.data'; |
16 | 16 | import { DataActionModeEnum } from '/@/enums/toolEnum'; |
17 | +import { TaskTypeEnum } from '/@/views/task/center/config'; | |
17 | 18 | |
18 | 19 | useComponentRegister('OrgTreeSelect', OrgTreeSelect); |
19 | 20 | |
... | ... | @@ -24,6 +25,7 @@ export interface CommonDataSourceBindValueType extends Record<DataSourceField, s |
24 | 25 | command?: string; |
25 | 26 | commandType?: string; |
26 | 27 | callType?: string; |
28 | + [ksy: string]: string | undefined; | |
27 | 29 | }; |
28 | 30 | } |
29 | 31 | |
... | ... | @@ -33,6 +35,7 @@ export enum DataSourceField { |
33 | 35 | TRANSPORT_TYPE = 'transportType', |
34 | 36 | ORIGINATION_ID = 'organizationId', |
35 | 37 | DEVICE_ID = 'deviceId', |
38 | + DEVICE_CODE = 'deviceCode', //设备地址码 | |
36 | 39 | DEVICE_PROFILE_ID = 'deviceProfileId', |
37 | 40 | ATTRIBUTE = 'attribute', |
38 | 41 | ATTRIBUTE_NAME = 'attributeName', |
... | ... | @@ -41,10 +44,15 @@ export enum DataSourceField { |
41 | 44 | DEVICE_RENAME = 'deviceRename', |
42 | 45 | LONGITUDE_ATTRIBUTE = 'longitudeAttribute', |
43 | 46 | LATITUDE_ATTRIBUTE = 'latitudeAttribute', |
44 | - | |
47 | + CODE_TYPE = 'codeType', | |
45 | 48 | COMMAND = 'command', |
49 | + OPEN_COMMAND = 'openCommand', | |
50 | + CLOSE_COMMAND = 'closeCommand', | |
46 | 51 | COMMAND_TYPE = 'commandType', |
47 | 52 | SERVICE = 'service', |
53 | + OPEN_SERVICE = 'openService', | |
54 | + CLOSE_SERVICE = 'closeService', | |
55 | + EXTENSION_DESC = 'extensionDesc', | |
48 | 56 | CALL_TYPE = 'callType', |
49 | 57 | } |
50 | 58 | |
... | ... | @@ -72,7 +80,7 @@ const getDeviceService = async (deviceProfileId: string) => { |
72 | 80 | const getDeviceAttribute = async (params: DeviceAttributeParams) => { |
73 | 81 | try { |
74 | 82 | const data = await getDeviceAttributes(params); |
75 | - if (data) return data.map((item) => ({ label: item.name, value: item.identifier })); | |
83 | + if (data) return data.map((item) => ({ ...item, label: item.name, value: item.identifier })); | |
76 | 84 | } catch (error) {} |
77 | 85 | return []; |
78 | 86 | }; |
... | ... | @@ -82,7 +90,6 @@ export const commonDataSourceSchemas = (): FormSchema[] => { |
82 | 90 | const isUpdate = unref(mode) === DataActionModeEnum.UPDATE; |
83 | 91 | const selectWidgetKeys = useSelectWidgetKeys(); |
84 | 92 | const category = unref(selectWidgetKeys).categoryKey; |
85 | - | |
86 | 93 | return [ |
87 | 94 | { |
88 | 95 | field: DataSourceField.IS_GATEWAY_DEVICE, |
... | ... | @@ -161,6 +168,7 @@ export const commonDataSourceSchemas = (): FormSchema[] => { |
161 | 168 | [DataSourceField.ATTRIBUTE]: null, |
162 | 169 | [DataSourceField.ATTRIBUTE_NAME]: null, |
163 | 170 | [DataSourceField.TRANSPORT_TYPE]: option[DataSourceField.TRANSPORT_TYPE], |
171 | + [DataSourceField.COMMAND_TYPE]: null, | |
164 | 172 | }); |
165 | 173 | }, |
166 | 174 | getPopupContainer: () => document.body, |
... | ... | @@ -228,6 +236,9 @@ export const commonDataSourceSchemas = (): FormSchema[] => { |
228 | 236 | onChange(_value, record: MasterDeviceList) { |
229 | 237 | setFieldsValue({ |
230 | 238 | [DataSourceField.DEVICE_NAME]: record?.label, |
239 | + [DataSourceField.CODE_TYPE]: record?.codeType, | |
240 | + [DataSourceField.DEVICE_CODE]: record?.code, | |
241 | + [DataSourceField.COMMAND_TYPE]: null, | |
231 | 242 | }); |
232 | 243 | }, |
233 | 244 | placeholder: '请选择设备', |
... | ... | @@ -236,19 +247,94 @@ export const commonDataSourceSchemas = (): FormSchema[] => { |
236 | 247 | }, |
237 | 248 | }, |
238 | 249 | { |
250 | + field: DataSourceField.CODE_TYPE, | |
251 | + component: 'Input', | |
252 | + label: '设备标识符', | |
253 | + show: false, | |
254 | + }, | |
255 | + | |
256 | + { | |
257 | + field: DataSourceField.DEVICE_CODE, | |
258 | + component: 'Input', | |
259 | + show: false, | |
260 | + label: '设备地址码', | |
261 | + }, | |
262 | + | |
263 | + { | |
239 | 264 | field: DataSourceField.ATTRIBUTE_NAME, |
240 | 265 | component: 'Input', |
241 | 266 | label: '属性名', |
242 | 267 | show: false, |
243 | 268 | }, |
244 | 269 | { |
270 | + field: DataSourceField.COMMAND_TYPE, | |
271 | + component: 'ApiSelect', | |
272 | + label: '命令类型', | |
273 | + defaultValue: CommandTypeEnum.CUSTOM.toString(), | |
274 | + rules: [{ required: true, message: '请选择命令类型' }], | |
275 | + colProps: { span: 8 }, | |
276 | + ifShow: ({ model }) => { | |
277 | + return isControlComponent(category!) && isTcpProfile(model[DataSourceField.TRANSPORT_TYPE]); | |
278 | + }, | |
279 | + componentProps: ({ formActionType, formModel }) => { | |
280 | + const { setFieldsValue } = formActionType; | |
281 | + const { codeType } = formModel || {}; | |
282 | + return { | |
283 | + // api: findDictItemByCode, | |
284 | + api: async (params: Recordable) => { | |
285 | + try { | |
286 | + const record = await findDictItemByCode(params); | |
287 | + if (unref(selectWidgetKeys).componentKey == 'LateralNumericalControl') { | |
288 | + return record.filter( | |
289 | + (item) => item.itemValue == CommandTypeEnum.ATTRIBUTE.toString() | |
290 | + ); | |
291 | + } | |
292 | + if (codeType == TaskTypeEnum.MODBUS_RTU) { | |
293 | + // setFieldsValue({ [DataSourceField.COMMAND_TYPE]: undefined }); | |
294 | + return record.filter( | |
295 | + (item) => item.itemValue !== CommandTypeEnum.CUSTOM.toString() | |
296 | + ); | |
297 | + } else { | |
298 | + return record.filter( | |
299 | + (item) => item.itemValue !== CommandTypeEnum.ATTRIBUTE.toString() | |
300 | + ); | |
301 | + } | |
302 | + } catch (error) { | |
303 | + console.log(error); | |
304 | + return []; | |
305 | + } | |
306 | + }, | |
307 | + params: { | |
308 | + dictCode: 'custom_define', | |
309 | + }, | |
310 | + labelField: 'itemText', | |
311 | + valueField: 'itemValue', | |
312 | + placeholder: '请选择命令类型', | |
313 | + getPopupContainer: () => document.body, | |
314 | + onChange() { | |
315 | + setFieldsValue({ | |
316 | + [DataSourceField.COMMAND]: null, | |
317 | + [DataSourceField.SERVICE]: null, | |
318 | + [DataSourceField.OPEN_COMMAND]: null, | |
319 | + [DataSourceField.CLOSE_COMMAND]: null, | |
320 | + [DataSourceField.OPEN_SERVICE]: null, | |
321 | + [DataSourceField.CLOSE_SERVICE]: null, | |
322 | + [DataSourceField.CALL_TYPE]: null, | |
323 | + [DataSourceField.ATTRIBUTE]: null, | |
324 | + }); | |
325 | + }, | |
326 | + }; | |
327 | + }, | |
328 | + }, | |
329 | + { | |
245 | 330 | field: DataSourceField.ATTRIBUTE, |
246 | 331 | component: 'ApiSelect', |
247 | 332 | label: '属性', |
248 | 333 | colProps: { span: 8 }, |
249 | 334 | rules: [{ required: true, message: '请选择属性' }], |
250 | 335 | ifShow: ({ model }) => |
251 | - !(isTcpProfile(model[DataSourceField.TRANSPORT_TYPE]) && isControlComponent(category!)), | |
336 | + !(isTcpProfile(model[DataSourceField.TRANSPORT_TYPE]) && isControlComponent(category!)) || | |
337 | + model[DataSourceField.COMMAND_TYPE] == 2, | |
252 | 338 | componentProps({ formModel, formActionType }) { |
253 | 339 | const { setFieldsValue } = formActionType; |
254 | 340 | const deviceProfileId = formModel[DataSourceField.DEVICE_PROFILE_ID]; |
... | ... | @@ -277,6 +363,16 @@ export const commonDataSourceSchemas = (): FormSchema[] => { |
277 | 363 | [DataSourceField.ATTRIBUTE]: null, |
278 | 364 | }); |
279 | 365 | } |
366 | + | |
367 | + if (unref(selectWidgetKeys).componentKey == 'LateralNumericalControl') { | |
368 | + setFieldsValue({ | |
369 | + [DataSourceField.COMMAND_TYPE]: 2, | |
370 | + }); | |
371 | + return option.filter( | |
372 | + (item) => | |
373 | + item.detail.dataType.type == 'INT' || item.detail.dataType.type == 'DOUBLE' | |
374 | + ); | |
375 | + } | |
280 | 376 | return option; |
281 | 377 | } |
282 | 378 | } catch (error) {} |
... | ... | @@ -284,53 +380,79 @@ export const commonDataSourceSchemas = (): FormSchema[] => { |
284 | 380 | }, |
285 | 381 | placeholder: '请选择属性', |
286 | 382 | getPopupContainer: () => document.body, |
287 | - onChange(value: string, option: Record<'label' | 'value', string>) { | |
288 | - setFieldsValue({ [DataSourceField.ATTRIBUTE_NAME]: value ? option.label : null }); | |
383 | + onChange(value: string, option: Record<'label' | 'value' | any, string>) { | |
384 | + setFieldsValue({ | |
385 | + [DataSourceField.ATTRIBUTE_NAME]: value ? option.label : null, | |
386 | + [DataSourceField.EXTENSION_DESC]: value ? JSON.stringify(option.extensionDesc) : '', | |
387 | + }); | |
289 | 388 | }, |
290 | 389 | }; |
291 | 390 | }, |
292 | 391 | }, |
293 | 392 | { |
294 | - field: DataSourceField.COMMAND_TYPE, | |
393 | + field: DataSourceField.EXTENSION_DESC, | |
394 | + component: 'Input', | |
395 | + show: false, | |
396 | + label: '扩展描述符', | |
397 | + }, | |
398 | + | |
399 | + { | |
400 | + field: DataSourceField.CALL_TYPE, | |
401 | + component: 'Input', | |
402 | + ifShow: false, | |
403 | + label: 'callType', | |
404 | + }, | |
405 | + { | |
406 | + field: DataSourceField.OPEN_SERVICE, | |
295 | 407 | component: 'ApiSelect', |
296 | - label: '命令类型', | |
297 | - defaultValue: CommandTypeEnum.CUSTOM.toString(), | |
298 | - rules: [{ required: true, message: '请选择命令类型' }], | |
408 | + label: '开服务', | |
299 | 409 | colProps: { span: 8 }, |
410 | + rules: [{ required: true, message: '请选择开服务' }], | |
300 | 411 | ifShow: ({ model }) => |
301 | - isControlComponent(category!) && isTcpProfile(model[DataSourceField.TRANSPORT_TYPE]), | |
302 | - componentProps: ({ formActionType }) => { | |
412 | + isControlComponent(category!) && | |
413 | + model[DataSourceField.COMMAND_TYPE] === CommandTypeEnum.SERVICE.toString() && | |
414 | + isTcpProfile(model[DataSourceField.TRANSPORT_TYPE]), | |
415 | + componentProps({ formModel, formActionType }) { | |
303 | 416 | const { setFieldsValue } = formActionType; |
417 | + const deviceProfileId = formModel[DataSourceField.DEVICE_PROFILE_ID]; | |
418 | + const transportType = formModel[DataSourceField.TRANSPORT_TYPE]; | |
419 | + if (isUpdate && ![deviceProfileId, transportType].every(Boolean)) | |
420 | + return { placeholder: '请选择开服务', getPopupContainer: () => document.body }; | |
304 | 421 | return { |
305 | - api: findDictItemByCode, | |
306 | - params: { | |
307 | - dictCode: 'custom_define', | |
422 | + api: async () => { | |
423 | + try { | |
424 | + if (deviceProfileId) { | |
425 | + const services = await getDeviceService(deviceProfileId); | |
426 | + const value = formModel[DataSourceField.SERVICE]; | |
427 | + if (value) { | |
428 | + const selected = services.find((item) => item.value === value); | |
429 | + selected && setFieldsValue({ [DataSourceField.CALL_TYPE]: selected.callType }); | |
430 | + } | |
431 | + return services; | |
432 | + } | |
433 | + } catch (error) {} | |
434 | + return []; | |
308 | 435 | }, |
309 | - labelField: 'itemText', | |
310 | - valueField: 'itemValue', | |
311 | - placeholder: '请选择命令类型', | |
312 | - onChange() { | |
436 | + placeholder: '请选择开服务', | |
437 | + getPopupContainer: () => document.body, | |
438 | + onChange(value: string, options: ModelOfMatterParams) { | |
439 | + const command = value | |
440 | + ? (options.functionJson.inputData || [])[0]?.serviceCommand | |
441 | + : null; | |
313 | 442 | setFieldsValue({ |
314 | - [DataSourceField.COMMAND]: null, | |
315 | - [DataSourceField.SERVICE]: null, | |
316 | - [DataSourceField.CALL_TYPE]: null, | |
443 | + [DataSourceField.OPEN_COMMAND]: command, | |
444 | + [DataSourceField.CALL_TYPE]: value ? options.callType : null, | |
317 | 445 | }); |
318 | 446 | }, |
319 | 447 | }; |
320 | 448 | }, |
321 | 449 | }, |
322 | 450 | { |
323 | - field: DataSourceField.CALL_TYPE, | |
324 | - component: 'Input', | |
325 | - ifShow: false, | |
326 | - label: 'callType', | |
327 | - }, | |
328 | - { | |
329 | - field: DataSourceField.SERVICE, | |
451 | + field: DataSourceField.CLOSE_SERVICE, | |
330 | 452 | component: 'ApiSelect', |
331 | - label: '服务', | |
453 | + label: '关服务', | |
332 | 454 | colProps: { span: 8 }, |
333 | - rules: [{ required: true, message: '请选择服务' }], | |
455 | + rules: [{ required: true, message: '请选择关服务' }], | |
334 | 456 | ifShow: ({ model }) => |
335 | 457 | isControlComponent(category!) && |
336 | 458 | model[DataSourceField.COMMAND_TYPE] === CommandTypeEnum.SERVICE.toString() && |
... | ... | @@ -340,7 +462,7 @@ export const commonDataSourceSchemas = (): FormSchema[] => { |
340 | 462 | const deviceProfileId = formModel[DataSourceField.DEVICE_PROFILE_ID]; |
341 | 463 | const transportType = formModel[DataSourceField.TRANSPORT_TYPE]; |
342 | 464 | if (isUpdate && ![deviceProfileId, transportType].every(Boolean)) |
343 | - return { placeholder: '请选择服务', getPopupContainer: () => document.body }; | |
465 | + return { placeholder: '请选择关服务', getPopupContainer: () => document.body }; | |
344 | 466 | return { |
345 | 467 | api: async () => { |
346 | 468 | try { |
... | ... | @@ -356,14 +478,14 @@ export const commonDataSourceSchemas = (): FormSchema[] => { |
356 | 478 | } catch (error) {} |
357 | 479 | return []; |
358 | 480 | }, |
359 | - placeholder: '请选择服务', | |
481 | + placeholder: '请选择关服务', | |
360 | 482 | getPopupContainer: () => document.body, |
361 | 483 | onChange(value: string, options: ModelOfMatterParams) { |
362 | 484 | const command = value |
363 | 485 | ? (options.functionJson.inputData || [])[0]?.serviceCommand |
364 | 486 | : null; |
365 | 487 | setFieldsValue({ |
366 | - [DataSourceField.COMMAND]: command, | |
488 | + [DataSourceField.CLOSE_COMMAND]: command, | |
367 | 489 | [DataSourceField.CALL_TYPE]: value ? options.callType : null, |
368 | 490 | }); |
369 | 491 | }, |
... | ... | @@ -371,11 +493,27 @@ export const commonDataSourceSchemas = (): FormSchema[] => { |
371 | 493 | }, |
372 | 494 | }, |
373 | 495 | { |
374 | - field: DataSourceField.COMMAND, | |
496 | + field: DataSourceField.OPEN_COMMAND, | |
497 | + component: 'Input', | |
498 | + label: '命令', | |
499 | + colProps: { span: 8 }, | |
500 | + rules: [{ required: true, message: '请输入开下发命令' }], | |
501 | + // 是控制组件 && 自定义命令 && 传输协议为TCP | |
502 | + ifShow: ({ model }) => | |
503 | + isControlComponent(category!) && | |
504 | + model[DataSourceField.COMMAND_TYPE] === CommandTypeEnum.CUSTOM.toString() && | |
505 | + model[DataSourceField.TRANSPORT_TYPE] && | |
506 | + isTcpProfile(model[DataSourceField.TRANSPORT_TYPE]), | |
507 | + componentProps: { | |
508 | + placeholder: '请输入开下发命令', | |
509 | + }, | |
510 | + }, | |
511 | + { | |
512 | + field: DataSourceField.CLOSE_COMMAND, | |
375 | 513 | component: 'Input', |
376 | 514 | label: '命令', |
377 | 515 | colProps: { span: 8 }, |
378 | - rules: [{ required: true, message: '请输入下发命令' }], | |
516 | + rules: [{ required: true, message: '请输入关下发命令' }], | |
379 | 517 | // 是控制组件 && 自定义命令 && 传输协议为TCP |
380 | 518 | ifShow: ({ model }) => |
381 | 519 | isControlComponent(category!) && |
... | ... | @@ -383,7 +521,7 @@ export const commonDataSourceSchemas = (): FormSchema[] => { |
383 | 521 | model[DataSourceField.TRANSPORT_TYPE] && |
384 | 522 | isTcpProfile(model[DataSourceField.TRANSPORT_TYPE]), |
385 | 523 | componentProps: { |
386 | - placeholder: '请输入下发命令', | |
524 | + placeholder: '请输入关下发命令', | |
387 | 525 | }, |
388 | 526 | }, |
389 | 527 | { | ... | ... |
... | ... | @@ -14,7 +14,7 @@ export function useSendCommand() { |
14 | 14 | return false; |
15 | 15 | }; |
16 | 16 | |
17 | - const sendCommand = async (record: DataSource, value: any) => { | |
17 | + const sendCommand = async (record: DataSource, value: any, isModbusCommand = false) => { | |
18 | 18 | if (!record) return false; |
19 | 19 | const { customCommand, attribute } = record || {}; |
20 | 20 | const { deviceId } = record; |
... | ... | @@ -25,16 +25,18 @@ export function useSendCommand() { |
25 | 25 | let params: string | Recordable = { |
26 | 26 | [attribute!]: Number(value), |
27 | 27 | }; |
28 | + if (isModbusCommand) { | |
29 | + params = value; | |
30 | + } | |
28 | 31 | |
29 | 32 | let sendCommandFn = sendCommandOneway; |
30 | 33 | // 如果是TCP设备从物模型中获取下发命令(TCP网关子设备无物模型服务与事件) |
31 | - if (customCommand?.transportType === TransportTypeEnum.TCP) { | |
34 | + if (customCommand?.transportType === TransportTypeEnum.TCP && !isModbusCommand) { | |
32 | 35 | params = customCommand.command!; |
33 | 36 | if (customCommand.callType === ServiceCallTypeEnum.SYNC) { |
34 | 37 | sendCommandFn = sendCommandTwoway; |
35 | 38 | } |
36 | 39 | } |
37 | - | |
38 | 40 | // 控制按钮下发命令为0 或 1 |
39 | 41 | await sendCommandFn({ |
40 | 42 | deviceId, | ... | ... |
... | ... | @@ -28,6 +28,7 @@ export interface DataSource { |
28 | 28 | componentInfo: ComponentInfo; |
29 | 29 | customCommand: CustomCommand; |
30 | 30 | videoConfig?: VideoConfigType; |
31 | + [key: string]: any; | |
31 | 32 | } |
32 | 33 | |
33 | 34 | export interface ExtraDataSource extends DataSource, PublicComponentOptions { |
... | ... | @@ -71,6 +72,7 @@ export interface CustomCommand { |
71 | 72 | command: string; |
72 | 73 | service: string; |
73 | 74 | callType: string; |
75 | + [key: string]: string | undefined; | |
74 | 76 | } |
75 | 77 | |
76 | 78 | export interface ComponentLayoutType { | ... | ... |