index.ts 4.6 KB
import { FormSchema } from '/@/components/Form';
import { findDictItemByCode } from '/@/api/system/dict';
import { getDeviceProfile } from '/@/api/alarm/position';
import { BasicInfoFormField, DataSourceType } from '../enum';
import { DeviceRecord } from '/@/api/device/model/deviceModel';
import { useMessage } from '/@/hooks/web/useMessage';

export const stepConfig = ['选择流转方式', '完善配置参数'];

export const removeFieldByModeForm = ['name', 'description'];

const handleGroupDevice = (options: DeviceRecord[]) => {
  const map = new Map<string, string[]>();
  options.forEach((item) => {
    if (map.has(item.profileId)) {
      const deviceList = map.get(item.profileId)!;
      deviceList.push(item.tbDeviceId);
    } else {
      map.set(item.profileId, [item.tbDeviceId]);
    }
  });
  const value = Array.from(map.entries()).map(([product, devices]) => ({ product, devices }));

  return value;
};

//表单通用配置
export const modelFormPublicConfig = {
  labelWidth: 120,
  actionColOptions: {
    span: 14,
  },
  showResetButton: false,
  showSubmitButton: false,
};

const { createMessage } = useMessage();
export const modeForm = (disabled: boolean): FormSchema[] => {
  return [
    {
      field: BasicInfoFormField.CONVERT_CONFIG_ID,
      label: '',
      component: 'Input',
      show: false,
    },
    {
      field: BasicInfoFormField.DATA_SOURCE_TYPE,
      label: '数据源',
      component: 'RadioGroup',
      defaultValue: DataSourceType.ALL,
      componentProps: {
        options: [
          { label: '全部', value: DataSourceType.ALL },
          { label: '产品', value: DataSourceType.PRODUCT },
          { label: '设备', value: DataSourceType.DEVICE },
        ],
      },
    },
    {
      field: BasicInfoFormField.DATA_SOURCE_PRODUCT,
      label: '数据源产品',
      component: 'TransferModal',
      rules: [{ required: true, message: '数据源产品为必选项', type: 'array' }],
      ifShow: ({ model }) => {
        return model[BasicInfoFormField.DATA_SOURCE_TYPE] !== DataSourceType.ALL;
      },
      valueField: 'value',
      changeEvent: 'update:value',
      componentProps: ({ formActionType }) => {
        const { setFieldsValue } = formActionType;
        return {
          api: getDeviceProfile,
          labelField: 'name',
          valueField: 'tbProfileId',
          disabled,
          selectProps: {
            disabled,
            placeholder: '请选择产品',
          },
          transferProps: {
            listStyle: { height: '400px' },
            showSearch: true,
            filterOption: (inputValue: string, option: Recordable) => {
              const upperCaseInputValue = inputValue.toUpperCase();
              const upperCaseOptionValue = option.name.toUpperCase();
              return upperCaseOptionValue.includes(upperCaseInputValue);
            },
          },
          onChange: () => {
            setFieldsValue({ [BasicInfoFormField.DATA_SOURCE_DEVICE]: [] });
          },
        };
      },
    },
    {
      field: BasicInfoFormField.DATA_SOURCE_DEVICE,
      label: '数据源设备',
      component: 'TransferTableModal',
      ifShow: ({ model }) => {
        return model[BasicInfoFormField.DATA_SOURCE_TYPE] === DataSourceType.DEVICE;
      },
      valueField: 'value',
      changeEvent: 'update:value',
      rules: [{ required: true, message: '数据源设备为必选项', type: 'array' }],
      componentProps: ({ formModel }) => {
        const convertConfigId = formModel[BasicInfoFormField.CONVERT_CONFIG_ID];
        const deviceProfileIds = formModel[BasicInfoFormField.DATA_SOURCE_PRODUCT];
        return {
          disabled,
          params: { convertConfigId, deviceProfileIds },
          transformValue: handleGroupDevice,
          openModalValidate: () => {
            if (!deviceProfileIds || !deviceProfileIds?.length) {
              createMessage.warning('请选择数据源设备');
            }
            return deviceProfileIds && deviceProfileIds?.length;
          },
        };
      },
    },
    {
      field: 'type',
      label: '转换方式',
      component: 'ApiSelect',
      required: true,
      colProps: {
        span: 24,
      },
      componentProps({}) {
        return {
          api: findDictItemByCode,
          params: {
            dictCode: 'convert_data_to',
          },
          labelField: 'itemText',
          valueField: 'itemValue',
        };
      },
    },
    {
      field: 'remark',
      label: '描述',
      colProps: { span: 24 },
      component: 'Input',
      componentProps: {
        maxLength: 255,
        placeholder: '请输入描述',
      },
    },
  ];
};