From c34c3ecf09cd06e5fa3726027d82cda2ff310d13 Mon Sep 17 00:00:00 2001 From: tristanliu <37809633+sevenliu1896@users.noreply.github.com> Date: Fri, 27 Sep 2024 15:06:24 +0800 Subject: [PATCH] [improvement][headless-fe] Added a connectivity test for large models in the system settings (#1723) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [improvement][semantic-fe] Fixing the API for the indicator list by changing "current" to "pageNum" * [improvement][semantic-fe] Fixing the default value setting for the indicator list * [improvement][semantic-fe] Adding batch operations for indicators/dimensions/models * [improvement][semantic-fe] Replacing the single status update API for indicators/dimensions with a batch update API * [improvement][semantic-fe] Redesigning the indicator homepage to incorporate trend charts and table functionality for indicators * [improvement][semantic-fe] Optimizing the logic for setting dimension values and editing data sources, and adding system settings functionality * [improvement][semantic-fe] Upgrading antd version to 5.x, extracting the batch operation button component, optimizing the interaction for system settings, and expanding the configuration generation types for list-to-select component. * [improvement][semantic-fe] Adding the ability to filter dimensions based on whether they are tags or not. * [improvement][semantic-fe] Adding the ability to edit relationships between models in the canvas. * [improvement][semantic-fe] Updating the datePicker component to use dayjs instead. * [improvement][semantic-fe] Fixing the issue with passing the model ID for dimensions in the indicator market. * [improvement][semantic-fe] Fixing the abnormal state of the popup when creating a model. * [improvement][semantic-fe] Adding permission logic for bulk operations in the indicator market. * [improvement][semantic-fe] Adding the ability to download and transpose data. * [improvement][semantic-fe] Fixing the initialization issue with the date selection component in the indicator details page when switching time granularity. * [improvement][semantic-fe] Fixing the logic error in the dimension value setting. * [improvement][semantic-fe] Fixing the synchronization issue with the question and answer settings information. * [improvement][semantic-fe] Optimizing the canvas functionality for better performance and user experience. * [improvement][semantic-fe] Optimizing the update process for drawing model relationship edges in the canvas. * [improvement][semantic-fe] Changing the line type for canvas connections. * [improvement][semantic-fe] Replacing the initialization variable from "semantic" to "headless". * [improvement][semantic-fe] Fixing the missing migration issue for default drill-down dimension configuration in model editing. Additionally, optimizing the data retrieval method for initializing fields in the model. * [improvement][semantic-fe] Updating the logic for the fieldName. * [improvement][semantic-fe] Adjusting the position of the metrics tab. * [improvement][semantic-fe] Changing the 字段名称 to 英文名称. * [improvement][semantic-fe] Fix metric measurement deletion. * [improvement][semantic-fe] UI optimization for metric details page. * [improvement][semantic-fe] UI optimization for metric details page. * [improvement][semantic-fe] UI adjustment for metric details page. * [improvement][semantic-fe] The granularity field in the time type of model editing now supports setting it as empty. * [improvement][semantic-fe] Added field type and metric type to the metric creation options. * [improvement][semantic-fe] The organization structure selection feature has been added to the permission management. * [improvement][semantic-fe] Improved user experience for the metric list. * [improvement][semantic-fe] fix update the metric list. * [improvement][headless-fe] Added view management functionality. * [improvement][headless-fe] The view management functionality has been added. This feature allows users to create, edit, and manage different views within the system. * [improvement][headless-fe] Added model editing side effect detection. * [improvement][headless-fe] Fixed the logic error in view editing. * [improvement][headless-fe] Fixed the issue with initializing dimension associations in metric settings. * [improvement][headless-fe] Added the ability to hide the Q&A settings entry point. * [improvement][headless-fe] Fixed the issue with selecting search results in metric field creation. * [improvement][headless-fe] Added search functionality to the field list in model editing. * [improvement][headless-fe] fix the field list in model editing * [improvement][headless-fe] Restructured the data for the dimension value settings interface. * [improvement][headless-fe] Added dynamic variable functionality to model creation based on SQL scripts. * [improvement][headless-fe] Added support for passing dynamic variables as parameters in the executeSql function. * [improvement][headless-fe] Resolved the issue where users were unable to select all options for dimensions, metrics, and fields in the metric generation process. * [improvement][headless-fe] Replaced the term "view" with "dataset" * [improvement][headless-fe] Added the ability to export metrics and dimensions to a specific target. * [improvement][headless-fe] Enhanced dataset creation to support the tag mode. * [improvement][headless-fe] Added tag value setting. * [improvement][headless-fe] Optimized the tag setting system. * [improvement][headless-fe] Optimized the tag setting system. * [improvement][headless-fe] Updated the data initialization for model editing to use API requests instead. * [improvement][headless-fe] Added search functionality to model management. * [improvement][headless-fe] Removed field null validation during model editing. * [improvement][headless-fe] Updated the batch operation button component. * [improvement][headless-fe] Optimized the logic for initializing indicators in dimension value settings. * [improvement][headless-fe] Adjusted the length of the input field for model editing names. * [improvement][headless-fe] Lock the version of the @ant-design/pro-table component and replace it with @ant-design/pro-components. * [improvement][headless-fe] Optimized the style of the metrics market and tags market. * [improvement][headless-fe] The quick creation of model fields now defaults to using the "comment" field for filling. * [improvement][headless-fe] The quick creation of model fields now defaults to using the "comment" field for filling * [improvement][headless-fe] The quick creation of model fields now defaults to using the "comment" field for filling. * [improvement][headless-fe] Fixed the issue where the conditions for metric measurement creation were not being saved correctly. * [improvement][headless-fe] Default value setting for hiding dimensions. * [improvement][headless-fe] Updated the file imports in the project. * [improvement][headless-fe] Adjusted the logic for displaying the tab in the theme domain. * [improvement][headless-fe] Added term management functionality. * [improvement][headless-fe] When creating a model, the current metric operator now allows for clearance. * [improvement][headless-fe] Term management interface transformation * [improvement][headless-fe] Migrating scaffold version to @umi/max * [improvement][headless-fe] remove modle column * [improvement][headless-fe] 1.Added configuration for the large language model in the agent; 2.upgraded React version from 17 to 18; 3.modified some UI effects. * [improvement][headless-fe] Added a simplified mode to the question-answering system. * [improvement][headless-fe] remove pnpm-lock * [improvement][headless-fe] add pnpm-lock * [improvement][headless-fe] Fixed the issue with passing the modelId during initialization. * [improvement][headless-fe] Fixed the issue with abnormal comments during model creation. * [improvement][headless-fe] fix build bugs * [improvement][headless-fe] change build config * [improvement][headless-fe] route config change * [improvement][headless-fe] Optimized data updating when switching domains. * [improvement][headless-fe] css change * [improvement][semantic-fe] logo css change * [improvement][semantic-fe] system config add defaultValue support * [improvement][semantic-fe] tag mode wording change * [improvement][semantic-fe] fix metric edit page init error * [improvement][supersonic-fe] Updated the way chat projects are imported in supersonic-fe. * [improvement][chat-engine] Added a background silent mode for watching chat projects. * [improvement][supersonic-fe] fix proxy url * [improvement][headless-fe] agent setting update * [improvement][headless-fe] Agent configuration: Added connectivity testing for large models. * [improvement][headless-fe] Chat: Enabled integration with agent configuration. * [improvement][headless-fe] SQL formatter: Updated the import method. * [improvement][headless-fe] login fixed * [improvement][headless-fe] Agent: Optimized the logic for saving. * [improvement][headless-fe] Model management: Integrated into the main theme domain. * [improvement][headless-fe] Sensitivity: Added bulk modification functionality. * [improvement][headless-fe] wording change * [improvement][headless-fe] Prompt configuration: Added the ability to configure prompts. * [improvement][headless-fe] Added the ability to configure embedding models. * [improvement][headless-fe] hidden configure embedding models. * [improvement][headless-fe] Connection test prompt update for large language model settings. * [improvement][headless-fe] add memory review config * [improvement][headless-fe] Rollback of data structure for large language model configuration. * [improvement][headless-fe] Added dependency relationships between various items in system configuration. * [improvement][headless-fe] Added password parsing to the generation rules of system settings. * [improvement][headless-fe] Added slider parsing to the generation rules of system settings. * [improvement][headless-fe] Optimized the logic for initializing values in system settings. * [improvement][headless-fe] Optimized the time format * [improvement][headless-fe] Unified the SQL generation method for data sets to ensure consistency and improve efficiency. * [improvement][headless-fe] Added support for data sets with non-partitioned time fields * [improvement][headless-fe] Added support for editing time formats in dimension settings * [improvement][headless-fe] Rolled back the time parameter in the metric details page to its previous state * [improvement][headless-fe] Fixed the issue with hidden field validation when editing dimensions * [improvement][headless-fe] Added a connectivity test for large models in the system settings --------- Co-authored-by: tristanliu --- .../src/components/ChatItem/ParseTip.tsx | 2 +- webapp/packages/supersonic-fe/config/proxy.ts | 3 +- .../src/pages/Agent/AgentForm.tsx | 2 +- .../supersonic-fe/src/pages/Agent/service.ts | 7 - .../supersonic-fe/src/pages/Agent/type.ts | 2 +- .../SemanticModel/Datasource/constants.ts | 2 +- .../pages/SemanticModel/OverviewContainer.tsx | 37 ++-- .../View/components/DataSetTable.tsx | 30 +-- .../View/components/DefaultSettingForm.tsx | 155 +++++++------- .../components/DefaultSettingForm_tag.tsx | 190 ------------------ .../components/ViewModelConfigTransfer.tsx | 26 +-- .../View/components/ViewSearchFormModal.tsx | 32 ++- .../components/ViewSearchFormModal_tag.tsx | 179 ----------------- .../src/pages/SemanticModel/View/index.tsx | 13 +- .../components/DomainManagerTab.tsx | 35 +--- .../Entity/RecommendedQuestionsSection.tsx | 87 -------- .../src/pages/SemanticModel/data.d.ts | 6 +- .../src/pages/SemanticModel/enum.ts | 18 ++ .../src/pages/SemanticModel/service.ts | 2 +- .../supersonic-fe/src/pages/System/index.tsx | 39 +++- .../supersonic-fe/src/services/system.ts | 8 + 21 files changed, 249 insertions(+), 626 deletions(-) delete mode 100644 webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DefaultSettingForm_tag.tsx delete mode 100644 webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/ViewSearchFormModal_tag.tsx delete mode 100644 webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/RecommendedQuestionsSection.tsx create mode 100644 webapp/packages/supersonic-fe/src/services/system.ts diff --git a/webapp/packages/chat-sdk/src/components/ChatItem/ParseTip.tsx b/webapp/packages/chat-sdk/src/components/ChatItem/ParseTip.tsx index f0066f6f0..54b859cf6 100644 --- a/webapp/packages/chat-sdk/src/components/ChatItem/ParseTip.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatItem/ParseTip.tsx @@ -187,7 +187,7 @@ const ParseTip: React.FC = ({
查询模式:
- {queryType === 'METRIC' || queryType === 'METRIC_TAG' ? '指标模式' : '明细模式'} + {queryType === 'METRIC' || queryType === 'METRIC_TAG' ? '聚合模式' : '明细模式'}
)} diff --git a/webapp/packages/supersonic-fe/config/proxy.ts b/webapp/packages/supersonic-fe/config/proxy.ts index 166919713..7d956b9a4 100644 --- a/webapp/packages/supersonic-fe/config/proxy.ts +++ b/webapp/packages/supersonic-fe/config/proxy.ts @@ -1,7 +1,8 @@ export default { dev: { '/api/': { - target: 'http://localhost:9080', + target: 'http://10.91.210.65:9080', + // target: 'http://s2.tmeoa.com', changeOrigin: true, }, }, diff --git a/webapp/packages/supersonic-fe/src/pages/Agent/AgentForm.tsx b/webapp/packages/supersonic-fe/src/pages/Agent/AgentForm.tsx index 5883c6e8e..9e7f6c437 100644 --- a/webapp/packages/supersonic-fe/src/pages/Agent/AgentForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/Agent/AgentForm.tsx @@ -20,7 +20,7 @@ import { DeleteOutlined, PlusOutlined } from '@ant-design/icons'; import { uuid, jsonParse, encryptPassword, decryptPassword } from '@/utils/utils'; import ToolsSection from './ToolsSection'; import globalStyles from '@/global.less'; -import { testLLMConn } from './service'; +import { testLLMConn } from '../../services/system'; import MemorySection from './MemorySection'; const FormItem = Form.Item; diff --git a/webapp/packages/supersonic-fe/src/pages/Agent/service.ts b/webapp/packages/supersonic-fe/src/pages/Agent/service.ts index 5be555052..4c6fe3e60 100644 --- a/webapp/packages/supersonic-fe/src/pages/Agent/service.ts +++ b/webapp/packages/supersonic-fe/src/pages/Agent/service.ts @@ -35,13 +35,6 @@ export function getMetricList(modelId: number) { }); } -export function testLLMConn(data: any) { - return request>('/api/chat/agent/testLLMConn', { - method: 'POST', - data, - }); -} - export function getMemeoryList(agentId: number, chatMemoryFilter: any, current: number) { return request>('/api/chat/memory/pageMemories', { method: 'POST', diff --git a/webapp/packages/supersonic-fe/src/pages/Agent/type.ts b/webapp/packages/supersonic-fe/src/pages/Agent/type.ts index 9195a1815..0d514a6df 100644 --- a/webapp/packages/supersonic-fe/src/pages/Agent/type.ts +++ b/webapp/packages/supersonic-fe/src/pages/Agent/type.ts @@ -32,7 +32,7 @@ export enum QueryModeEnum { export const QUERY_MODE_LIST = [ { - label: '指标模式', + label: '聚合模式', value: QueryModeEnum.METRIC, }, { diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/constants.ts b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/constants.ts index 5727b1c67..6e3304bee 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/constants.ts +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/constants.ts @@ -39,7 +39,7 @@ export const DIM_OPTIONS = [ value: EnumDataSourceType.TIME, }, { - label: '分区时间', + label: '数据时间', value: EnumDataSourceType.PARTITION_TIME, }, ]; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx index 88103390d..28bdf3315 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx @@ -5,14 +5,17 @@ import DomainListTree from './components/DomainList'; import styles from './components/style.less'; import { LeftOutlined, RightOutlined } from '@ant-design/icons'; import { ISemantic } from './data'; -import { getDomainList } from './service'; +import { getDomainList, getDataSetList } from './service'; import DomainManagerTab from './components/DomainManagerTab'; +import { isArrayOfValues } from '@/utils/utils'; type Props = { mode: 'domain'; }; const OverviewContainer: React.FC = ({ mode }) => { + const defaultTabKey = 'dataSetManage'; + // 'overview' const params: any = useParams(); const domainId = params.domainId; const modelId = params.modelId; @@ -32,10 +35,11 @@ const OverviewContainer: React.FC = ({ mode }) => { const { MrefreshDimensionList } = dimensionModel; const { MrefreshMetricList } = metricModel; const { MrefreshDatabaseList } = databaseModel; - const menuKey = params.menuKey ? params.menuKey : !Number(modelId) ? 'overview' : ''; + const menuKey = params.menuKey ? params.menuKey : !Number(modelId) ? defaultTabKey : ''; const [isModel, setIsModel] = useState(false); const [collapsedState, setCollapsedState] = useState(true); const [activeKey, setActiveKey] = useState(menuKey); + const [dataSetList, setDataSetList] = useState([]); const initSelectedDomain = (domainList: ISemantic.IDomainItem[]) => { const targetNode = domainList.filter((item: any) => { @@ -80,21 +84,25 @@ const OverviewContainer: React.FC = ({ mode }) => { return; } queryModelList(); + queryDataSetList(); }, [selectDomainId]); - const queryModelList = async () => { - const list = await MrefreshModelList(selectDomainId); - const model = list.filter((item: any) => { - return `${item.id}` === modelId; - })[0]; - if (model) { - setSelectModel(model); - setActiveKey(menuKey); - setIsModel(true); - pushUrlMenu(model.domainId, model.id, menuKey); + const queryDataSetList = async () => { + const { code, data, msg } = await getDataSetList(selectDomainId); + if (code === 200) { + setDataSetList(data); + if (!isArrayOfValues(data)) { + setActiveKey('overview'); + } + } else { + message.error(msg); } }; + const queryModelList = async () => { + await MrefreshModelList(selectDomainId); + }; + useEffect(() => { if (!selectDomainId) { return; @@ -134,8 +142,8 @@ const OverviewContainer: React.FC = ({ mode }) => { const cleanModelInfo = (domainId) => { setIsModel(false); - setActiveKey('overview'); - pushUrlMenu(domainId, 0, 'overview'); + setActiveKey(defaultTabKey); + pushUrlMenu(domainId, 0, defaultTabKey); setSelectModel(undefined); }; @@ -180,6 +188,7 @@ const OverviewContainer: React.FC = ({ mode }) => { isModel={isModel} activeKey={activeKey} modelList={modelList} + dataSetList={dataSetList} handleModelChange={(model) => { handleModelChange(model); MrefreshModelList(selectDomainId); diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DataSetTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DataSetTable.tsx index 74dc7128e..3e0def38b 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DataSetTable.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DataSetTable.tsx @@ -4,7 +4,7 @@ import { message, Button, Space, Popconfirm } from 'antd'; import React, { useRef, useState, useEffect } from 'react'; import { StatusEnum } from '../../enum'; import { useModel } from '@umijs/max'; -import { deleteView, updateView, getViewList, getAllModelByDomainId } from '../../service'; +import { deleteView, updateView, getDataSetList, getAllModelByDomainId } from '../../service'; import ViewCreateFormModal from './ViewCreateFormModal'; import moment from 'moment'; import styles from '../../components/style.less'; @@ -13,15 +13,15 @@ import { ColumnsConfig } from '../../components/TableColumnRender'; import ViewSearchFormModal from './ViewSearchFormModal'; type Props = { + dataSetList: ISemantic.IDatasetItem[]; disabledEdit?: boolean; - modelList: ISemantic.IModelItem[]; }; -const DataSetTable: React.FC = ({ disabledEdit = false }) => { +const DataSetTable: React.FC = ({ dataSetList, disabledEdit = false }) => { const domainModel = useModel('SemanticModel.domainData'); const { selectDomainId } = domainModel; - const [viewItem, setViewItem] = useState(); + const [viewItem, setViewItem] = useState(); const [saveLoading, setSaveLoading] = useState(false); const [loading, setLoading] = useState(false); const [createDataSourceModalOpen, setCreateDataSourceModalOpen] = useState(false); @@ -29,29 +29,33 @@ const DataSetTable: React.FC = ({ disabledEdit = false }) => { const [modelList, setModelList] = useState([]); const actionRef = useRef(); - const updateViewStatus = async (modelData: ISemantic.IViewItem) => { + const updateViewStatus = async (modelData: ISemantic.IDatasetItem) => { setSaveLoading(true); const { code, msg } = await updateView({ ...modelData, }); setSaveLoading(false); if (code === 200) { - queryViewList(); + queryDataSetList(); } else { message.error(msg); } }; - const [viewList, setViewList] = useState([]); + const [viewList, setViewList] = useState(dataSetList); useEffect(() => { - queryViewList(); + setViewList(dataSetList); + }, [dataSetList]); + + useEffect(() => { + // queryDataSetList(); queryDomainAllModel(); }, [selectDomainId]); - const queryViewList = async () => { + const queryDataSetList = async () => { setLoading(true); - const { code, data, msg } = await getViewList(selectDomainId); + const { code, data, msg } = await getDataSetList(selectDomainId); setLoading(false); if (code === 200) { setViewList(data); @@ -175,7 +179,7 @@ const DataSetTable: React.FC = ({ disabledEdit = false }) => { onConfirm={async () => { const { code, msg } = await deleteView(record.id); if (code === 200) { - queryViewList(); + queryDataSetList(); } else { message.error(msg); } @@ -227,7 +231,7 @@ const DataSetTable: React.FC = ({ disabledEdit = false }) => { viewItem={viewItem} modelList={modelList} onSubmit={() => { - queryViewList(); + queryDataSetList(); setCreateDataSourceModalOpen(false); }} onCancel={() => { @@ -241,7 +245,7 @@ const DataSetTable: React.FC = ({ disabledEdit = false }) => { domainId={selectDomainId} viewItem={viewItem} onSubmit={() => { - queryViewList(); + queryDataSetList(); setSearchModalOpen(false); }} onCancel={() => { diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DefaultSettingForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DefaultSettingForm.tsx index 94ff000ad..cf2abdd2b 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DefaultSettingForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DefaultSettingForm.tsx @@ -1,24 +1,17 @@ -import { useEffect, useState, forwardRef, useImperativeHandle } from 'react'; +import { useEffect, forwardRef } from 'react'; import type { ForwardRefRenderFunction } from 'react'; import FormItemTitle from '@/components/FormHelper/FormItemTitle'; - import { Form, Input, Select, InputNumber } from 'antd'; - -import { wrapperTransTypeAndId } from '../../utils'; - import { ISemantic } from '../../data'; -import { ChatConfigType, TransType, SemanticNodeType } from '../../enum'; -import TransTypeTag from '../../components/TransTypeTag'; +import { ChatConfigType, DetailTypeDefaultConfig, TimeModeEnum, DatePeriod } from '../../enum'; +// import TransTypeTag from '../../components/TransTypeTag'; type Props = { - // entityData: any; - // chatConfigKey: string; chatConfigType: ChatConfigType.TAG | ChatConfigType.METRIC; metricList?: ISemantic.IMetricItem[]; dimensionList?: ISemantic.IDimensionItem[]; form: any; - // domainId: number; - // onSubmit: (params?: any) => void; + formData: Record; }; const FormItem = Form.Item; @@ -31,15 +24,15 @@ const formDefaultValue = { }; const DefaultSettingForm: ForwardRefRenderFunction = ( - { metricList, dimensionList, chatConfigType, form }, + { metricList, dimensionList, formData, chatConfigType, form }, ref, ) => { - const [dataItemListOptions, setDataItemListOptions] = useState([]); + // const [dataItemListOptions, setDataItemListOptions] = useState([]); const initData = () => { form.setFieldsValue({ queryConfig: { - [defaultConfigKeyMap[chatConfigType]]: { + [DetailTypeDefaultConfig[chatConfigType]]: { timeDefaultConfig: { ...formDefaultValue, }, @@ -54,54 +47,49 @@ const DefaultSettingForm: ForwardRefRenderFunction = ( } }, []); - const defaultConfigKeyMap = { - [ChatConfigType.TAG]: 'tagTypeDefaultConfig', - [ChatConfigType.METRIC]: 'metricTypeDefaultConfig', - }; - - useEffect(() => { - if (Array.isArray(dimensionList) && Array.isArray(metricList)) { - const dimensionEnum = dimensionList.map((item: ISemantic.IDimensionItem) => { - const { name, id, bizName } = item; - return { - name, - label: ( - <> - - {name} - - ), - value: wrapperTransTypeAndId(TransType.DIMENSION, id), - bizName, - id, - transType: TransType.DIMENSION, - }; - }); - const metricEnum = metricList.map((item: ISemantic.IMetricItem) => { - const { name, id, bizName } = item; - return { - name, - label: ( - <> - - {name} - - ), - value: wrapperTransTypeAndId(TransType.METRIC, id), - bizName, - id, - transType: TransType.METRIC, - }; - }); - setDataItemListOptions([...dimensionEnum, ...metricEnum]); - } - }, [dimensionList, metricList]); + // useEffect(() => { + // if (Array.isArray(dimensionList) && Array.isArray(metricList)) { + // const dimensionEnum = dimensionList.map((item: ISemantic.IDimensionItem) => { + // const { name, id, bizName } = item; + // return { + // name, + // label: ( + // <> + // + // {name} + // + // ), + // value: wrapperTransTypeAndId(TransType.DIMENSION, id), + // bizName, + // id, + // transType: TransType.DIMENSION, + // }; + // }); + // const metricEnum = metricList.map((item: ISemantic.IMetricItem) => { + // const { name, id, bizName } = item; + // return { + // name, + // label: ( + // <> + // + // {name} + // + // ), + // value: wrapperTransTypeAndId(TransType.METRIC, id), + // bizName, + // id, + // transType: TransType.METRIC, + // }; + // }); + // setDataItemListOptions([...dimensionEnum, ...metricEnum]); + // } + // }, [dimensionList, metricList]); return ( <> - {chatConfigType === ChatConfigType.TAG && ( + {/* {chatConfigType === ChatConfigType.TAG && ( { const result: { dimensionIds: number[]; metricIds: number[] } = { @@ -151,7 +139,7 @@ const DefaultSettingForm: ForwardRefRenderFunction = ( options={dataItemListOptions} /> - )} + )} */} = ( )} - - - + {formData?.queryConfig?.[DetailTypeDefaultConfig[chatConfigType]]?.timeDefaultConfig + ?.timeMode !== 'CURRENT' && ( + + + + )} + + } + > + + ); }; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DefaultSettingForm_tag.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DefaultSettingForm_tag.tsx deleted file mode 100644 index c2a88580f..000000000 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DefaultSettingForm_tag.tsx +++ /dev/null @@ -1,190 +0,0 @@ -import { useEffect, useState, forwardRef, useImperativeHandle } from 'react'; -import type { ForwardRefRenderFunction } from 'react'; -import FormItemTitle from '@/components/FormHelper/FormItemTitle'; - -import { Form, Input, Select, InputNumber } from 'antd'; - -import { wrapperTransTypeAndId } from '../../utils'; - -import { ISemantic } from '../../data'; -import { TransType, SemanticNodeType } from '../../enum'; -import TransTypeTag from '../../components/TransTypeTag'; - -type Props = { - chatConfigType: TransType; - metricList?: ISemantic.IMetricItem[]; - dimensionList?: ISemantic.IDimensionItem[]; - tagList?: ISemantic.ITagItem[]; - form: any; -}; - -const FormItem = Form.Item; -const Option = Select.Option; - -const formDefaultValue = { - unit: 7, - period: 'DAY', - timeMode: 'LAST', -}; - -const DefaultSettingForm: ForwardRefRenderFunction = ( - { metricList, dimensionList, tagList, chatConfigType, form }, - ref, -) => { - const [dataItemListOptions, setDataItemListOptions] = useState([]); - - const initData = () => { - form.setFieldsValue({ - queryConfig: { - [defaultConfigKeyMap[chatConfigType]]: { - timeDefaultConfig: { - ...formDefaultValue, - }, - }, - }, - }); - }; - - useEffect(() => { - if (form && !form.getFieldValue('id')) { - initData(); - } - }, []); - - const defaultConfigKeyMap: any = { - [TransType.TAG]: 'tagTypeDefaultConfig', - [TransType.METRIC]: 'metricTypeDefaultConfig', - }; - - useEffect(() => { - if (Array.isArray(tagList)) { - const tagEnum = tagList.map((item: ISemantic.ITagItem) => { - const { name, id, bizName } = item; - return { - name, - label: ( - <> - - {name} - - ), - value: wrapperTransTypeAndId(TransType.TAG, id), - bizName, - id, - transType: TransType.TAG, - }; - }); - setDataItemListOptions([...tagEnum]); - } - }, [tagList]); - - return ( - <> - {chatConfigType === TransType.TAG && ( - { - const result: { tagIds: number[] } = { - tagIds: [], - }; - items.forEach((item: any) => { - result.tagIds.push(item.id); - }); - return result; - }} - getValueProps={(value) => { - const { tagIds } = value || {}; - const tagValues = Array.isArray(tagIds) - ? tagIds.map((id: number) => { - return wrapperTransTypeAndId(TransType.TAG, id); - }) - : []; - return { - value: [...tagValues], - }; - }} - > - - - - - - - )} - - - - - - - - - - ); -}; - -export default forwardRef(DefaultSettingForm); diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/ViewModelConfigTransfer.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/ViewModelConfigTransfer.tsx index b516303ce..e72e1f094 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/ViewModelConfigTransfer.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/ViewModelConfigTransfer.tsx @@ -11,7 +11,7 @@ import { isArrayOfValues } from '@/utils/utils'; type Props = { queryType?: string; - viewItem: ISemantic.IViewItem; + viewItem: ISemantic.IDatasetItem; modelItem?: ISemantic.IModelItem; dimensionList?: ISemantic.IDimensionItem[]; metricList?: ISemantic.IMetricItem[]; @@ -133,7 +133,7 @@ const ViewModelConfigTransfer: React.FC = forwardRef( const idList: number[] = []; const transferKeys: React.Key[] = []; const viewConfigMap: any = {}; - dataSetModelConfigs.forEach((item: ISemantic.IViewModelConfigItem) => { + dataSetModelConfigs.forEach((item: ISemantic.IDatasetModelConfigItem) => { const { id, metrics, dimensions, tagIds } = item; idList.push(id); viewConfigMap[id] = { ...item }; @@ -171,15 +171,15 @@ const ViewModelConfigTransfer: React.FC = forwardRef( return; } // const dataSetModelConfigs = isArrayOfValues(Object.values(viewModelConfigsMap)) - // ? (Object.values(viewModelConfigsMap) as ISemantic.IViewModelConfigItem[]) + // ? (Object.values(viewModelConfigsMap) as ISemantic.IDatasetModelConfigItem[]) // : viewItem?.dataSetDetail?.dataSetModelConfigs; const dataSetModelConfigs = Object.values( viewModelConfigsMap, - ) as ISemantic.IViewModelConfigItem[]; + ) as ISemantic.IDatasetModelConfigItem[]; if (isArrayOfValues(dataSetModelConfigs)) { const allMetrics: number[] = []; const allDimensions: number[] = []; - dataSetModelConfigs.forEach((item: ISemantic.IViewModelConfigItem) => { + dataSetModelConfigs.forEach((item: ISemantic.IDatasetModelConfigItem) => { const { metrics, dimensions } = item; allMetrics.push(...metrics); allDimensions.push(...dimensions); @@ -200,11 +200,11 @@ const ViewModelConfigTransfer: React.FC = forwardRef( return; } const dataSetModelConfigs = isArrayOfValues(Object.values(viewModelConfigsMap)) - ? (Object.values(viewModelConfigsMap) as ISemantic.IViewModelConfigItem[]) + ? (Object.values(viewModelConfigsMap) as ISemantic.IDatasetModelConfigItem[]) : viewItem?.dataSetDetail?.dataSetModelConfigs; if (isArrayOfValues(dataSetModelConfigs)) { const allTags: number[] = []; - dataSetModelConfigs.forEach((item: ISemantic.IViewModelConfigItem) => { + dataSetModelConfigs.forEach((item: ISemantic.IDatasetModelConfigItem) => { const { tagIds } = item; allTags.push(...tagIds); }); @@ -224,17 +224,17 @@ const ViewModelConfigTransfer: React.FC = forwardRef( metricList={mergeMetricList} selectedTransferKeys={selectedTransferKeys} onSubmit={( - submitData: Record, + submitData: Record, selectedKeys: React.Key[], ) => { const dataSetModelConfigs = Object.values( submitData, - ) as ISemantic.IViewModelConfigItem[]; + ) as ISemantic.IDatasetModelConfigItem[]; if (isArrayOfValues(dataSetModelConfigs)) { const allMetrics: number[] = []; const allDimensions: number[] = []; - dataSetModelConfigs.forEach((item: ISemantic.IViewModelConfigItem) => { + dataSetModelConfigs.forEach((item: ISemantic.IDatasetModelConfigItem) => { const { metrics, dimensions } = item; allMetrics.push(...metrics); allDimensions.push(...dimensions); @@ -255,16 +255,16 @@ const ViewModelConfigTransfer: React.FC = forwardRef( tagList={mergeTagList} selectedTransferKeys={selectedTransferKeys} onSubmit={( - submitData: Record, + submitData: Record, selectedKeys: React.Key[], ) => { const dataSetModelConfigs = Object.values( submitData, - ) as ISemantic.IViewModelConfigItem[]; + ) as ISemantic.IDatasetModelConfigItem[]; if (isArrayOfValues(dataSetModelConfigs)) { const allTags: number[] = []; - dataSetModelConfigs.forEach((item: ISemantic.IViewModelConfigItem) => { + dataSetModelConfigs.forEach((item: ISemantic.IDatasetModelConfigItem) => { const { tagIds } = item; allTags.push(...tagIds); }); diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/ViewSearchFormModal.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/ViewSearchFormModal.tsx index 672721c5a..1d5e073a0 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/ViewSearchFormModal.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/ViewSearchFormModal.tsx @@ -8,7 +8,7 @@ import { ISemantic } from '../../data'; import DefaultSettingForm from './DefaultSettingForm'; import { isArrayOfValues } from '@/utils/utils'; import { ProCard } from '@ant-design/pro-components'; -import { ChatConfigType } from '../../enum'; +import { ChatConfigType, DetailTypeDefaultConfig, TimeModeEnum, DatePeriod } from '../../enum'; export type ModelCreateFormModalProps = { domainId: number; @@ -31,12 +31,14 @@ const ViewSearchFormModal: React.FC = ({ const [dimensionList, setDimensionList] = useState(); const [metricList, setMetricList] = useState(); + const [formData, setFormData] = useState(viewItem); + useEffect(() => { const dataSetModelConfigs = viewItem?.dataSetDetail?.dataSetModelConfigs; if (Array.isArray(dataSetModelConfigs)) { const allMetrics: number[] = []; const allDimensions: number[] = []; - dataSetModelConfigs.forEach((item: ISemantic.IViewModelConfigItem) => { + dataSetModelConfigs.forEach((item: ISemantic.IDatasetModelConfigItem) => { const { metrics, dimensions } = item; allMetrics.push(...metrics); allDimensions.push(...dimensions); @@ -96,6 +98,7 @@ const ViewSearchFormModal: React.FC = ({ - - - ); - }; - - const renderContent = () => { - return ( -
- {viewItem?.queryType === TransType.METRIC && ( - - - - )} - - {viewItem?.queryType === TransType.TAG && ( - - - - )} -
- ); - }; - - return ( - -
{}} - > - - {renderContent()} -
-
- ); -}; - -export default ViewSearchFormModal; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/index.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/index.tsx index 8c08bd1da..962b9e1f8 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/index.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/index.tsx @@ -4,20 +4,15 @@ import DataSetTable from './components/DataSetTable'; type Props = { disabledEdit?: boolean; - modelList: ISemantic.IModelItem[]; - onModelChange?: (model?: ISemantic.IModelItem) => void; + dataSetList: ISemantic.IDatasetItem[]; }; -const View: React.FC = ({ modelList, disabledEdit = false, onModelChange }) => { +const View: React.FC = ({ dataSetList, disabledEdit = false }) => { return (
- +
); }; -export default View +export default View; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainManagerTab.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainManagerTab.tsx index 262a74bf0..2b6d75a60 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainManagerTab.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainManagerTab.tsx @@ -11,13 +11,13 @@ import styles from './style.less'; import { HomeOutlined, FundViewOutlined } from '@ant-design/icons'; import { ISemantic } from '../data'; import SemanticGraphCanvas from '../SemanticGraphCanvas'; -import RecommendedQuestionsSection from '../components/Entity/RecommendedQuestionsSection'; import View from '../View'; type Props = { isModel: boolean; activeKey: string; modelList: ISemantic.IModelItem[]; + dataSetList: ISemantic.IDatasetItem[]; handleModelChange: (model?: ISemantic.IModelItem) => void; onBackDomainBtnClick?: () => void; onMenuChange?: (menuKey: string) => void; @@ -26,6 +26,7 @@ const DomainManagerTab: React.FC = ({ isModel, activeKey, modelList, + dataSetList, handleModelChange, onBackDomainBtnClick, onMenuChange, @@ -44,16 +45,16 @@ const DomainManagerTab: React.FC = ({ }, [selectModelId]); const [showModelType, setShowModelType] = useState('list'); - - const domainListParentIdList: number[] = Array.isArray(domainList) - ? Array.from(new Set(domainList.map((item) => item.parentId))) - : []; - const tabItem = [ + { + label: '数据集管理', + key: 'dataSetManage', + hidden: !!domainData?.parentId, + children: , + }, { label: '模型管理', key: 'overview', - // hidden: domainData && domainListParentIdList.includes(domainData.id), children: showModelType === 'list' ? ( = ({ ) : (
- {/* */}
), }, - { - label: '数据集管理', - key: 'dataSetManage', - hidden: !!domainData?.parentId, - children: ( - { - handleModelChange(model); - }} - /> - ), - }, + { label: '标签对象管理', key: 'tagObjectManage', @@ -146,11 +134,6 @@ const DomainManagerTab: React.FC = ({ key: 'permissonSetting', children: , }, - { - label: '推荐问题', - key: 'recommendedQuestions', - children: , - }, ]; const getActiveKey = () => { diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/RecommendedQuestionsSection.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/RecommendedQuestionsSection.tsx deleted file mode 100644 index 62455885c..000000000 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/RecommendedQuestionsSection.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { message } from 'antd'; -import React, { useState, useEffect } from 'react'; -import { useModel } from '@umijs/max'; -import type { StateType } from '../../model'; -import { getDomainExtendConfig, addDomainExtend, editDomainExtend } from '../../service'; -import { ProCard } from '@ant-design/pro-components'; - -import TextAreaCommonEditList from '../../components/CommonEditList/TextArea'; - -type Props = {}; - -const RecommendedQuestionsSection: React.FC = ({}) => { - const modelModel = useModel('SemanticModel.modelData'); - const { selectModelId: modelId } = modelModel; - - const [questionData, setQuestionData] = useState([]); - const [currentRecordId, setCurrentRecordId] = useState(0); - - const queryThemeListData: any = async () => { - const { code, data } = await getDomainExtendConfig({ - modelId, - }); - - if (code === 200) { - const target = data?.[0] || {}; - if (Array.isArray(target.recommendedQuestions)) { - setQuestionData( - target.recommendedQuestions.map((item: { question: string }) => { - return item.question; - }), - ); - setCurrentRecordId(target.id || 0); - } else { - setQuestionData([]); - setCurrentRecordId(0); - } - return; - } - - message.error('获取问答设置信息失败'); - }; - - const saveEntity = async (list: string[]) => { - let saveDomainExtendQuery = addDomainExtend; - if (currentRecordId) { - saveDomainExtendQuery = editDomainExtend; - } - const { code, msg } = await saveDomainExtendQuery({ - recommendedQuestions: list.map((question: string) => { - return { question }; - }), - id: currentRecordId, - modelId, - }); - - if (code === 200) { - return; - } - message.error(msg); - }; - - const initPage = async () => { - queryThemeListData(); - }; - - useEffect(() => { - if (!modelId) { - return; - } - initPage(); - }, [modelId]); - - return ( -
- - { - saveEntity(list); - setQuestionData(list); - }} - /> - -
- ); -}; -export default RecommendedQuestionsSection; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/data.d.ts b/webapp/packages/supersonic-fe/src/pages/SemanticModel/data.d.ts index c61c08655..20ca2a719 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/data.d.ts +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/data.d.ts @@ -156,7 +156,7 @@ export declare namespace ISemantic { updatedAt: ISODateString; } - interface IViewModelConfigItem { + interface IDatasetModelConfigItem { id: number; includesAll: boolean; metrics: number[]; @@ -164,7 +164,7 @@ export declare namespace ISemantic { tagIds: number[]; } - interface IViewItem { + interface IDatasetItem { createdBy: UserName; updatedBy: UserName; createdAt: ISODateString; @@ -178,7 +178,7 @@ export declare namespace ISemantic { sensitiveLevel: number; domainId: number; dataSetDetail: { - dataSetModelConfigs: IViewModelConfigItem[]; + dataSetModelConfigs: IDatasetModelConfigItem[]; }; } diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/enum.ts b/webapp/packages/supersonic-fe/src/pages/SemanticModel/enum.ts index bfd5da35e..2fd7d6eec 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/enum.ts +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/enum.ts @@ -75,3 +75,21 @@ export enum KnowledgeConfigStatusEnum { UNAVAILABLE = 'UNAVAILABLE', UNKNOWN = 'UNKNOWN', } + +export const DetailTypeDefaultConfig = { + [ChatConfigType.TAG]: 'detailTypeDefaultConfig', + [ChatConfigType.METRIC]: 'aggregateTypeDefaultConfig', +}; + +export enum TimeModeEnum { + LAST = 'LAST', + RECENT = 'RECENT', + CURRENT = 'CURRENT', +} + +export enum DatePeriod { + DAY = 'DAY', + WEEK = 'WEEK', + MONTH = 'MONTH', + YEAR = 'YEAR', +} diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/service.ts b/webapp/packages/supersonic-fe/src/pages/SemanticModel/service.ts index a158f9a84..46c831a43 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/service.ts +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/service.ts @@ -606,7 +606,7 @@ export function getDatabaseDetail(id: number): Promise { return request.get(`${process.env.API_BASE_URL}database/${id}`); } -export function getViewList(domainId: number): Promise { +export function getDataSetList(domainId: number): Promise { return request(`${process.env.API_BASE_URL}dataSet/getDataSetList`, { method: 'GET', params: { domainId }, diff --git a/webapp/packages/supersonic-fe/src/pages/System/index.tsx b/webapp/packages/supersonic-fe/src/pages/System/index.tsx index bb9362f59..9236a5049 100644 --- a/webapp/packages/supersonic-fe/src/pages/System/index.tsx +++ b/webapp/packages/supersonic-fe/src/pages/System/index.tsx @@ -5,7 +5,7 @@ import { getSystemConfig, saveSystemConfig } from '@/services/user'; import { ProCard } from '@ant-design/pro-components'; import SelectTMEPerson from '@/components/SelectTMEPerson'; import { ConfigParametersItem, SystemConfig, dependenciesItem } from './types'; - +import { testLLMConn } from '../../services/system'; import { groupBy } from 'lodash'; import { genneratorFormItemList } from '../SemanticModel/utils'; @@ -23,7 +23,8 @@ const System: React.FC = () => { const configMap = useRef>(); const configIocDepMap = useRef>(); - // const [configIocDepMap, setConfigIocDepMap] = useState({}); + const [llmTestLoading, setLlmTestLoading] = useState(false); + const [formData, setFormData] = useState({}); useEffect(() => { querySystemConfig(); @@ -197,6 +198,17 @@ const System: React.FC = () => { groupConfigAndSet(Object.values(tempConfigMap)); }; + const testLLMConnect = async (params: any) => { + setLlmTestLoading(true); + const { code, data } = await testLLMConn(params); + setLlmTestLoading(false); + if (code === 200 && data) { + message.success('连接成功'); + } else { + message.error('模型连接失败'); + } + }; + return ( <>
@@ -214,6 +226,28 @@ const System: React.FC = () => { > 保 存 + } > @@ -222,6 +256,7 @@ const System: React.FC = () => { layout="vertical" className={styles.form} onValuesChange={(value, values) => { + setFormData(values); const valueKey = Object.keys(value)[0]; excuteDepConfig(valueKey, values); }} diff --git a/webapp/packages/supersonic-fe/src/services/system.ts b/webapp/packages/supersonic-fe/src/services/system.ts new file mode 100644 index 000000000..55f14cab2 --- /dev/null +++ b/webapp/packages/supersonic-fe/src/services/system.ts @@ -0,0 +1,8 @@ +import request from 'umi-request'; + +export function testLLMConn(data: any) { + return request('/api/chat/agent/testLLMConn', { + method: 'POST', + data, + }); +}