Commit 6996c664caf5e3737f582ff20aaee165e7e08193

Authored by xp.Huang
2 parents 4fd1cc00 8fd2cefb

Merge branch 'fix/board-control-ordres' into 'main_dev'

fix: 修改看板控制组件选择tcp时的逻辑问题

See merge request yunteng/thingskit-front!803
@@ -127,6 +127,9 @@ export interface MasterDeviceList { @@ -127,6 +127,9 @@ export interface MasterDeviceList {
127 label?: string; 127 label?: string;
128 value?: string; 128 value?: string;
129 alias?: string; 129 alias?: string;
  130 + codeType?: string;
  131 + code?: string;
  132 + [key: string]: string | undefined;
130 } 133 }
131 134
132 export interface ComponentInfoDetail { 135 export interface ComponentInfoDetail {
@@ -125,23 +125,25 @@ export const step1Schemas: FormSchema[] = [ @@ -125,23 +125,25 @@ export const step1Schemas: FormSchema[] = [
125 dynamicRules({ values }) { 125 dynamicRules({ values }) {
126 return [ 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 message: '请输入设备标识符', 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 return { 139 return {
141 options: [ 140 options: [
142 { label: '自定义', value: TaskTypeEnum.CUSTOM }, 141 { label: '自定义', value: TaskTypeEnum.CUSTOM },
143 { label: 'ModBus', value: TaskTypeEnum.MODBUS_RTU }, 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,11 +169,17 @@ export const step1Schemas: FormSchema[] = [
167 minValue: 0, 169 minValue: 0,
168 disabledSwitch: true, 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 ifShow: ({ values }) => { 180 ifShow: ({ values }) => {
171 return ( 181 return (
172 values?.transportType === TransportTypeEnum.TCP && 182 values?.transportType === TransportTypeEnum.TCP &&
173 - (values.deviceType === DeviceTypeEnum.SENSOR ||  
174 - values.deviceType === DeviceTypeEnum.GATEWAY) &&  
175 values?.codeType === TaskTypeEnum.MODBUS_RTU 183 values?.codeType === TaskTypeEnum.MODBUS_RTU
176 ); 184 );
177 }, 185 },
@@ -31,6 +31,7 @@ export type TOption = { @@ -31,6 +31,7 @@ export type TOption = {
31 export enum CommandTypeEnum { 31 export enum CommandTypeEnum {
32 CUSTOM = 0, 32 CUSTOM = 0,
33 SERVICE = 1, 33 SERVICE = 1,
  34 + ATTRIBUTE = 2,
34 } 35 }
35 36
36 /** 37 /**
@@ -122,7 +122,7 @@ @@ -122,7 +122,7 @@
122 }); 122 });
123 }; 123 };
124 124
125 - const handleCopy = (record: DataSourceType) => { 125 + const handleCopy = async (record: DataSourceType) => {
126 const { key } = props.componentConfig || {}; 126 const { key } = props.componentConfig || {};
127 if (key == 'HumidityComponent2' && props.dataSource.length >= 6) { 127 if (key == 'HumidityComponent2' && props.dataSource.length >= 6) {
128 createMessage.warning('绑定的数据源不能超过6条~'); 128 createMessage.warning('绑定的数据源不能超过6条~');
@@ -134,11 +134,12 @@ @@ -134,11 +134,12 @@
134 return; 134 return;
135 } 135 }
136 136
137 - const allValues = getFormValues(); 137 + const allValues = await getFormValues();
138 const currentRecord = getFormValueByUUID(record.uuid); 138 const currentRecord = getFormValueByUUID(record.uuid);
139 const uuid = trackUpdate(); 139 const uuid = trackUpdate();
140 const raw = toRaw(record); 140 const raw = toRaw(record);
141 141
  142 + console.log(currentRecord, 'currentRecord');
142 emit('update:dataSource', [ 143 emit('update:dataSource', [
143 ...allValues, 144 ...allValues,
144 { componentInfo: raw.componentInfo, ...currentRecord, uuid }, 145 { componentInfo: raw.componentInfo, ...currentRecord, uuid },
@@ -32,6 +32,10 @@ @@ -32,6 +32,10 @@
32 transportType: value.transportType, 32 transportType: value.transportType,
33 service: value.service, 33 service: value.service,
34 command: value.command, 34 command: value.command,
  35 + openService: value.openService,
  36 + closeService: value.closeService,
  37 + openCommand: value.openCommand,
  38 + closeCommand: value.closeCommand,
35 commandType: value.commandType, 39 commandType: value.commandType,
36 callType: value.callType, 40 callType: value.callType,
37 }, 41 },
@@ -45,6 +49,10 @@ @@ -45,6 +49,10 @@
45 ...record, 49 ...record,
46 transportType: customCommand?.transportType || (record as Recordable).transportType, 50 transportType: customCommand?.transportType || (record as Recordable).transportType,
47 service: customCommand?.service || (record as Recordable).service, 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 command: customCommand?.command || (record as Recordable).command, 56 command: customCommand?.command || (record as Recordable).command,
49 commandType: customCommand?.commandType || (record as Recordable).commandType, 57 commandType: customCommand?.commandType || (record as Recordable).commandType,
50 callType: customCommand?.callType || (record as Recordable).callType, 58 callType: customCommand?.callType || (record as Recordable).callType,
@@ -2,12 +2,13 @@ @@ -2,12 +2,13 @@
2 import { ComponentPropsConfigType } from '/@/views/visual/packages/index.type'; 2 import { ComponentPropsConfigType } from '/@/views/visual/packages/index.type';
3 import { option } from './config'; 3 import { option } from './config';
4 import { Spin } from 'ant-design-vue'; 4 import { Spin } from 'ant-design-vue';
5 - import { computed, ref } from 'vue'; 5 + import { computed, ref, unref } from 'vue';
6 import { useComponentScale } from '../../../hook/useComponentScale'; 6 import { useComponentScale } from '../../../hook/useComponentScale';
7 import { useSendCommand } from '../../../hook/useSendCommand'; 7 import { useSendCommand } from '../../../hook/useSendCommand';
8 import { DeviceName } from '/@/views/visual/commonComponents/DeviceName'; 8 import { DeviceName } from '/@/views/visual/commonComponents/DeviceName';
9 import { DataFetchUpdateFn } from '../../../hook/socket/useSocket.type'; 9 import { DataFetchUpdateFn } from '../../../hook/socket/useSocket.type';
10 import { useDataFetch } from '../../../hook/socket/useSocket'; 10 import { useDataFetch } from '../../../hook/socket/useSocket';
  11 + import { getSendValues } from '../config';
11 12
12 const props = defineProps<{ 13 const props = defineProps<{
13 config: ComponentPropsConfigType<typeof option>; 14 config: ComponentPropsConfigType<typeof option>;
@@ -19,9 +20,23 @@ @@ -19,9 +20,23 @@
19 20
20 const getDesign = computed(() => { 21 const getDesign = computed(() => {
21 const { option } = props.config; 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 return { 33 return {
24 attribute: attributeRename || attributeName || attribute, 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,8 +44,15 @@
29 const handleChange = async (event: Event) => { 44 const handleChange = async (event: Event) => {
30 const target = event.target as HTMLInputElement; 45 const target = event.target as HTMLInputElement;
31 const value = target.checked; 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 if (flag) currentValue.value = value; 56 if (flag) currentValue.value = value;
35 flag ? (currentValue.value = value) : (target.checked = !value); 57 flag ? (currentValue.value = value) : (target.checked = !value);
36 }; 58 };
@@ -32,6 +32,10 @@ @@ -32,6 +32,10 @@
32 transportType: value.transportType, 32 transportType: value.transportType,
33 service: value.service, 33 service: value.service,
34 command: value.command, 34 command: value.command,
  35 + openService: value.openService,
  36 + closeService: value.closeService,
  37 + openCommand: value.openCommand,
  38 + closeCommand: value.closeCommand,
35 commandType: value.commandType, 39 commandType: value.commandType,
36 callType: value.callType, 40 callType: value.callType,
37 }, 41 },
@@ -41,14 +45,20 @@ @@ -41,14 +45,20 @@
41 45
42 const setFormValues = (record: DataSource) => { 46 const setFormValues = (record: DataSource) => {
43 const { customCommand } = record; 47 const { customCommand } = record;
44 - return setFieldsValue({ 48 + const values = {
45 ...record, 49 ...record,
46 transportType: customCommand?.transportType || (record as Recordable).transportType, 50 transportType: customCommand?.transportType || (record as Recordable).transportType,
47 service: customCommand?.service || (record as Recordable).service, 51 service: customCommand?.service || (record as Recordable).service,
48 command: customCommand?.command || (record as Recordable).command, 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 commandType: customCommand?.commandType || (record as Recordable).commandType, 57 commandType: customCommand?.commandType || (record as Recordable).commandType,
50 callType: customCommand?.callType || (record as Recordable).callType, 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 defineExpose({ 64 defineExpose({
@@ -10,6 +10,7 @@ @@ -10,6 +10,7 @@
10 import { DeviceName } from '/@/views/visual/commonComponents/DeviceName'; 10 import { DeviceName } from '/@/views/visual/commonComponents/DeviceName';
11 import { DataFetchUpdateFn } from '../../../hook/socket/useSocket.type'; 11 import { DataFetchUpdateFn } from '../../../hook/socket/useSocket.type';
12 import { useDataFetch } from '../../../hook/socket/useSocket'; 12 import { useDataFetch } from '../../../hook/socket/useSocket';
  13 + import { getSendValues } from '../config';
13 14
14 const props = defineProps<{ 15 const props = defineProps<{
15 config: ComponentPropsConfigType<typeof option>; 16 config: ComponentPropsConfigType<typeof option>;
@@ -19,19 +20,88 @@ @@ -19,19 +20,88 @@
19 20
20 const getDesign = computed(() => { 21 const getDesign = computed(() => {
21 const { option, persetOption } = props.config; 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 const { icon: presetIcon, iconColor: presetIconColor } = persetOption || {}; 34 const { icon: presetIcon, iconColor: presetIconColor } = persetOption || {};
24 const { icon, iconColor } = componentInfo || {}; 35 const { icon, iconColor } = componentInfo || {};
  36 +
25 return { 37 return {
26 icon: icon ?? presetIcon, 38 icon: icon ?? presetIcon,
27 iconColor: iconColor || presetIconColor, 39 iconColor: iconColor || presetIconColor,
28 attribute: attributeRename || attributeName || attribute, 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 const { sendCommand, loading } = useSendCommand(); 49 const { sendCommand, loading } = useSendCommand();
  50 +
33 const handleChange = async () => { 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 if (!flag) checked.value = !unref(checked); 105 if (!flag) checked.value = !unref(checked);
36 }; 106 };
37 107
@@ -32,6 +32,10 @@ @@ -32,6 +32,10 @@
32 transportType: value.transportType, 32 transportType: value.transportType,
33 service: value.service, 33 service: value.service,
34 command: value.command, 34 command: value.command,
  35 + openService: value.openService,
  36 + closeService: value.closeService,
  37 + openCommand: value.openCommand,
  38 + closeCommand: value.closeCommand,
35 commandType: value.commandType, 39 commandType: value.commandType,
36 callType: value.callType, 40 callType: value.callType,
37 }, 41 },
@@ -45,6 +49,10 @@ @@ -45,6 +49,10 @@
45 ...record, 49 ...record,
46 transportType: customCommand?.transportType || (record as Recordable).transportType, 50 transportType: customCommand?.transportType || (record as Recordable).transportType,
47 service: customCommand?.service || (record as Recordable).service, 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 command: customCommand?.command || (record as Recordable).command, 56 command: customCommand?.command || (record as Recordable).command,
49 commandType: customCommand?.commandType || (record as Recordable).commandType, 57 commandType: customCommand?.commandType || (record as Recordable).commandType,
50 callType: customCommand?.callType || (record as Recordable).callType, 58 callType: customCommand?.callType || (record as Recordable).callType,
@@ -2,12 +2,13 @@ @@ -2,12 +2,13 @@
2 import { ComponentPropsConfigType } from '/@/views/visual/packages/index.type'; 2 import { ComponentPropsConfigType } from '/@/views/visual/packages/index.type';
3 import { option } from './config'; 3 import { option } from './config';
4 import { Spin } from 'ant-design-vue'; 4 import { Spin } from 'ant-design-vue';
5 - import { computed, ref } from 'vue'; 5 + import { computed, ref, unref } from 'vue';
6 import { useComponentScale } from '../../../hook/useComponentScale'; 6 import { useComponentScale } from '../../../hook/useComponentScale';
7 import { useSendCommand } from '../../../hook/useSendCommand'; 7 import { useSendCommand } from '../../../hook/useSendCommand';
8 import { DeviceName } from '/@/views/visual/commonComponents/DeviceName'; 8 import { DeviceName } from '/@/views/visual/commonComponents/DeviceName';
9 import { DataFetchUpdateFn } from '../../../hook/socket/useSocket.type'; 9 import { DataFetchUpdateFn } from '../../../hook/socket/useSocket.type';
10 import { useDataFetch } from '../../../hook/socket/useSocket'; 10 import { useDataFetch } from '../../../hook/socket/useSocket';
  11 + import { getSendValues } from '../config';
11 12
12 const props = defineProps<{ 13 const props = defineProps<{
13 config: ComponentPropsConfigType<typeof option>; 14 config: ComponentPropsConfigType<typeof option>;
@@ -19,9 +20,23 @@ @@ -19,9 +20,23 @@
19 20
20 const getDesign = computed(() => { 21 const getDesign = computed(() => {
21 const { option } = props.config; 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 return { 33 return {
24 attribute: attributeRename || attributeName || attribute, 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,7 +44,15 @@
29 const handleChange = async (event: Event) => { 44 const handleChange = async (event: Event) => {
30 const target = event.target as HTMLInputElement; 45 const target = event.target as HTMLInputElement;
31 const value = target.checked; 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 flag ? (currentValue.value = value) : (target.checked = !value); 56 flag ? (currentValue.value = value) : (target.checked = !value);
34 }; 57 };
35 58
@@ -42,10 +42,10 @@ @@ -42,10 +42,10 @@
42 const { customCommand } = record; 42 const { customCommand } = record;
43 return setFieldsValue({ 43 return setFieldsValue({
44 ...record, 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 } as unknown as Partial<CommonDataSourceBindValueType>); 49 } as unknown as Partial<CommonDataSourceBindValueType>);
50 }; 50 };
51 51
@@ -32,6 +32,10 @@ @@ -32,6 +32,10 @@
32 transportType: value.transportType, 32 transportType: value.transportType,
33 service: value.service, 33 service: value.service,
34 command: value.command, 34 command: value.command,
  35 + openService: value.openService,
  36 + closeService: value.closeService,
  37 + openCommand: value.openCommand,
  38 + closeCommand: value.closeCommand,
35 commandType: value.commandType, 39 commandType: value.commandType,
36 callType: value.callType, 40 callType: value.callType,
37 }, 41 },
@@ -45,6 +49,10 @@ @@ -45,6 +49,10 @@
45 ...record, 49 ...record,
46 transportType: customCommand?.transportType || (record as Recordable).transportType, 50 transportType: customCommand?.transportType || (record as Recordable).transportType,
47 service: customCommand?.service || (record as Recordable).service, 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 command: customCommand?.command || (record as Recordable).command, 56 command: customCommand?.command || (record as Recordable).command,
49 commandType: customCommand?.commandType || (record as Recordable).commandType, 57 commandType: customCommand?.commandType || (record as Recordable).commandType,
50 callType: customCommand?.callType || (record as Recordable).callType, 58 callType: customCommand?.callType || (record as Recordable).callType,
@@ -13,6 +13,7 @@ @@ -13,6 +13,7 @@
13 import { useReceiveMessage } from '../../../hook/useReceiveMessage'; 13 import { useReceiveMessage } from '../../../hook/useReceiveMessage';
14 import { useReceiveValue } from '../../../hook/useReceiveValue'; 14 import { useReceiveValue } from '../../../hook/useReceiveValue';
15 import { DataSource } from '/@/views/visual/palette/types'; 15 import { DataSource } from '/@/views/visual/palette/types';
  16 + import { getSendValues, CommandTypeEnumLIst } from '../config';
16 17
17 const props = defineProps<{ 18 const props = defineProps<{
18 config: ComponentPropsConfigType<typeof option>; 19 config: ComponentPropsConfigType<typeof option>;
@@ -55,8 +56,19 @@ @@ -55,8 +56,19 @@
55 return { 56 return {
56 dataSource: dataSource.map((item) => { 57 dataSource: dataSource.map((item) => {
57 const { fontColor, icon, iconColor, unit, showDeviceName } = item.componentInfo; 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 return { 72 return {
61 unit: unit ?? persetUnit, 73 unit: unit ?? persetUnit,
62 fontColor: fontColor ?? persetFontColor, 74 fontColor: fontColor ?? persetFontColor,
@@ -67,6 +79,11 @@ @@ -67,6 +79,11 @@
67 showDeviceName, 79 showDeviceName,
68 deviceName: deviceRename || deviceName, 80 deviceName: deviceRename || deviceName,
69 id: deviceId, 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,7 +93,6 @@
76 const handleChange = async (index: number, checked: Boolean) => { 93 const handleChange = async (index: number, checked: Boolean) => {
77 const { heightPx, itemHeightRatio, itemWidthRatio, mode, widthPx, dataSource } = 94 const { heightPx, itemHeightRatio, itemWidthRatio, mode, widthPx, dataSource } =
78 props.config.option; 95 props.config.option;
79 -  
80 const data = { 96 const data = {
81 ...dataSource?.[index], 97 ...dataSource?.[index],
82 heightPx, 98 heightPx,
@@ -85,8 +101,13 @@ @@ -85,8 +101,13 @@
85 mode, 101 mode,
86 widthPx, 102 widthPx,
87 } as DataSource; 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 if (!flag) controlList.value[index].checked = !checked; 111 if (!flag) controlList.value[index].checked = !checked;
91 }; 112 };
92 113
@@ -135,7 +156,11 @@ @@ -135,7 +156,11 @@
135 <div 156 <div
136 class="text-gray-500 truncate ml-6" 157 class="text-gray-500 truncate ml-6"
137 :style="{ fontSize: getRatio ? '18px' : getRatio * 18 + 'px' }" 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 </div> 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,6 +14,7 @@ import { OrgTreeSelect } from '/@/views/common/OrgTreeSelect';
14 import { TransportTypeEnum } from '/@/views/device/profiles/components/TransportDescript/const'; 14 import { TransportTypeEnum } from '/@/views/device/profiles/components/TransportDescript/const';
15 import { CommandTypeEnum } from '/@/views/rule/linkedge/config/config.data'; 15 import { CommandTypeEnum } from '/@/views/rule/linkedge/config/config.data';
16 import { DataActionModeEnum } from '/@/enums/toolEnum'; 16 import { DataActionModeEnum } from '/@/enums/toolEnum';
  17 +import { TaskTypeEnum } from '/@/views/task/center/config';
17 18
18 useComponentRegister('OrgTreeSelect', OrgTreeSelect); 19 useComponentRegister('OrgTreeSelect', OrgTreeSelect);
19 20
@@ -24,6 +25,7 @@ export interface CommonDataSourceBindValueType extends Record<DataSourceField, s @@ -24,6 +25,7 @@ export interface CommonDataSourceBindValueType extends Record<DataSourceField, s
24 command?: string; 25 command?: string;
25 commandType?: string; 26 commandType?: string;
26 callType?: string; 27 callType?: string;
  28 + [ksy: string]: string | undefined;
27 }; 29 };
28 } 30 }
29 31
@@ -33,6 +35,7 @@ export enum DataSourceField { @@ -33,6 +35,7 @@ export enum DataSourceField {
33 TRANSPORT_TYPE = 'transportType', 35 TRANSPORT_TYPE = 'transportType',
34 ORIGINATION_ID = 'organizationId', 36 ORIGINATION_ID = 'organizationId',
35 DEVICE_ID = 'deviceId', 37 DEVICE_ID = 'deviceId',
  38 + DEVICE_CODE = 'deviceCode', //设备地址码
36 DEVICE_PROFILE_ID = 'deviceProfileId', 39 DEVICE_PROFILE_ID = 'deviceProfileId',
37 ATTRIBUTE = 'attribute', 40 ATTRIBUTE = 'attribute',
38 ATTRIBUTE_NAME = 'attributeName', 41 ATTRIBUTE_NAME = 'attributeName',
@@ -41,10 +44,15 @@ export enum DataSourceField { @@ -41,10 +44,15 @@ export enum DataSourceField {
41 DEVICE_RENAME = 'deviceRename', 44 DEVICE_RENAME = 'deviceRename',
42 LONGITUDE_ATTRIBUTE = 'longitudeAttribute', 45 LONGITUDE_ATTRIBUTE = 'longitudeAttribute',
43 LATITUDE_ATTRIBUTE = 'latitudeAttribute', 46 LATITUDE_ATTRIBUTE = 'latitudeAttribute',
44 - 47 + CODE_TYPE = 'codeType',
45 COMMAND = 'command', 48 COMMAND = 'command',
  49 + OPEN_COMMAND = 'openCommand',
  50 + CLOSE_COMMAND = 'closeCommand',
46 COMMAND_TYPE = 'commandType', 51 COMMAND_TYPE = 'commandType',
47 SERVICE = 'service', 52 SERVICE = 'service',
  53 + OPEN_SERVICE = 'openService',
  54 + CLOSE_SERVICE = 'closeService',
  55 + EXTENSION_DESC = 'extensionDesc',
48 CALL_TYPE = 'callType', 56 CALL_TYPE = 'callType',
49 } 57 }
50 58
@@ -72,7 +80,7 @@ const getDeviceService = async (deviceProfileId: string) => { @@ -72,7 +80,7 @@ const getDeviceService = async (deviceProfileId: string) => {
72 const getDeviceAttribute = async (params: DeviceAttributeParams) => { 80 const getDeviceAttribute = async (params: DeviceAttributeParams) => {
73 try { 81 try {
74 const data = await getDeviceAttributes(params); 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 } catch (error) {} 84 } catch (error) {}
77 return []; 85 return [];
78 }; 86 };
@@ -82,7 +90,6 @@ export const commonDataSourceSchemas = (): FormSchema[] => { @@ -82,7 +90,6 @@ export const commonDataSourceSchemas = (): FormSchema[] => {
82 const isUpdate = unref(mode) === DataActionModeEnum.UPDATE; 90 const isUpdate = unref(mode) === DataActionModeEnum.UPDATE;
83 const selectWidgetKeys = useSelectWidgetKeys(); 91 const selectWidgetKeys = useSelectWidgetKeys();
84 const category = unref(selectWidgetKeys).categoryKey; 92 const category = unref(selectWidgetKeys).categoryKey;
85 -  
86 return [ 93 return [
87 { 94 {
88 field: DataSourceField.IS_GATEWAY_DEVICE, 95 field: DataSourceField.IS_GATEWAY_DEVICE,
@@ -161,6 +168,7 @@ export const commonDataSourceSchemas = (): FormSchema[] => { @@ -161,6 +168,7 @@ export const commonDataSourceSchemas = (): FormSchema[] => {
161 [DataSourceField.ATTRIBUTE]: null, 168 [DataSourceField.ATTRIBUTE]: null,
162 [DataSourceField.ATTRIBUTE_NAME]: null, 169 [DataSourceField.ATTRIBUTE_NAME]: null,
163 [DataSourceField.TRANSPORT_TYPE]: option[DataSourceField.TRANSPORT_TYPE], 170 [DataSourceField.TRANSPORT_TYPE]: option[DataSourceField.TRANSPORT_TYPE],
  171 + [DataSourceField.COMMAND_TYPE]: null,
164 }); 172 });
165 }, 173 },
166 getPopupContainer: () => document.body, 174 getPopupContainer: () => document.body,
@@ -228,6 +236,9 @@ export const commonDataSourceSchemas = (): FormSchema[] => { @@ -228,6 +236,9 @@ export const commonDataSourceSchemas = (): FormSchema[] => {
228 onChange(_value, record: MasterDeviceList) { 236 onChange(_value, record: MasterDeviceList) {
229 setFieldsValue({ 237 setFieldsValue({
230 [DataSourceField.DEVICE_NAME]: record?.label, 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 placeholder: '请选择设备', 244 placeholder: '请选择设备',
@@ -236,19 +247,94 @@ export const commonDataSourceSchemas = (): FormSchema[] => { @@ -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 field: DataSourceField.ATTRIBUTE_NAME, 264 field: DataSourceField.ATTRIBUTE_NAME,
240 component: 'Input', 265 component: 'Input',
241 label: '属性名', 266 label: '属性名',
242 show: false, 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 field: DataSourceField.ATTRIBUTE, 330 field: DataSourceField.ATTRIBUTE,
246 component: 'ApiSelect', 331 component: 'ApiSelect',
247 label: '属性', 332 label: '属性',
248 colProps: { span: 8 }, 333 colProps: { span: 8 },
249 rules: [{ required: true, message: '请选择属性' }], 334 rules: [{ required: true, message: '请选择属性' }],
250 ifShow: ({ model }) => 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 componentProps({ formModel, formActionType }) { 338 componentProps({ formModel, formActionType }) {
253 const { setFieldsValue } = formActionType; 339 const { setFieldsValue } = formActionType;
254 const deviceProfileId = formModel[DataSourceField.DEVICE_PROFILE_ID]; 340 const deviceProfileId = formModel[DataSourceField.DEVICE_PROFILE_ID];
@@ -277,6 +363,16 @@ export const commonDataSourceSchemas = (): FormSchema[] => { @@ -277,6 +363,16 @@ export const commonDataSourceSchemas = (): FormSchema[] => {
277 [DataSourceField.ATTRIBUTE]: null, 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 return option; 376 return option;
281 } 377 }
282 } catch (error) {} 378 } catch (error) {}
@@ -284,53 +380,79 @@ export const commonDataSourceSchemas = (): FormSchema[] => { @@ -284,53 +380,79 @@ export const commonDataSourceSchemas = (): FormSchema[] => {
284 }, 380 },
285 placeholder: '请选择属性', 381 placeholder: '请选择属性',
286 getPopupContainer: () => document.body, 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 component: 'ApiSelect', 407 component: 'ApiSelect',
296 - label: '命令类型',  
297 - defaultValue: CommandTypeEnum.CUSTOM.toString(),  
298 - rules: [{ required: true, message: '请选择命令类型' }], 408 + label: '开服务',
299 colProps: { span: 8 }, 409 colProps: { span: 8 },
  410 + rules: [{ required: true, message: '请选择开服务' }],
300 ifShow: ({ model }) => 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 const { setFieldsValue } = formActionType; 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 return { 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 setFieldsValue({ 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 component: 'ApiSelect', 452 component: 'ApiSelect',
331 - label: '服务', 453 + label: '服务',
332 colProps: { span: 8 }, 454 colProps: { span: 8 },
333 - rules: [{ required: true, message: '请选择服务' }], 455 + rules: [{ required: true, message: '请选择服务' }],
334 ifShow: ({ model }) => 456 ifShow: ({ model }) =>
335 isControlComponent(category!) && 457 isControlComponent(category!) &&
336 model[DataSourceField.COMMAND_TYPE] === CommandTypeEnum.SERVICE.toString() && 458 model[DataSourceField.COMMAND_TYPE] === CommandTypeEnum.SERVICE.toString() &&
@@ -340,7 +462,7 @@ export const commonDataSourceSchemas = (): FormSchema[] => { @@ -340,7 +462,7 @@ export const commonDataSourceSchemas = (): FormSchema[] => {
340 const deviceProfileId = formModel[DataSourceField.DEVICE_PROFILE_ID]; 462 const deviceProfileId = formModel[DataSourceField.DEVICE_PROFILE_ID];
341 const transportType = formModel[DataSourceField.TRANSPORT_TYPE]; 463 const transportType = formModel[DataSourceField.TRANSPORT_TYPE];
342 if (isUpdate && ![deviceProfileId, transportType].every(Boolean)) 464 if (isUpdate && ![deviceProfileId, transportType].every(Boolean))
343 - return { placeholder: '请选择服务', getPopupContainer: () => document.body }; 465 + return { placeholder: '请选择服务', getPopupContainer: () => document.body };
344 return { 466 return {
345 api: async () => { 467 api: async () => {
346 try { 468 try {
@@ -356,14 +478,14 @@ export const commonDataSourceSchemas = (): FormSchema[] => { @@ -356,14 +478,14 @@ export const commonDataSourceSchemas = (): FormSchema[] => {
356 } catch (error) {} 478 } catch (error) {}
357 return []; 479 return [];
358 }, 480 },
359 - placeholder: '请选择服务', 481 + placeholder: '请选择服务',
360 getPopupContainer: () => document.body, 482 getPopupContainer: () => document.body,
361 onChange(value: string, options: ModelOfMatterParams) { 483 onChange(value: string, options: ModelOfMatterParams) {
362 const command = value 484 const command = value
363 ? (options.functionJson.inputData || [])[0]?.serviceCommand 485 ? (options.functionJson.inputData || [])[0]?.serviceCommand
364 : null; 486 : null;
365 setFieldsValue({ 487 setFieldsValue({
366 - [DataSourceField.COMMAND]: command, 488 + [DataSourceField.CLOSE_COMMAND]: command,
367 [DataSourceField.CALL_TYPE]: value ? options.callType : null, 489 [DataSourceField.CALL_TYPE]: value ? options.callType : null,
368 }); 490 });
369 }, 491 },
@@ -371,11 +493,27 @@ export const commonDataSourceSchemas = (): FormSchema[] => { @@ -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 component: 'Input', 513 component: 'Input',
376 label: '命令', 514 label: '命令',
377 colProps: { span: 8 }, 515 colProps: { span: 8 },
378 - rules: [{ required: true, message: '请输入下发命令' }], 516 + rules: [{ required: true, message: '请输入下发命令' }],
379 // 是控制组件 && 自定义命令 && 传输协议为TCP 517 // 是控制组件 && 自定义命令 && 传输协议为TCP
380 ifShow: ({ model }) => 518 ifShow: ({ model }) =>
381 isControlComponent(category!) && 519 isControlComponent(category!) &&
@@ -383,7 +521,7 @@ export const commonDataSourceSchemas = (): FormSchema[] => { @@ -383,7 +521,7 @@ export const commonDataSourceSchemas = (): FormSchema[] => {
383 model[DataSourceField.TRANSPORT_TYPE] && 521 model[DataSourceField.TRANSPORT_TYPE] &&
384 isTcpProfile(model[DataSourceField.TRANSPORT_TYPE]), 522 isTcpProfile(model[DataSourceField.TRANSPORT_TYPE]),
385 componentProps: { 523 componentProps: {
386 - placeholder: '请输入下发命令', 524 + placeholder: '请输入下发命令',
387 }, 525 },
388 }, 526 },
389 { 527 {
@@ -14,7 +14,7 @@ export function useSendCommand() { @@ -14,7 +14,7 @@ export function useSendCommand() {
14 return false; 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 if (!record) return false; 18 if (!record) return false;
19 const { customCommand, attribute } = record || {}; 19 const { customCommand, attribute } = record || {};
20 const { deviceId } = record; 20 const { deviceId } = record;
@@ -25,16 +25,18 @@ export function useSendCommand() { @@ -25,16 +25,18 @@ export function useSendCommand() {
25 let params: string | Recordable = { 25 let params: string | Recordable = {
26 [attribute!]: Number(value), 26 [attribute!]: Number(value),
27 }; 27 };
  28 + if (isModbusCommand) {
  29 + params = value;
  30 + }
28 31
29 let sendCommandFn = sendCommandOneway; 32 let sendCommandFn = sendCommandOneway;
30 // 如果是TCP设备从物模型中获取下发命令(TCP网关子设备无物模型服务与事件) 33 // 如果是TCP设备从物模型中获取下发命令(TCP网关子设备无物模型服务与事件)
31 - if (customCommand?.transportType === TransportTypeEnum.TCP) { 34 + if (customCommand?.transportType === TransportTypeEnum.TCP && !isModbusCommand) {
32 params = customCommand.command!; 35 params = customCommand.command!;
33 if (customCommand.callType === ServiceCallTypeEnum.SYNC) { 36 if (customCommand.callType === ServiceCallTypeEnum.SYNC) {
34 sendCommandFn = sendCommandTwoway; 37 sendCommandFn = sendCommandTwoway;
35 } 38 }
36 } 39 }
37 -  
38 // 控制按钮下发命令为0 或 1 40 // 控制按钮下发命令为0 或 1
39 await sendCommandFn({ 41 await sendCommandFn({
40 deviceId, 42 deviceId,
@@ -28,6 +28,7 @@ export interface DataSource { @@ -28,6 +28,7 @@ export interface DataSource {
28 componentInfo: ComponentInfo; 28 componentInfo: ComponentInfo;
29 customCommand: CustomCommand; 29 customCommand: CustomCommand;
30 videoConfig?: VideoConfigType; 30 videoConfig?: VideoConfigType;
  31 + [key: string]: any;
31 } 32 }
32 33
33 export interface ExtraDataSource extends DataSource, PublicComponentOptions { 34 export interface ExtraDataSource extends DataSource, PublicComponentOptions {
@@ -71,6 +72,7 @@ export interface CustomCommand { @@ -71,6 +72,7 @@ export interface CustomCommand {
71 command: string; 72 command: string;
72 service: string; 73 service: string;
73 callType: string; 74 callType: string;
  75 + [key: string]: string | undefined;
74 } 76 }
75 77
76 export interface ComponentLayoutType { 78 export interface ComponentLayoutType {