diff --git a/web/src/components/line-chart/index.tsx b/web/src/components/line-chart/index.tsx index 81ae954b7..66540f3e5 100644 --- a/web/src/components/line-chart/index.tsx +++ b/web/src/components/line-chart/index.tsx @@ -10,44 +10,6 @@ import { } from 'recharts'; import { CategoricalChartProps } from 'recharts/types/chart/generateCategoricalChart'; -const data = [ - { - name: 'Page A', - uv: 4000, - pv: 2400, - }, - { - name: 'Page B', - uv: 3000, - pv: 1398, - }, - { - name: 'Page C', - uv: 2000, - pv: 9800, - }, - { - name: 'Page D', - uv: 2780, - pv: 3908, - }, - { - name: 'Page E', - uv: 1890, - pv: 4800, - }, - { - name: 'Page F', - uv: 2390, - pv: 3800, - }, - { - name: 'Page G', - uv: 3490, - pv: 4300, - }, -]; - interface IProps extends CategoricalChartProps { data?: Array<{ xAxis: string; yAxis: number }>; showLegend?: boolean; diff --git a/web/src/hooks/user-setting-hooks.ts b/web/src/hooks/user-setting-hooks.ts index d52ef917d..d3c01b076 100644 --- a/web/src/hooks/user-setting-hooks.ts +++ b/web/src/hooks/user-setting-hooks.ts @@ -1,7 +1,7 @@ import { LanguageTranslationMap } from '@/constants/common'; import { ResponseGetType } from '@/interfaces/database/base'; import { ITenantInfo } from '@/interfaces/database/knowledge'; -import { ISystemStatus, IUserInfo } from '@/interfaces/database/userSetting'; +import { ISystemStatus, IUserInfo } from '@/interfaces/database/user-setting'; import userService from '@/services/user-service'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { message } from 'antd'; diff --git a/web/src/interfaces/database/userSetting.ts b/web/src/interfaces/database/user-setting.ts similarity index 85% rename from web/src/interfaces/database/userSetting.ts rename to web/src/interfaces/database/user-setting.ts index c99ed5d9e..e98b117b2 100644 --- a/web/src/interfaces/database/userSetting.ts +++ b/web/src/interfaces/database/user-setting.ts @@ -20,11 +20,17 @@ export interface IUserInfo { update_time: number; } +export type TaskExecutorElapsed = Record; + export interface ISystemStatus { es: Es; minio: Minio; mysql: Minio; redis: Redis; + task_executor: { + status: string; + elapsed: TaskExecutorElapsed; + }; } interface Redis { diff --git a/web/src/pages/user-setting/setting-system/index.less b/web/src/pages/user-setting/setting-system/index.less index 365a8ed54..77757dfba 100644 --- a/web/src/pages/user-setting/setting-system/index.less +++ b/web/src/pages/user-setting/setting-system/index.less @@ -18,3 +18,16 @@ color: red; } } + +.taskBarTooltip { + font-size: 16px; +} + +.taskBar { + width: '100%'; + height: 200px; +} + +.taskBarTitle { + font-size: 16px; +} diff --git a/web/src/pages/user-setting/setting-system/index.tsx b/web/src/pages/user-setting/setting-system/index.tsx index 987d02557..d24833cf7 100644 --- a/web/src/pages/user-setting/setting-system/index.tsx +++ b/web/src/pages/user-setting/setting-system/index.tsx @@ -1,6 +1,9 @@ import SvgIcon from '@/components/svg-icon'; import { useFetchSystemStatus } from '@/hooks/user-setting-hooks'; -import { ISystemStatus, Minio } from '@/interfaces/database/userSetting'; +import { + ISystemStatus, + TaskExecutorElapsed, +} from '@/interfaces/database/user-setting'; import { Badge, Card, Flex, Spin, Typography } from 'antd'; import classNames from 'classnames'; import lowerCase from 'lodash/lowerCase'; @@ -9,6 +12,7 @@ import { useEffect } from 'react'; import { toFixed } from '@/utils/common-util'; import styles from './index.less'; +import TaskBarChat from './task-bar-chat'; const { Text } = Typography; @@ -23,6 +27,7 @@ const TitleMap = { minio: 'MinIO Object Storage', redis: 'Redis', mysql: 'Mysql', + task_executor: 'Task Executor', }; const SystemInfo = () => { @@ -48,7 +53,11 @@ const SystemInfo = () => { type="inner" title={ - + {key === 'task_executor' ? ( + + ) : ( + + )} {TitleMap[key as keyof typeof TitleMap]} @@ -60,28 +69,34 @@ const SystemInfo = () => { } key={key} > - {Object.keys(info) - .filter((x) => x !== 'status') - .map((x) => { - return ( - - {upperFirst(lowerCase(x))}: - + ) : ( + Object.keys(info) + .filter((x) => x !== 'status') + .map((x) => { + return ( + - {toFixed(info[x as keyof Minio]) as any} - {x === 'elapsed' && ' ms'} - - - ); - })} + {upperFirst(lowerCase(x))}: + + {toFixed((info as Record)[x]) as any} + {x === 'elapsed' && ' ms'} + + + ); + }) + )} ); })} diff --git a/web/src/pages/user-setting/setting-system/task-bar-chat.tsx b/web/src/pages/user-setting/setting-system/task-bar-chat.tsx new file mode 100644 index 000000000..9097b8a5a --- /dev/null +++ b/web/src/pages/user-setting/setting-system/task-bar-chat.tsx @@ -0,0 +1,91 @@ +import { TaskExecutorElapsed } from '@/interfaces/database/user-setting'; +import { Divider, Flex } from 'antd'; +import { max } from 'lodash'; +import { + Bar, + BarChart, + CartesianGrid, + ResponsiveContainer, + Tooltip, +} from 'recharts'; + +import styles from './index.less'; + +interface IProps { + data: TaskExecutorElapsed; +} + +const getColor = (value: number) => { + if (value > 120) { + return 'red'; + } else if (value <= 120 && value > 50) { + return '#faad14'; + } + return '#52c41a'; +}; + +const getMaxLength = (data: TaskExecutorElapsed) => { + const lengths = Object.keys(data).reduce((pre, cur) => { + pre.push(data[cur].length); + return pre; + }, []); + return max(lengths) ?? 0; +}; + +const fillEmptyElementByMaxLength = (list: any[], maxLength: number) => { + if (list.length === maxLength) { + return list; + } + return list.concat( + new Array(maxLength - list.length).fill({ + value: 0, + actualValue: 0, + fill: getColor(0), + }), + ); +}; + +const CustomTooltip = ({ active, payload }: any) => { + if (active && payload && payload.length) { + return ( +
+

{`${payload[0].payload.actualValue}`}

+
+ ); + } + + return null; +}; + +const TaskBarChat = ({ data }: IProps) => { + const maxLength = getMaxLength(data); + return ( + + {Object.keys(data).map((key) => { + const list = data[key].map((x) => ({ + value: x > 120 ? 120 : x, + actualValue: x, + fill: getColor(x), + })); + const nextList = fillEmptyElementByMaxLength(list, maxLength); + return ( + + ID: {key} + + + + } /> + + + + + + ); + })} + + ); +}; + +export default TaskBarChat;