config.ts 8.35 KB
import { ChartComponentEnum } from '.'
import type { FormSchema } from '@/components/Form'
import { ComponentEnum } from '@/components/Form/src/enum'
import { AggregateTypeEnum, AggregateTypeNameEnum, SocketSubscriberEnum } from '@/enums/datasource'
import { useTranslation } from '@/hooks/useTranslation'
const { t } = useTranslation()

enum TimeUnit {
  SECOND = 'SECOND',
  MINUTE = 'MINUTE',
  HOUR = 'HOUR',
  DAY = 'DAY',
}

const unitConversion = {
  [TimeUnit.SECOND]: 1 * 1000,
  [TimeUnit.MINUTE]: 1 * 60 * 1000,
  [TimeUnit.HOUR]: 1 * 60 * 60 * 1000,
  [TimeUnit.DAY]: 1 * 60 * 60 * 24 * 1000,
}

const unitLabelMapping = {
  [TimeUnit.SECOND]: 'intervalSecond',
  [TimeUnit.MINUTE]: 'intervalMinute',
  [TimeUnit.HOUR]: 'intervalHour',
  [TimeUnit.DAY]: 'intervalDay',
}

export const intervalOption = [
  {
    id: 1,
    unit: TimeUnit.SECOND,
    linkage: [{ id: 1, unit: TimeUnit.SECOND }],
  },
  {
    id: 5,
    unit: TimeUnit.SECOND,
    linkage: [{ id: 1, unit: TimeUnit.SECOND }],
  },
  {
    id: 10,
    unit: TimeUnit.SECOND,
    linkage: [{ id: 1, unit: TimeUnit.SECOND }],
  },
  {
    id: 15,
    unit: TimeUnit.SECOND,
    linkage: [{ id: 1, unit: TimeUnit.SECOND }],
  },
  {
    id: 30,
    unit: TimeUnit.SECOND,
    linkage: [{ id: 1, unit: TimeUnit.SECOND }],
  },
  {
    id: 1,
    unit: TimeUnit.MINUTE,
    linkage: [
      { id: 1, unit: TimeUnit.SECOND },
      { id: 5, unit: TimeUnit.SECOND },
    ],
  },
  {
    id: 2,
    unit: TimeUnit.MINUTE,
    linkage: [
      { id: 1, unit: TimeUnit.SECOND },
      { id: 5, unit: TimeUnit.SECOND },
      { id: 10, unit: TimeUnit.SECOND },
      { id: 15, unit: TimeUnit.SECOND },
    ],
  },
  {
    id: 5,
    unit: TimeUnit.MINUTE,
    linkage: [
      { id: 1, unit: TimeUnit.SECOND },
      { id: 5, unit: TimeUnit.SECOND },
      { id: 10, unit: TimeUnit.SECOND },
      { id: 15, unit: TimeUnit.SECOND },
      { id: 30, unit: TimeUnit.SECOND },
    ],
  },
  {
    id: 10,
    unit: TimeUnit.MINUTE,
    linkage: [
      { id: 5, unit: TimeUnit.SECOND },
      { id: 10, unit: TimeUnit.SECOND },
      { id: 15, unit: TimeUnit.SECOND },
      { id: 30, unit: TimeUnit.SECOND },
      { id: 1, unit: TimeUnit.MINUTE },
    ],
  },
  {
    id: 15,
    unit: TimeUnit.MINUTE,
    linkage: [
      { id: 5, unit: TimeUnit.SECOND },
      { id: 10, unit: TimeUnit.SECOND },
      { id: 15, unit: TimeUnit.SECOND },
      { id: 30, unit: TimeUnit.SECOND },
      { id: 1, unit: TimeUnit.MINUTE },
      { id: 2, unit: TimeUnit.MINUTE },
    ],
  },
  {
    id: 30,
    unit: TimeUnit.MINUTE,
    linkage: [
      { id: 5, unit: TimeUnit.SECOND },
      { id: 10, unit: TimeUnit.SECOND },
      { id: 15, unit: TimeUnit.SECOND },
      { id: 30, unit: TimeUnit.SECOND },
      { id: 1, unit: TimeUnit.MINUTE },
      { id: 2, unit: TimeUnit.MINUTE },
    ],
  },
  {
    id: 1,
    unit: TimeUnit.HOUR,
    linkage: [
      { id: 10, unit: TimeUnit.SECOND },
      { id: 15, unit: TimeUnit.SECOND },
      { id: 30, unit: TimeUnit.SECOND },
      { id: 1, unit: TimeUnit.MINUTE },
      { id: 2, unit: TimeUnit.MINUTE },
      { id: 5, unit: TimeUnit.MINUTE },
    ],
  },
  {
    id: 2,
    unit: TimeUnit.HOUR,
    linkage: [
      { id: 15, unit: TimeUnit.SECOND },
      { id: 30, unit: TimeUnit.SECOND },
      { id: 1, unit: TimeUnit.MINUTE },
      { id: 2, unit: TimeUnit.MINUTE },
      { id: 5, unit: TimeUnit.MINUTE },
      { id: 10, unit: TimeUnit.MINUTE },
      { id: 15, unit: TimeUnit.MINUTE },
    ],
  },
  {
    id: 5,
    unit: TimeUnit.HOUR,
    linkage: [
      { id: 1, unit: TimeUnit.MINUTE },
      { id: 2, unit: TimeUnit.MINUTE },
      { id: 5, unit: TimeUnit.MINUTE },
      { id: 10, unit: TimeUnit.MINUTE },
      { id: 15, unit: TimeUnit.MINUTE },
      { id: 30, unit: TimeUnit.MINUTE },
    ],
  },
  {
    id: 10,
    unit: TimeUnit.HOUR,
    linkage: [
      { id: 2, unit: TimeUnit.MINUTE },
      { id: 5, unit: TimeUnit.MINUTE },
      { id: 10, unit: TimeUnit.MINUTE },
      { id: 15, unit: TimeUnit.MINUTE },
      { id: 30, unit: TimeUnit.MINUTE },
      { id: 1, unit: TimeUnit.HOUR },
    ],
  },
  {
    id: 12,
    unit: TimeUnit.HOUR,
    linkage: [
      { id: 2, unit: TimeUnit.MINUTE },
      { id: 5, unit: TimeUnit.MINUTE },
      { id: 10, unit: TimeUnit.MINUTE },
      { id: 15, unit: TimeUnit.MINUTE },
      { id: 30, unit: TimeUnit.MINUTE },
      { id: 1, unit: TimeUnit.HOUR },
    ],
  },
  {
    id: 1,
    unit: TimeUnit.DAY,
    linkage: [
      { id: 5, unit: TimeUnit.MINUTE },
      { id: 10, unit: TimeUnit.MINUTE },
      { id: 15, unit: TimeUnit.MINUTE },
      { id: 30, unit: TimeUnit.MINUTE },
      { id: 1, unit: TimeUnit.HOUR },
      { id: 2, unit: TimeUnit.HOUR },
    ],
  },
  {
    id: 7,
    unit: TimeUnit.DAY,
    linkage: [
      { id: 30, unit: TimeUnit.MINUTE },
      { id: 1, unit: TimeUnit.HOUR },
      { id: 2, unit: TimeUnit.HOUR },
      { id: 5, unit: TimeUnit.HOUR },
      { id: 10, unit: TimeUnit.HOUR },
      { id: 12, unit: TimeUnit.HOUR },
      { id: 1, unit: TimeUnit.DAY },
    ],
  },
  {
    id: 30,
    unit: TimeUnit.DAY,
    linkage: [
      { id: 2, unit: TimeUnit.HOUR },
      { id: 5, unit: TimeUnit.HOUR },
      { id: 10, unit: TimeUnit.HOUR },
      { id: 12, unit: TimeUnit.HOUR },
      { id: 1, unit: TimeUnit.DAY },
    ],
  },
].map((item) => {
  return {
    value: item.id * unitConversion[item.unit],
    label: item.id,
    unit: item.unit,
    linkage: item.linkage.map((item) => {
      return {
        value: item.id * unitConversion[item.unit],
        label: item.id,
        unit: item.unit,
      }
    }),
  }
})

export enum FormFieldEnum {
  INTERVAL = 'interval',
  EFFECT_SCOPE = 'effectScope',
  QUERY_TYPE = 'queryType',
  AGG = 'agg',
  UNIT = 'unit',
}

export function getPacketIntervalByValue(value: number) {
  return intervalOption.find(item => item.value === value)?.linkage.map(item => ({ ...item, label: item.label + t(unitLabelMapping[item.unit]) })) || []
}
const getTypeOptions = () => [
  { label: t('realTime'), value: SocketSubscriberEnum.TS_SUB_CMDS },
  { label: t('history'), value: SocketSubscriberEnum.HISTORY_CMDS },
]

// 是否隐藏单位
export const formSchemas = (chartType?: ChartComponentEnum): FormSchema[] => {
  const options = getTypeOptions().filter((item) => {
    if (chartType === ChartComponentEnum.INSTRUMENT)
      return item.value === SocketSubscriberEnum.TS_SUB_CMDS

    if (chartType === ChartComponentEnum.HISTOGRAM)
      return item.value === SocketSubscriberEnum.HISTORY_CMDS

    return item
  })
  return [
    {
      label: t('dataType'),
      field: FormFieldEnum.QUERY_TYPE,
      component: ComponentEnum.RADIO_GROUP,
      required: true,
      defaultValue: options?.[0].value,
      componentProps: {
        options,
      },
    },
    {
      label: t('cycleTime'),
      field: FormFieldEnum.EFFECT_SCOPE,
      component: ComponentEnum.SELECT,
      defaultValue: 1000,
      componentProps({ formModel, formActionType }) {
        return {
          options: intervalOption.map(item => ({ ...item, label: item.label + t(unitLabelMapping[item.unit]) })),
          allowClear: false,
          onSelect() {
            const { setFieldsValue } = formActionType
            const options = getPacketIntervalByValue(formModel.effectScope)
            setFieldsValue({ [FormFieldEnum.INTERVAL]: options?.[0].value })
          },
        }
      },
    },
    {
      label: t('aggMethod'),
      field: FormFieldEnum.AGG,
      component: ComponentEnum.SELECT,
      defaultValue: AggregateTypeEnum.AVG,
      componentProps: {
        getPopupContainer: () => document.body,
        allowClear: false,
        options: Object.keys(AggregateTypeEnum).map(value => ({ label: t(AggregateTypeNameEnum[value as AggregateTypeEnum]), value })),
      },
    },
    {
      label: t('intervalTime'),
      field: FormFieldEnum.INTERVAL,
      component: ComponentEnum.SELECT,
      defaultValue: 1000,
      componentProps({ formModel }) {
        const options = getPacketIntervalByValue(formModel.effectScope)
        return {
          options,
          allowClear: false,
          getPopupContainer: () => document.body,
        }
      },
    },
    {
      label: t('unitText'),
      field: FormFieldEnum.UNIT,
      component: ComponentEnum.INPUT,
      ifShow: chartType === ChartComponentEnum.INSTRUMENT,
      defaultValue: '℃',
      componentProps: {
        allowClear: false,
        getPopupContainer: () => document.body,

      },
    },

  ]
}