refactor(admin-reports, i18n): remove rebate commission report and enhance localization

Removed the `getAdminReportRebateCommission` function and its references from the admin reports API and localization files. Updated CSS for improved money display handling in admin components. Enhanced localization support by adding new finance and support workspace entries in English, Nepali, and Chinese, improving user experience across the application.
This commit is contained in:
2026-06-16 16:04:03 +08:00
parent d4cf4ff436
commit a020e34a7d
38 changed files with 1259 additions and 353 deletions

View File

@@ -24,6 +24,8 @@ import { Button } from "@/components/ui/button";
import { percentValueToUi } from "@/lib/admin-rate-percent";
import { isLineRootAgentNode } from "@/lib/agent-profile-caps";
import { resolveRoleStatusTone } from "@/lib/admin-status-tone";
import { AdminMoneyDisplay } from "@/components/admin/admin-money-display";
import { AdminTableMoney, adminMoneyCellClassName } from "@/components/admin/admin-table-money";
import { cn } from "@/lib/utils";
import type { AgentNodeRow, AgentProfileRow } from "@/types/api/admin-agent";
@@ -369,10 +371,11 @@ function OverviewTab({
</p>
) : null}
<div className="grid grid-cols-2 gap-3 lg:grid-cols-4">
<div className="grid min-w-0 grid-cols-2 gap-3 lg:grid-cols-4">
<MetricCard
label={t("profile.totalShareRate", { defaultValue: "占成比例" })}
value={profileLoading ? "…" : `${profile?.total_share_rate ?? 0}%`}
money={false}
subtitle={
parentRelativeShare
? t("profile.relativeShareRateValue", {
@@ -398,16 +401,18 @@ function OverviewTab({
/>
</div>
<div className="grid grid-cols-2 gap-3 lg:grid-cols-4">
<div className="grid min-w-0 grid-cols-2 gap-3 lg:grid-cols-4">
<MetricCard
label={t("profile.rebateLimit", { defaultValue: "回水上限 (%)" })}
value={profileLoading ? "…" : `${rebateCap ?? "0"}%`}
money={false}
/>
<MetricCard
label={t("profile.defaultPlayerRebate", { defaultValue: "默认玩家回水 (%)" })}
value={
profileLoading ? "…" : `${percentValueToUi(profile?.default_player_rebate ?? 0)}%`
}
money={false}
/>
<MetricCard
label={t("profile.riskTags", { defaultValue: "风控标签" })}
@@ -418,6 +423,7 @@ function OverviewTab({
? profile!.risk_tags!.join(", ")
: t("common:states.none", { defaultValue: "无" })
}
money={false}
/>
<CapabilityMetric
label={t("profile.canGrantExtraRebate", { defaultValue: "允许额外回水" })}
@@ -567,11 +573,11 @@ function DownlineTable({
</div>
) : "—"}
</TableCell>
<TableCell className="text-right tabular-nums text-xs">
{summary ? formatCredit(summary.credit_limit) : "—"}
<TableCell className={adminMoneyCellClassName("text-right text-xs")}>
{summary ? <AdminTableMoney>{formatCredit(summary.credit_limit)}</AdminTableMoney> : "—"}
</TableCell>
<TableCell className="text-right tabular-nums text-xs">
{summary ? formatCredit(summary.allocated_credit) : "—"}
<TableCell className={adminMoneyCellClassName("text-right text-xs")}>
{summary ? <AdminTableMoney>{formatCredit(summary.allocated_credit)}</AdminTableMoney> : "—"}
</TableCell>
<TableCell className="text-center tabular-nums text-xs">
{childCountById.get(child.id) ?? 0}
@@ -625,31 +631,45 @@ function MetricCard({
subtitle,
accent = false,
highlight = false,
money = true,
}: {
label: string;
value: string;
subtitle?: string;
accent?: boolean;
highlight?: boolean;
/** 金额类指标:自适应字号 + 换行 */
money?: boolean;
}): React.ReactElement {
return (
<div
className={cn(
"rounded-xl border bg-card px-4 py-4 shadow-sm transition-colors",
"min-w-0 overflow-visible rounded-xl border bg-card px-4 py-4 shadow-sm transition-colors",
highlight && "border-primary/25 bg-primary/[0.04]",
accent && !highlight && "border-border/70",
!accent && !highlight && "border-border/70",
)}
>
<p className="text-xs font-medium text-muted-foreground">{label}</p>
<p
className={cn(
"mt-1.5 text-2xl font-semibold tabular-nums tracking-tight",
highlight ? "text-primary" : "text-foreground",
)}
>
{value}
</p>
{money ? (
<AdminMoneyDisplay
as="p"
value={value}
size="lg"
className={cn("mt-1.5", highlight ? "text-primary" : "text-foreground")}
>
{value}
</AdminMoneyDisplay>
) : (
<p
className={cn(
"mt-1.5 text-2xl font-semibold tabular-nums tracking-tight",
highlight ? "text-primary" : "text-foreground",
)}
>
{value}
</p>
)}
{subtitle ? <p className="mt-1 text-xs text-muted-foreground">{subtitle}</p> : null}
</div>
);

View File

@@ -19,6 +19,7 @@ import type { AgentParentCaps } from "@/types/api/admin-agent";
import { Info } from "lucide-react";
import { AdminNumericStepper } from "@/components/admin/admin-numeric-stepper";
import { AdminMoneyDisplay } from "@/components/admin/admin-money-display";
import { AdminStatusBadge } from "@/components/admin/admin-status-badge";
import {
AGENT_PERCENT_HARD_MAX,
@@ -411,14 +412,14 @@ function ReadOnlyScalar({
<div
id={id}
className={cn(
"flex h-10 items-center justify-center rounded-md border border-border/80 bg-muted/35 px-3 text-sm font-semibold tabular-nums text-foreground shadow-xs",
"flex min-h-10 min-w-0 items-center justify-center rounded-md border border-border/80 bg-muted/35 px-3 py-2 text-center shadow-xs",
className,
)}
>
<span>
<AdminMoneyDisplay as="span" value={value} size="sm" emphasize className="text-foreground">
{value}
{suffix ? <span className="ml-0.5 font-medium text-foreground/80">{suffix}</span> : null}
</span>
</AdminMoneyDisplay>
</div>
);
}