config.ts 4.69 KB
import { unref } from 'vue'
import { getDeviceAttributes, getListByConfigurationId, getListByDeviceProfileIds } from '@/api/device'
import type { DeviceItemType, ThingsModelItemType } from '@/api/device/model'
import type { FormSchema } from '@/components/Form'
import { ComponentEnum } from '@/components/Form/src/enum'
import { ContentDataFieldsEnum, ContentDataFieldsNameEnum } from '@/enums/datasource'
import { useContentDataStoreWithOut } from '@/store/modules/contentData'
import type { ProductAndDevice } from '@/api/content/model'
import { ControlComponentEnum } from '@/core/Library/packages/Control'
import { useParseParams } from '@/core/LoadData'
import { DataTypeEnum } from '@/enums/objectModelEnum'
import { useTranslation } from '@/hooks/useTranslation'

const contentDataStore = useContentDataStoreWithOut()
const { t } = useTranslation()
export const formSchemas = (componentKey?: string): FormSchema[] => {
  const isTemplate = contentDataStore.isTemplate // 判断是否是模板组态
  const isTemplateLink = contentDataStore.getIsTemplateLink
  const params = useParseParams()
  const { configurationId } = params
  return [
    {
      field: ContentDataFieldsEnum.DEVICE_PROFILE_ID,
      label: t(ContentDataFieldsNameEnum.DEVICE_PROFILE_ID),
      component: ComponentEnum.INPUT,
      ifShow: false,
    },
    {
      field: ContentDataFieldsEnum.DEVICE_PROFILE_TEMPLATE_ID, // 模板产品id
      label: t(ContentDataFieldsNameEnum.DEVICE_PROFILE_ID),
      component: ComponentEnum.API_SELECT,
      ifShow: !!isTemplate,
      required: !!isTemplate,
      componentProps: ({ formModel }) => {
        return {
          options: (unref(contentDataStore.getProductAndDevice) || []).map((item: ProductAndDevice) => ({ label: item.profileName || item.name, value: item.profileId, transportType: item?.transportType, deviceType: item?.deviceType })),
          onSelect(value: string) {
            formModel[ContentDataFieldsEnum.DEVICE_PROFILE_ID] = value
            formModel[ContentDataFieldsEnum.ATTR] = []
          },
          getPopupContainer: () => document.body,
        }
      },
    },
    {
      field: ContentDataFieldsEnum.DEVICE_ID,
      label: t(ContentDataFieldsNameEnum.DEVICE_ID),
      component: ComponentEnum.API_SELECT,
      ifShow: !isTemplate,
      required: !isTemplate,
      componentProps: ({ formModel }) => {
        const organizationId = window.useParseParams().organizationId
        if (!organizationId) return
        return {
          showSearch: true,
          api: async (params: Recordable) => {
            if (isTemplateLink) return await getListByConfigurationId(configurationId!)
            return await getListByDeviceProfileIds(params)
          },
          params: {
            deviceProfileIds: unref(contentDataStore.getProductIds),
            organizationId,
          },
          aliasField: 'alias',
          fieldNames: { label: 'name', value: 'tbDeviceId' },
          onSelect(value: string, option: DeviceItemType) {
            formModel[ContentDataFieldsEnum.DEVICE_PROFILE_ID] = value ? option.deviceProfileId : null
            formModel[ContentDataFieldsEnum.ATTR] = []
            formModel[ContentDataFieldsEnum.DEVICE_NAME] = value ? option.alias || option.name : ''
          },
          filterOption: (inputValue: string, option: DeviceItemType) => {
            return option.alias?.includes?.(inputValue) || option.name?.includes?.(inputValue)
          },
        }
      },
    },
    {
      field: ContentDataFieldsEnum.DEVICE_NAME,
      label: t(ContentDataFieldsNameEnum.deviceName),
      component: ComponentEnum.INPUT,
      ifShow: false,
    },
    {
      field: ContentDataFieldsEnum.ATTR,
      label: t(ContentDataFieldsNameEnum.ATTR),
      component: ComponentEnum.API_SELECT,
      required: true,
      componentProps: ({ formModel }) => {
        const deviceProfileId = isTemplate ? formModel[ContentDataFieldsEnum.DEVICE_PROFILE_TEMPLATE_ID] : formModel[ContentDataFieldsEnum.DEVICE_PROFILE_ID]
        return {
          showSearch: true,
          mode: 'multiple',
          api: async (params: string) => {
            if (!deviceProfileId) return []
            const options = await getDeviceAttributes(params)
            if (componentKey === ControlComponentEnum.SWITCH) { // 开关只返回bool
              return options.filter((item) => {
                return item.detail.dataType.type === DataTypeEnum.BOOL
              })
            }
            return options
          },
          params: deviceProfileId,
          fieldNames: { label: 'name', value: 'identifier' },
          filterOption: (inputValue: string, option: ThingsModelItemType) => {
            return option.name.includes(inputValue)
          },
        }
      },
    },
  ]
}