diff --git a/webapp/packages/chat-sdk/src/common/constants.ts b/webapp/packages/chat-sdk/src/common/constants.ts index 737363f2d..0d8ea0936 100644 --- a/webapp/packages/chat-sdk/src/common/constants.ts +++ b/webapp/packages/chat-sdk/src/common/constants.ts @@ -42,7 +42,7 @@ export const THEME_COLOR_LIST = [ export const PARSE_ERROR_TIP = '智能助理不太懂您说什么呐,回去一定补充知识'; -export const SEARCH_EXCEPTION_TIP = '查询出错啦,智能助理还不够聪明,请您换个表达再试试'; +export const SEARCH_EXCEPTION_TIP = '查询出错啦,数据库可能出现异常或者负载繁忙,请联系管理员或者稍后重试'; export const MSG_VALID_TIP = { [MsgValidTypeEnum.SEARCH_EXCEPTION]: '数据查询异常', diff --git a/webapp/packages/chat-sdk/src/common/type.ts b/webapp/packages/chat-sdk/src/common/type.ts index 27cd0ad2d..84c7c5b1f 100644 --- a/webapp/packages/chat-sdk/src/common/type.ts +++ b/webapp/packages/chat-sdk/src/common/type.ts @@ -173,7 +173,7 @@ export enum SemanticTypeEnum { }; export const SEMANTIC_TYPE_MAP = { - [SemanticTypeEnum.DOMAIN]: '主题域', + [SemanticTypeEnum.DOMAIN]: '数据模型', [SemanticTypeEnum.DIMENSION]: '维度', [SemanticTypeEnum.METRIC]: '指标', [SemanticTypeEnum.VALUE]: '维度值', diff --git a/webapp/packages/chat-sdk/src/components/ChatItem/ParseTip.tsx b/webapp/packages/chat-sdk/src/components/ChatItem/ParseTip.tsx index e43eba214..c7ff53137 100644 --- a/webapp/packages/chat-sdk/src/components/ChatItem/ParseTip.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatItem/ParseTip.tsx @@ -165,7 +165,7 @@ const ParseTip: React.FC = ({ ) : (
-
主题域:
+
数据模型:
{modelName}
)} diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/Bar/index.tsx b/webapp/packages/chat-sdk/src/components/ChatMsg/Bar/index.tsx index 09bbae8f7..74edcaaab 100644 --- a/webapp/packages/chat-sdk/src/components/ChatMsg/Bar/index.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/Bar/index.tsx @@ -1,37 +1,24 @@ import { CHART_BLUE_COLOR, CHART_SECONDARY_COLOR, PREFIX_CLS } from '../../../common/constants'; -import { DrillDownDimensionType, MsgDataType } from '../../../common/type'; +import { MsgDataType } from '../../../common/type'; import { getChartLightenColor, getFormattedValue } from '../../../utils/utils'; import type { ECharts } from 'echarts'; import * as echarts from 'echarts'; import React, { useEffect, useRef, useState } from 'react'; import NoPermissionChart from '../NoPermissionChart'; -import DrillDownDimensions from '../../DrillDownDimensions'; import { Spin } from 'antd'; -import FilterSection from '../FilterSection'; type Props = { data: MsgDataType; triggerResize?: boolean; - drillDownDimension?: DrillDownDimensionType; loading: boolean; - onSelectDimension: (dimension?: DrillDownDimensionType) => void; onApplyAuth?: (model: string) => void; }; -const BarChart: React.FC = ({ - data, - triggerResize, - drillDownDimension, - loading, - onSelectDimension, - onApplyAuth, -}) => { +const BarChart: React.FC = ({ data, triggerResize, loading, onApplyAuth }) => { const chartRef = useRef(); const [instance, setInstance] = useState(); - const { queryColumns, queryResults, entityInfo, chatContext, queryMode } = data; - - const { dateInfo, dimensionFilters } = chatContext || {}; + const { queryColumns, queryResults, entityInfo } = data; const categoryColumnName = queryColumns?.find(column => column.showType === 'CATEGORY')?.nameEn || ''; @@ -159,48 +146,16 @@ const BarChart: React.FC = ({ ); } - // const hasFilterSection = dimensionFilters?.length > 0; - const prefixCls = `${PREFIX_CLS}-bar`; return (
{metricColumn?.name}
- {drillDownDimension && ( -
- ( -
- {/* */} - {drillDownDimension && ( -
-
下钻维度:
-
{drillDownDimension.name}
-
- )} -
- ) -
- )}
- {/* {dateInfo && ( -
- {dateInfo.startDate === dateInfo.endDate - ? dateInfo.startDate - : `${dateInfo.startDate} ~ ${dateInfo.endDate}`} -
- )} */}
- {queryMode.includes('METRIC') && ( - - )}
); }; diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/DateOptions/index.tsx b/webapp/packages/chat-sdk/src/components/ChatMsg/DateOptions/index.tsx new file mode 100644 index 000000000..0b794f1e2 --- /dev/null +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/DateOptions/index.tsx @@ -0,0 +1,46 @@ +import classNames from 'classnames'; +import { CLS_PREFIX, DATE_TYPES } from '../../../common/constants'; +import { isMobile } from '../../../utils/utils'; +import { ChatContextType } from '../../../common/type'; + +type Props = { + chatContext: ChatContextType; + currentDateOption?: number; + onSelectDateOption: (value: number) => void; +}; + +const DateOptions: React.FC = ({ chatContext, currentDateOption, onSelectDateOption }) => { + const prefixCls = `${CLS_PREFIX}-date-options`; + + const dateOptions = DATE_TYPES[chatContext?.dateInfo?.period] || DATE_TYPES.DAY; + + return ( +
+ {dateOptions.map((dateOption: { label: string; value: number }, index: number) => { + const dateOptionClass = classNames(`${prefixCls}-item`, { + [`${prefixCls}-date-active`]: dateOption.value === currentDateOption, + [`${prefixCls}-date-mobile`]: isMobile, + }); + return ( + <> +
{ + onSelectDateOption(dateOption.value); + }} + > + {dateOption.label} + {dateOption.value === currentDateOption && ( +
+ )} +
+ {index !== dateOptions.length - 1 &&
} + + ); + })} +
+ ); +}; + +export default DateOptions; diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/DateOptions/style.less b/webapp/packages/chat-sdk/src/components/ChatMsg/DateOptions/style.less new file mode 100644 index 000000000..4990982e2 --- /dev/null +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/DateOptions/style.less @@ -0,0 +1,43 @@ +@import '../../../styles/index.less'; + +@date-options-prefix-cls: ~'@{supersonic-chat-prefix}-date-options'; + +.@{date-options-prefix-cls} { + display: flex; + align-items: center; + column-gap: 20px; + font-size: 14px; + + &-item { + position: relative; + color: var(--text-color-secondary); + cursor: pointer; + + &:hover { + color: var(--chat-blue); + } + } + + &-date-active { + color: var(--chat-blue); + } + + &-date-mobile { + font-size: 12px; + } + + &-active-identifier { + position: absolute; + bottom: -6px; + width: 100%; + height: 4px; + background-color: var(--chat-blue); + border-radius: 4px 4px 0 0; + } + + &-item-divider { + width: 1px; + height: 16px; + background-color: var(--text-color-fifth); + } +} \ No newline at end of file diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/Message/index.tsx b/webapp/packages/chat-sdk/src/components/ChatMsg/Message/index.tsx index d70a2b608..bfaeb7116 100644 --- a/webapp/packages/chat-sdk/src/components/ChatMsg/Message/index.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/Message/index.tsx @@ -68,7 +68,7 @@ const Message: React.FC = ({
-
主题域:
+
数据模型:
{modelName}
diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/MetricCard/index.tsx b/webapp/packages/chat-sdk/src/components/ChatMsg/MetricCard/index.tsx index 4ffe6d45e..f5808029c 100644 --- a/webapp/packages/chat-sdk/src/components/ChatMsg/MetricCard/index.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/MetricCard/index.tsx @@ -1,9 +1,8 @@ import { PREFIX_CLS } from '../../../common/constants'; import { formatByDecimalPlaces, formatMetric, formatNumberWithCN } from '../../../utils/utils'; import ApplyAuth from '../ApplyAuth'; -import { DrillDownDimensionType, MsgDataType } from '../../../common/type'; +import { MsgDataType } from '../../../common/type'; import PeriodCompareItem from './PeriodCompareItem'; -import DrillDownDimensions from '../../DrillDownDimensions'; import { Spin } from 'antd'; import classNames from 'classnames'; import { SwapOutlined } from '@ant-design/icons'; @@ -11,20 +10,12 @@ import { useState } from 'react'; type Props = { data: MsgDataType; - drillDownDimension?: DrillDownDimensionType; loading: boolean; - onSelectDimension: (dimension?: DrillDownDimensionType) => void; onApplyAuth?: (model: string) => void; }; -const MetricCard: React.FC = ({ - data, - drillDownDimension, - loading, - onSelectDimension, - onApplyAuth, -}) => { - const { queryMode, queryColumns, queryResults, entityInfo, aggregateInfo, chatContext } = data; +const MetricCard: React.FC = ({ data, loading, onApplyAuth }) => { + const { queryMode, queryColumns, queryResults, entityInfo, aggregateInfo } = data; const { metricInfos } = aggregateInfo || {}; @@ -57,20 +48,6 @@ const MetricCard: React.FC = ({ ) : (
)} - {drillDownDimension && ( -
- ( -
- {drillDownDimension && ( -
-
下钻维度:
-
{drillDownDimension.name}
-
- )} -
- ) -
- )}
@@ -104,16 +81,6 @@ const MetricCard: React.FC = ({ )}
- {queryMode.includes('METRIC') && ( -
- -
- )}
); }; diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/MetricTrend/index.tsx b/webapp/packages/chat-sdk/src/components/ChatMsg/MetricTrend/index.tsx index 77a867bbc..22d5d2715 100644 --- a/webapp/packages/chat-sdk/src/components/ChatMsg/MetricTrend/index.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/MetricTrend/index.tsx @@ -1,150 +1,48 @@ -import { useEffect, useState } from 'react'; -import { CLS_PREFIX, DATE_TYPES } from '../../../common/constants'; -import { ColumnType, DrillDownDimensionType, FieldType, MsgDataType } from '../../../common/type'; +import { CLS_PREFIX } from '../../../common/constants'; +import { FieldType, MsgDataType } from '../../../common/type'; import { isMobile } from '../../../utils/utils'; -import { queryData } from '../../../service'; import MetricTrendChart from './MetricTrendChart'; -import classNames from 'classnames'; import { Spin } from 'antd'; import Table from '../Table'; -import DrillDownDimensions from '../../DrillDownDimensions'; import MetricInfo from './MetricInfo'; -import MetricOptions from '../../MetricOptions'; +import DateOptions from '../DateOptions'; type Props = { data: MsgDataType; chartIndex: number; triggerResize?: boolean; + loading: boolean; + activeMetricField?: FieldType; + currentDateOption?: number; onApplyAuth?: (model: string) => void; + onSelectDateOption: (value: number) => void; }; -const MetricTrend: React.FC = ({ data, chartIndex, triggerResize, onApplyAuth }) => { - const { entityInfo, chatContext, queryMode } = data; - const { dateInfo, dimensionFilters, elementMatches } = chatContext || {}; - const { dateMode, unit } = dateInfo || {}; - const dateOptions = DATE_TYPES[chatContext?.dateInfo?.period] || DATE_TYPES.DAY; +const MetricTrend: React.FC = ({ + data, + chartIndex, + triggerResize, + loading, + activeMetricField, + currentDateOption, + onApplyAuth, + onSelectDateOption, +}) => { + const { queryColumns, queryResults, aggregateInfo, entityInfo, chatContext } = data; - const [columns, setColumns] = useState([]); - const [defaultMetricField, setDefaultMetricField] = useState(); - const [activeMetricField, setActiveMetricField] = useState(); - const [dataSource, setDataSource] = useState([]); - const [currentDateOption, setCurrentDateOption] = useState(); - const [dimensions, setDimensions] = useState(); - const [drillDownDimension, setDrillDownDimension] = useState(); - const [aggregateInfoValue, setAggregateInfoValue] = useState(); - const [dateModeValue, setDateModeValue] = useState(); - const [loading, setLoading] = useState(false); - - const dateField: any = columns.find( + const dateField: any = queryColumns?.find( (column: any) => column.showType === 'DATE' || column.type === 'DATE' ); const dateColumnName = dateField?.nameEn || ''; const categoryColumnName = - columns.find((column: any) => column.showType === 'CATEGORY')?.nameEn || ''; + queryColumns?.find((column: any) => column.showType === 'CATEGORY')?.nameEn || ''; - const entityId = dimensionFilters?.length > 0 ? dimensionFilters[0].value : undefined; - const entityName = elementMatches?.find((item: any) => item.element?.type === 'ID')?.element - ?.name; - - const isEntityMode = - (queryMode === 'ENTITY_LIST_FILTER' || queryMode === 'METRIC_ENTITY') && - typeof entityId === 'string' && - entityName !== undefined; - - useEffect(() => { - const { queryColumns, queryResults, chatContext, aggregateInfo } = data; - - const initialDateOption = dateOptions.find((option: any) => { - return dateMode === 'RECENT' && option.value === unit; - })?.value; - - setColumns(queryColumns || []); - const metricField = chatContext?.metrics?.[0]; - setDefaultMetricField(metricField); - setActiveMetricField(metricField); - setDataSource(queryResults); - setCurrentDateOption(initialDateOption); - setDimensions(chatContext?.dimensions); - setDrillDownDimension(undefined); - setAggregateInfoValue(aggregateInfo); - setDateModeValue(chatContext?.dateInfo?.dateMode); - }, [data]); - - useEffect(() => { - if (queryMode === 'METRIC_GROUPBY') { - const dimensionValue = chatContext?.dimensions?.find( - dimension => dimension.type === 'DIMENSION' - ); - setDrillDownDimension(dimensionValue); - setDimensions( - chatContext?.dimensions?.filter(dimension => dimension.id !== dimensionValue?.id) - ); - } - }, []); - - const onLoadData = async (value: any) => { - setLoading(true); - const { data } = await queryData({ - ...chatContext, - ...value, - }); - setLoading(false); - if (data.code === 200) { - setColumns(data.data?.queryColumns || []); - setDataSource(data.data?.queryResults || []); - setAggregateInfoValue(data.data?.aggregateInfo); - } - }; - - const selectDateOption = (dateOption: number) => { - setCurrentDateOption(dateOption); - setDateModeValue('RECENT'); - onLoadData({ - metrics: [activeMetricField], - dimensions: drillDownDimension ? [...(dimensions || []), drillDownDimension] : undefined, - dateInfo: { - ...chatContext?.dateInfo, - dateMode: 'RECENT', - unit: dateOption, - }, - }); - }; - - const onSwitchMetric = (metricField?: FieldType) => { - setActiveMetricField(metricField); - onLoadData({ - dateInfo: { - ...chatContext.dateInfo, - dateMode: dateModeValue, - unit: currentDateOption || chatContext.dateInfo.unit, - }, - dimensions: drillDownDimension ? [...(dimensions || []), drillDownDimension] : undefined, - metrics: [metricField || defaultMetricField], - }); - }; - - const onSelectDimension = (dimension?: DrillDownDimensionType) => { - setDrillDownDimension(dimension); - onLoadData({ - dateInfo: { - ...chatContext.dateInfo, - dateMode: dateModeValue, - unit: currentDateOption || chatContext.dateInfo.unit, - }, - metrics: [activeMetricField], - dimensions: dimension === undefined ? undefined : [...(dimensions || []), dimension], - }); - }; - - const currentMetricField = columns.find((column: any) => column.showType === 'NUMBER'); + const currentMetricField = queryColumns?.find((column: any) => column.showType === 'NUMBER'); if (!currentMetricField) { return null; } - const isMultipleMetric = chatContext?.metrics?.length > 1; - const existDrillDownDimension = queryMode.includes('METRIC') && !isEntityMode; - const prefixCls = `${CLS_PREFIX}-metric-trend`; return ( @@ -157,92 +55,31 @@ const MetricTrend: React.FC = ({ data, chartIndex, triggerResize, onApply > {activeMetricField?.name}
- {drillDownDimension && ( -
- ( -
- {drillDownDimension && ( -
-
下钻维度:
-
- {drillDownDimension.name} -
-
- )} -
- ) -
- )}
- {!isMobile && aggregateInfoValue?.metricInfos?.length > 0 && ( - + {!isMobile && aggregateInfo?.metricInfos?.length > 0 && ( + )} -
- {dateOptions.map((dateOption: { label: string; value: number }, index: number) => { - const dateOptionClass = classNames(`${prefixCls}-date-option`, { - [`${prefixCls}-date-active`]: dateOption.value === currentDateOption, - [`${prefixCls}-date-mobile`]: isMobile, - }); - return ( - <> -
{ - selectDateOption(dateOption.value); - }} - > - {dateOption.label} - {dateOption.value === currentDateOption && ( -
- )} -
- {index !== dateOptions.length - 1 && ( -
- )} - - ); - })} -
- {dataSource?.length === 1 || chartIndex % 2 === 1 ? ( - + + {queryResults?.length === 1 || chartIndex % 2 === 1 ? ( +
) : ( )} - {(isMultipleMetric || existDrillDownDimension) && ( -
- {isMultipleMetric && ( - - )} - {existDrillDownDimension && ( - - )} -
- )} diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/MetricTrend/style.less b/webapp/packages/chat-sdk/src/components/ChatMsg/MetricTrend/style.less index 573b14fcc..a114ef1a2 100644 --- a/webapp/packages/chat-sdk/src/components/ChatMsg/MetricTrend/style.less +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/MetricTrend/style.less @@ -139,53 +139,6 @@ color: var(--text-color); } } - - &-date-options { - display: flex; - align-items: center; - column-gap: 20px; - font-size: 14px; - } - - &-date-option { - position: relative; - color: var(--text-color-secondary); - cursor: pointer; - - &:hover { - color: var(--chat-blue); - } - } - - &-date-option-active { - color: var(--chat-blue); - } - - &-date-option-mobile { - font-size: 12px; - } - - &-bottom-tools { - display: flex; - align-items: center; - column-gap: 20px; - font-size: 14px; - } - - &-active-identifier { - position: absolute; - bottom: -6px; - width: 100%; - height: 4px; - background-color: var(--chat-blue); - border-radius: 4px 4px 0 0; - } - - &-date-option-divider { - width: 1px; - height: 16px; - background-color: var(--text-color-fifth); - } } .@{metric-info-prefix-cls} { diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/Table/style.less b/webapp/packages/chat-sdk/src/components/ChatMsg/Table/style.less index 778d2c766..5c1056f66 100644 --- a/webapp/packages/chat-sdk/src/components/ChatMsg/Table/style.less +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/Table/style.less @@ -11,6 +11,39 @@ justify-content: center; } + &-filter-section-wrapper { + display: flex; + align-items: center; + color: var(--text-color-third); + margin-bottom: 12px; + } + + &-filter-section { + display: flex; + align-items: center; + font-size: 13px; + column-gap: 12px; + color: var(--text-color-third); + } + + &-filter-item { + display: flex; + align-items: center; + } + + &-filter-item-label { + color: var(--text-color-third); + } + + &-filter-item-value { + color: var(--text-color); + font-weight: 500; + } + + &-drill-down-dimensions { + margin-top: 12px; + } + table { width: 100%; } diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx b/webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx index 6974a21b1..17d768f14 100644 --- a/webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx @@ -2,12 +2,14 @@ import Bar from './Bar'; import MetricCard from './MetricCard'; import MetricTrend from './MetricTrend'; import Table from './Table'; -import { ColumnType, DrillDownDimensionType, MsgDataType } from '../../common/type'; +import { ColumnType, DrillDownDimensionType, FieldType, MsgDataType } from '../../common/type'; import { useEffect, useState } from 'react'; import { queryData } from '../../service'; import classNames from 'classnames'; import { PREFIX_CLS } from '../../common/constants'; import Text from './Text'; +import DrillDownDimensions from '../DrillDownDimensions'; +import MetricOptions from '../MetricOptions'; type Props = { data: MsgDataType; @@ -16,14 +18,18 @@ type Props = { }; const ChatMsg: React.FC = ({ data, chartIndex, triggerResize }) => { - const { queryColumns, queryResults, chatContext, queryMode } = data; + const { queryColumns, queryResults, chatContext, queryMode } = data || {}; + const { dimensionFilters, elementMatches } = chatContext || {}; const [columns, setColumns] = useState(); const [referenceColumn, setReferenceColumn] = useState(); const [dataSource, setDataSource] = useState(queryResults); - const [drillDownDimension, setDrillDownDimension] = useState(); const [loading, setLoading] = useState(false); + const [defaultMetricField, setDefaultMetricField] = useState(); + const [activeMetricField, setActiveMetricField] = useState(); + const [dateModeValue, setDateModeValue] = useState(); + const [currentDateOption, setCurrentDateOption] = useState(); const prefixCls = `${PREFIX_CLS}-chat-msg`; @@ -36,7 +42,11 @@ const ChatMsg: React.FC = ({ data, chartIndex, triggerResize }) => { useEffect(() => { updateColummns(queryColumns); setDataSource(queryResults); - }, [queryColumns, queryResults]); + setDefaultMetricField(chatContext?.metrics?.[0]); + setActiveMetricField(chatContext?.metrics?.[0]); + setDateModeValue(chatContext?.dateInfo?.dateMode); + setCurrentDateOption(chatContext?.dateInfo?.unit); + }, [data]); if (!queryColumns || !queryResults || !columns) { return null; @@ -69,6 +79,52 @@ const ChatMsg: React.FC = ({ data, chartIndex, triggerResize }) => { queryMode === 'ENTITY_DIMENSION' || (categoryField.length === 1 && metricFields.length === 0)); + const getMsgContent = () => { + if (isText) { + return ; + } + if (isMetricCard) { + return ( + + ); + } + if (isTable) { + return
; + } + if (dateField && metricFields.length > 0) { + if (!dataSource.every(item => item[dateField.nameEn] === dataSource[0][dateField.nameEn])) { + return ( + + ); + } + } + if (categoryField?.length > 0 && metricFields?.length > 0) { + return ( + + ); + } + return
; + }; + const onLoadData = async (value: any) => { setLoading(true); const { data } = await queryData({ @@ -85,58 +141,94 @@ const ChatMsg: React.FC = ({ data, chartIndex, triggerResize }) => { const onSelectDimension = (dimension?: DrillDownDimensionType) => { setDrillDownDimension(dimension); onLoadData({ - dimensions: - dimension === undefined ? undefined : [...(chatContext.dimensions || []), dimension], + dateInfo: { + ...chatContext.dateInfo, + dateMode: dateModeValue, + unit: currentDateOption || chatContext.dateInfo.unit, + }, + dimensions: dimension + ? [...(chatContext.dimensions || []), dimension] + : chatContext.dimensions, + metrics: [activeMetricField || defaultMetricField], }); }; - const getMsgContent = () => { - if (isText) { - return ; - } - if (isMetricCard) { - return ( - - ); - } - if (isTable) { - return
; - } - if (dateField && metricFields.length > 0) { - if (!dataSource.every(item => item[dateField.nameEn] === dataSource[0][dateField.nameEn])) { - return ( - - ); - } - } - if (categoryField?.length > 0 && metricFields?.length > 0) { - return ( - - ); - } - return
; + const onSwitchMetric = (metricField?: FieldType) => { + setActiveMetricField(metricField); + onLoadData({ + dateInfo: { + ...chatContext.dateInfo, + dateMode: dateModeValue, + unit: currentDateOption || chatContext.dateInfo.unit, + }, + dimensions: drillDownDimension + ? [...(chatContext.dimensions || []), drillDownDimension] + : chatContext.dimensions, + metrics: [metricField || defaultMetricField], + }); + }; + + const selectDateOption = (dateOption: number) => { + setCurrentDateOption(dateOption); + setDateModeValue('RECENT'); + onLoadData({ + metrics: [activeMetricField || defaultMetricField], + dimensions: drillDownDimension + ? [...(chatContext.dimensions || []), drillDownDimension] + : chatContext.dimensions, + dateInfo: { + ...chatContext?.dateInfo, + dateMode: 'RECENT', + unit: dateOption, + }, + }); }; const chartMsgClass = classNames({ [prefixCls]: !isTable }); + const entityId = dimensionFilters?.length > 0 ? dimensionFilters[0].value : undefined; + const entityName = elementMatches?.find((item: any) => item.element?.type === 'ID')?.element + ?.name; + + const isEntityMode = + (queryMode === 'ENTITY_LIST_FILTER' || queryMode === 'METRIC_ENTITY') && + typeof entityId === 'string' && + entityName !== undefined; + + const existDrillDownDimension = queryMode.includes('METRIC') && !isText && !isEntityMode; + + const isMultipleMetric = existDrillDownDimension && chatContext?.metrics?.length > 1; + return (
- {dataSource?.length === 0 ?
暂无数据,如有疑问请联系管理员
: getMsgContent()} + {dataSource?.length === 0 ? ( +
暂无数据,如有疑问请联系管理员
+ ) : ( +
+ {getMsgContent()} + {(isMultipleMetric || existDrillDownDimension) && ( +
+ {isMultipleMetric && ( + + )} + {existDrillDownDimension && ( + + )} +
+ )} +
+ )}
); }; diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/style.less b/webapp/packages/chat-sdk/src/components/ChatMsg/style.less index 262351eee..f1bad610b 100644 --- a/webapp/packages/chat-sdk/src/components/ChatMsg/style.less +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/style.less @@ -7,4 +7,12 @@ border: 1px solid var(--border-color-base); border-radius: 4px; background: #f5f8fb; + + &-bottom-tools { + display: flex; + align-items: center; + column-gap: 20px; + font-size: 14px; + margin-top: 6px; + } } \ No newline at end of file diff --git a/webapp/packages/chat-sdk/src/components/DrillDownDimensions/index.tsx b/webapp/packages/chat-sdk/src/components/DrillDownDimensions/index.tsx index b39603164..7a8539ff5 100644 --- a/webapp/packages/chat-sdk/src/components/DrillDownDimensions/index.tsx +++ b/webapp/packages/chat-sdk/src/components/DrillDownDimensions/index.tsx @@ -10,6 +10,7 @@ type Props = { modelId: number; drillDownDimension?: DrillDownDimensionType; isMetricCard?: boolean; + originDimensions?: DrillDownDimensionType[]; dimensionFilters?: FilterItemType[]; onSelectDimension: (dimension?: DrillDownDimensionType) => void; }; @@ -20,6 +21,7 @@ const DrillDownDimensions: React.FC = ({ modelId, drillDownDimension, isMetricCard, + originDimensions, dimensionFilters, onSelectDimension, }) => { @@ -33,7 +35,11 @@ const DrillDownDimensions: React.FC = ({ const res = await queryDrillDownDimensions(modelId); setDimensions( res.data.data.dimensions - .filter(dimension => !dimensionFilters?.some(filter => filter.name === dimension.name)) + .filter( + dimension => + !dimensionFilters?.some(filter => filter.name === dimension.name) && + (!originDimensions || !originDimensions.some(item => item.id === dimension.id)) + ) .slice(0, MAX_DIMENSION_COUNT) ); }; diff --git a/webapp/packages/chat-sdk/src/components/IconFont/index.tsx b/webapp/packages/chat-sdk/src/components/IconFont/index.tsx index 6226e1c6e..1890dd48b 100644 --- a/webapp/packages/chat-sdk/src/components/IconFont/index.tsx +++ b/webapp/packages/chat-sdk/src/components/IconFont/index.tsx @@ -1,7 +1,7 @@ import { createFromIconfontCN } from '@ant-design/icons'; const IconFont = createFromIconfontCN({ - scriptUrl: '//at.alicdn.com/t/c/font_4120566_sz2crkuyuj.js', + scriptUrl: '//at.alicdn.com/t/c/font_4120566_x5c4www9bqm.js', }); export default IconFont; diff --git a/webapp/packages/chat-sdk/src/service/index.ts b/webapp/packages/chat-sdk/src/service/index.ts index 85b1e196d..9c66ff95f 100644 --- a/webapp/packages/chat-sdk/src/service/index.ts +++ b/webapp/packages/chat-sdk/src/service/index.ts @@ -1,7 +1,7 @@ import axios from './axiosInstance'; import { ChatContextType, DrillDownDimensionType, HistoryType, MsgDataType, ParseDataType, SearchRecommendItem } from '../common/type'; -const DEFAULT_CHAT_ID = 0; +const DEFAULT_CHAT_ID = 12009993; const prefix = '/api'; diff --git a/webapp/packages/chat-sdk/src/styles/index.less b/webapp/packages/chat-sdk/src/styles/index.less index b3f268cda..4a3106f11 100644 --- a/webapp/packages/chat-sdk/src/styles/index.less +++ b/webapp/packages/chat-sdk/src/styles/index.less @@ -22,6 +22,8 @@ @import "../components/ChatMsg/FilterSection/style.less"; +@import "../components/ChatMsg/DateOptions/style.less"; + @import "../components/ChatMsg/Text/style.less"; @import '../components/ChatItem/style.less'; diff --git a/webapp/packages/supersonic-fe/src/pages/Chat/MessageContainer/style.less b/webapp/packages/supersonic-fe/src/pages/Chat/MessageContainer/style.less index a247e20b3..46018e158 100644 --- a/webapp/packages/supersonic-fe/src/pages/Chat/MessageContainer/style.less +++ b/webapp/packages/supersonic-fe/src/pages/Chat/MessageContainer/style.less @@ -46,7 +46,7 @@ display: flex; flex-wrap: wrap; justify-content: center; - margin: 16px 0 0; + margin: 16px 0 1px; row-gap: 8px; }