"use client"; import { AdminNoResourceState, AdminTableNoResourceRow } from "@/components/admin/admin-no-resource-state"; import { useTranslation } from "react-i18next"; import { SignedMoney } from "@/lib/admin-signed-money"; import { formatDashboardCreditMajor, formatDashboardMoneyMinor } from "@/modules/dashboard/use-dashboard-analytics"; import { formatSignedSettlementMoney } from "@/modules/settlement/settlement-signed-money"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import type { AgentSettlementReportType } from "@/api/admin-agent-settlement"; type AgentSettlementReportViewProps = { reportType: AgentSettlementReportType; data: unknown; currencyCode: string; }; function asRecord(value: unknown): Record | null { return value !== null && typeof value === "object" && !Array.isArray(value) ? (value as Record) : null; } function asRows(value: unknown): Record[] { if (!Array.isArray(value)) { return []; } return value.filter((row): row is Record => row !== null && typeof row === "object"); } function money( value: unknown, currencyCode: string, ): string { return formatDashboardMoneyMinor(Number(value ?? 0), currencyCode); } function creditMoney(value: unknown, currencyCode: string): string { return formatDashboardCreditMajor(Number(value ?? 0), currencyCode); } export function AgentSettlementReportView({ reportType, data, currencyCode, }: AgentSettlementReportViewProps): React.ReactElement { const { t } = useTranslation(["agents", "common"]); const root = asRecord(data); if (reportType === "summary" && root) { const stats = [ { label: t("settlementReports.summary.billCount", { defaultValue: "账单数" }), value: String(root.bill_count ?? 0) }, { label: t("settlementReports.summary.totalNet", { defaultValue: "净额合计" }), value: money(root.total_net, currencyCode) }, { label: t("settlementReports.summary.totalUnpaid", { defaultValue: "未结合计" }), value: money(root.total_unpaid, currencyCode) }, { label: t("settlementReports.summary.overdueCount", { defaultValue: "逾期账单" }), value: String(root.overdue_count ?? 0) }, { label: t("settlementReports.summary.platformRounding", { defaultValue: "平台尾差合计" }), value: money(root.platform_rounding_total, currencyCode), }, ]; return (
{stats.map((item) => (
{item.label}
{item.value}
))}
); } if (reportType === "rebate" && root) { const byType = asRows(root.by_type); return (
{[ ["accrued_total", t("settlementReports.rebate.accrued", { defaultValue: "应计" })], ["in_bill_total", t("settlementReports.rebate.inBill", { defaultValue: "已入账单" })], ["settled_total", t("settlementReports.rebate.settled", { defaultValue: "已结算" })], ["allocated_total", t("settlementReports.rebate.allocated", { defaultValue: "已分摊" })], ].map(([key, label]) => (
{label}
{money(root[key], currencyCode)}
))}
{byType.length > 0 ? ( {t("settlementReports.columns.rebateType", { defaultValue: "类型" })} {t("settlementReports.columns.status", { defaultValue: "状态" })} {t("settlementReports.columns.amount", { defaultValue: "金额" })} {t("settlementReports.columns.count", { defaultValue: "笔数" })} {byType.map((row, idx) => ( {String(row.rebate_type ?? "")} {String(row.status ?? "")} {money(row.total, currencyCode)} {String(row.count ?? 0)} ))}
) : null}
); } if (reportType === "credit" && root) { const agents = asRows(root.agents); const players = asRows(root.players); return (

{t("settlementReports.credit.agents", { defaultValue: "代理授信" })}

{t("settlementReports.credit.players", { defaultValue: "玩家授信" })}

); } if (reportType === "platform_pnl" && root) { if (root.error) { return (

{t("settlementReports.platformPnl.periodRequired", { defaultValue: "请选择具体账期后查看平台盈亏(需 settlement_period_id)。", })}

); } const stats: { label: string; amount: number; signed?: boolean }[] = [ { label: t("settlementReports.platformPnl.billNet", { defaultValue: "平台账单净额" }), amount: Number(root.platform_bill_net ?? 0), }, { label: t("settlementReports.platformPnl.rounding", { defaultValue: "尾差调整" }), amount: Number(root.platform_rounding_adjustment ?? 0), }, { label: t("settlementReports.platformPnl.shareProfit", { defaultValue: "占成利润(元数据)" }), amount: Number(root.share_profit_meta ?? 0), signed: true, }, ]; return (
{stats.map((item) => (
{item.label}
{item.signed ? ( {formatSignedSettlementMoney(item.amount, currencyCode)} ) : ( money(item.amount, currencyCode) )}
))}
); } const items = asRows(root?.items ?? (reportType === "player_win_loss" || reportType === "agent_share" || reportType === "unpaid_bills" || reportType === "overdue" || reportType === "draw_period" ? data : null)); const columnSets: Record = { player_win_loss: [ { key: "username", header: t("settlementReports.columns.player", { defaultValue: "玩家" }) }, { key: "game_type", header: t("settlementReports.columns.gameType", { defaultValue: "玩法" }) }, { key: "game_win_loss", header: t("settlementReports.columns.grossWinLoss", { defaultValue: "输赢" }), money: true, signed: true }, { key: "basic_rebate", header: t("settlementReports.columns.rebate", { defaultValue: "回水" }), money: true }, ], agent_share: [ { key: "agent_node_id", header: t("settlementReports.columns.agentId", { defaultValue: "代理 ID" }) }, { key: "game_win_loss", header: t("settlementReports.columns.grossWinLoss", { defaultValue: "输赢" }), money: true, signed: true }, { key: "basic_rebate", header: t("settlementReports.columns.rebate", { defaultValue: "回水" }), money: true }, { key: "entry_count", header: t("settlementReports.columns.count", { defaultValue: "笔数" }) }, ], unpaid_bills: [ { key: "bill_id", header: t("settlementReports.columns.billId", { defaultValue: "账单" }) }, { key: "bill_type", header: t("settlementReports.columns.billType", { defaultValue: "类型" }) }, { key: "unpaid_amount", header: t("settlementReports.columns.unpaid", { defaultValue: "未结" }), money: true }, { key: "status", header: t("settlementReports.columns.status", { defaultValue: "状态" }) }, ], overdue: [ { key: "bill_id", header: t("settlementReports.columns.billId", { defaultValue: "账单" }) }, { key: "overdue_days", header: t("settlementReports.columns.overdueDays", { defaultValue: "逾期天数" }) }, { key: "unpaid_amount", header: t("settlementReports.columns.unpaid", { defaultValue: "未结" }), money: true }, ], draw_period: [ { key: "draw_no", header: t("settlementReports.columns.drawNo", { defaultValue: "期号" }) }, { key: "game_win_loss", header: t("settlementReports.columns.grossWinLoss", { defaultValue: "输赢" }), money: true, signed: true }, { key: "basic_rebate", header: t("settlementReports.columns.rebate", { defaultValue: "回水" }), money: true }, { key: "ticket_count", header: t("settlementReports.columns.count", { defaultValue: "笔数" }) }, ], }; const columns = columnSets[reportType]; if (!columns) { return ( ); } return ; } function ReportTable({ rows, columns, currencyCode, }: { rows: Record[]; columns: { key: string; header: string; money?: boolean; signed?: boolean; creditMajor?: boolean }[]; currencyCode: string; }): React.ReactElement { const { t } = useTranslation("common"); if (rows.length === 0) { return ; } return (
{columns.map((col) => ( {col.header} ))} {rows.map((row, idx) => ( {columns.map((col) => ( {col.creditMajor ? creditMoney(row[col.key], currencyCode) : col.money && col.signed ? ( {formatSignedSettlementMoney(Number(row[col.key] ?? 0), currencyCode)} ) : col.money ? money(row[col.key], currencyCode) : String(row[col.key] ?? "—")} ))} ))}
); }