import { getInvoiceBillsList, invoiceBillDataType, submitInvoice } from '@/web/support/wallet/bill/invoice/api'; import { Box, Button, Checkbox, Flex, Table, TableContainer, Tbody, Td, Th, Thead, Tr, useDisclosure } from '@chakra-ui/react'; import { billTypeMap } from '@fastgpt/global/support/wallet/bill/constants'; import { formatStorePrice2Read } from '@fastgpt/global/support/wallet/usage/tools'; import MyModal from '@fastgpt/web/components/common/MyModal'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import dayjs from 'dayjs'; import { useTranslation } from 'next-i18next'; import { useCallback, useState } from 'react'; import MyIcon from '@fastgpt/web/components/common/Icon'; import Divider from '@/pages/app/detail/components/WorkflowComponents/Flow/components/Divider'; import { TeamInvoiceHeaderType } from '@fastgpt/global/support/user/team/type'; import { InvoiceHeaderSingleForm } from './InvoiceHeaderForm'; import MyBox from '@fastgpt/web/components/common/MyBox'; import { getTeamInvoiceHeader } from '@/web/support/user/team/api'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { useRouter } from 'next/router'; type chosenBillDataType = { _id: string; price: number; }; const ApplyInvoiceModal = ({ onClose }: { onClose: () => void }) => { const { t } = useTranslation(); const { toast } = useToast(); const [chosenBillDataList, setChosenBillDataList] = useState([]); const [totalPrice, setTotalPrice] = useState(0); const [formData, setFormData] = useState({ teamName: '', unifiedCreditCode: '', companyAddress: '', companyPhone: '', bankName: '', bankAccount: '', needSpecialInvoice: undefined, emailAddress: '' }); const router = useRouter(); const { isOpen: isOpenSettleModal, onOpen: onOpenSettleModal, onClose: onCloseSettleModal } = useDisclosure(); const handleChange = useCallback((e: any) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); }, []); const handleRatiosChange = useCallback((v: string) => { setFormData((prev) => ({ ...prev, needSpecialInvoice: v === 'true' })); }, []); const isHeaderValid = useCallback((v: TeamInvoiceHeaderType) => { const emailRegex = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/; for (const [key, value] of Object.entries(v)) { if (typeof value === 'string' && value.trim() === '') { return false; } } return emailRegex.test(v.emailAddress); }, []); const { loading: isLoading, data: billsList, run: getInvoiceBills } = useRequest2(() => getInvoiceBillsList(), { manual: false }); const { run: handleSubmitInvoice, loading: isSubmitting } = useRequest2( () => submitInvoice({ amount: totalPrice, billIdList: chosenBillDataList.map((item) => item._id), ...formData }), { manual: true, successToast: t('common:common.submit_success'), errorToast: t('common:common.Submit failed'), onSuccess: () => { onClose(); router.reload(); } } ); const { loading: isLoadingHeader } = useRequest2(() => getTeamInvoiceHeader(), { manual: false, onSuccess: (res) => setFormData(res) }); const handleSubmit = useCallback(async () => { if (!isHeaderValid(formData)) { toast({ title: t('common:support.wallet.invoice_data.in_valid'), status: 'info' }); return; } handleSubmitInvoice(); }, [formData, handleSubmitInvoice, isHeaderValid, t, toast]); const handleBack = useCallback(() => { setChosenBillDataList([]); getInvoiceBills(); onCloseSettleModal(); }, [getInvoiceBills, onCloseSettleModal]); const handleSingleCheck = useCallback( (item: invoiceBillDataType) => { if (chosenBillDataList.find((bill) => bill._id === item._id)) { setChosenBillDataList(chosenBillDataList.filter((bill) => bill._id !== item._id)); } else { setChosenBillDataList([...chosenBillDataList, { _id: item._id, price: item.price }]); } }, [chosenBillDataList] ); return ( {!isOpenSettleModal ? ( {t('common:support.wallet.billable_invoice')} {billsList?.map((item) => ( { if (e.target?.name && e.target.name === 'check') return; handleSingleCheck(item); }} _hover={{ bg: 'blue.50' }} > ))}
{ !e.target.checked ? setChosenBillDataList([]) : setChosenBillDataList( billsList?.map((item) => ({ _id: item._id, price: item.price })) || [] ); }} /> {t('common:user.type')} {t('common:user.Time')} {t('common:support.wallet.Amount')}
i._id === item._id)} /> {t(billTypeMap[item.type]?.label as any)} {item.createTime ? dayjs(item.createTime).format('YYYY/MM/DD HH:mm:ss') : '-'} {t('common:pay.yuan', { amount: formatStorePrice2Read(item.price) })}
{!isLoading && billsList && billsList.length === 0 && ( {t('common:support.wallet.noBill')} )}
) : ( {t('common:support.wallet.invoice_amount')} {t('common:pay.yuan', { amount: formatStorePrice2Read(totalPrice) })} {t('common:support.wallet.invoice_info')} )}
); }; export default ApplyInvoiceModal;