'use client' import {useCallback, useEffect, useState} from 'react' import {PageRecord} from '@/lib/api' import {Balance} from '@/lib/models' import {useStatus} from '@/lib/states' import {Search, Eraser} from 'lucide-react' import {Button} from '@/components/ui/button' import DataTable from '@/components/data-table' import {format} from 'date-fns' import DatePicker from '@/components/date-picker' import {Form, FormField} from '@/components/ui/form' import {useForm} from 'react-hook-form' import zod from 'zod' import {zodResolver} from '@hookform/resolvers/zod' import {Label} from '@/components/ui/label' import Page from '@/components/page' import {CheckCircle, AlertCircle} from 'lucide-react' import {Input} from '@/components/ui/input' import {listBalances} from '@/actions/balance' const filterSchema = zod.object({ created_at_start: zod.date().optional(), created_at_end: zod.date().optional(), bill_no: zod.string().optional(), }) type FilterSchema = zod.infer export type BalancePageProps = {} export default function BalancePage(props: BalancePageProps) { const [status, setStatus] = useStatus() const [data, setData] = useState>({ page: 1, size: 10, total: 0, list: [], }) const form = useForm({ resolver: zodResolver(filterSchema), defaultValues: { bill_no: '', created_at_start: undefined, created_at_end: undefined, }, }) const onSubmit = async (value: FilterSchema) => { await refresh(1, data.size) } const refresh = useCallback(async (page: number, size: number) => { setStatus('load') try { const created_at_start = form.getValues('created_at_start') const created_at_end = form.getValues('created_at_end') const bill_no = form.getValues('bill_no') const res = await listBalances({ page, size, created_at_start, created_at_end, bill_no: bill_no || undefined, }) if (res.success) { setData(res.data) setStatus('done') } else { throw new Error('Failed to load bills') } } catch (e) { setStatus('fail') } }, [form, setStatus]) useEffect(() => { refresh(1, 10).then() }, [refresh]) return (
账单编号}> {({id, field}) => { return }}
{({field}) => { const dateValue = typeof field.value === 'string' && field.value ? new Date(field.value) : undefined return ( ) } } - {({field}) => ( ) }
{ await refresh(page, data.size) }, onSizeChange: async (size: number) => { await refresh(data.page, size) }, }} columns={[ {accessorKey: 'bill_no', header: `账单编号`, accessorFn: row => row.bill?.bill_no || '', }, { accessorKey: 'status', header: `状态`, cell: ({row}) => { const trade = row.original.trade if (![1, 2, 3, 4, 5].includes(trade?.method)) { return (
已完成
) } if (!trade) return - return (
{trade?.status === 1 ? ( ) : trade?.status === 2 ? ( ) : trade?.status === 3 ? ( ) : null} {trade?.status === 1 ? '已完成' : trade?.status === 2 ? '已取消' : trade?.status === 3 ? '已退款' : '-'}
) }, }, { accessorKey: 'amount', header: '变动金额', cell: ({row}) => { const amount = row.original.amount const isPositive = Number(amount) > 0 return (
{isPositive ? '+' : ''} {Number(amount).toFixed(2)}
) }, }, { header: '余额变化', accessorKey: 'balance_prev', cell: ({row}) => (
¥{Number(row.original.balance_prev).toFixed(2)} ¥{Number(row.original.balance_curr).toFixed(2)}
), }, { header: '备注', accessorKey: 'remark', }, { header: '创建时间', accessorKey: 'created_at', cell: ({row}) => format(new Date(row.original.created_at), 'yyyy-MM-dd HH:mm'), }, ]} />
) }