diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricFilter.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricFilter.tsx index fde5dc890..c83e22c1d 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricFilter.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricFilter.tsx @@ -81,7 +81,7 @@ const MetricFilter: React.FC = ({ filterValues = {}, onFiltersChange }) =
} onSearch={(value) => { onSearch(value); diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/index.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/index.tsx index ca089637d..609dbd756 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/index.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/index.tsx @@ -1,9 +1,9 @@ import type { ActionType, ProColumns } from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table'; -import { message, Space, Popconfirm } from 'antd'; +import { message, Space, Popconfirm, Tag } from 'antd'; import React, { useRef, useState, useEffect } from 'react'; import type { Dispatch } from 'umi'; -import { connect } from 'umi'; +import { connect, history } from 'umi'; import type { StateType } from '../model'; import { SENSITIVE_LEVEL_ENUM } from '../constant'; import { queryMetric, deleteMetric } from '../service'; @@ -89,6 +89,20 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => { { dataIndex: 'name', title: '指标名称', + render: (_, record: any) => { + if (record.hasAdminRes) { + return ( + { + history.replace(`/model/${record.domainId}/${record.modelId}/metric`); + }} + > + {record.name} + + ); + } + return <> {record.name}; + }, }, // { // dataIndex: 'alias', @@ -113,6 +127,25 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => { title: '创建人', search: false, }, + { + dataIndex: 'tags', + title: '标签', + search: false, + render: (tags) => { + if (Array.isArray(tags)) { + return ( + + {tags.map((tag) => ( + + {tag} + + ))} + + ); + } + return <>--; + }, + }, { dataIndex: 'description', title: '描述', @@ -140,43 +173,47 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => { dataIndex: 'x', valueType: 'option', render: (_, record) => { - return ( - - { - setMetricItem(record); - setCreateModalVisible(true); - }} - > - 编辑 - - - { - const { code, msg } = await deleteMetric(record.id); - if (code === 200) { - setMetricItem(undefined); - actionRef.current?.reload(); - } else { - message.error(msg); - } - }} - > + if (record.hasAdminRes) { + return ( + { setMetricItem(record); + setCreateModalVisible(true); }} > - 删除 + 编辑 - - - ); + + { + const { code, msg } = await deleteMetric(record.id); + if (code === 200) { + setMetricItem(undefined); + queryMetricList(); + } else { + message.error(msg); + } + }} + > + { + setMetricItem(record); + }} + > + 删除 + + + + ); + } else { + return <>; + } }, }, ]; @@ -239,7 +276,7 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => { metricItem={metricItem} onSubmit={() => { setCreateModalVisible(false); - actionRef?.current?.reload(); + queryMetricList(); dispatch({ type: 'domainManger/queryMetricList', payload: { diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/style.less b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/style.less index df680eae5..df11043b0 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/style.less +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/style.less @@ -15,7 +15,7 @@ // margin-bottom: 12px; background: #fff; border-radius: 10px; - width: 500px; + width: 540px; margin: 0 auto; .searchInput { width: 100%; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassMetricTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassMetricTable.tsx index 1826d83b3..65a447aca 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassMetricTable.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassMetricTable.tsx @@ -1,6 +1,6 @@ import type { ActionType, ProColumns } from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table'; -import { message, Button, Space, Popconfirm, Input } from 'antd'; +import { message, Button, Space, Popconfirm, Input, Tag } from 'antd'; import React, { useRef, useState } from 'react'; import type { Dispatch } from 'umi'; import { connect } from 'umi'; @@ -76,7 +76,7 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => { dataIndex: 'key', title: '指标搜索', hideInTable: true, - renderFormItem: () => , + renderFormItem: () => , }, { dataIndex: 'alias', @@ -101,6 +101,25 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => { title: '创建人', search: false, }, + { + dataIndex: 'tags', + title: '标签', + search: false, + render: (tags) => { + if (Array.isArray(tags)) { + return ( + + {tags.map((tag) => ( + + {tag} + + ))} + + ); + } + return <>--; + }, + }, { dataIndex: 'description', title: '描述', diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricInfoCreateForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricInfoCreateForm.tsx index 130780a2b..95777067b 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricInfoCreateForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricInfoCreateForm.tsx @@ -24,7 +24,7 @@ import FormItemTitle from '@/components/FormHelper/FormItemTitle'; import styles from './style.less'; import { getMeasureListByModelId } from '../service'; import TableTitleTooltips from '../components/TableTitleTooltips'; -import { creatExprMetric, updateExprMetric, mockMetricAlias } from '../service'; +import { creatExprMetric, updateExprMetric, mockMetricAlias, getMetricTags } from '../service'; import { ISemantic } from '../data'; import { history } from 'umi'; @@ -75,6 +75,8 @@ const MetricInfoCreateForm: React.FC = ({ const [hasMeasuresState, setHasMeasuresState] = useState(true); const [llmLoading, setLlmLoading] = useState(false); + const [tagOptions, setTagOptions] = useState<{ label: string; value: string }[]>([]); + const forward = () => setCurrentStep(currentStep + 1); const backward = () => setCurrentStep(currentStep - 1); @@ -95,6 +97,7 @@ const MetricInfoCreateForm: React.FC = ({ useEffect(() => { queryClassMeasureList(); + queryMetricTags(); }, []); const handleNext = async () => { @@ -126,6 +129,7 @@ const MetricInfoCreateForm: React.FC = ({ dataFormat, dataFormatType, alias, + tags, } = metricItem as any; const isPercent = dataFormatType === 'percent'; const isDecimal = dataFormatType === 'decimal'; @@ -135,6 +139,7 @@ const MetricInfoCreateForm: React.FC = ({ bizName, sensitiveLevel, description, + tags, // isPercent, dataFormatType: dataFormatType || '', alias: alias && alias.trim() ? alias.split(',') : [], @@ -204,6 +209,22 @@ const MetricInfoCreateForm: React.FC = ({ } }; + const queryMetricTags = async () => { + const { code, data } = await getMetricTags(); + if (code === 200) { + // form.setFieldValue('alias', Array.from(new Set([...formAlias, ...data]))); + setTagOptions( + Array.isArray(data) + ? data.map((tag: string) => { + return { label: tag, value: tag }; + }) + : [], + ); + } else { + message.error('获取指标标签失败'); + } + }; + const renderContent = () => { if (currentStep === 1) { return ( @@ -277,6 +298,15 @@ const MetricInfoCreateForm: React.FC = ({ )} + +