import React, { useEffect, useMemo, useState } from 'react'; import { Table, Thead, Tbody, Tr, Th, Td, TableContainer, Flex, Box, Button } from '@chakra-ui/react'; import { UsageSourceEnum, UsageSourceMap } from '@fastgpt/global/support/wallet/usage/constants'; import { getUserUsages } from '@/web/support/wallet/usage/api'; import type { UsageItemType } from '@fastgpt/global/support/wallet/usage/type'; import { usePagination } from '@fastgpt/web/hooks/usePagination'; import { useLoading } from '@fastgpt/web/hooks/useLoading'; import dayjs from 'dayjs'; import DateRangePicker, { type DateRangeType } from '@fastgpt/web/components/common/DateRangePicker'; import { addDays } from 'date-fns'; import dynamic from 'next/dynamic'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useTranslation } from 'next-i18next'; import { useQuery } from '@tanstack/react-query'; import { useUserStore } from '@/web/support/user/useUserStore'; import { getTeamMembers } from '@/web/support/user/team/api'; import Avatar from '@fastgpt/web/components/common/Avatar'; import MySelect from '@fastgpt/web/components/common/MySelect'; import { formatNumber } from '@fastgpt/global/common/math/tools'; import EmptyTip from '@fastgpt/web/components/common/EmptyTip'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; const UsageDetail = dynamic(() => import('./UsageDetail')); const UsageTable = () => { const { t } = useTranslation(); const { Loading } = useLoading(); const [dateRange, setDateRange] = useState({ from: addDays(new Date(), -7), to: new Date() }); const [usageSource, setUsageSource] = useState(''); const { isPc } = useSystem(); const { userInfo } = useUserStore(); const [usageDetail, setUsageDetail] = useState(); const sourceList = useMemo( () => [ { label: t('common:common.All'), value: '' }, ...Object.entries(UsageSourceMap).map(([key, value]) => ({ label: t(value.label as any), value: key })) ] as { label: never; value: UsageSourceEnum | ''; }[], [t] ); const [selectTmbId, setSelectTmbId] = useState(userInfo?.team?.tmbId); const { data: members = [] } = useQuery(['getMembers', userInfo?.team?.teamId], () => { if (!userInfo?.team?.teamId) return []; return getTeamMembers(); }); const tmbList = useMemo( () => members.map((item) => ({ label: ( {item.memberName} ), value: item.tmbId })), [members] ); const { data: usages, isLoading, Pagination, getData } = usePagination({ api: getUserUsages, pageSize: isPc ? 20 : 10, params: { dateStart: dateRange.from || new Date(), dateEnd: addDays(dateRange.to || new Date(), 1), source: usageSource, teamMemberId: selectTmbId }, defaultRequest: false }); useEffect(() => { getData(1); }, [usageSource, selectTmbId]); return ( {tmbList.length > 1 && userInfo?.team?.permission.hasManagePer && ( {t('common:support.user.team.member')} )} getData(1)} /> {/* */} {usages.map((item) => ( {/* */} ))}
{t('common:user.team.Member Name')}{t('common:user.Time')} list={sourceList} value={usageSource} size={'sm'} onchange={(e) => { setUsageSource(e); }} w={'130px'} > {t('common:user.Application Name')} {t('common:support.wallet.usage.Total points')}
{item.memberName}{dayjs(item.time).format('YYYY/MM/DD HH:mm:ss')} {t(UsageSourceMap[item.source]?.label as any) || '-'} {t(item.appName as any) || '-'} {formatNumber(item.totalPoints) || 0}
{!isLoading && usages.length === 0 && ( )} {!!usageDetail && ( setUsageDetail(undefined)} /> )}
); }; export default React.memo(UsageTable);