import type { Metadata } from "next"; import { Gift, Sparkles, WalletCards } from "lucide-react"; import { createCoupon, createPromotionRule } from "@/actions/admin/commerce"; import { ActiveStatusBadge, StatusBadge } from "@/components/admin/status-badge"; import { PageHeader, PageShell, SectionHeader } from "@/components/shared/page-shell"; import { Pagination } from "@/components/shared/pagination"; import { PendingSubmitButton } from "@/components/shared/pending-submit-button"; import type { StatusTone } from "@/components/shared/status-badge"; import { BooleanToggle } from "@/components/ui/boolean-toggle"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { formatDate } from "@/lib/utils"; import { getCommerceData } from "./commerce-data"; import { CommerceToggleButton } from "./_components/commerce-actions"; import { DiscountTypeSelect } from "./_components/discount-type-select"; import { RechargeCardActions, type RechargeCardActionItem } from "./_components/recharge-card-actions"; import { RechargeCardForm } from "./_components/recharge-card-form"; function formatCouponDiscount(type: string, value: unknown) { const numericValue = Number(value); if (type === "PERCENT_OFF") { return `折扣 ${numericValue}%`; } return `立减 ¥${numericValue.toFixed(2)}`; } export const metadata: Metadata = { title: "商业配置", description: "管理优惠券与满减规则。", }; const rechargeCardStatusLabels: Record = { UNUSED: "未使用", REDEEMED: "已兑换", EXPIRED: "已过期", DISABLED: "已停用", }; const rechargeCardStatusTones: Record = { UNUSED: "success", REDEEMED: "info", EXPIRED: "warning", DISABLED: "danger", }; function userLabel(user: { name: string | null; email: string } | null | undefined, fallback = "系统") { if (!user) return fallback; return user.name ? `${user.name} · ${user.email}` : user.email; } function formatRechargeCardValue(card: { type: "BALANCE" | "PLAN"; balanceAmount: unknown; plan: { name: string } | null; }) { return card.type === "BALANCE" ? `¥${Number(card.balanceAmount ?? 0).toFixed(2)}` : card.plan?.name ?? "套餐已删除"; } type RechargeCardRow = { id: string; code: string; type: "BALANCE" | "PLAN"; status: "UNUSED" | "REDEEMED" | "EXPIRED" | "DISABLED"; balanceAmount: unknown; plan: { name: string } | null; batchName: string | null; expiresAt: Date | null; redeemedAt: Date | null; createdAt: Date; updatedAt: Date; createdBy: { name: string | null; email: string } | null; redeemedBy: { name: string | null; email: string } | null; transactions: Array<{ amount: unknown; balanceAfter: unknown; createdAt: Date; }>; }; function formatRechargeCardAction(card: RechargeCardRow): RechargeCardActionItem { const transaction = card.transactions[0] ?? null; return { id: card.id, code: card.code, type: card.type, typeLabel: card.type === "BALANCE" ? "余额卡" : "套餐卡", status: card.status, statusLabel: rechargeCardStatusLabels[card.status] ?? "未知状态", statusTone: rechargeCardStatusTones[card.status] ?? "neutral", valueLabel: formatRechargeCardValue(card), batchName: card.batchName, createdByLabel: userLabel(card.createdBy), redeemedByLabel: userLabel(card.redeemedBy, "未兑换"), createdAtLabel: formatDate(card.createdAt), updatedAtLabel: formatDate(card.updatedAt), expiresAtLabel: card.expiresAt ? formatDate(card.expiresAt) : "永不过期", redeemedAtLabel: card.redeemedAt ? formatDate(card.redeemedAt) : "未兑换", transactionLabel: transaction ? `余额入账 ¥${Number(transaction.amount).toFixed(2)} · 兑换后余额 ¥${Number(transaction.balanceAfter).toFixed(2)} · ${formatDate(transaction.createdAt)}` : null, releasesPlanStock: card.type === "PLAN" && card.status === "UNUSED" && (!card.expiresAt || card.expiresAt > new Date()), }; } function normalizeCommerceTab(value: string | string[] | undefined) { return value === "manage" || value === "cards" ? value : "create"; } export default async function AdminCommercePage({ searchParams, }: { searchParams: Promise>; }) { const params = await searchParams; const activeTab = normalizeCommerceTab(params.tab); const { coupons, promotions, rechargeCards, rechargeCardPagination, plans } = await getCommerceData(params); return ( 新建规则 规则列表 充值卡
创建优惠券
创建满减
{coupons.map((coupon) => (

{coupon.name}

{coupon.code}

{formatCouponDiscount(coupon.discountType, coupon.discountValue)} {coupon.thresholdAmount == null ? "无门槛" : `满 ¥${Number(coupon.thresholdAmount).toFixed(2)}`} {coupon.isPublic ? "公开展示" : "仅发放"} 订单 {coupon._count.orders} · 发放 {coupon._count.grants}
))} {coupons.length === 0 && (

暂无优惠券

)}
{promotions.map((rule) => (

{rule.name}

满 ¥{Number(rule.thresholdAmount).toFixed(2)} 减 ¥{Number(rule.discountAmount).toFixed(2)}

减 ¥{Number(rule.discountAmount).toFixed(2)} 门槛 ¥{Number(rule.thresholdAmount).toFixed(2)} 排序 {rule.sortOrder}
))} {promotions.length === 0 && (

暂无满减规则

)}
{rechargeCards.map((card) => { const actionCard = formatRechargeCardAction(card); return (

{card.code}

{actionCard.statusLabel}

{actionCard.typeLabel} · {actionCard.valueLabel}

{card.batchName && {card.batchName}} {card.redeemedBy && {userLabel(card.redeemedBy, "已兑换")}} {card.expiresAt ? `到期 ${formatDate(card.expiresAt)}` : "永不过期"}
); })} {rechargeCards.length === 0 && (

暂无充值卡

)}
); }