import CardGiftcardOutlined from "@mui/icons-material/CardGiftcardOutlined"; import { useMemo, useState } from "react"; import { listGiftRecords } from "@/features/operations/api"; import styles from "@/features/operations/operations.module.css"; import { usePaginatedQuery } from "@/shared/hooks/usePaginatedQuery.js"; import { AdminFilterResetButton, AdminListBody, AdminListToolbar } from "@/shared/ui/AdminListLayout.jsx"; import { AdminUserIdentity } from "@/shared/ui/AdminUserIdentity.jsx"; import { DataState } from "@/shared/ui/DataState.jsx"; import { DataTable } from "@/shared/ui/DataTable.jsx"; import { TimeRangeFilter } from "@/shared/ui/TimeRangeFilter.jsx"; import { TimeText } from "@/shared/ui/TimeText.jsx"; import { createOptionsColumnFilter, createUserIdentityColumnFilter } from "@/shared/ui/tableFilters.js"; import { emptyUserIdentityFilter, isUserIdentityFilterEmpty, userIdentityFilterParams, } from "@/shared/ui/userIdentityFilter.js"; const pageSize = 30; const sceneOptions = [ { label: "房间送礼", value: "room" }, { label: "私聊送礼", value: "direct" }, ]; export function GiftRecordTable() { const [page, setPage] = useState(1); const [scene, setScene] = useState(""); const [senderFilter, setSenderFilter] = useState(emptyUserIdentityFilter); const [timeRange, setTimeRange] = useState({ endMs: "", startMs: "" }); const filters = useMemo( () => ({ end_at_ms: timeRange.endMs || "", scene, ...userIdentityFilterParams(senderFilter, { displayUserId: "sender_display_user_id", userId: "sender_user_id", username: "sender_username", }), start_at_ms: timeRange.startMs || "", }), [scene, senderFilter, timeRange.endMs, timeRange.startMs], ); const query = usePaginatedQuery({ errorMessage: "获取送礼记录失败", fetcher: listGiftRecords, filters, page, pageSize, queryKey: ["gift-records", filters, page], }); const data = query.data || { items: [], page, pageSize, total: 0 }; const items = data.items || []; const total = data.total || 0; const hasActiveFilters = Boolean( !isUserIdentityFilterEmpty(senderFilter) || scene || timeRange.startMs || timeRange.endMs, ); const changeScene = (value) => { setScene(value); setPage(1); }; const changeSenderFilter = (value) => { setSenderFilter(value); setPage(1); }; const changeTimeRange = (value) => { setTimeRange(value); setPage(1); }; const resetFilters = () => { setScene(""); setSenderFilter(emptyUserIdentityFilter); setTimeRange({ endMs: "", startMs: "" }); setPage(1); }; const columns = useMemo( () => [ { key: "index", label: "序号", render: (_entry, index) => {index + 1}, resizable: false, width: "72px", }, { filter: createUserIdentityColumnFilter({ value: senderFilter, onChange: changeSenderFilter, }), key: "sender", label: "送礼人", render: (entry) => , width: "minmax(210px, 1fr)", }, { key: "receiver", label: "收礼人", render: (entry) => , width: "minmax(210px, 1fr)", }, { key: "gift", label: "礼物", render: (entry) => , width: "minmax(220px, 1fr)", }, { key: "giftValue", label: "数量与价值", render: (entry) => , width: "minmax(190px, 0.9fr)", }, { filter: createOptionsColumnFilter({ emptyLabel: "全部场景", options: sceneOptions, placeholder: "送礼场景", value: scene, onChange: changeScene, }), key: "scene", label: "场景", render: (entry) => , width: "minmax(132px, 0.7fr)", }, { key: "createdAtMs", label: "送礼时间", render: (entry) => , width: "minmax(170px, 0.8fr)", }, ], [scene, senderFilter], ); return (
} /> 0 ? { page, pageSize: data.pageSize || pageSize, total, onPageChange: setPage, } : undefined } rowKey={(entry) => entry.transactionId} />
); } function GiftCell({ gift = {} }) { return (
{gift.coverUrl ? : } {gift.name || "-"} {gift.giftId ? {gift.giftId} : null}
); } function GiftValueCell({ entry }) { return (
数量 × {formatNumber(entry.giftCount)} 单价 {formatNumber(entry.unitValue)} 总价值 {formatNumber(entry.giftValue)}
); } function SceneCell({ entry }) { const direct = entry.scene === "direct"; return ( {direct ? "私聊" : "房间"} {!direct && entry.roomId ? {entry.roomId} : null} ); } function formatNumber(value) { return Number(value || 0).toLocaleString("zh-CN"); }