import { SearchOutlined, ReloadOutlined } from '@ant-design/icons' import { Button, Card, Form, Input, Select, Space, Table, Typography } from 'antd' import type { TableColumnsType } from 'antd' import { useQuery } from '@tanstack/react-query' import { useMemo } from 'react' import { useNavigate, useSearchParams } from 'react-router' import PageHeader from '@/components/admin/PageHeader' import StatusTag from '@/components/admin/StatusTag' import { fetchAdminOrders } from '@/services/admin' import type { AdminOrderListItem } from '@/types/admin' import { adminPayStatusOptions } from '@/utils/admin-options' import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination, resolveAdminPageSize, } from '@/utils/admin-pagination' import { formatAdminDateTime } from '@/utils/admin-time' type OrderFilterForm = { platformOrderId?: string payStatus?: string skuCode?: string } export default function AdminOrdersPage() { const navigate = useNavigate() const [searchParams, setSearchParams] = useSearchParams() const page = Number(searchParams.get('page') || 1) || 1 const pageSize = resolveAdminPageSize(searchParams.get('pageSize'), ADMIN_DEFAULT_PAGE_SIZE) const filters = { platformOrderId: searchParams.get('platformOrderId') || '', payStatus: searchParams.get('payStatus') || '', skuCode: searchParams.get('skuCode') || '', } const queryParams = useMemo( () => ({ page, pageSize, ...filters }), [filters.platformOrderId, filters.payStatus, filters.skuCode, page, pageSize], ) const query = useQuery({ queryKey: ['admin-orders', queryParams], queryFn: () => fetchAdminOrders(queryParams), }) const data = query.data?.data const columns: TableColumnsType = [ { title: '订单信息', dataIndex: 'platformOrderId', minWidth: 220, render: (_, row) => (
navigate(`/admin/orders/${row.orderId}`)}> {row.platformOrderId} {row.shopName || row.shopId || row.provider}
), }, { title: '商品 / 任务', minWidth: 220, render: (_, row) => (
{row.itemSummary || '-'} 商品 {row.itemCount} · 数量 {row.totalQuantity} · 任务 {row.taskCount}
), }, { title: '状态', minWidth: 220, render: (_, row) => ( ), }, { title: '金额 / 时间', minWidth: 180, render: (_, row) => (
{row.totalAmount || '0.00'} {row.currency} {formatAdminDateTime(row.createdAt)}
), }, ] function applyFilters(values: OrderFilterForm) { setSearchParams(cleanParams({ ...values, page: 1, pageSize })) } function resetFilters() { setSearchParams(cleanParams({ page: 1, pageSize })) } return (
layout="inline" initialValues={filters} onFinish={applyFilters} className="filter-form" > rowKey="orderId" loading={query.isLoading || query.isFetching} columns={columns} dataSource={data?.items || []} scroll={{ x: 900 }} pagination={buildAdminTablePagination({ current: data?.pagination.page || page, pageSize: data?.pagination.pageSize || pageSize, total: data?.pagination.total || 0, onChange: (nextPage, nextPageSize) => { setSearchParams(cleanParams({ ...filters, page: nextPage, pageSize: nextPageSize })) }, })} />
) } function cleanParams(params: Record) { const next = new URLSearchParams() Object.entries(params).forEach(([key, value]) => { const normalized = String(value ?? '').trim() if (normalized) { next.set(key, normalized) } }) return next }