datasource.config.ts 4.58 KB
import { getCameraList } from '/@/api/camera/cameraManager';
import { CameraModel } from '/@/api/camera/model/cameraModel';
import { FormSchema } from '/@/components/Form';
import { AccessMode } from '/@/views/camera/manage/config.data';

export enum FormFieldEnum {
  VIDEO_TYPE = 'type',
  VIDEO_PLAY_URL = 'url',
  VIDEO_CONFIG = 'videoConfig',
  ACCESS_MODE = 'accessMode',
  VIDEO_ID = 'id',
  ORGANIZATION_ID = 'organizationId',

  DEVICE_ID = 'deviceId',
  CHANNEL_ID = 'channelId',
  PLAY_PROTOCOL = 'playProtocol',
}

export interface DataSourceValueType {
  [FormFieldEnum.VIDEO_TYPE]?: string;
  [FormFieldEnum.VIDEO_PLAY_URL]?: string;
  [FormFieldEnum.ACCESS_MODE]?: number;
  [FormFieldEnum.VIDEO_ID]?: string;
  [FormFieldEnum.ORGANIZATION_ID]?: string;
}

export enum VideoOriginalEnum {
  CUSTOM = 'CUSTOM',
  VIDEO_MANAGE = 'VIDEO_MANAGE',
}

export enum VideoOriginalNameEnum {
  CUSTOM = '自定义',
  VIDEO_MANAGE = '平台获取',
}

export const formSchemas: FormSchema[] = [
  {
    field: FormFieldEnum.VIDEO_TYPE,
    component: 'Select',
    label: '视频来源',
    colProps: { span: 8 },
    defaultValue: VideoOriginalEnum.CUSTOM,
    componentProps: ({ formActionType }) => {
      const { setFieldsValue } = formActionType;
      return {
        placeholder: '请选择视频来源',
        options: Object.keys(VideoOriginalEnum).map((value) => ({
          label: VideoOriginalNameEnum[value],
          value,
        })),
        onChange() {
          setFieldsValue({
            [FormFieldEnum.ACCESS_MODE]: null,
            [FormFieldEnum.ORGANIZATION_ID]: null,
            [FormFieldEnum.VIDEO_PLAY_URL]: null,
            [FormFieldEnum.VIDEO_ID]: null,
          });
        },
      };
    },
  },
  {
    field: FormFieldEnum.ACCESS_MODE,
    component: 'InputNumber',
    label: '视频流获取方式',
    show: false,
  },
  {
    field: FormFieldEnum.VIDEO_PLAY_URL,
    component: 'Input',
    label: '地址',
    colProps: { span: 16 },
    ifShow: ({ model }) => model[FormFieldEnum.VIDEO_TYPE] === VideoOriginalEnum.CUSTOM,
    componentProps: {
      placeholder: '请输入自定义地址',
    },
  },
  {
    field: FormFieldEnum.ORGANIZATION_ID,
    component: 'OrgTreeSelect',
    label: '组织',
    colProps: { span: 8 },
    ifShow: ({ model }) => model[FormFieldEnum.VIDEO_TYPE] === VideoOriginalEnum.VIDEO_MANAGE,
    componentProps: ({ formActionType }) => {
      const { setFieldsValue } = formActionType;
      return {
        showCreate: false,
        allowClean: true,
        apiTreeSelectProps: {
          params: { organizationId: location?.pathname?.split('/')?.pop() || '' },
        },
        onChange() {
          setFieldsValue({
            [FormFieldEnum.ACCESS_MODE]: null,
            [FormFieldEnum.VIDEO_PLAY_URL]: null,
            [FormFieldEnum.VIDEO_ID]: null,
            [FormFieldEnum.DEVICE_ID]: null,
            [FormFieldEnum.CHANNEL_ID]: null,
          });
        },
      };
    },
  },
  {
    field: FormFieldEnum.VIDEO_ID,
    component: 'ApiSelect',
    label: '地址',
    colProps: { span: 8 },
    ifShow: ({ model }) => model[FormFieldEnum.VIDEO_TYPE] === VideoOriginalEnum.VIDEO_MANAGE,
    componentProps: ({ formActionType, formModel }) => {
      const { setFieldsValue } = formActionType;
      const organizationId = formModel[FormFieldEnum.ORGANIZATION_ID];
      return {
        placeholder: '请选择视频',
        params: { organizationId },
        api: async (params: Record<'organizationId', string>) => {
          if (!params.organizationId) return [];
          return await getCameraList(params);
        },
        labelField: 'name',
        valueField: 'id',
        resultField: 'data',
        onChange(_: string, options: CameraModel) {
          const accessMode = options?.accessMode;
          setFieldsValue({
            [FormFieldEnum.ACCESS_MODE]: accessMode,
            [FormFieldEnum.VIDEO_PLAY_URL]: options?.videoUrl,
            [FormFieldEnum.CHANNEL_ID]:
              accessMode === AccessMode.GBT28181 ? options.params?.channelNo : null,
            [FormFieldEnum.DEVICE_ID]:
              accessMode === AccessMode.GBT28181 ? options.params?.deviceId : null,
            [FormFieldEnum.PLAY_PROTOCOL]: options?.playProtocol,
          });
        },
      };
    },
  },
  {
    field: FormFieldEnum.DEVICE_ID,
    label: '设备Id',
    component: 'Input',
    ifShow: false,
  },
  {
    field: FormFieldEnum.CHANNEL_ID,
    label: '通道号',
    component: 'Input',
    ifShow: false,
  },
  {
    field: FormFieldEnum.PLAY_PROTOCOL,
    label: '播放协议',
    component: 'InputNumber',
    ifShow: false,
  },
];