Commit f58124e66901e26b82fe65376d338b92be2007e4

Authored by ww
1 parent 1ec59896

feat: 完成modbus rtu指令生成页面

... ... @@ -124,6 +124,6 @@ export type ComponentType =
124 124 | 'TransferTableModal'
125 125 | 'ObjectModelValidateForm'
126 126 | 'DevicePicker'
127   - | 'CustomInput'
  127 + | 'PollCommandInput'
128 128 | 'RegisterAddressInput'
129 129 | 'ControlGroup';
... ...
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 };
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 1 export { default as ControlGroup } from './index.vue';
2   -export { add, del } from './componentMap';
3   -export { useComponentRegister } from './help';
... ...
1 1 <script lang="ts" setup>
2 2 import { BasicForm, FormSchema, useForm } from '/@/components/Form';
3 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 29 defineProps<{
  30 + value: ValueItemType[];
  31 + length?: number;
7 32 component?: ComponentType;
8 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 42 component: 'Switch',
  43 + itemLabel: (index: number) => `#${index}`,
  44 + itemProps: () => ({} as unknown as FormSchema),
12 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 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 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 169 </script>
28 170
29 171 <template>
30   - <BasicForm @register="registerForm" />
  172 + <BasicForm class="control-group-form" @register="registerForm" />
31 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>
... ...
1   -export type ComponentType = '';
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 6 validateDevicePicker,
7 7 FormFieldsEnum as DeviceCascadePickerFieldsEnum,
8 8 } from '../DevicePicker';
9   -import { CustomInput, ModeEnum } from '../CustomInput';
  9 +import { PollCommandInput, ModeEnum } from '../PollCommandInput';
10 10 import { DeviceProfileModel } from '/@/api/device/model/deviceModel';
11 11 import { TransportTypeEnum } from '/@/views/device/profiles/components/TransportDescript/const';
12 12 import { getDeviceProfile } from '/@/api/alarm/position';
... ... @@ -15,7 +15,7 @@ import { TimeUnitEnum, TimeUnitNameEnum } from '/@/enums/toolEnum';
15 15 import { createPickerSearch } from '/@/utils/pickerSearch';
16 16
17 17 useComponentRegister('DevicePicker', DevicePicker);
18   -useComponentRegister('CustomInput', CustomInput);
  18 +useComponentRegister('PollCommandInput', PollCommandInput);
19 19
20 20 export enum FormFieldsEnum {
21 21 // 任务名称
... ... @@ -208,7 +208,7 @@ export const formSchemas: FormSchema[] = [
208 208 },
209 209 {
210 210 field: FormFieldsEnum.RPC_COMMAND,
211   - component: 'CustomInput',
  211 + component: 'PollCommandInput',
212 212 label: '自定义数据流',
213 213 rules: [{ required: true, message: '请输入自定义数据流' }],
214 214 dynamicRules: ({ model }) =>
... ... @@ -228,7 +228,7 @@ export const formSchemas: FormSchema[] = [
228 228 },
229 229 {
230 230 field: FormFieldsEnum.RPC_COMMAND,
231   - component: 'CustomInput',
  231 + component: 'PollCommandInput',
232 232 label: 'ModbusRTU轮询',
233 233 rules: [{ required: true, message: '请输入Modbus RTU 轮询指令' }],
234 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 10
11 11 const [registerModal] = useModal();
12 12
13   - const [registerForm, {}] = useForm({
  13 + const [registerForm, { getFieldsValue }] = useForm({
14 14 schemas: formSchemas,
15 15 showActionButtonGroup: false,
16 16 rowProps: { gutter: 10 },
... ... @@ -19,7 +19,10 @@
19 19
20 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 27 const handleOk = () => {
25 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 14
15 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 28 const addressTypeOptions = [
22 29 { label: AddressTypeEnum.DEC, value: AddressTypeEnum.DEC },
... ... @@ -52,7 +59,6 @@
52 59 () => props.value,
53 60 (targetValue) => {
54 61 inputValue.value = targetValue || 0;
55   - console.log(`inputValue: ${unref(inputValue)}`);
56 62 }
57 63 );
58 64 </script>
... ... @@ -63,7 +69,7 @@
63 69 v-model:value="type"
64 70 :options="addressTypeOptions"
65 71 @change="handleChange"
66   - class="bg-gray-200"
  72 + class="bg-gray-200 max-w-20"
67 73 />
68 74 <InputNumber
69 75 v-if="type === AddressTypeEnum.DEC"
... ... @@ -71,6 +77,7 @@
71 77 :step="1"
72 78 class="flex-1"
73 79 @change="handleEmit"
  80 + v-bind="inputProps"
74 81 />
75 82 <Input v-if="type === AddressTypeEnum.HEX" v-model:value="inputValue" />
76 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
1   -export { default as CustomInput } from './index.vue';
  1 +export { default as PollCommandInput } from './index.vue';
2 2 export enum ModeEnum {
3 3 JSON = 'application/json',
4 4 NORMAL = 'normal',
... ...
src/views/task/center/components/PollCommandInput/index.vue renamed from src/views/task/center/components/CustomInput/index.vue