diff --git a/src/components/admin/admin-player-identity-columns.tsx b/src/components/admin/admin-player-identity-columns.tsx new file mode 100644 index 0000000..ef983f0 --- /dev/null +++ b/src/components/admin/admin-player-identity-columns.tsx @@ -0,0 +1,105 @@ +"use client"; + +import { useTranslation } from "react-i18next"; + +import { TableCell, TableHead } from "@/components/ui/table"; +import { cn } from "@/lib/utils"; + +export type AdminPlayerIdentityFields = { + site_code?: string | null; + site_player_id?: string | null; + username?: string | null; + nickname?: string | null; +}; + +export function adminPlayerDisplayName(row: AdminPlayerIdentityFields): string { + const nickname = row.nickname?.trim() ?? ""; + const username = row.username?.trim() ?? ""; + if (nickname !== "") { + return nickname; + } + if (username !== "") { + return username; + } + + return "—"; +} + +function cellText(value: string | null | undefined): string { + const trimmed = value?.trim() ?? ""; + return trimmed !== "" ? trimmed : "—"; +} + +type HeadProps = { className?: string }; +type CellProps = { row: AdminPlayerIdentityFields; className?: string }; + +export function AdminPlayerSiteHead({ className }: HeadProps): React.ReactElement { + const { t } = useTranslation("common"); + return ( + + {t("playerColumns.site")} + + ); +} + +export function AdminPlayerDisplayHead({ className }: HeadProps): React.ReactElement { + const { t } = useTranslation("common"); + return ( + + {t("playerColumns.display")} + + ); +} + +export function AdminPlayerSiteIdHead({ className }: HeadProps): React.ReactElement { + const { t } = useTranslation("common"); + return ( + + {t("playerColumns.sitePlayerId")} + + ); +} + +export function AdminPlayerIdentityHeads({ className }: { className?: string }): React.ReactElement { + return ( + <> + + + + + ); +} + +export function AdminPlayerSiteCell({ row, className }: CellProps): React.ReactElement { + return ( + + {cellText(row.site_code)} + + ); +} + +export function AdminPlayerDisplayCell({ row, className }: CellProps): React.ReactElement { + return ( + + {adminPlayerDisplayName(row)} + + ); +} + +export function AdminPlayerSiteIdCell({ row, className }: CellProps): React.ReactElement { + return ( + + {cellText(row.site_player_id)} + + ); +} + +export function AdminPlayerIdentityCells({ row, className }: CellProps): React.ReactElement { + return ( + <> + + + + + ); +} diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index e849da3..f1aeb5e 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -120,6 +120,11 @@ "table": { "id": "ID" }, + "playerColumns": { + "site": "Site", + "display": "Player", + "sitePlayerId": "Player ID" + }, "toolbar": { "defaultAdmin": "Administrator", "notifications": "Notifications", diff --git a/src/i18n/locales/en/dashboard.json b/src/i18n/locales/en/dashboard.json index c7b00db..35127ca 100644 --- a/src/i18n/locales/en/dashboard.json +++ b/src/i18n/locales/en/dashboard.json @@ -7,7 +7,7 @@ "lifetime": "All-time totals", "currentDraw": "Current draw", "currentDrawDetail": "Current draw · {{drawNo}}", - "operations": "Operations (current draw)", + "operations": "Operations (site-wide)", "snapshot": "Current draw snapshot" }, "countdownToClose": "Time to close", @@ -85,10 +85,15 @@ "noFinanceActivity": "No bets this draw", "noPayoutYet": "No payout this draw", "resultBatches": "Result batch progress", - "resultBatchQueueScope": "Site-wide pending batches", + "resultBatchQueueScope": "Site-wide result batches", "batchPending": "Pending review", "batchPendingDraws": "Draws involved", - "batchCurrentDrawPending": "Current draw", + "batchPendingDrawsCount": "{{count}} draws pending", + "platformLockedAndCap": "Site locked {{locked}} / cap {{cap}}", + "platformOrderAndTicket": "Site-wide {{orders}} orders · {{tickets}} lines", + "platformBetTotal": "Lifetime bet", + "platformNoFinanceActivity": "No bets site-wide yet", + "platformNoPayoutYet": "No payouts site-wide yet", "batchPublished": "Published", "batchTotal": "Total batches", "batchOther": "Other statuses", diff --git a/src/i18n/locales/ne/common.json b/src/i18n/locales/ne/common.json index cd7dc51..201e25b 100644 --- a/src/i18n/locales/ne/common.json +++ b/src/i18n/locales/ne/common.json @@ -120,6 +120,11 @@ "table": { "id": "ID" }, + "playerColumns": { + "site": "साइट", + "display": "खेलाडी", + "sitePlayerId": "खेलाडी ID" + }, "toolbar": { "defaultAdmin": "प्रशासक", "notifications": "सूचना", diff --git a/src/i18n/locales/ne/dashboard.json b/src/i18n/locales/ne/dashboard.json index cd3e8ea..8bb2d84 100644 --- a/src/i18n/locales/ne/dashboard.json +++ b/src/i18n/locales/ne/dashboard.json @@ -7,7 +7,7 @@ "lifetime": "ऐतिहासिक कुल", "currentDraw": "हालको ड्रअ", "currentDrawDetail": "हालको ड्रअ · {{drawNo}}", - "operations": "सञ्चालन (हालको ड्रअ)", + "operations": "सञ्चालन (साइटव्यापी)", "snapshot": "हालको ड्रअ स्न्यापसट" }, "countdownToClose": "बन्द हुन बाँकी", @@ -85,10 +85,15 @@ "noFinanceActivity": "यस ड्रअमा बेट छैन", "noPayoutYet": "यस ड्रअमा भुक्तानी छैन", "resultBatches": "परिणाम ब्याच प्रगति", - "resultBatchQueueScope": "साइटव्यापी पेन्डिङ ब्याच", + "resultBatchQueueScope": "साइटव्यापी नतिजा ब्याच", "batchPending": "समीक्षा बाँकी", "batchPendingDraws": "सम्बन्धित ड्रअ", - "batchCurrentDrawPending": "हालको ड्रअ", + "batchPendingDrawsCount": "{{count}} ड्रअ पेन्डिङ", + "platformLockedAndCap": "साइट लक {{locked}} / क्याप {{cap}}", + "platformOrderAndTicket": "साइटव्यापी {{orders}} अर्डर · {{tickets}} लाइन", + "platformBetTotal": "जम्मा बेट", + "platformNoFinanceActivity": "साइटव्यापी अहिले बेट छैन", + "platformNoPayoutYet": "साइटव्यापी पेआउट छैन", "batchPublished": "प्रकाशित", "batchTotal": "कुल ब्याच", "batchOther": "अन्य स्थिति", diff --git a/src/i18n/locales/zh/common.json b/src/i18n/locales/zh/common.json index 7c8f6f0..0836e05 100644 --- a/src/i18n/locales/zh/common.json +++ b/src/i18n/locales/zh/common.json @@ -120,6 +120,11 @@ "table": { "id": "ID" }, + "playerColumns": { + "site": "主站", + "display": "玩家", + "sitePlayerId": "玩家 ID" + }, "toolbar": { "defaultAdmin": "管理员", "notifications": "通知", diff --git a/src/i18n/locales/zh/dashboard.json b/src/i18n/locales/zh/dashboard.json index 6d8fd4c..2f9483f 100644 --- a/src/i18n/locales/zh/dashboard.json +++ b/src/i18n/locales/zh/dashboard.json @@ -7,7 +7,7 @@ "lifetime": "历史累计", "currentDraw": "当前期号", "currentDrawDetail": "当期明细 · {{drawNo}}", - "operations": "运营监控(当期)", + "operations": "运营监控(全站)", "snapshot": "当期快照" }, "countdownToClose": "距截止投注", @@ -85,10 +85,15 @@ "noFinanceActivity": "本期暂无投注", "noPayoutYet": "本期暂无派彩", "resultBatches": "开奖批次进度", - "resultBatchQueueScope": "全站待审核批次", + "resultBatchQueueScope": "全站开奖批次", "batchPending": "待审核", "batchPendingDraws": "涉及期数", - "batchCurrentDrawPending": "当前期", + "batchPendingDrawsCount": "{{count}} 期待审", + "platformLockedAndCap": "全站已占用 {{locked}} / 封顶 {{cap}}", + "platformOrderAndTicket": "全站 {{orders}} 单 · {{tickets}} 笔", + "platformBetTotal": "累计投注", + "platformNoFinanceActivity": "全站暂无投注", + "platformNoPayoutYet": "全站暂无派彩记录", "batchPublished": "已发布", "batchTotal": "批次合计", "batchOther": "其他状态", diff --git a/src/i18n/locales/zh/tickets.json b/src/i18n/locales/zh/tickets.json index 1d8b572..0fa7225 100644 --- a/src/i18n/locales/zh/tickets.json +++ b/src/i18n/locales/zh/tickets.json @@ -40,8 +40,8 @@ "partial_failed": "部分失败", "failed": "投注失败", "pending_payout": "待派奖", - "settled_win": "已中奖结算", - "settled_lose": "已未中奖结算", + "settled_win": "已结算(中奖)", + "settled_lose": "已结算(未中奖)", "refunded": "已退款" }, "allTickets": "全部注单" diff --git a/src/modules/dashboard/dashboard-console.tsx b/src/modules/dashboard/dashboard-console.tsx index 1e1db1e..07cf29d 100644 --- a/src/modules/dashboard/dashboard-console.tsx +++ b/src/modules/dashboard/dashboard-console.tsx @@ -41,8 +41,8 @@ import { CapUsageBar, FinanceStructureChart, HotUsageBars, - PayoutPanelSnapshot, ResultBatchQueueSummary, + PlatformLifetimePayoutSnapshot, DashboardPanelCard, SettlementStatusChart, } from "@/modules/dashboard/dashboard-visuals"; @@ -55,6 +55,8 @@ import { cn } from "@/lib/utils"; import { LotteryApiBizError } from "@/types/api/errors"; import type { AdminDashboardDrawPanel, + AdminDashboardLifetimeFinance, + AdminDashboardPlatformRisk, AdminDashboardResultBatchQueue, } from "@/types/api/admin-dashboard"; import type { AdminDrawFinanceSummaryData } from "@/types/api/admin-draw-finance"; @@ -151,6 +153,10 @@ export function DashboardConsole(): ReactElement { const [resultBatchQueue, setResultBatchQueue] = useState( null, ); + const [lifetimeFinance, setLifetimeFinance] = useState( + null, + ); + const [platformRisk, setPlatformRisk] = useState(null); const [riskLocked, setRiskLocked] = useState(0); const [riskCap, setRiskCap] = useState(0); const [hotPoolSample, setHotPoolSample] = useState([]); @@ -190,6 +196,8 @@ export function DashboardConsole(): ReactElement { setCapabilities(null); setDrawPanel(null); setResultBatchQueue(null); + setLifetimeFinance(null); + setPlatformRisk(null); setDrawId(null); setRiskLocked(0); setRiskCap(0); @@ -208,9 +216,11 @@ export function DashboardConsole(): ReactElement { if (d.finance != null) { setFinance(d.finance); } + setResultBatchQueue(d.result_batch_queue); + setLifetimeFinance(d.lifetime_finance); + setPlatformRisk(d.platform_risk); if (d.draw != null) { setDrawPanel(d.draw); - setResultBatchQueue(d.result_batch_queue); } if (d.risk != null) { setRiskLocked(d.risk.locked_amount); @@ -235,14 +245,16 @@ export function DashboardConsole(): ReactElement { return () => window.clearTimeout(timer); }, [load]); - const currency = finance?.currency_code ?? null; + const currency = + lifetimeFinance?.currency_code ?? finance?.currency_code ?? null; const canFinance = capabilities?.draw_finance_risk ?? false; - const usagePct = riskCap > 0 ? (riskLocked / riskCap) * 100 : 0; + const platformLocked = platformRisk?.locked_amount ?? 0; + const platformCap = platformRisk?.cap_amount ?? 0; + const platformUsagePct = platformRisk?.usage_percent ?? 0; const hotRows = useMemo(() => topPoolsForTab(hotPoolSample, hotTab), [hotPoolSample, hotTab]); const pendingReviewTotal = resultBatchQueue?.pending_review_total ?? 0; - const currentDrawPending = drawPanel?.result_batch_counts.pending_review ?? 0; const analytics = useDashboardAnalytics({ enabled: canFinance, playOptions }); const showAnalytics = canFinance; @@ -322,11 +334,7 @@ export function DashboardConsole(): ReactElement { loading={loading} > {resultBatchQueue != null ? ( - + ) : null} @@ -348,53 +356,62 @@ export function DashboardConsole(): ReactElement { } accent={ - usagePct >= 90 ? "destructive" : usagePct >= 70 ? "primary" : "muted" + platformUsagePct >= 90 + ? "destructive" + : platformUsagePct >= 70 + ? "primary" + : "muted" } loading={loading} > - + {platformRisk != null ? ( + + ) : null} } accent="primary" loading={loading} > - {finance ? ( - + {lifetimeFinance ? ( + ) : null} diff --git a/src/modules/dashboard/dashboard-visuals.tsx b/src/modules/dashboard/dashboard-visuals.tsx index 2c25594..a890a72 100644 --- a/src/modules/dashboard/dashboard-visuals.tsx +++ b/src/modules/dashboard/dashboard-visuals.tsx @@ -41,6 +41,7 @@ import { } from "@/modules/dashboard/dashboard-chart-config"; import { DashboardChartEmpty } from "@/modules/dashboard/dashboard-chart-empty"; import type { AdminDrawFinanceSummaryData } from "@/types/api/admin-draw-finance"; +import type { AdminDashboardLifetimeFinance } from "@/types/api/admin-dashboard"; import type { AdminRiskPoolRow } from "@/types/api/admin-risk"; import type { AdminDashboardDrawPanel, @@ -976,15 +977,13 @@ export function ResultBatchProgress({ export function ResultBatchQueueSummary({ queue, - currentDrawPending, compact = false, }: { queue: AdminDashboardResultBatchQueue; - currentDrawPending: number; compact?: boolean; }): ReactElement { const { t } = useTranslation("dashboard"); - const { pending_review_total, pending_draw_count } = queue; + const { pending_review_total, pending_draw_count, published_total, batch_total } = queue; return (
@@ -999,27 +998,89 @@ export function ResultBatchQueueSummary({

{t("batchPending")}

-
+

- {pending_draw_count} + {published_total}

-

{t("batchPendingDraws")}

+

{t("batchPublished")}

- {currentDrawPending} + {batch_total} +

+

+ {pending_draw_count > 0 + ? t("batchPendingDrawsCount", { count: pending_draw_count }) + : t("batchTotal")}

-

{t("batchCurrentDrawPending")}

); } +export function PlatformLifetimePayoutSnapshot({ + finance, + formatMoney, +}: { + finance: AdminDashboardLifetimeFinance; + formatMoney: MoneyFormatter; +}): ReactElement { + const { t } = useTranslation("dashboard"); + const currency = finance.currency_code; + const bet = finance.total_bet_minor; + const win = finance.total_win_minor; + const jackpot = finance.total_jackpot_minor; + const hasPayout = win + jackpot > 0; + + if (bet <= 0 && !hasPayout) { + return ; + } + + const cells = [ + { key: "bet", label: t("platformBetTotal"), amount: bet, emphasize: bet > 0 }, + { key: "win", label: t("winPayout"), amount: win, emphasize: win > 0 }, + { key: "jackpot", label: t("jackpotPayout"), amount: jackpot, emphasize: jackpot > 0 }, + ] as const; + + return ( +
+
+ {cells.map((cell) => ( +
+

{cell.label}

+

+ {formatMoney(cell.amount, currency)} +

+
+ ))} +
+ {!hasPayout ? ( +

+ {t("platformNoPayoutYet")} +

+ ) : null} +
+ ); +} + export function SettlementStatusChart({ finance, }: { diff --git a/src/modules/jackpot/jackpot-records-console.tsx b/src/modules/jackpot/jackpot-records-console.tsx index 9e26d14..5caded8 100644 --- a/src/modules/jackpot/jackpot-records-console.tsx +++ b/src/modules/jackpot/jackpot-records-console.tsx @@ -6,6 +6,7 @@ import { useTranslation } from "react-i18next"; import { getAdminJackpotContributions, getAdminJackpotPayoutLogs } from "@/api/admin-jackpot"; import { AdminListPaginationFooter } from "@/components/admin/admin-list-pagination-footer"; +import { AdminPlayerIdentityCells, AdminPlayerIdentityHeads } from "@/components/admin/admin-player-identity-columns"; import { AdminTableExportButton } from "@/components/admin/admin-table-export-button"; import { ModuleScaffold } from "@/components/admin/module-scaffold"; import { Button } from "@/components/ui/button"; @@ -289,7 +290,7 @@ export function JackpotRecordsConsole({ embedded = false }: JackpotRecordsConsol {t("table.id", { ns: "common" })} {t("drawNo")} {t("ticketNo")} - {t("player")} + {t("contributionAmount")} {t("time")} @@ -297,7 +298,7 @@ export function JackpotRecordsConsole({ embedded = false }: JackpotRecordsConsol {(contribs?.items ?? []).length === 0 ? ( - + {t("states.noData", { ns: "common" })} @@ -307,9 +308,7 @@ export function JackpotRecordsConsole({ embedded = false }: JackpotRecordsConsol {r.id} {r.draw_no ?? "—"} {r.ticket_no ?? "—"} - - {r.player_username ?? "—"} - + {formatAdminMinorUnits(r.contribution_amount, r.currency_code ?? "NPR")} diff --git a/src/modules/settlement/settlement-batch-details-console.tsx b/src/modules/settlement/settlement-batch-details-console.tsx index 55896e0..08d1a56 100644 --- a/src/modules/settlement/settlement-batch-details-console.tsx +++ b/src/modules/settlement/settlement-batch-details-console.tsx @@ -14,6 +14,7 @@ import { postAdminRejectSettlementBatch, } from "@/api/admin-settlement"; import { AdminListPaginationFooter } from "@/components/admin/admin-list-pagination-footer"; +import { AdminPlayerIdentityCells, AdminPlayerIdentityHeads } from "@/components/admin/admin-player-identity-columns"; import { AdminStatusBadge } from "@/components/admin/admin-status-badge"; import { ModuleScaffold } from "@/components/admin/module-scaffold"; import { Button, buttonVariants } from "@/components/ui/button"; @@ -336,7 +337,7 @@ export function SettlementBatchDetailsConsole({ batchId }: Props) { {t("ticketNo")} {t("playCode")} - {t("player")} + {t("matchedTier")} {t("regularPayout")} {t("jackpot")} @@ -347,9 +348,7 @@ export function SettlementBatchDetailsConsole({ batchId }: Props) { {r.ticket_no ?? "—"} {playCodeLabel(r.play_code)} - - {r.player_username ?? r.site_player_id ?? r.player_id ?? "—"} - + {r.matched_prize_tier ?? "—"} {formatAdminMinorUnits(r.win_amount, r.currency_code ?? batchCurrency)} diff --git a/src/modules/tickets/player-tickets-console.tsx b/src/modules/tickets/player-tickets-console.tsx index 3589501..5226f7a 100644 --- a/src/modules/tickets/player-tickets-console.tsx +++ b/src/modules/tickets/player-tickets-console.tsx @@ -8,6 +8,7 @@ import { getAdminTicketItems } from "@/api/admin-tickets"; import { useAdminSiteCodeOptions } from "@/hooks/use-admin-site-code-options"; import { AdminDateRangeField } from "@/components/admin/admin-date-range-field"; import { AdminListPaginationFooter } from "@/components/admin/admin-list-pagination-footer"; +import { AdminPlayerIdentityCells, AdminPlayerIdentityHeads } from "@/components/admin/admin-player-identity-columns"; import { AdminTableExportButton } from "@/components/admin/admin-table-export-button"; import { AdminStatusBadge } from "@/components/admin/admin-status-badge"; import { Button } from "@/components/ui/button"; @@ -354,7 +355,7 @@ export function PlayerTicketsConsole(): React.ReactElement { {t("ticketNo")} - {t("player")} + {t("orderNo")} {t("drawNo")} {t("playCode")} @@ -371,7 +372,7 @@ export function PlayerTicketsConsole(): React.ReactElement { {data.items.length === 0 ? ( - + {t("states.noData", { ns: "common" })} @@ -380,22 +381,10 @@ export function PlayerTicketsConsole(): React.ReactElement { const winLabel = row.jackpot_win_amount > 0 ? `${row.win_amount_formatted} + ${row.jackpot_win_amount_formatted}` : row.win_amount_formatted; - return ( {row.ticket_no} - -
- - {row.nickname ?? row.username ?? "—"} - - - {row.site_code && row.site_player_id - ? `${row.site_code} / ${row.site_player_id}` - : row.site_player_id ?? `#${row.player_id}`} - -
-
+ {row.order_no ?? "—"} {row.draw_no ?? "—"} {playCodeLabel(row.play_code)} diff --git a/src/modules/wallet/wallet-console.tsx b/src/modules/wallet/wallet-console.tsx index bc7bed1..b8bc42b 100644 --- a/src/modules/wallet/wallet-console.tsx +++ b/src/modules/wallet/wallet-console.tsx @@ -15,6 +15,7 @@ import { } from "@/api/admin-wallet"; import { AdminDateRangeField } from "@/components/admin/admin-date-range-field"; import { AdminListPaginationFooter } from "@/components/admin/admin-list-pagination-footer"; +import { AdminPlayerIdentityCells, AdminPlayerIdentityHeads } from "@/components/admin/admin-player-identity-columns"; import { AdminRowActionsMenu } from "@/components/admin/admin-row-actions-menu"; import { AdminTableExportButton } from "@/components/admin/admin-table-export-button"; import { AdminStatusBadge } from "@/components/admin/admin-status-badge"; @@ -542,7 +543,7 @@ export function TransferOrdersPanel(): React.ReactElement { {t("localTransferNo")} {t("externalRefNo")} - {t("playerAccount")} + {t("direction")} {t("amount")} {t("status")} @@ -555,7 +556,7 @@ export function TransferOrdersPanel(): React.ReactElement { {data.items.length === 0 ? ( - + {t("states.noData", { ns: "common" })} @@ -568,13 +569,7 @@ export function TransferOrdersPanel(): React.ReactElement { - - #{row.player_id} -
- - {row.site_player_id ?? row.username ?? "—"} - -
+ {row.direction} {formatAdminMinorUnits(row.amount, row.currency_code)} @@ -852,7 +847,7 @@ export function WalletTxnsPanel(): React.ReactElement { {t("txnNo")} {t("externalRefNo")} - {t("playerAccount")} + {t("type")} {t("amount")} {t("status")} @@ -863,7 +858,7 @@ export function WalletTxnsPanel(): React.ReactElement { {data.items.length === 0 ? ( - + {t("states.noData", { ns: "common" })} @@ -876,13 +871,7 @@ export function WalletTxnsPanel(): React.ReactElement { - - #{row.player_id} -
- - {row.site_player_id ?? row.username ?? "—"} - -
+ {row.biz_type} {row.amount} ({row.direction === 1 ? t("in") : t("out")}) diff --git a/src/types/api/admin-dashboard.ts b/src/types/api/admin-dashboard.ts index e585e50..3bd832c 100644 --- a/src/types/api/admin-dashboard.ts +++ b/src/types/api/admin-dashboard.ts @@ -53,10 +53,19 @@ export type AdminDashboardCapabilities = { export type AdminDashboardResultBatchQueue = { pending_review_total: number; pending_draw_count: number; + published_total: number; + batch_total: number; first_pending_draw_id: number | null; first_pending_batch_id: number | null; }; +/** 全站风险池占用汇总 */ +export type AdminDashboardPlatformRisk = { + locked_amount: number; + cap_amount: number; + usage_percent: number; +}; + /** 按业务日汇总的今日投注/派彩/盈亏(与报表 daily-profit 口径一致) */ export type AdminDashboardTodayFinance = { business_date: string; @@ -70,8 +79,12 @@ export type AdminDashboardTodayFinance = { export type AdminDashboardLifetimeFinance = { currency_code: string | null; total_bet_minor: number; + total_win_minor: number; + total_jackpot_minor: number; total_payout_minor: number; approx_house_gross_minor: number; + order_count: number; + ticket_item_count: number; draw_count: number; business_day_count: number; date_from: string | null; @@ -87,6 +100,7 @@ export type AdminDashboardData = { finance: AdminDrawFinanceSummaryData | null; draw: AdminDashboardDrawPanel | null; risk: AdminDashboardRiskSnapshot | null; + platform_risk: AdminDashboardPlatformRisk | null; result_batch_queue: AdminDashboardResultBatchQueue | null; abnormal_transfer_total: number | null; warnings: AdminDashboardWarning[]; diff --git a/src/types/api/admin-jackpot.ts b/src/types/api/admin-jackpot.ts index 6db6716..3930c44 100644 --- a/src/types/api/admin-jackpot.ts +++ b/src/types/api/admin-jackpot.ts @@ -47,7 +47,12 @@ export type AdminJackpotContributionRow = { jackpot_pool_id: number; currency_code: string | null; player_id: number; - player_username: string | null; + site_code: string | null; + site_player_id: string | null; + username: string | null; + nickname: string | null; + /** @deprecated 使用 username / nickname */ + player_username?: string | null; ticket_item_id: number | null; ticket_no: string | null; contribution_amount: number; diff --git a/src/types/api/admin-settlement.ts b/src/types/api/admin-settlement.ts index c97607f..53a9eef 100644 --- a/src/types/api/admin-settlement.ts +++ b/src/types/api/admin-settlement.ts @@ -66,8 +66,11 @@ export type AdminSettlementDetailRow = { play_code: string | null; currency_code: string | null; player_id: number | null; - player_username: string | null; + site_code: string | null; site_player_id: string | null; + username: string | null; + /** @deprecated 使用 username */ + player_username?: string | null; matched_prize_tier: string | null; win_amount: number; jackpot_allocation_amount: number; diff --git a/src/types/api/admin-wallet.ts b/src/types/api/admin-wallet.ts index 9b97f05..aa49371 100644 --- a/src/types/api/admin-wallet.ts +++ b/src/types/api/admin-wallet.ts @@ -38,6 +38,7 @@ export type AdminWalletTxnItem = { site_code: string | null; site_player_id: string | null; username: string | null; + nickname: string | null; wallet_id: number; biz_type: string; biz_no: string;