config.ts 3.16 KB
import { unref } from 'vue';
import { useObjectModelFormContext } from '../useObjectModelFormContext';
import { findDictItemByCode } from '/@/api/system/dict';
import { FormSchema } from '/@/components/Table';
import { DictEnum } from '/@/enums/dictEnum';
import {
  DataTypeEnum,
  RegisterActionTypeEnum,
  RegisterActionTypeNameEnum,
  RegisterDataTypeEnum,
} from '/@/enums/objectModelEnum';

export enum FormFieldsEnum {
  REGISTER_ADDRESS = 'registerAddress',
  DATA_TYPE = 'dataType',
  ACTION_TYPE = 'actionType',
  ZOOM_FACTOR = 'zoomFactor',

  OBJECT_MODEL_TYPE = 'objectModelType',
}

function getActionTypeByObjectModelType(dataType: DataTypeEnum) {
  const list: Record<'label' | 'value', string>[] = [];
  if (dataType === DataTypeEnum.BOOL) {
    list.push({ label: RegisterActionTypeNameEnum.BOOL, value: RegisterActionTypeEnum.BOOL });
  } else if (dataType === DataTypeEnum.NUMBER_INT) {
    list.push({ label: RegisterActionTypeNameEnum.INT, value: RegisterActionTypeEnum.INT });
  } else if (dataType === DataTypeEnum.NUMBER_DOUBLE) {
    list.push({ label: RegisterActionTypeNameEnum.DOUBLE, value: RegisterActionTypeEnum.DOUBLE });
  } else {
    list.push(
      ...Object.keys(RegisterActionTypeEnum).map((key) => ({
        label: RegisterActionTypeNameEnum[key],
        value: RegisterActionTypeEnum[key],
      }))
    );
  }

  return list;
}

export const getFormSchemas = (): FormSchema[] => {
  const { getDataType } = useObjectModelFormContext();
  return [
    {
      field: FormFieldsEnum.REGISTER_ADDRESS,
      component: 'RegisterAddressInput',
      label: '寄存器地址',
      changeEvent: 'update:value',
      valueField: 'value',
      rules: [{ message: '请输入寄存器地址', required: true, type: 'number' }],
      componentProps: {
        placeholder: '请输入寄存器地址',
      },
    },
    {
      field: FormFieldsEnum.DATA_TYPE,
      component: 'ApiSelect',
      label: '数据格式',
      rules: [{ message: '请选择数据格式', required: true }],
      defaultValue: RegisterDataTypeEnum.UN_SHORT,
      componentProps: {
        api: findDictItemByCode,
        params: {
          dictCode: DictEnum.REGISTER_DATA_FORMAT,
        },
        labelField: 'itemText',
        valueField: 'itemValue',
        placeholder: '请选择数据格式',
        getPopupContainer: () => document.body,
      },
    },
    {
      field: FormFieldsEnum.ACTION_TYPE,
      component: 'Select',
      label: '操作类型',
      rules: [{ message: '请选择操作类型', required: true }],
      componentProps: () => {
        return {
          options: getActionTypeByObjectModelType(unref(getDataType)),
          placeholder: '请选择操作类型',
          getPopupContainer: () => document.body,
        };
      },
    },
    {
      field: FormFieldsEnum.ZOOM_FACTOR,
      component: 'InputNumber',
      label: '缩放因子',
      helpMessage: ['缩放因子不能为0,默认为1'],
      defaultValue: 1,
      ifShow: ({ model }) =>
        ![DataTypeEnum.BOOL, DataTypeEnum.STRING].includes(model[FormFieldsEnum.OBJECT_MODEL_TYPE]),
      componentProps: {
        min: 1,
        placeholder: '请输入缩放因子',
      },
    },
  ];
};