import React, { useEffect, useState } from 'react'; import { Button, Form, Input, Modal, Select, Row, Col, Space, Tooltip, Switch } from 'antd'; import { SENSITIVE_LEVEL_OPTIONS, TAG_DEFINE_TYPE } from '../constant'; import { StatusEnum } from '../enum'; import { formLayout } from '@/components/FormHelper/utils'; import SqlEditor from '@/components/SqlEditor'; import InfoTagList from './InfoTagList'; import { ISemantic } from '../data'; import { DIM_OPTIONS, EnumDataSourceType, PARTITION_TIME_FORMATTER, DATE_FORMATTER, } from '@/pages/SemanticModel/Datasource/constants'; import { InfoCircleOutlined } from '@ant-design/icons'; import { createDimension, updateDimension, mockDimensionAlias, batchCreateTag, batchDeleteTag, } from '../service'; import FormItemTitle from '@/components/FormHelper/FormItemTitle'; import { message } from 'antd'; import { values } from 'lodash'; export type CreateFormProps = { modelId: number; domainId: number; dimensionItem?: ISemantic.IDimensionItem; onCancel: () => void; bindModalVisible: boolean; dataSourceList: any[]; onSubmit: (values?: any) => void; }; const FormItem = Form.Item; const { Option } = Select; const { TextArea } = Input; const DimensionInfoModal: React.FC = ({ domainId, modelId, onCancel, bindModalVisible, dimensionItem, dataSourceList, onSubmit: handleUpdate, }) => { const isEdit = !!dimensionItem?.id; const [dimensionValueSettingList, setDimensionValueSettingList] = useState< ISemantic.IDimensionValueSettingItem[] >([]); const [form] = Form.useForm(); const { setFieldsValue, resetFields } = form; const [llmLoading, setLlmLoading] = useState(false); const [formData, setFormData] = useState(); const handleSubmit = async ( isSilenceSubmit = false, dimValueMaps?: ISemantic.IDimensionValueSettingItem[], ) => { const fieldsValue = await form.validateFields(); await saveDimension( { ...fieldsValue, dimValueMaps: dimValueMaps || dimensionValueSettingList, alias: Array.isArray(fieldsValue.alias) ? fieldsValue.alias.join(',') : '', }, isSilenceSubmit, ); }; const saveDimension = async (fieldsValue: any, isSilenceSubmit = false) => { const queryParams = { modelId: isEdit ? dimensionItem.modelId : modelId, type: 'categorical', ...fieldsValue, }; let saveDimensionQuery = createDimension; if (queryParams.id) { saveDimensionQuery = updateDimension; } const { code, msg, data } = await saveDimensionQuery(queryParams); if (code === 200) { if (queryParams.isTag) { queryBatchExportTag(data.id || dimensionItem?.id); } if (dimensionItem?.id && !queryParams.isTag) { queryBatchDeleteTag(dimensionItem); } if (!isSilenceSubmit) { message.success('编辑维度成功'); handleUpdate(fieldsValue); } return; } message.error(msg); }; const queryBatchDeleteTag = async (dimensionItem: ISemantic.IDimensionItem) => { const { code, msg } = await batchDeleteTag([ { itemIds: [dimensionItem.id], tagDefineType: TAG_DEFINE_TYPE.DIMENSION, }, ]); if (code === 200) { return; } message.error(msg); }; const queryBatchExportTag = async (id: number) => { const { code, msg } = await batchCreateTag([ { itemId: id, tagDefineType: TAG_DEFINE_TYPE.DIMENSION }, ]); if (code === 200) { return; } message.error(msg); }; const setFormVal = () => { if (dimensionItem) { const { alias } = dimensionItem; const dimensionData = { ...dimensionItem, alias: alias && alias.trim() ? alias.split(',') : [], }; setFieldsValue(dimensionData); setFormData(dimensionData); } }; useEffect(() => { if (dimensionItem) { setFormVal(); if (Array.isArray(dimensionItem.dimValueMaps)) { setDimensionValueSettingList(dimensionItem.dimValueMaps); } else { setDimensionValueSettingList([]); } } else { resetFields(); } if (!isEdit && Array.isArray(dataSourceList) && dataSourceList[0]?.id) { setFieldsValue({ datasourceId: dataSourceList[0].id }); } }, [dimensionItem, dataSourceList]); const renderFooter = () => { return ( <> ); }; const generatorDimensionAlias = async () => { const fieldsValue = await form.validateFields(); setLlmLoading(true); const { code, data } = await mockDimensionAlias({ ...dimensionItem, ...fieldsValue, alias: fieldsValue.alias?.join(','), }); setLlmLoading(false); const formAlias = form.getFieldValue('alias'); setLlmLoading(false); if (code === 200) { form.setFieldValue('alias', Array.from(new Set([...formAlias, ...data]))); } else { message.error('大语言模型解析异常'); } }; const renderContent = () => { return ( <> {DIM_OPTIONS.map((item) => ( ))} {formData?.type && [EnumDataSourceType.PARTITION_TIME, EnumDataSourceType.TIME].includes(formData.type) && ( )} {/*