import React, { useState, useEffect, useRef } from 'react'; import { message, Row, Col, Button, Space, Select, Form, Tooltip } from 'antd'; import { queryStruct } from '@/pages/SemanticModel/service'; import { DownloadOutlined, PoweroffOutlined, SearchOutlined } from '@ant-design/icons'; import TrendChart from '@/pages/SemanticModel/Metric/components/MetricTrend'; import MetricTrendDimensionFilterContainer from './MetricTrendDimensionFilterContainer'; import MDatePicker from '@/components/MDatePicker'; import { DateRangeType, DateSettingType } from '@/components/MDatePicker/type'; import { getDatePickerDynamicInitialValues } from '@/components/MDatePicker/utils'; import StandardFormRow from '@/components/StandardFormRow'; import MetricTable from './Table'; import { ColumnConfig } from '../data'; import dayjs from 'dayjs'; import { ISemantic } from '../../data'; import { DateFieldMap } from '@/pages/SemanticModel/constant'; import ProCard from '@ant-design/pro-card'; import styles from '../style.less'; const FormItem = Form.Item; type Props = { relationDimensionOptions: { value: string; label: string; modelId: number }[]; dimensionList: ISemantic.IDimensionItem[]; metircData?: ISemantic.IMetricItem; [key: string]: any; }; const MetricTrendSection: React.FC = ({ metircData, relationDimensionOptions, dimensionList, }) => { const indicatorFields = useRef<{ name: string; column: string }[]>([]); const [metricTrendData, setMetricTrendData] = useState([]); const [metricTrendLoading, setMetricTrendLoading] = useState(false); const [metricColumnConfig, setMetricColumnConfig] = useState(); const [authMessage, setAuthMessage] = useState(''); const [downloadLoding, setDownloadLoding] = useState(false); const [queryParams, setQueryParams] = useState({}); const [downloadBtnDisabledState, setDownloadBtnDisabledState] = useState(true); const [periodDate, setPeriodDate] = useState<{ startDate: string; endDate: string; dateField: string; }>({ startDate: dayjs().subtract(6, 'days').format('YYYY-MM-DD'), endDate: dayjs().format('YYYY-MM-DD'), dateField: DateFieldMap[DateRangeType.DAY], }); const [rowNumber, setRowNumber] = useState(5); const [tableColumnConfig, setTableColumnConfig] = useState([]); const [transformState, setTransformState] = useState(false); const [groupByDimensionFieldName, setGroupByDimensionFieldName] = useState(); const getMetricTrendData = async (params: any = { download: false }) => { const { download, dimensionGroup = [], dimensionFilters = [] } = params; if (download) { setDownloadLoding(true); } else { setMetricTrendLoading(true); } if (!metircData) { return; } const { modelId, bizName, name } = metircData; indicatorFields.current = [{ name, column: bizName }]; const dimensionFiltersBizNameList = dimensionFilters.map((item) => { return item.bizName; }); const bizNameList = Array.from(new Set([...dimensionFiltersBizNameList, ...dimensionGroup])); const modelIds = dimensionList.reduce( (idList: number[], item: ISemantic.IDimensionItem) => { if (bizNameList.includes(item.bizName)) { idList.push(item.modelId); } return idList; }, [modelId], ); const res = await queryStruct({ // modelId, modelIds: Array.from(new Set(modelIds)), bizName, groups: dimensionGroup, dimensionFilters, dateField: periodDate.dateField, startDate: periodDate.startDate, endDate: periodDate.endDate, download, isTransform: transformState, }); if (download) { setDownloadLoding(false); return; } const { code, data, msg } = res; setMetricTrendLoading(false); if (code === 200) { const { resultList, columns, queryAuthorization } = data; setMetricTrendData(resultList); setTableColumnConfig(columns); const message = queryAuthorization?.message; if (message) { setAuthMessage(message); } const targetConfig = columns.find((item: ISemantic.IMetricTrendColumn) => { return item.nameEn === bizName; }); if (targetConfig) { setMetricColumnConfig(targetConfig); } setDownloadBtnDisabledState(false); if (dimensionGroup[dimensionGroup.length - 1]) { setGroupByDimensionFieldName(dimensionGroup[dimensionGroup.length - 1]); } } else { if (code === 401 || code === 400) { setAuthMessage(msg); } else { message.error(msg); } setDownloadBtnDisabledState(true); setMetricTrendData([]); setMetricColumnConfig(undefined); } }; useEffect(() => { if (metircData?.id) { getMetricTrendData({ ...queryParams }); } }, [metircData]); return (
{ if (value.key) { return; } }} > { const [startDate, endDate] = value; const { dateSettingType, dynamicParams, staticParams } = config; let dateField = DateFieldMap[DateRangeType.DAY]; if (DateSettingType.DYNAMIC === dateSettingType) { dateField = DateFieldMap[dynamicParams.dateRangeType]; } if (DateSettingType.STATIC === dateSettingType) { dateField = DateFieldMap[staticParams.dateRangeType]; } setPeriodDate({ startDate, endDate, dateField }); }} disabledAdvanceSetting={true} />