import { useState } from "react"; import { createFileRoute } from "@tanstack/react-router"; import { RotateCcw, Search } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { DataTable } from "@/components/data-table"; import { Pagination } from "@/components/pagination"; import { useFetchList } from "./-hooks/useFetchList"; import { useUserStatusActions } from "@/hooks/use-user-status-actions"; import { UserActionConfirmDialog } from "./-components/UserActionConfirmDialog"; import { useUserStore } from "@/stores/user"; import { DateRangePicker } from "@/components/date-range-picker"; export const Route = createFileRoute("/admin/org-account/")({ component: RouteComponent, }); const initialFilters = { orgNameLike: "", usernameLike: "", realNameLike: "", phoneLike: "", enabled: "", status: "", createTimeStart: "", createTimeEnd: "", }; export function useColumns({ handleEnable, handleDisable, handleCancelUser, }: any) { const currentUserId = useUserStore((state: any) => state.user?.id); return [ { accessorKey: "orgName", header: "机构名称", cell: ({ row }: any) => (
{row.getValue("orgName")}
{row.original.administrator && ( 管理员 )}
), }, { accessorKey: "username", header: "账号", cell: ({ row }: any) =>
{row.getValue("username")}
, }, { accessorKey: "realName", header: "姓名", cell: ({ row }: any) => (
{row.getValue("realName") || row.original.nickname || "-"}
), }, { accessorKey: "phone", header: "手机号", cell: ({ row }: any) =>
{row.getValue("phone") || "-"}
, }, { accessorKey: "userType", header: "用户类型", cell: ({ row }: any) => (
{row.getValue("userType") === 2 ? "个人用户" : "企业用户"}
), }, { accessorKey: "enabled", header: "启用状态", cell: ({ row }: any) => row.getValue("enabled") ? ( 启用 ) : ( 禁用 ), }, { accessorKey: "status", header: "状态", cell: ({ row }: any) => { const status = Number(row.getValue("status")); return (
{status === 1 ? ( 待激活 ) : status === 2 ? ( 已激活 ) : ( 已注销 )}
); }, }, { accessorKey: "createTime", header: "创建时间", cell: ({ row }: any) =>
{row.getValue("createTime")}
, }, { id: "actions", enableHiding: false, header: "操作", cell: ({ row }: any) => { const record = row.original; // 已注销或当前登录人自己,不展示操作 if (Number(record.status) === 3 || record.userId === currentUserId) { return null; } return (
{record.enabled ? ( ) : ( )}
); }, }, ]; } function RouteComponent() { const [currentEntity, setCurrentEntity] = useState(null); // 启用(直接操作) const { enable } = useUserStatusActions({ onSuccess: () => query?.refetch(), }); const handleEnable = (record: any) => { enable(record.userId); }; // 禁用/注销(二次确认) const [confirmAction, setConfirmAction] = useState< "disable" | "adminCancel" >("disable"); const [openConfirmDialog, setOpenConfirmDialog] = useState(false); const handleDisable = (record: any) => { setCurrentEntity(record); setConfirmAction("disable"); setOpenConfirmDialog(true); }; const handleCancelUser = (record: any) => { setCurrentEntity(record); setConfirmAction("adminCancel"); setOpenConfirmDialog(true); }; const { table, query, search } = useFetchList(() => useColumns({ handleEnable, handleDisable, handleCancelUser, }), ); // 筛选条件(点击查询后生效) const [filters, setFilters] = useState(initialFilters); const setFilter = (key: string, value: string) => { setFilters((prev: any) => ({ ...prev, [key]: value })); }; const handleSearch = () => { search({ ...filters, createTimeStart: filters.createTimeStart ? `${filters.createTimeStart} 00:00:00` : "", createTimeEnd: filters.createTimeEnd ? `${filters.createTimeEnd} 23:59:59` : "", }); }; const handleReset = () => { setFilters(initialFilters); search({}); }; return ( <>
机构账号
查看各机构下的账号信息,启用/禁用/注销账号
setFilter("orgNameLike", e.target.value)} /> setFilter("usernameLike", e.target.value)} /> setFilter("realNameLike", e.target.value)} /> setFilter("phoneLike", e.target.value)} />
创建时间 { setFilter("createTimeStart", range.from ?? ""); setFilter("createTimeEnd", range.to ?? ""); }} />
); }