"use client" import { zodResolver } from "@hookform/resolvers/zod" import { format } from "date-fns" import { useRouter } from "next/navigation" import { Suspense, useCallback, useState } from "react" import { Controller, useForm } from "react-hook-form" import { toast } from "sonner" import { z } from "zod" import { getPageUser } from "@/actions/user" import { DeductionDialog } from "@/app/(root)/cust/deduction" import { DepositDialog } from "@/app/(root)/cust/deposit" import { UpdateDialog } from "@/app/(root)/cust/update" import { Auth } from "@/components/auth" import { DataTable } from "@/components/data-table" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Field, FieldError, FieldGroup, FieldLabel, } from "@/components/ui/field" import { Input } from "@/components/ui/input" import { ScopeBatchReadOfUser, ScopeBillReadOfUser, ScopeChannelReadOfUser, ScopeResourceRead, ScopeTradeReadOfUser, ScopeUserWrite, ScopeUserWriteBalance, ScopeUserWriteBalanceDec, ScopeUserWriteBalanceInc, } from "@/lib/scopes" import type { User } from "@/models/user" import { AddUserDialog } from "../../cust/create" // import { ResourcesDialog } from "./resourcesDialog" interface UserQueryParams { account?: string name?: string } const filterSchema = z.object({ phone: z.string().optional(), name: z.string().optional(), }) type FormValues = z.infer export default function UserQueryPage() { const [userList, setUserList] = useState([]) const [loading, setLoading] = useState(false) const [depositDialog, setDepositDialog] = useState(false) const [deposit, setDeposit] = useState(null) const [deductionDialog, setDeductionDialog] = useState(false) const [deduction, setDeduction] = useState(null) const [isEditDialogOpen, setIsEditDialogOpen] = useState(false) const [currentEditUser, setCurrentEditUser] = useState(null) const [currentFilters, setCurrentFilters] = useState({}) const [isAddDialogOpen, setIsAddDialogOpen] = useState(false) const router = useRouter() const { control, handleSubmit, reset } = useForm({ resolver: zodResolver(filterSchema), defaultValues: { phone: "", name: "", }, }) const fetchUsers = useCallback(async (filters: UserQueryParams = {}) => { setLoading(true) try { const res = await getPageUser(filters) if (res.success) { const data = Array.isArray(res.data) ? res.data : [res.data] setUserList(data) } else { toast.error(res.message || "获取用户失败") setUserList([]) } } catch (error) { const message = error instanceof Error ? error.message : error toast.error(`获取用户失败: ${message}`) } finally { setLoading(false) } }, []) const onFilter = handleSubmit((data: FormValues) => { const params: UserQueryParams = {} if (data.phone?.trim()) params.account = data.phone.trim() if (data.name?.trim()) params.name = data.name.trim() if (Object.keys(params).length === 0) { toast.info("请至少输入一个筛选条件") return } setCurrentFilters(params) fetchUsers(params) }) const refreshTable = useCallback(() => { if (Object.keys(currentFilters).length > 0) { fetchUsers(currentFilters) } }, [fetchUsers, currentFilters]) const handleReset = () => { reset() setCurrentFilters({}) setUserList([]) } return (
( 手机号 {fieldState.error?.message} )} /> ( 姓名 {fieldState.error?.message} )} />
data={userList || []} status={loading ? "load" : "done"} columns={[ { header: "账号", accessorKey: "username" }, { header: "手机", accessorKey: "phone" }, { header: "邮箱", accessorKey: "email" }, { header: "姓名", accessorKey: "name" }, { header: "余额", accessorKey: "balance", cell: ({ row }) => { const balance = Number(row.original.balance) || 0 return ( 0 ? "text-green-500" : "text-orange-500" } > ¥{balance.toFixed(2)} ) }, }, { header: "实名状态", accessorKey: "id_type", cell: ({ row }) => ( {row.original.id_type === 1 ? "已认证" : "未认证"} ), }, { header: "身份证号", accessorKey: "id_no", cell: ({ row }) => { const idNo = row.original.id_no return idNo ? `${idNo.slice(0, 6)}****${idNo.slice(-4)}` : "" }, }, { header: "客户来源", accessorKey: "source", cell: ({ row }) => { const sourceMap: Record = { 0: "官网注册", 1: "管理员添加", 2: "代理商注册", 3: "代理商添加", } return sourceMap[row.original.source] ?? "未知" }, }, { header: "账号状态", accessorKey: "status", cell: ({ row }) => (row.original.status === 1 ? "正常" : "禁用"), }, { header: "联系方式", accessorKey: "contact_wechat" }, { header: "客户经理", cell: ({ row }) => row.original.admin?.name || "", }, { header: "最后登录时间", accessorKey: "last_login", cell: ({ row }) => row.original.last_login ? format( new Date(row.original.last_login), "yyyy-MM-dd HH:mm", ) : "", }, { header: "最后登录IP", accessorKey: "last_login_ip", cell: ({ row }) => row.original.last_login_ip || "", }, { header: "创建时间", accessorKey: "created_at", cell: ({ row }) => format(new Date(row.original.created_at), "yyyy-MM-dd HH:mm"), }, { id: "action", meta: { pin: "right" }, header: "操作", cell: ({ row }) => { return (
) }, }, ]} />
) }