import React, { useMemo } from 'react'; import { ModalBody, Flex, Box, Table, Thead, Tbody, Tr, Th, Td, TableContainer } from '@chakra-ui/react'; import { UsageItemType } from '@fastgpt/global/support/wallet/usage/type.d'; import dayjs from 'dayjs'; import { UsageSourceMap } from '@fastgpt/global/support/wallet/usage/constants'; import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { formatNumber } from '@fastgpt/global/common/math/tools'; import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel'; const UsageDetail = ({ usage, onClose }: { usage: UsageItemType; onClose: () => void }) => { const { t } = useTranslation(); const filterBillList = useMemo( () => usage.list.filter((item) => item && item.moduleName), [usage.list] ); const { hasModel, hasToken, hasInputToken, hasOutputToken, hasCharsLen, hasDuration } = useMemo(() => { let hasModel = false; let hasToken = false; let hasInputToken = false; let hasOutputToken = false; let hasCharsLen = false; let hasDuration = false; let hasDataLen = false; usage.list.forEach((item) => { if (item.model !== undefined) { hasModel = true; } if (typeof item.tokens === 'number') { hasToken = true; } if (typeof item.inputTokens === 'number') { hasInputToken = true; } if (typeof item.outputTokens === 'number') { hasOutputToken = true; } if (typeof item.charsLength === 'number') { hasCharsLen = true; } if (typeof item.duration === 'number') { hasDuration = true; } }); return { hasModel, hasToken, hasInputToken, hasOutputToken, hasCharsLen, hasDuration, hasDataLen }; }, [usage.list]); return ( {t('account_usage:order_number')}: {usage.id} {t('account_usage:generation_time')}: {dayjs(usage.time).format('YYYY/MM/DD HH:mm:ss')} {t('account_usage:app_name')}: {t(usage.appName as any) || '-'} {t('account_usage:source')}: {t(UsageSourceMap[usage.source]?.label as any)} {t('account_usage:total_points_consumed')}: {formatNumber(usage.totalPoints)} {t('account_usage:billing_module')} {hasModel && } {hasToken && } {hasInputToken && } {hasOutputToken && } {hasCharsLen && } {hasDuration && } {filterBillList.map((item, i) => ( {hasModel && } {hasToken && } {hasInputToken && } {hasOutputToken && } {hasCharsLen && } {hasDuration && } ))}
{t('account_usage:module_name')}{t('account_usage:ai_model')}{t('account_usage:token_length')}{t('account_usage:input_token_length')}{t('account_usage:output_token_length')}{t('account_usage:text_length')}{t('account_usage:duration_seconds')}{t('account_usage:total_points_consumed')}
{t(item.moduleName as any)}{item.model ?? '-'}{item.tokens ?? '-'}{item.inputTokens ?? '-'}{item.outputTokens ?? '-'}{item.charsLength ?? '-'}{item.duration ?? '-'}{formatNumber(item.amount)}
); }; export default UsageDetail;