import type { ColumnDef } from "@tanstack/react-table" import { SearchIcon } from "lucide-react" import { useMemo, useState } from "react" import DataTable from "@/components/data-table" import Page from "@/components/page" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip" import { cutAccount, DEFAULT_FILTERS, formatOrderType, type OrderFilters, type OrderItem, PACKAGE_OPTIONS, totalConnections, } from "@/lib/models/order" import { MOCK_ORDERS, MOCK_PRODUCTS } from "./mock" function formatMoney(value: number): string { return value.toFixed(2) } function formatDate(value: string): string { const date = new Date(value) if (Number.isNaN(date.getTime())) return value const year = date.getFullYear() const month = String(date.getMonth() + 1).padStart(2, "0") const day = String(date.getDate()).padStart(2, "0") return `${year}.${month}.${day}` } function AccountCell({ accounts }: { accounts: string }) { const isCut = accounts.length > 15 if (!isCut) return {accounts} return ( {cutAccount(accounts)} {accounts} ) } const columns: ColumnDef[] = [ { accessorKey: "CreateTime", header: "日期", cell: ({ row }) => formatDate(row.original.CreateTime), }, { accessorKey: "OrderNo", header: "订单编号", }, { accessorKey: "OrderType", header: "类型", cell: ({ row }) => formatOrderType(row.original.OrderType), }, { accessorKey: "ProductName", header: "产品", }, { accessorKey: "PackageName", header: "套餐", }, { accessorKey: "Accounts", header: "账号", cell: ({ row }) => , }, { accessorKey: "ConnectCount", header: "连接数", cell: ({ row }) => totalConnections(row.original), }, { accessorKey: "DayPrice", header: "退款时长", cell: ({ row }) => formatMoney(row.original.DayPrice), }, { accessorKey: "DayPrice", header: "退款单价", cell: ({ row }) => formatMoney(row.original.DayPrice), }, { accessorKey: "PaymentAmount", header: "实付金额", cell: ({ row }) => formatMoney(row.original.PaymentAmount), }, { accessorKey: "CouponAmount", header: "退款金额", cell: ({ row }) => formatMoney(row.original.CouponAmount), }, ] function matchOrders(list: typeof MOCK_ORDERS, filters: OrderFilters) { const keyword = filters.keyword.trim() return list.filter(order => { if ( filters.orderType !== "0" && order.OrderType !== Number(filters.orderType) ) { return false } if ( filters.productId !== "0" && order.ProductId !== Number(filters.productId) ) { return false } if ( filters.packageName !== "0" && order.PackageName !== filters.packageName ) { return false } if ( keyword && !order.OrderNo.includes(keyword) && !order.Accounts.includes(keyword) ) { return false } if (filters.bTime && order.CreateTime.slice(0, 10) < filters.bTime) { return false } if (filters.eTime && order.CreateTime.slice(0, 10) > filters.eTime) { return false } return true }) } export default function RefundOrdersPage() { const [filters, setFilters] = useState(DEFAULT_FILTERS) const [appliedFilters, setAppliedFilters] = useState(DEFAULT_FILTERS) const [page, setPage] = useState(1) const [pageSize, setPageSize] = useState(10) const filtered = useMemo( () => matchOrders(MOCK_ORDERS, appliedFilters), [appliedFilters], ) const paged = useMemo( () => filtered.slice((page - 1) * pageSize, page * pageSize), [filtered, page, pageSize], ) const patch = (partial: Partial) => setFilters({ ...filters, ...partial }) const handleSearch = () => { setAppliedFilters(filters) setPage(1) } return ( 日期筛选: patch({ bTime: e.target.value })} className="w-36" aria-label="开始时间" /> 至 patch({ eTime: e.target.value })} className="w-36" aria-label="结束时间" /> patch({ productId: value })} > 全部产品 {MOCK_PRODUCTS.map(product => ( {product.name} ))} patch({ packageName: value })} > 全部套餐 {PACKAGE_OPTIONS.map(pkg => ( {pkg} ))} patch({ keyword: e.target.value })} onKeyDown={e => { if (e.key === "Enter") handleSearch() }} placeholder="账号" className="w-40" /> 查询 订单管理 { setPageSize(size) setPage(1) }, }} /> ) }