Showing
14 changed files
with
145 additions
and
73 deletions
... | ... | @@ -33,6 +33,7 @@ |
33 | 33 | service: value.service, |
34 | 34 | command: value.command, |
35 | 35 | commandType: value.commandType, |
36 | + callType: value.callType, | |
36 | 37 | }, |
37 | 38 | }; |
38 | 39 | return value; |
... | ... | @@ -42,10 +43,11 @@ |
42 | 43 | const { customCommand } = record; |
43 | 44 | return setFieldsValue({ |
44 | 45 | ...record, |
45 | - transportType: customCommand?.transportType, | |
46 | - service: customCommand?.service, | |
47 | - command: customCommand?.command, | |
48 | - commandType: customCommand?.commandType, | |
46 | + transportType: customCommand?.transportType || (record as Recordable).transportType, | |
47 | + service: customCommand?.service || (record as Recordable).service, | |
48 | + command: customCommand?.command || (record as Recordable).command, | |
49 | + commandType: customCommand?.commandType || (record as Recordable).commandType, | |
50 | + callType: customCommand?.callType || (record as Recordable).callType, | |
49 | 51 | } as unknown as Partial<CommonDataSourceBindValueType>); |
50 | 52 | }; |
51 | 53 | ... | ... |
... | ... | @@ -10,17 +10,19 @@ |
10 | 10 | import { DeviceName } from '/@/views/visual/commonComponents/DeviceName'; |
11 | 11 | import { MultipleDataFetchUpdateFn } from '../../../hook/socket/useSocket.type'; |
12 | 12 | import { useMultipleDataFetch } from '../../../hook/socket/useSocket'; |
13 | + import { useReceiveMessage } from '../../../hook/useReceiveMessage'; | |
14 | + import { useReceiveValue } from '../../../hook/useReceiveValue'; | |
15 | + import { DataSource } from '/@/views/visual/palette/types'; | |
13 | 16 | |
14 | 17 | const props = defineProps<{ |
15 | 18 | config: ComponentPropsConfigType<typeof option>; |
16 | 19 | }>(); |
17 | 20 | |
18 | - const checked = ref(false); | |
19 | - | |
20 | 21 | const svgList = ref<any>([ |
21 | 22 | { |
22 | 23 | value: 26.2, |
23 | - name: 'wendu', | |
24 | + deviceName: '光照设备', | |
25 | + attributeName: '光照', | |
24 | 26 | icon: 'zongfushe', |
25 | 27 | unit: 'kw', |
26 | 28 | iconColor: '#367BFF', |
... | ... | @@ -30,7 +32,8 @@ |
30 | 32 | }, |
31 | 33 | { |
32 | 34 | value: 53.7, |
33 | - name: 'shidu', | |
35 | + deviceName: '风机设备', | |
36 | + attributeName: '风机', | |
34 | 37 | icon: 'guangzhaoqiangdu', |
35 | 38 | unit: '℃', |
36 | 39 | iconColor: '#FFA000', |
... | ... | @@ -41,6 +44,7 @@ |
41 | 44 | ]); |
42 | 45 | |
43 | 46 | const getDesign = computed(() => { |
47 | + console.log(props.config.option, 'option'); | |
44 | 48 | const { persetOption = {}, option } = props.config; |
45 | 49 | const { dataSource = [] } = option || {}; |
46 | 50 | const { |
... | ... | @@ -51,42 +55,65 @@ |
51 | 55 | } = persetOption || {}; |
52 | 56 | return { |
53 | 57 | dataSource: dataSource.map((item) => { |
54 | - const { fontColor, icon, iconColor, unit } = item.componentInfo; | |
55 | - const { attribute, attributeRename } = item; | |
58 | + const { fontColor, icon, iconColor, unit, showDeviceName } = item.componentInfo; | |
59 | + const { attribute, attributeRename, attributeName, deviceId, deviceName, deviceRename } = | |
60 | + item; | |
56 | 61 | return { |
57 | 62 | unit: unit ?? persetUnit, |
58 | 63 | fontColor: fontColor ?? persetFontColor, |
59 | 64 | icon: icon ?? persetIcon, |
60 | 65 | iconColor: iconColor ?? persetIconColor, |
61 | - attribute: attribute || attributeRename, | |
62 | - attributeRename, | |
66 | + attribute: attribute, | |
67 | + attributeName: attributeRename ?? attributeName, | |
68 | + showDeviceName, | |
69 | + deviceName: deviceRename ?? deviceName, | |
70 | + id: deviceId, | |
63 | 71 | }; |
64 | 72 | }), |
65 | 73 | }; |
66 | 74 | }); |
67 | 75 | |
68 | - const { sendCommand, loading } = useSendCommand(); | |
69 | - const handleChange = async (index: number) => { | |
70 | - const flag = await sendCommand(props.config.option, unref(checked)); | |
71 | - if (!flag) svgList[index].checked = !svgList[index].checked; | |
76 | + const { loading, sendCommand } = useSendCommand(); | |
77 | + const handleChange = async (index: number, checked: Boolean) => { | |
78 | + console.log(props.config.option); | |
79 | + const { heightPx, itemHeightRatio, itemWidthRatio, mode, widthPx, dataSource } = | |
80 | + props.config.option; | |
81 | + | |
82 | + const data = { | |
83 | + ...dataSource?.[index], | |
84 | + heightPx, | |
85 | + itemHeightRatio, | |
86 | + itemWidthRatio, | |
87 | + mode, | |
88 | + widthPx, | |
89 | + } as DataSource; | |
90 | + console.log(data, 'data', checked); | |
91 | + | |
92 | + const flag = await sendCommand(data, checked); | |
93 | + if (!flag) controlList.value[index].checked = !checked; | |
72 | 94 | }; |
73 | 95 | |
74 | - const updateFn: MultipleDataFetchUpdateFn = (message) => { | |
75 | - const { data = {} } = message; | |
76 | - const { dataSource } = unref(getDesign); | |
77 | - svgList.value.length = 0; | |
78 | - svgList.value = dataSource.map((item) => { | |
79 | - const { icon, iconColor, unit, fontColor, attribute } = item || {}; | |
80 | - const [latest] = data[attribute] || []; | |
81 | - const [_timespan, value] = latest || []; | |
82 | - return { | |
83 | - value: Number(value), | |
84 | - name: attribute, | |
85 | - icon, | |
86 | - unit, | |
87 | - iconColor, | |
88 | - fontColor, | |
89 | - }; | |
96 | + const { forEachGroupMessage } = useReceiveMessage(); | |
97 | + const { getNumberValue } = useReceiveValue(); | |
98 | + | |
99 | + const controlList = ref( | |
100 | + props.config.option.dataSource | |
101 | + ? unref(getDesign).dataSource.map((item) => { | |
102 | + return { ...item, checked: false }; | |
103 | + }) | |
104 | + : svgList | |
105 | + ); | |
106 | + | |
107 | + const updateFn: MultipleDataFetchUpdateFn = async (message, deviceId, attribute) => { | |
108 | + console.log(unref(getDesign).dataSource, 'dataSource'); | |
109 | + | |
110 | + forEachGroupMessage(message, deviceId, attribute, (attribute, value, time) => { | |
111 | + console.log(attribute, value, time); | |
112 | + controlList.value.forEach((item) => { | |
113 | + if (item.id === deviceId && item.attribute === attribute) { | |
114 | + item.checked = Boolean(getNumberValue(value)); | |
115 | + } | |
116 | + }); | |
90 | 117 | }); |
91 | 118 | }; |
92 | 119 | |
... | ... | @@ -99,7 +126,7 @@ |
99 | 126 | <DeviceName :config="config" /> |
100 | 127 | <div |
101 | 128 | style="width: 86%" |
102 | - v-for="(item, index) in svgList" | |
129 | + v-for="(item, index) in controlList" | |
103 | 130 | :key="item.id" |
104 | 131 | class="flex justify-between items-center" |
105 | 132 | > |
... | ... | @@ -111,10 +138,18 @@ |
111 | 138 | :style="{ color: item.iconColor }" |
112 | 139 | /> |
113 | 140 | |
114 | - <div class="text-gray-500 text-lg truncate ml-6">{{ item.attribute || '温度' }}</div> | |
141 | + <div | |
142 | + class="text-gray-500 truncate ml-6" | |
143 | + :style="{ fontSize: getRatio ? '18px' : getRatio * 18 + 'px' }" | |
144 | + >{{ `${item.deviceName} - ${item.attributeName}` }}</div | |
145 | + > | |
115 | 146 | </div> |
116 | 147 | |
117 | - <Switch v-model:checked="item.checked" :loading="loading" @change="handleChange(index)" /> | |
148 | + <Switch | |
149 | + v-model:checked="item.checked" | |
150 | + :loading="loading" | |
151 | + @change="handleChange(index, item.checked)" | |
152 | + /> | |
118 | 153 | </div> |
119 | 154 | </main> |
120 | 155 | </template> | ... | ... |
... | ... | @@ -2,12 +2,12 @@ import { ControlComponentSlidingSwitchConfig } from './ControlComponentSlidingSw |
2 | 2 | import { ControlComponentSwitchWithIconConfig } from './ControlComponentSwitchWithIcon'; |
3 | 3 | import { ControlComponentToggleSwitchConfig } from './ControlComponentToggleSwitch'; |
4 | 4 | import { LateralNumericalControlConfig } from './LateralNumericalControl'; |
5 | -// import { SwitchListConfig } from './SwitchList'; | |
5 | +import { SwitchListConfig } from './SwitchList'; | |
6 | 6 | |
7 | 7 | export const ControlList = [ |
8 | 8 | ControlComponentSwitchWithIconConfig, |
9 | 9 | ControlComponentSlidingSwitchConfig, |
10 | 10 | ControlComponentToggleSwitchConfig, |
11 | 11 | LateralNumericalControlConfig, |
12 | - // SwitchListConfig, | |
12 | + SwitchListConfig, | |
13 | 13 | ]; | ... | ... |
... | ... | @@ -63,14 +63,16 @@ |
63 | 63 | <main :style="getScale" class="w-full h-full flex flex-col justify-center items-center"> |
64 | 64 | <DeviceName :config="config" class="text-center" /> |
65 | 65 | |
66 | - <div | |
67 | - :style="{ | |
68 | - '--open-color': getDesign.openColor, | |
69 | - '--close-color': getDesign.closeColor, | |
70 | - }" | |
71 | - :class="isOpenClose ? 'switch_open' : 'switch_close'" | |
72 | - ></div> | |
73 | - <div class="text-gray-500 text-sm truncate">{{ getDesign.attribute }}</div> | |
66 | + <div class="flex-1 flex justify-center items-center flex-col"> | |
67 | + <div | |
68 | + :style="{ | |
69 | + '--open-color': getDesign.openColor, | |
70 | + '--close-color': getDesign.closeColor, | |
71 | + }" | |
72 | + :class="isOpenClose ? 'switch_open' : 'switch_close'" | |
73 | + ></div> | |
74 | + <div class="text-gray-500 text-sm truncate">{{ getDesign.attribute }}</div> | |
75 | + </div> | |
74 | 76 | <UpdateTime :time="time" /> |
75 | 77 | </main> |
76 | 78 | </template> | ... | ... |
src/views/visual/packages/components/Other/SwitchStatus/config.ts
renamed from
src/views/visual/packages/components/Text/SwitchStatus/config.ts
... | ... | @@ -10,9 +10,9 @@ import { PublicConfigClass, componentInitConfig } from '/@/views/visual/packages |
10 | 10 | import { ComponentConfigFieldEnum } from '/@/views/visual/packages/enum'; |
11 | 11 | |
12 | 12 | export const option: PublicPresetOptions = { |
13 | - [ComponentConfigFieldEnum.ICON]: 'shuiwen', | |
14 | - [ComponentConfigFieldEnum.ICON_COLOR]: '#367bff', | |
15 | - [ComponentConfigFieldEnum.ICON_CLOSE]: 'shuiwen', | |
13 | + [ComponentConfigFieldEnum.ICON]: 'dianyuandianya', | |
14 | + [ComponentConfigFieldEnum.ICON_COLOR]: '#ffa621', | |
15 | + [ComponentConfigFieldEnum.ICON_CLOSE]: 'dianyuandianya', | |
16 | 16 | [ComponentConfigFieldEnum.ICON_COLOR_CLOSE]: '#CCCCCC', |
17 | 17 | [ComponentConfigFieldEnum.SHOW_DEVICE_NAME]: false, |
18 | 18 | }; | ... | ... |
src/views/visual/packages/components/Other/SwitchStatus/config.vue
renamed from
src/views/visual/packages/components/Text/SwitchStatus/config.vue
src/views/visual/packages/components/Other/SwitchStatus/datasource.vue
renamed from
src/views/visual/packages/components/Text/SwitchStatus/datasource.vue
src/views/visual/packages/components/Other/SwitchStatus/index.ts
renamed from
src/views/visual/packages/components/Text/SwitchStatus/index.ts
src/views/visual/packages/components/Other/SwitchStatus/index.vue
renamed from
src/views/visual/packages/components/Text/SwitchStatus/index.vue
... | ... | @@ -2,52 +2,71 @@ |
2 | 2 | import { ComponentPropsConfigType } from '/@/views/visual/packages/index.type'; |
3 | 3 | import { option } from './config'; |
4 | 4 | import { SvgIcon } from '/@/components/Icon'; |
5 | - import { computed } from 'vue'; | |
5 | + import { computed, ref } from 'vue'; | |
6 | 6 | import { DeviceName } from '/@/views/visual/commonComponents/DeviceName'; |
7 | + import { UpdateTime } from '/@/views/visual/commonComponents/UpdateTime'; | |
7 | 8 | import { useDataFetch } from '../../../hook/socket/useSocket'; |
8 | 9 | import { DataFetchUpdateFn } from '../../../hook/socket/useSocket.type'; |
10 | + import { useReceiveValue } from '../../../hook/useReceiveValue'; | |
9 | 11 | |
10 | 12 | const props = defineProps<{ |
11 | 13 | config: ComponentPropsConfigType<typeof option>; |
12 | 14 | }>(); |
13 | 15 | |
16 | + const time = ref<Nullable<number>>(null); | |
17 | + const isOpenClose = ref<boolean>(true); | |
18 | + | |
14 | 19 | const getDesign = computed(() => { |
15 | 20 | const { persetOption = {}, option } = props.config; |
16 | - | |
17 | 21 | const { |
18 | 22 | iconColor: persetIconColor, |
19 | 23 | unit: perseUnit, |
20 | 24 | icon: persetIcon, |
21 | 25 | fontColor: persetFontColor, |
26 | + iconClose: persetIconCLose, | |
27 | + iconColorClose: persetIconColorClose, | |
22 | 28 | } = persetOption; |
23 | 29 | |
24 | - const { componentInfo, attribute, attributeRename } = option; | |
30 | + const { componentInfo, attributeRename } = option; | |
25 | 31 | |
26 | - const { icon, iconColor, fontColor, unit } = componentInfo || {}; | |
32 | + const { icon, iconColor, fontColor, unit, iconClose, iconColorClose, attributeName } = | |
33 | + componentInfo || {}; | |
27 | 34 | return { |
28 | 35 | iconColor: iconColor || persetIconColor, |
29 | 36 | unit: unit ?? perseUnit, |
30 | 37 | icon: icon || persetIcon, |
31 | 38 | fontColor: fontColor || persetFontColor, |
32 | - attribute: attributeRename || attribute, | |
39 | + attribute: attributeRename || attributeName, | |
40 | + iconClose: iconClose || persetIconCLose, | |
41 | + iconColorClose: iconColorClose || persetIconColorClose, | |
33 | 42 | }; |
34 | 43 | }); |
35 | 44 | |
36 | - const updateFn: DataFetchUpdateFn = () => {}; | |
45 | + const { getNumberValue } = useReceiveValue(); | |
46 | + | |
47 | + const updateFn: DataFetchUpdateFn = (message, attribute) => { | |
48 | + const { data = {} } = message; | |
49 | + const [latest] = data[attribute] || []; | |
50 | + const [timespan, value] = latest; | |
51 | + time.value = timespan; | |
52 | + isOpenClose.value = Boolean(getNumberValue(value)); | |
53 | + }; | |
37 | 54 | |
38 | 55 | useDataFetch(props, updateFn); |
39 | 56 | </script> |
40 | 57 | |
41 | 58 | <template> |
42 | - <main class="w-full h-full flex flex-col justify-evenly items-center"> | |
59 | + <main class="w-full h-full flex flex-col justify-center items-center"> | |
43 | 60 | <DeviceName :config="config" /> |
44 | - <div class="flex justify-center items-center"> | |
61 | + <div class="flex flex-1 flex-col justify-center items-center"> | |
45 | 62 | <SvgIcon |
46 | - :name="getDesign.icon!" | |
63 | + :name="isOpenClose ? getDesign.icon : getDesign.iconClose" | |
47 | 64 | prefix="iconfont" |
48 | 65 | :size="60" |
49 | - :style="{ color: getDesign.iconColor }" | |
66 | + :style="{ color: isOpenClose ? getDesign.iconColor : getDesign.iconColorClose }" | |
50 | 67 | /> |
68 | + <div class="text-gray-500 text-sm truncate m-2">{{ getDesign.attribute || '温度' }}</div> | |
51 | 69 | </div> |
70 | + <UpdateTime :time="time" /> | |
52 | 71 | </main> |
53 | 72 | </template> | ... | ... |
1 | 1 | import { MonitorVideoConfig } from './MonitorVideo'; |
2 | 2 | import { PictureConfig } from './Picture'; |
3 | 3 | import { SwitchSignalLightConfig } from './SwitchSignalLight'; |
4 | +import { SwitchStatusConfig } from './SwitchStatus'; | |
4 | 5 | |
5 | -export const OtherList = [MonitorVideoConfig, PictureConfig, SwitchSignalLightConfig]; | |
6 | +export const OtherList = [ | |
7 | + MonitorVideoConfig, | |
8 | + PictureConfig, | |
9 | + SwitchSignalLightConfig, | |
10 | + SwitchStatusConfig, | |
11 | +]; | ... | ... |
... | ... | @@ -37,8 +37,8 @@ |
37 | 37 | fontColor: '#377dff', |
38 | 38 | backgroundColor: '#377dff', |
39 | 39 | unit: '℃', |
40 | - deviceName: '温度', | |
41 | - attribute: '1', | |
40 | + deviceName: '温湿度', | |
41 | + attribute: '温度', | |
42 | 42 | id: buildUUID(), |
43 | 43 | }, |
44 | 44 | { |
... | ... | @@ -46,8 +46,8 @@ |
46 | 46 | fontColor: '#1E8667', |
47 | 47 | backgroundColor: '#1E8667', |
48 | 48 | unit: '℃', |
49 | - deviceName: '温度', | |
50 | - attribute: '3', | |
49 | + deviceName: '温湿度', | |
50 | + attribute: '湿度', | |
51 | 51 | id: buildUUID(), |
52 | 52 | }, |
53 | 53 | ]; | ... | ... |
... | ... | @@ -29,7 +29,8 @@ |
29 | 29 | return { |
30 | 30 | dataSource: dataSource.map((item) => { |
31 | 31 | const { fontColor, icon, iconColor, unit } = item.componentInfo; |
32 | - const { attribute, attributeRename, deviceName, deviceRename, deviceId } = item; | |
32 | + const { attribute, attributeRename, deviceName, deviceRename, deviceId, attributeName } = | |
33 | + item; | |
33 | 34 | |
34 | 35 | return { |
35 | 36 | unit: unit ?? persetUnit, |
... | ... | @@ -39,6 +40,7 @@ |
39 | 40 | attribute: attribute || attributeRename, |
40 | 41 | attributeRename, |
41 | 42 | deviceName, |
43 | + attributeName, | |
42 | 44 | deviceRename, |
43 | 45 | id: deviceId, |
44 | 46 | }; |
... | ... | @@ -48,15 +50,17 @@ |
48 | 50 | const defaultSvgList = ref<any>([ |
49 | 51 | { |
50 | 52 | value: 26.2, |
51 | - name: 'wendu', | |
53 | + deviceRename: '温湿度', | |
54 | + attributeRename: '温度', | |
52 | 55 | icon: 'zongfushe', |
53 | - unit: 'kw', | |
56 | + unit: '℃', | |
54 | 57 | iconColor: '#367BFF', |
55 | 58 | fontColor: '#357CFB', |
56 | 59 | }, |
57 | 60 | { |
58 | 61 | value: 53.7, |
59 | - name: 'shidu', | |
62 | + deviceRename: '温湿度', | |
63 | + attributeRename: '湿度', | |
60 | 64 | icon: 'guangzhaoqiangdu', |
61 | 65 | unit: '℃', |
62 | 66 | iconColor: '#FFA000', |
... | ... | @@ -72,7 +76,6 @@ |
72 | 76 | ); |
73 | 77 | |
74 | 78 | const updateFn: MultipleDataFetchUpdateFn = (message, deviceId, attribute) => { |
75 | - // console.log(unref(getDesign).dataSource, 'dataSource'); | |
76 | 79 | forEachGroupMessage(message, deviceId, attribute, (attribute, value, timespan) => { |
77 | 80 | updateSvgList.value.forEach((item) => { |
78 | 81 | if (item.id === deviceId && item.attribute === attribute) { |
... | ... | @@ -93,19 +96,19 @@ |
93 | 96 | style="width: 86%" |
94 | 97 | v-for="item in updateSvgList" |
95 | 98 | :key="item.id" |
96 | - class="flex justify-between items-center" | |
99 | + class="flex justify-between items-center mt-2" | |
97 | 100 | > |
98 | 101 | <div class="flex items-center"> |
99 | 102 | <SvgIcon |
100 | 103 | :name="item.icon!" |
101 | 104 | prefix="iconfont" |
102 | - :size="45" | |
105 | + :size="40" | |
103 | 106 | :style="{ color: item.iconColor }" |
104 | 107 | /> |
105 | 108 | |
106 | 109 | <div class="text-gray-500 text-lg truncate ml-6">{{ |
107 | 110 | item.deviceRename || |
108 | - item.deviceName + '-' + (item.attributeRename || item.attribute) || | |
111 | + item.deviceName + '-' + (item.attributeRename || item.attributeName) || | |
109 | 112 | '温度' |
110 | 113 | }}</div> |
111 | 114 | </div> | ... | ... |
... | ... | @@ -3,6 +3,7 @@ import { TextComponent2Config } from './TextComponent2'; |
3 | 3 | import { TextComponent3Config } from './TextComponent3'; |
4 | 4 | import { TextComponent4Config } from './TextComponent4'; |
5 | 5 | import { ValueList1Config } from './ValueList1'; |
6 | +import { ValueList2Config } from './ValueList2'; | |
6 | 7 | |
7 | 8 | export const TextList = [ |
8 | 9 | TextComponent1Config, |
... | ... | @@ -10,4 +11,5 @@ export const TextList = [ |
10 | 11 | TextComponent3Config, |
11 | 12 | TextComponent4Config, |
12 | 13 | ValueList1Config, |
14 | + ValueList2Config, | |
13 | 15 | ]; | ... | ... |
... | ... | @@ -54,7 +54,10 @@ const isControlComponent = (category?: string) => PackagesCategoryEnum.CONTROL = |
54 | 54 | |
55 | 55 | const isBooleanComponent = (componentKeys: { categoryKey?: string; componentKey?: string }) => { |
56 | 56 | const { categoryKey, componentKey } = componentKeys; |
57 | - return categoryKey == 'OTHER' && componentKey == 'SwitchSignalLight'; | |
57 | + return ( | |
58 | + categoryKey == 'OTHER' && | |
59 | + (componentKey == 'SwitchSignalLight' || componentKey == 'SwitchStatus') | |
60 | + ); | |
58 | 61 | }; |
59 | 62 | |
60 | 63 | const getDeviceService = async (deviceProfileId: string) => { | ... | ... |