Showing
13 changed files
with
439 additions
and
153 deletions
@@ -124,6 +124,6 @@ export type ComponentType = | @@ -124,6 +124,6 @@ export type ComponentType = | ||
124 | | 'TransferTableModal' | 124 | | 'TransferTableModal' |
125 | | 'ObjectModelValidateForm' | 125 | | 'ObjectModelValidateForm' |
126 | | 'DevicePicker' | 126 | | 'DevicePicker' |
127 | - | 'CustomInput' | 127 | + | 'PollCommandInput' |
128 | | 'RegisterAddressInput' | 128 | | 'RegisterAddressInput' |
129 | | 'ControlGroup'; | 129 | | 'ControlGroup'; |
src/views/task/center/components/ControlGroup/componentMap.ts
deleted
100644 → 0
1 | -import { Component } from 'vue'; | ||
2 | -import { ComponentType } from './type'; | ||
3 | - | ||
4 | -const componentMap = new Map<ComponentType, Component>(); | ||
5 | - | ||
6 | -export function add(compName: ComponentType, component: Component) { | ||
7 | - componentMap.set(compName, component); | ||
8 | -} | ||
9 | - | ||
10 | -export function del(compName: ComponentType) { | ||
11 | - componentMap.delete(compName); | ||
12 | -} | ||
13 | - | ||
14 | -export { componentMap }; |
src/views/task/center/components/ControlGroup/help.ts
deleted
100644 → 0
1 | -import type { ComponentType } from './type'; | ||
2 | -import { tryOnUnmounted } from '@vueuse/core'; | ||
3 | -import { add, del } from './componentMap'; | ||
4 | -import type { Component } from 'vue'; | ||
5 | - | ||
6 | -export function useComponentRegister(compName: ComponentType, comp: Component) { | ||
7 | - add(compName, comp); | ||
8 | - tryOnUnmounted(() => { | ||
9 | - del(compName); | ||
10 | - }); | ||
11 | -} |
1 | <script lang="ts" setup> | 1 | <script lang="ts" setup> |
2 | import { BasicForm, FormSchema, useForm } from '/@/components/Form'; | 2 | import { BasicForm, FormSchema, useForm } from '/@/components/Form'; |
3 | import { ComponentType, ColEx } from '/@/components/Form/src/types/index'; | 3 | import { ComponentType, ColEx } from '/@/components/Form/src/types/index'; |
4 | + import { computed } from '@vue/reactivity'; | ||
5 | + import { isFunction } from '/@/utils/is'; | ||
6 | + import { unref } from 'vue'; | ||
7 | + import { watch } from 'vue'; | ||
8 | + import { nextTick } from 'vue'; | ||
9 | + import { ref } from 'vue'; | ||
10 | + import { onMounted } from 'vue'; | ||
4 | 11 | ||
5 | - withDefaults( | 12 | + interface ValueItemType { |
13 | + value: any; | ||
14 | + } | ||
15 | + | ||
16 | + enum FormFieldsEnum { | ||
17 | + TOTAL_CONTROL = 'totalControl', | ||
18 | + } | ||
19 | + | ||
20 | + enum EmitEventEnum { | ||
21 | + UPDATE_VALUE = 'update:value', | ||
22 | + } | ||
23 | + | ||
24 | + const emit = defineEmits<{ | ||
25 | + (event: EmitEventEnum.UPDATE_VALUE, value: ValueItemType[]): void; | ||
26 | + }>(); | ||
27 | + | ||
28 | + const props = withDefaults( | ||
6 | defineProps<{ | 29 | defineProps<{ |
30 | + value: ValueItemType[]; | ||
31 | + length?: number; | ||
7 | component?: ComponentType; | 32 | component?: ComponentType; |
8 | itemColProps?: Partial<ColEx>; | 33 | itemColProps?: Partial<ColEx>; |
34 | + itemLabel?: (index: number) => string; | ||
35 | + itemProps?: (index: number) => FormSchema; | ||
36 | + showTotalControl?: boolean; | ||
37 | + totalControlProps?: FormSchema; | ||
9 | }>(), | 38 | }>(), |
10 | { | 39 | { |
40 | + value: () => [], | ||
41 | + length: 0, | ||
11 | component: 'Switch', | 42 | component: 'Switch', |
43 | + itemLabel: (index: number) => `#${index}`, | ||
44 | + itemProps: () => ({} as unknown as FormSchema), | ||
12 | itemColProps: () => ({ span: 12 } as Partial<ColEx>), | 45 | itemColProps: () => ({ span: 12 } as Partial<ColEx>), |
46 | + showTotalControl: true, | ||
47 | + totalControlProps: () => ({} as unknown as FormSchema), | ||
13 | } | 48 | } |
14 | ); | 49 | ); |
15 | 50 | ||
16 | - const [registerForm, {}] = useForm({ | 51 | + const getProps = computed(() => { |
52 | + return props; | ||
53 | + }); | ||
54 | + | ||
55 | + const batchSetValue = (value: any): ValueItemType[] => { | ||
56 | + const { length } = unref(getProps); | ||
57 | + return Array.from({ length }, () => ({ value })); | ||
58 | + }; | ||
59 | + | ||
60 | + const getTotalControlItem = computed(() => { | ||
61 | + const { totalControlProps, component, showTotalControl } = unref(getProps); | ||
62 | + return { | ||
63 | + ...totalControlProps, | ||
64 | + field: FormFieldsEnum.TOTAL_CONTROL, | ||
65 | + component, | ||
66 | + ifShow: showTotalControl, | ||
67 | + componentProps: { | ||
68 | + onChange(value: any) { | ||
69 | + handleUpdateValue(batchSetValue(value)); | ||
70 | + }, | ||
71 | + }, | ||
72 | + } as FormSchema; | ||
73 | + }); | ||
74 | + | ||
75 | + const getSchemas = computed(() => { | ||
76 | + const { itemProps, itemLabel, length, component } = unref(getProps); | ||
77 | + let label = isFunction(itemLabel) ? itemLabel : (index: number) => `#${index}`; | ||
78 | + let _itemProps = isFunction(itemProps) ? itemProps : () => ({}); | ||
79 | + const schemas = Array.from( | ||
80 | + { length }, | ||
81 | + (_item, index) => | ||
82 | + ({ | ||
83 | + ..._itemProps(index), | ||
84 | + label: label(index), | ||
85 | + field: index.toString(), | ||
86 | + component, | ||
87 | + componentProps: { | ||
88 | + onChange: async () => { | ||
89 | + await nextTick(); | ||
90 | + handleUpdateValue(); | ||
91 | + }, | ||
92 | + }, | ||
93 | + } as FormSchema) | ||
94 | + ); | ||
95 | + | ||
96 | + length && schemas.unshift(unref(getTotalControlItem)); | ||
97 | + | ||
98 | + return schemas; | ||
99 | + }); | ||
100 | + | ||
101 | + const [registerForm, { getFieldsValue, setProps, setFieldsValue }] = useForm({ | ||
17 | showActionButtonGroup: false, | 102 | showActionButtonGroup: false, |
18 | - schemas: Array.from({ length: 3 }).map((_item, index) => { | ||
19 | - return { | ||
20 | - field: index.toString(), | ||
21 | - label: index.toString(), | ||
22 | - component: 'Switch', | ||
23 | - } as FormSchema; | ||
24 | - }), | 103 | + schemas: unref(getSchemas), |
25 | // baseColProps, | 104 | // baseColProps, |
105 | + baseColProps: props.itemColProps, | ||
106 | + }); | ||
107 | + | ||
108 | + const handleUpdateValue = (value?: ValueItemType[]) => { | ||
109 | + if (value) { | ||
110 | + emit(EmitEventEnum.UPDATE_VALUE, value); | ||
111 | + return; | ||
112 | + } | ||
113 | + const allValue = getFieldsValue(); | ||
114 | + const sortKeyList = Array.from({ length: unref(getProps).length }, (_v, key) => key); | ||
115 | + const res = sortKeyList.map((item) => ({ value: allValue[item] } as ValueItemType)); | ||
116 | + | ||
117 | + emit(EmitEventEnum.UPDATE_VALUE, res); | ||
118 | + }; | ||
119 | + | ||
120 | + const transformValue = (value: ValueItemType[]) => { | ||
121 | + const { length } = unref(getProps); | ||
122 | + if (value.length !== length) { | ||
123 | + value = Array.from( | ||
124 | + { length: unref(getProps).length }, | ||
125 | + () => ({ value: null } as ValueItemType) | ||
126 | + ); | ||
127 | + } | ||
128 | + return value.reduce((prev, next, index) => ({ ...prev, [index]: next.value }), {}); | ||
129 | + }; | ||
130 | + | ||
131 | + const initialized = ref(false); | ||
132 | + | ||
133 | + watch( | ||
134 | + () => props.value, | ||
135 | + async (target) => { | ||
136 | + if (target) { | ||
137 | + let flag = unref(initialized); | ||
138 | + if (!flag) { | ||
139 | + await nextTick(); | ||
140 | + } | ||
141 | + const value = transformValue(target); | ||
142 | + setFieldsValue(value); | ||
143 | + | ||
144 | + if (!flag) { | ||
145 | + handleUpdateValue(); | ||
146 | + } | ||
147 | + } | ||
148 | + }, | ||
149 | + { | ||
150 | + immediate: true, | ||
151 | + } | ||
152 | + ); | ||
153 | + | ||
154 | + watch( | ||
155 | + () => [props.length, props.component], | ||
156 | + (target) => { | ||
157 | + if (target !== undefined || target !== null) { | ||
158 | + setProps({ | ||
159 | + schemas: unref(getSchemas), | ||
160 | + }); | ||
161 | + handleUpdateValue(); | ||
162 | + } | ||
163 | + } | ||
164 | + ); | ||
165 | + | ||
166 | + onMounted(() => { | ||
167 | + initialized.value = true; | ||
26 | }); | 168 | }); |
27 | </script> | 169 | </script> |
28 | 170 | ||
29 | <template> | 171 | <template> |
30 | - <BasicForm @register="registerForm" /> | 172 | + <BasicForm class="control-group-form" @register="registerForm" /> |
31 | </template> | 173 | </template> |
174 | + | ||
175 | +<style lang="less" scoped> | ||
176 | + .control-group-form { | ||
177 | + :deep(.ant-form-item-label) { | ||
178 | + font-weight: 700; | ||
179 | + } | ||
180 | + } | ||
181 | +</style> |
src/views/task/center/components/ControlGroup/type.ts
deleted
100644 → 0
1 | -export type ComponentType = ''; |
src/views/task/center/components/CustomInput/config.ts
deleted
100644 → 0
1 | -import { findDictItemByCode } from '/@/api/system/dict'; | ||
2 | -import { FormSchema, useComponentRegister } from '/@/components/Form'; | ||
3 | -import { DictEnum } from '/@/enums/dictEnum'; | ||
4 | -import RegisterAddressInput from './RegisterAddressInput.vue'; | ||
5 | -import { createPickerSearch } from '/@/utils/pickerSearch'; | ||
6 | -import { ControlGroup } from '../ControlGroup'; | ||
7 | - | ||
8 | -export enum FormFieldsEnum { | ||
9 | - ADDRESS = 'address', | ||
10 | - FUNCTION_CODE = 'functionCode', | ||
11 | - START_REGISTER_ADDRESS = 'startRegisterAddress', | ||
12 | - REGISTER_NUMBER = 'registerNumber', | ||
13 | - DATA_VALID = 'dataValid', | ||
14 | -} | ||
15 | - | ||
16 | -useComponentRegister('RegisterAddressInput', RegisterAddressInput); | ||
17 | -useComponentRegister('ControlGroup', ControlGroup); | ||
18 | - | ||
19 | -export const formSchemas: FormSchema[] = [ | ||
20 | - { | ||
21 | - field: FormFieldsEnum.ADDRESS, | ||
22 | - component: 'ApiSelect', | ||
23 | - label: '从机地址', | ||
24 | - componentProps: () => { | ||
25 | - return { | ||
26 | - api: async (params: Recordable) => { | ||
27 | - try { | ||
28 | - const result = await findDictItemByCode(params); | ||
29 | - return result.map((item, index) => ({ | ||
30 | - ...item, | ||
31 | - itemText: `${index + 1} - ${item.itemText}`, | ||
32 | - })); | ||
33 | - } catch (error) { | ||
34 | - return []; | ||
35 | - } | ||
36 | - }, | ||
37 | - params: { | ||
38 | - dictCode: DictEnum.SLAVE_ADDRESS, | ||
39 | - }, | ||
40 | - labelField: 'itemText', | ||
41 | - valueField: 'itemValue', | ||
42 | - ...createPickerSearch(), | ||
43 | - getPopupContainer: () => document.body, | ||
44 | - }; | ||
45 | - }, | ||
46 | - }, | ||
47 | - { | ||
48 | - field: FormFieldsEnum.FUNCTION_CODE, | ||
49 | - component: 'ApiSelect', | ||
50 | - label: '功能码', | ||
51 | - componentProps: () => { | ||
52 | - return { | ||
53 | - api: findDictItemByCode, | ||
54 | - params: { | ||
55 | - dictCode: DictEnum.FUNCTION_CODE, | ||
56 | - }, | ||
57 | - labelField: 'itemText', | ||
58 | - valueField: 'itemValue', | ||
59 | - getPopupContainer: () => document.body, | ||
60 | - }; | ||
61 | - }, | ||
62 | - }, | ||
63 | - { | ||
64 | - field: FormFieldsEnum.START_REGISTER_ADDRESS, | ||
65 | - label: '起始寄存器地址', | ||
66 | - component: 'RegisterAddressInput', | ||
67 | - valueField: 'value', | ||
68 | - changeEvent: 'update:value', | ||
69 | - }, | ||
70 | - { | ||
71 | - field: FormFieldsEnum.REGISTER_NUMBER, | ||
72 | - label: '寄存器个数', | ||
73 | - component: 'InputNumber', | ||
74 | - componentProps: { | ||
75 | - min: 1, | ||
76 | - max: 64, | ||
77 | - step: 1, | ||
78 | - }, | ||
79 | - }, | ||
80 | - { | ||
81 | - field: FormFieldsEnum.DATA_VALID, | ||
82 | - label: '数据校验', | ||
83 | - component: 'ApiSelect', | ||
84 | - colProps: { span: 24 }, | ||
85 | - componentProps: () => { | ||
86 | - return { | ||
87 | - api: findDictItemByCode, | ||
88 | - params: { | ||
89 | - dictCode: DictEnum.DATA_VALIDATE, | ||
90 | - }, | ||
91 | - labelField: 'itemText', | ||
92 | - valueField: 'itemValue', | ||
93 | - getPopupContainer: () => document.body, | ||
94 | - }; | ||
95 | - }, | ||
96 | - }, | ||
97 | - // { | ||
98 | - // field: 'test', | ||
99 | - // label: '住', | ||
100 | - // component: 'ControlGroup', | ||
101 | - // }, | ||
102 | -]; |
@@ -6,7 +6,7 @@ import { | @@ -6,7 +6,7 @@ import { | ||
6 | validateDevicePicker, | 6 | validateDevicePicker, |
7 | FormFieldsEnum as DeviceCascadePickerFieldsEnum, | 7 | FormFieldsEnum as DeviceCascadePickerFieldsEnum, |
8 | } from '../DevicePicker'; | 8 | } from '../DevicePicker'; |
9 | -import { CustomInput, ModeEnum } from '../CustomInput'; | 9 | +import { PollCommandInput, ModeEnum } from '../PollCommandInput'; |
10 | import { DeviceProfileModel } from '/@/api/device/model/deviceModel'; | 10 | import { DeviceProfileModel } from '/@/api/device/model/deviceModel'; |
11 | import { TransportTypeEnum } from '/@/views/device/profiles/components/TransportDescript/const'; | 11 | import { TransportTypeEnum } from '/@/views/device/profiles/components/TransportDescript/const'; |
12 | import { getDeviceProfile } from '/@/api/alarm/position'; | 12 | import { getDeviceProfile } from '/@/api/alarm/position'; |
@@ -15,7 +15,7 @@ import { TimeUnitEnum, TimeUnitNameEnum } from '/@/enums/toolEnum'; | @@ -15,7 +15,7 @@ import { TimeUnitEnum, TimeUnitNameEnum } from '/@/enums/toolEnum'; | ||
15 | import { createPickerSearch } from '/@/utils/pickerSearch'; | 15 | import { createPickerSearch } from '/@/utils/pickerSearch'; |
16 | 16 | ||
17 | useComponentRegister('DevicePicker', DevicePicker); | 17 | useComponentRegister('DevicePicker', DevicePicker); |
18 | -useComponentRegister('CustomInput', CustomInput); | 18 | +useComponentRegister('PollCommandInput', PollCommandInput); |
19 | 19 | ||
20 | export enum FormFieldsEnum { | 20 | export enum FormFieldsEnum { |
21 | // 任务名称 | 21 | // 任务名称 |
@@ -208,7 +208,7 @@ export const formSchemas: FormSchema[] = [ | @@ -208,7 +208,7 @@ export const formSchemas: FormSchema[] = [ | ||
208 | }, | 208 | }, |
209 | { | 209 | { |
210 | field: FormFieldsEnum.RPC_COMMAND, | 210 | field: FormFieldsEnum.RPC_COMMAND, |
211 | - component: 'CustomInput', | 211 | + component: 'PollCommandInput', |
212 | label: '自定义数据流', | 212 | label: '自定义数据流', |
213 | rules: [{ required: true, message: '请输入自定义数据流' }], | 213 | rules: [{ required: true, message: '请输入自定义数据流' }], |
214 | dynamicRules: ({ model }) => | 214 | dynamicRules: ({ model }) => |
@@ -228,7 +228,7 @@ export const formSchemas: FormSchema[] = [ | @@ -228,7 +228,7 @@ export const formSchemas: FormSchema[] = [ | ||
228 | }, | 228 | }, |
229 | { | 229 | { |
230 | field: FormFieldsEnum.RPC_COMMAND, | 230 | field: FormFieldsEnum.RPC_COMMAND, |
231 | - component: 'CustomInput', | 231 | + component: 'PollCommandInput', |
232 | label: 'ModbusRTU轮询', | 232 | label: 'ModbusRTU轮询', |
233 | rules: [{ required: true, message: '请输入Modbus RTU 轮询指令' }], | 233 | rules: [{ required: true, message: '请输入Modbus RTU 轮询指令' }], |
234 | ifShow: ({ model }) => model[FormFieldsEnum.EXECUTE_CONTENT_TYPE] === TaskTypeEnum.MODBUS_RTU, | 234 | ifShow: ({ model }) => model[FormFieldsEnum.EXECUTE_CONTENT_TYPE] === TaskTypeEnum.MODBUS_RTU, |
src/views/task/center/components/PollCommandInput/CreateTCPCommandModal.vue
renamed from
src/views/task/center/components/CustomInput/CreateTCPCommandModal.vue
@@ -10,7 +10,7 @@ | @@ -10,7 +10,7 @@ | ||
10 | 10 | ||
11 | const [registerModal] = useModal(); | 11 | const [registerModal] = useModal(); |
12 | 12 | ||
13 | - const [registerForm, {}] = useForm({ | 13 | + const [registerForm, { getFieldsValue }] = useForm({ |
14 | schemas: formSchemas, | 14 | schemas: formSchemas, |
15 | showActionButtonGroup: false, | 15 | showActionButtonGroup: false, |
16 | rowProps: { gutter: 10 }, | 16 | rowProps: { gutter: 10 }, |
@@ -19,7 +19,10 @@ | @@ -19,7 +19,10 @@ | ||
19 | 19 | ||
20 | const commandValue = ref(''); | 20 | const commandValue = ref(''); |
21 | 21 | ||
22 | - const handleGetValue = async () => {}; | 22 | + const handleGetValue = async () => { |
23 | + const value = getFieldsValue(); | ||
24 | + console.log(value); | ||
25 | + }; | ||
23 | 26 | ||
24 | const handleOk = () => { | 27 | const handleOk = () => { |
25 | emit('update:value', unref(commandValue)); | 28 | emit('update:value', unref(commandValue)); |
src/views/task/center/components/PollCommandInput/RegisterAddressInput.vue
renamed from
src/views/task/center/components/CustomInput/RegisterAddressInput.vue
@@ -14,9 +14,16 @@ | @@ -14,9 +14,16 @@ | ||
14 | 14 | ||
15 | const DEC_MAX_VALUE = parseInt('0xffff', 16); | 15 | const DEC_MAX_VALUE = parseInt('0xffff', 16); |
16 | 16 | ||
17 | - const props = defineProps<{ | ||
18 | - value?: string; | ||
19 | - }>(); | 17 | + const props = withDefaults( |
18 | + defineProps<{ | ||
19 | + value?: string; | ||
20 | + inputProps?: Recordable; | ||
21 | + }>(), | ||
22 | + { | ||
23 | + value: '0', | ||
24 | + inputProps: () => ({}), | ||
25 | + } | ||
26 | + ); | ||
20 | 27 | ||
21 | const addressTypeOptions = [ | 28 | const addressTypeOptions = [ |
22 | { label: AddressTypeEnum.DEC, value: AddressTypeEnum.DEC }, | 29 | { label: AddressTypeEnum.DEC, value: AddressTypeEnum.DEC }, |
@@ -52,7 +59,6 @@ | @@ -52,7 +59,6 @@ | ||
52 | () => props.value, | 59 | () => props.value, |
53 | (targetValue) => { | 60 | (targetValue) => { |
54 | inputValue.value = targetValue || 0; | 61 | inputValue.value = targetValue || 0; |
55 | - console.log(`inputValue: ${unref(inputValue)}`); | ||
56 | } | 62 | } |
57 | ); | 63 | ); |
58 | </script> | 64 | </script> |
@@ -63,7 +69,7 @@ | @@ -63,7 +69,7 @@ | ||
63 | v-model:value="type" | 69 | v-model:value="type" |
64 | :options="addressTypeOptions" | 70 | :options="addressTypeOptions" |
65 | @change="handleChange" | 71 | @change="handleChange" |
66 | - class="bg-gray-200" | 72 | + class="bg-gray-200 max-w-20" |
67 | /> | 73 | /> |
68 | <InputNumber | 74 | <InputNumber |
69 | v-if="type === AddressTypeEnum.DEC" | 75 | v-if="type === AddressTypeEnum.DEC" |
@@ -71,6 +77,7 @@ | @@ -71,6 +77,7 @@ | ||
71 | :step="1" | 77 | :step="1" |
72 | class="flex-1" | 78 | class="flex-1" |
73 | @change="handleEmit" | 79 | @change="handleEmit" |
80 | + v-bind="inputProps" | ||
74 | /> | 81 | /> |
75 | <Input v-if="type === AddressTypeEnum.HEX" v-model:value="inputValue" /> | 82 | <Input v-if="type === AddressTypeEnum.HEX" v-model:value="inputValue" /> |
76 | <div class="text-center h-8 leading-8 px-2 bg-gray-200 cursor-pointer rounded-1 w-20"> | 83 | <div class="text-center h-8 leading-8 px-2 bg-gray-200 cursor-pointer rounded-1 w-20"> |
1 | +import { findDictItemByCode } from '/@/api/system/dict'; | ||
2 | +import { FormSchema, useComponentRegister } from '/@/components/Form'; | ||
3 | +import { DictEnum } from '/@/enums/dictEnum'; | ||
4 | +import RegisterAddressInput from './RegisterAddressInput.vue'; | ||
5 | +import { createPickerSearch } from '/@/utils/pickerSearch'; | ||
6 | +import { ControlGroup } from '../ControlGroup'; | ||
7 | + | ||
8 | +export enum FormFieldsEnum { | ||
9 | + ADDRESS = 'address', | ||
10 | + FUNCTION_CODE = 'functionCode', | ||
11 | + START_REGISTER_ADDRESS = 'startRegisterAddress', | ||
12 | + DATA_VALID = 'dataValid', | ||
13 | + // 线圈个数 | ||
14 | + COIL_NUMBER = 'coilNumber', | ||
15 | + // 寄存器个数 | ||
16 | + REGISTER_NUMBER = 'registerNumber', | ||
17 | + // 线圈值 | ||
18 | + COIL_VALUE = 'coilValue', | ||
19 | + // 寄存器值 | ||
20 | + REGISTER_VALUE = 'registerValue', | ||
21 | + // 线圈组值 | ||
22 | + COIL_VALUES = 'coilValues', | ||
23 | + // 寄存器组值 | ||
24 | + REGISTER_VALUES = 'registerValues', | ||
25 | +} | ||
26 | + | ||
27 | +useComponentRegister('RegisterAddressInput', RegisterAddressInput); | ||
28 | +useComponentRegister('ControlGroup', ControlGroup); | ||
29 | + | ||
30 | +enum FunctionCodeEnum { | ||
31 | + // 读取线圈状态01 | ||
32 | + READ_COIL_STATE_01 = '01', | ||
33 | + // 读取输入状态02 | ||
34 | + READ_INPUT_STATE_02 = '02', | ||
35 | + // 读取保持寄存器 | ||
36 | + READ_KEEP_REGISTER_03 = '03', | ||
37 | + // 读取输入寄存器 | ||
38 | + READ_INPUT_REGISTER_04 = '04', | ||
39 | + // 写入耽搁线圈寄存器 | ||
40 | + WRITE_SINGLE_COIL_REGISTER_05 = '05', | ||
41 | + // 写入单个保持寄存器 | ||
42 | + WRITE_SINGLE_KEEP_COIL_REGISTER_06 = '06', | ||
43 | + // 写入多个线圈状态 | ||
44 | + WRITE_MULTIPLE_COIL_STATE_15 = '15', | ||
45 | + // 写入多个保持寄存器 | ||
46 | + WRITE_MULTIPLE_KEEP_REGISTER_16 = '16', | ||
47 | +} | ||
48 | + | ||
49 | +const showCoilNumber = (value: FunctionCodeEnum) => | ||
50 | + [ | ||
51 | + FunctionCodeEnum.READ_COIL_STATE_01, | ||
52 | + FunctionCodeEnum.READ_INPUT_STATE_02, | ||
53 | + FunctionCodeEnum.WRITE_MULTIPLE_COIL_STATE_15, | ||
54 | + ].includes(value); | ||
55 | + | ||
56 | +const showRegisterNumber = (value: FunctionCodeEnum) => | ||
57 | + [ | ||
58 | + FunctionCodeEnum.READ_KEEP_REGISTER_03, | ||
59 | + FunctionCodeEnum.READ_INPUT_REGISTER_04, | ||
60 | + FunctionCodeEnum.WRITE_MULTIPLE_KEEP_REGISTER_16, | ||
61 | + ].includes(value); | ||
62 | + | ||
63 | +const showCoilValue = (value: FunctionCodeEnum) => | ||
64 | + [FunctionCodeEnum.WRITE_SINGLE_COIL_REGISTER_05].includes(value); | ||
65 | + | ||
66 | +const showRegisterValue = (value: FunctionCodeEnum) => | ||
67 | + [FunctionCodeEnum.WRITE_SINGLE_KEEP_COIL_REGISTER_06].includes(value); | ||
68 | + | ||
69 | +const isWriteCoilGroup = (value: FunctionCodeEnum) => | ||
70 | + [FunctionCodeEnum.WRITE_MULTIPLE_COIL_STATE_15].includes(value); | ||
71 | + | ||
72 | +const isWriteRegisterGroup = (value: FunctionCodeEnum) => | ||
73 | + [FunctionCodeEnum.WRITE_MULTIPLE_KEEP_REGISTER_16].includes(value); | ||
74 | + | ||
75 | +export const formSchemas: FormSchema[] = [ | ||
76 | + { | ||
77 | + field: FormFieldsEnum.ADDRESS, | ||
78 | + component: 'ApiSelect', | ||
79 | + label: '从机地址', | ||
80 | + rules: [{ required: true, message: '请选择从机地址' }], | ||
81 | + defaultValue: '01', | ||
82 | + componentProps: () => { | ||
83 | + return { | ||
84 | + api: async (params: Recordable) => { | ||
85 | + try { | ||
86 | + const result = await findDictItemByCode(params); | ||
87 | + return result.map((item, index) => ({ | ||
88 | + ...item, | ||
89 | + itemText: `${index + 1} - ${item.itemText}`, | ||
90 | + })); | ||
91 | + } catch (error) { | ||
92 | + return []; | ||
93 | + } | ||
94 | + }, | ||
95 | + params: { | ||
96 | + dictCode: DictEnum.SLAVE_ADDRESS, | ||
97 | + }, | ||
98 | + labelField: 'itemText', | ||
99 | + valueField: 'itemValue', | ||
100 | + ...createPickerSearch(), | ||
101 | + getPopupContainer: () => document.body, | ||
102 | + }; | ||
103 | + }, | ||
104 | + }, | ||
105 | + { | ||
106 | + field: FormFieldsEnum.FUNCTION_CODE, | ||
107 | + component: 'ApiSelect', | ||
108 | + label: '功能码', | ||
109 | + defaultValue: '01', | ||
110 | + rules: [{ required: true, message: '请选择功能码' }], | ||
111 | + componentProps: () => { | ||
112 | + return { | ||
113 | + api: findDictItemByCode, | ||
114 | + params: { | ||
115 | + dictCode: DictEnum.FUNCTION_CODE, | ||
116 | + }, | ||
117 | + labelField: 'itemText', | ||
118 | + valueField: 'itemValue', | ||
119 | + getPopupContainer: () => document.body, | ||
120 | + }; | ||
121 | + }, | ||
122 | + }, | ||
123 | + { | ||
124 | + field: FormFieldsEnum.START_REGISTER_ADDRESS, | ||
125 | + label: '起始寄存器地址', | ||
126 | + component: 'RegisterAddressInput', | ||
127 | + valueField: 'value', | ||
128 | + changeEvent: 'update:value', | ||
129 | + defaultValue: '0', | ||
130 | + }, | ||
131 | + { | ||
132 | + field: FormFieldsEnum.REGISTER_NUMBER, | ||
133 | + label: '寄存器个数', | ||
134 | + component: 'InputNumber', | ||
135 | + ifShow: ({ model }) => showRegisterNumber(model[FormFieldsEnum.FUNCTION_CODE]), | ||
136 | + defaultValue: 1, | ||
137 | + rules: [{ required: true, message: '请输入寄存器个数' }], | ||
138 | + componentProps: { | ||
139 | + min: 1, | ||
140 | + max: 64, | ||
141 | + step: 1, | ||
142 | + placeholder: '请输入寄存器个数', | ||
143 | + }, | ||
144 | + }, | ||
145 | + { | ||
146 | + field: FormFieldsEnum.COIL_NUMBER, | ||
147 | + label: '线圈个数', | ||
148 | + component: 'InputNumber', | ||
149 | + ifShow: ({ model }) => showCoilNumber(model[FormFieldsEnum.FUNCTION_CODE]), | ||
150 | + defaultValue: 1, | ||
151 | + rules: [{ required: true, message: '请输入线圈个数' }], | ||
152 | + componentProps: { | ||
153 | + min: 1, | ||
154 | + max: 64, | ||
155 | + step: 1, | ||
156 | + placeholder: '请输入线圈个数', | ||
157 | + }, | ||
158 | + }, | ||
159 | + { | ||
160 | + field: FormFieldsEnum.COIL_VALUE, | ||
161 | + label: '线圈值', | ||
162 | + component: 'RegisterAddressInput', | ||
163 | + valueField: 'value', | ||
164 | + changeEvent: 'update:value', | ||
165 | + ifShow: ({ model }) => showCoilValue(model[FormFieldsEnum.FUNCTION_CODE]), | ||
166 | + defaultValue: '0', | ||
167 | + rules: [{ required: true, message: '请输入线圈值' }], | ||
168 | + componentProps: { | ||
169 | + placeholder: '请输入线圈值', | ||
170 | + }, | ||
171 | + }, | ||
172 | + { | ||
173 | + field: FormFieldsEnum.REGISTER_VALUE, | ||
174 | + label: '寄存器值', | ||
175 | + component: 'RegisterAddressInput', | ||
176 | + valueField: 'value', | ||
177 | + changeEvent: 'update:value', | ||
178 | + ifShow: ({ model }) => showRegisterValue(model[FormFieldsEnum.FUNCTION_CODE]), | ||
179 | + defaultValue: '0', | ||
180 | + rules: [{ required: true, message: '请输入寄存器值' }], | ||
181 | + componentProps: { | ||
182 | + placeholder: '请输入寄存器值', | ||
183 | + }, | ||
184 | + }, | ||
185 | + { | ||
186 | + field: FormFieldsEnum.REGISTER_VALUES, | ||
187 | + label: '', | ||
188 | + component: 'ControlGroup', | ||
189 | + colProps: { span: 24 }, | ||
190 | + valueField: 'value', | ||
191 | + changeEvent: 'update:value', | ||
192 | + ifShow: ({ model }) => isWriteRegisterGroup(model[FormFieldsEnum.FUNCTION_CODE]), | ||
193 | + componentProps: ({ formModel }) => { | ||
194 | + const length = formModel[FormFieldsEnum.REGISTER_NUMBER]; | ||
195 | + return { | ||
196 | + length: length || 1, | ||
197 | + itemColProps: { span: 12, style: { paddingRight: '10px' } }, | ||
198 | + component: 'RegisterAddressInput', | ||
199 | + itemLabel: (index: number) => `#${index} 寄存器值`, | ||
200 | + showTotalControl: false, | ||
201 | + itemProps: () => { | ||
202 | + return { | ||
203 | + defaultValue: '0', | ||
204 | + } as FormSchema; | ||
205 | + }, | ||
206 | + }; | ||
207 | + }, | ||
208 | + }, | ||
209 | + { | ||
210 | + field: FormFieldsEnum.COIL_VALUES, | ||
211 | + label: '', | ||
212 | + component: 'ControlGroup', | ||
213 | + colProps: { span: 24 }, | ||
214 | + valueField: 'value', | ||
215 | + changeEvent: 'update:value', | ||
216 | + ifShow: ({ model }) => isWriteCoilGroup(model[FormFieldsEnum.FUNCTION_CODE]), | ||
217 | + componentProps: ({ formModel }) => { | ||
218 | + const length = formModel[FormFieldsEnum.COIL_NUMBER]; | ||
219 | + return { | ||
220 | + length: length || 1, | ||
221 | + itemColProps: { span: 6 }, | ||
222 | + itemLabel: (index: number) => `#${index} 线圈状态值`, | ||
223 | + itemProps: (index: number) => { | ||
224 | + return { | ||
225 | + defaultValue: 0, | ||
226 | + helpMessage: [`设置从起始地址偏移 ${index} 位的线圈开关量状态。`], | ||
227 | + } as FormSchema; | ||
228 | + }, | ||
229 | + totalControlProps: { | ||
230 | + label: '全开或全关', | ||
231 | + helpMessage: ['将以下所有线圈的开关量状态全部置为 1 或 0,实现一键全开或全关.'], | ||
232 | + colProps: { span: 24 }, | ||
233 | + } as FormSchema, | ||
234 | + }; | ||
235 | + }, | ||
236 | + }, | ||
237 | + { | ||
238 | + field: FormFieldsEnum.DATA_VALID, | ||
239 | + label: '数据校验', | ||
240 | + component: 'ApiSelect', | ||
241 | + colProps: { span: 24 }, | ||
242 | + rules: [{ required: true, message: '请选择数据校验方式' }], | ||
243 | + componentProps: () => { | ||
244 | + return { | ||
245 | + api: findDictItemByCode, | ||
246 | + params: { | ||
247 | + dictCode: DictEnum.DATA_VALIDATE, | ||
248 | + }, | ||
249 | + labelField: 'itemText', | ||
250 | + valueField: 'itemValue', | ||
251 | + placeholder: '请选择数据校验方式', | ||
252 | + getPopupContainer: () => document.body, | ||
253 | + }; | ||
254 | + }, | ||
255 | + }, | ||
256 | +]; |
src/views/task/center/components/PollCommandInput/index.ts
renamed from
src/views/task/center/components/CustomInput/index.ts
src/views/task/center/components/PollCommandInput/index.vue
renamed from
src/views/task/center/components/CustomInput/index.vue