refactor: 合并多语言支持的显示名称字段,优化奖池手动爆发功能的返回数据结构,增强管理端权限控制

This commit is contained in:
2026-05-25 14:31:24 +08:00
parent 7d01e5c47e
commit ddedef824e
101 changed files with 3033 additions and 641 deletions

View File

@@ -42,7 +42,7 @@ import { useAdminDateTimeFormatter } from "@/hooks/use-admin-datetime-formatter"
import { adminHasAnyPermission } from "@/lib/admin-permissions";
import { formatAdminMinorUnits } from "@/lib/money";
import { cn } from "@/lib/utils";
import { PRD_PAYOUT_MANAGE, PRD_PAYOUT_REVIEW } from "@/modules/draws/draw-prd";
import { PRD_PAYOUT_MANAGE, PRD_PAYOUT_REVIEW } from "@/lib/admin-prd";
import { useAdminProfile } from "@/stores/admin-session";
import { LotteryApiBizError } from "@/types/api/errors";
import type {
@@ -86,6 +86,7 @@ export function SettlementBatchDetailsConsole({ batchId }: Props) {
const [acting, setActing] = useState<string | null>(null);
const [pendingAction, setPendingAction] = useState<SettlementAction | null>(null);
const [reviewRemark, setReviewRemark] = useState("");
const batchCurrency = summary?.currency_code ?? "NPR";
const load = useCallback(async () => {
setLoading(true);
@@ -277,32 +278,38 @@ export function SettlementBatchDetailsConsole({ batchId }: Props) {
<span className="text-muted-foreground">{t("endedAt")}</span> {formatDt(summary.finished_at)}
</p>
<div className="flex flex-wrap gap-2 sm:col-span-2">
<Button
type="button"
size="sm"
variant="outline"
disabled={!canReviewSettlement || acting !== null || summary.status !== "pending_review"}
onClick={() => openActionDialog("approve")}
>
{t("approve")}
</Button>
<Button
type="button"
size="sm"
variant="outline"
disabled={!canReviewSettlement || acting !== null || summary.status !== "pending_review"}
onClick={() => openActionDialog("reject")}
>
{t("reject")}
</Button>
<Button
type="button"
size="sm"
disabled={!canManagePayout || acting !== null || summary.status !== "approved"}
onClick={() => openActionDialog("payout")}
>
{t("runPayout")}
</Button>
{canReviewSettlement ? (
<Button
type="button"
size="sm"
variant="outline"
disabled={acting !== null || summary.status !== "pending_review"}
onClick={() => openActionDialog("approve")}
>
{t("approve")}
</Button>
) : null}
{canReviewSettlement ? (
<Button
type="button"
size="sm"
variant="outline"
disabled={acting !== null || summary.status !== "pending_review"}
onClick={() => openActionDialog("reject")}
>
{t("reject")}
</Button>
) : null}
{canManagePayout ? (
<Button
type="button"
size="sm"
disabled={acting !== null || summary.status !== "approved"}
onClick={() => openActionDialog("payout")}
>
{t("runPayout")}
</Button>
) : null}
<Button type="button" size="sm" variant="secondary" disabled={acting !== null} onClick={() => void exportCsv()}>
{t("exportSettlementReport")}
</Button>
@@ -341,12 +348,12 @@ export function SettlementBatchDetailsConsole({ batchId }: Props) {
</TableCell>
<TableCell className="text-xs">{r.matched_prize_tier ?? "—"}</TableCell>
<TableCell className="text-right font-mono text-xs tabular-nums">
{formatAdminMinorUnits(r.win_amount, r.currency_code ?? summary.currency_code ?? "NPR")}
{formatAdminMinorUnits(r.win_amount, r.currency_code ?? batchCurrency)}
</TableCell>
<TableCell className="text-right font-mono text-xs tabular-nums">
{formatAdminMinorUnits(
r.jackpot_allocation_amount,
r.currency_code ?? summary.currency_code ?? "NPR",
r.currency_code ?? batchCurrency,
)}
</TableCell>
</TableRow>

View File

@@ -48,7 +48,7 @@ import { useAdminCurrencyCatalog } from "@/hooks/use-admin-currency-catalog";
import { adminHasAnyPermission } from "@/lib/admin-permissions";
import { formatAdminMinorUnits } from "@/lib/money";
import { cn } from "@/lib/utils";
import { PRD_PAYOUT_MANAGE, PRD_PAYOUT_REVIEW } from "@/modules/draws/draw-prd";
import { PRD_PAYOUT_MANAGE, PRD_PAYOUT_REVIEW } from "@/lib/admin-prd";
import { useAdminProfile } from "@/stores/admin-session";
import { LotteryApiBizError } from "@/types/api/errors";
import type { AdminSettlementBatchListData, AdminSettlementBatchRow } from "@/types/api/admin-settlement";
@@ -295,32 +295,38 @@ export function SettlementBatchesConsole() {
>
{t("details")}
</Link>
<Button
type="button"
size="sm"
variant="outline"
disabled={!canReviewSettlement || actingId !== null || row.status !== "pending_review"}
onClick={() => openActionDialog(row, "approve")}
>
{t("pass")}
</Button>
<Button
type="button"
size="sm"
variant="outline"
disabled={!canReviewSettlement || actingId !== null || row.status !== "pending_review"}
onClick={() => openActionDialog(row, "reject")}
>
{t("reject")}
</Button>
<Button
type="button"
size="sm"
disabled={!canManagePayout || actingId !== null || row.status !== "approved"}
onClick={() => openActionDialog(row, "payout")}
>
{t("payout")}
</Button>
{canReviewSettlement ? (
<Button
type="button"
size="sm"
variant="outline"
disabled={actingId !== null || row.status !== "pending_review"}
onClick={() => openActionDialog(row, "approve")}
>
{t("pass")}
</Button>
) : null}
{canReviewSettlement ? (
<Button
type="button"
size="sm"
variant="outline"
disabled={actingId !== null || row.status !== "pending_review"}
onClick={() => openActionDialog(row, "reject")}
>
{t("reject")}
</Button>
) : null}
{canManagePayout ? (
<Button
type="button"
size="sm"
disabled={actingId !== null || row.status !== "approved"}
onClick={() => openActionDialog(row, "payout")}
>
{t("payout")}
</Button>
) : null}
</div>
</TableCell>
</TableRow>