Files
ckb-SuperAdmin/Cunkebao/app/scenarios/payment/[id]/page.tsx
2025-06-03 16:37:39 +08:00

378 lines
16 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use client"
import { useState } from "react"
import { useRouter } from "next/navigation"
import Image from "next/image"
import { ChevronLeft, Download, Share2, QrCode, Copy, BarChart4, Users } from "lucide-react"
import { Button } from "@/components/ui/button"
import { Card, CardContent } from "@/components/ui/card"
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"
import { Badge } from "@/components/ui/badge"
import { Switch } from "@/components/ui/switch"
import { toast } from "@/components/ui/use-toast"
export default function PaymentCodeDetailPage({ params }: { params: { id: string } }) {
const router = useRouter()
const [activeTab, setActiveTab] = useState("detail")
// 模拟数据
const paymentCode = {
id: params.id,
name: "社群会员付款码",
amount: "19.9",
description: "加入VIP社群会员",
status: "active",
qrCodeUrl: "/placeholder.svg?height=300&width=300&query=QR%20Code",
paymentMethod: "wechat",
createTime: "2023-10-26 11:00:00",
totalPayments: 156,
totalAmount: 3104.4,
distribution: {
enabled: true,
type: "percentage",
value: "10%",
totalDistributed: 310.44,
},
redPacket: {
enabled: true,
amount: "5",
totalSent: 156,
totalAmount: 780,
},
autoWelcome: {
enabled: true,
message: "感谢您的支付欢迎加入我们的VIP社群",
},
tags: ["付款客户", "社群会员", "已成交"],
}
const recentPayments = [
{ id: 1, user: "用户1", amount: "19.9", time: "2023-10-26 15:30:00", status: "success" },
{ id: 2, user: "用户2", amount: "19.9", time: "2023-10-26 14:45:00", status: "success" },
{ id: 3, user: "用户3", amount: "19.9", time: "2023-10-26 13:20:00", status: "success" },
{ id: 4, user: "用户4", amount: "19.9", time: "2023-10-26 12:10:00", status: "success" },
{ id: 5, user: "用户5", amount: "19.9", time: "2023-10-26 11:05:00", status: "success" },
]
const handleStatusChange = (checked: boolean) => {
toast({
title: checked ? "付款码已启用" : "付款码已停用",
description: checked ? "客户现在可以通过此付款码支付" : "客户将无法通过此付款码支付",
})
}
const handleCopy = (text: string) => {
navigator.clipboard.writeText(text)
toast({
title: "复制成功",
description: "内容已复制到剪贴板",
})
}
const handleDownload = () => {
toast({
title: "下载成功",
description: "付款码已保存到相册",
})
}
const handleShare = () => {
toast({
title: "分享成功",
description: "付款码已分享",
})
}
return (
<div className="flex flex-col min-h-screen bg-gray-50">
{/* 头部 */}
<header className="sticky top-0 z-10 bg-white border-b">
<div className="flex items-center justify-between h-14 px-4">
<div className="flex items-center">
<Button variant="ghost" size="icon" onClick={() => router.back()}>
<ChevronLeft className="h-5 w-5" />
</Button>
<h1 className="ml-2 text-lg font-medium"></h1>
</div>
<div className="flex items-center">
<Switch checked={paymentCode.status === "active"} onCheckedChange={handleStatusChange} />
<span className="ml-2 text-sm">{paymentCode.status === "active" ? "启用中" : "已停用"}</span>
</div>
</div>
</header>
{/* 标签页 */}
<div className="flex-1 px-4 pb-20">
<Tabs value={activeTab} onValueChange={setActiveTab} className="w-full">
<TabsList className="grid grid-cols-3 mb-4">
<TabsTrigger value="detail" className="text-xs">
<QrCode className="h-4 w-4 mr-1" />
</TabsTrigger>
<TabsTrigger value="payments" className="text-xs">
<BarChart4 className="h-4 w-4 mr-1" />
</TabsTrigger>
<TabsTrigger value="settings" className="text-xs">
<Users className="h-4 w-4 mr-1" />
</TabsTrigger>
</TabsList>
{/* 付款码详情 */}
<TabsContent value="detail" className="space-y-4">
<Card>
<CardContent className="p-4 flex flex-col items-center">
<h2 className="font-medium text-center mb-2">{paymentCode.name}</h2>
<p className="text-sm text-gray-500 mb-4">{paymentCode.description}</p>
<div className="relative w-64 h-64 mb-4">
<Image
src={paymentCode.qrCodeUrl || "/placeholder.svg"}
alt="付款码"
fill
className="object-contain"
/>
</div>
<div className="text-center mb-4">
<Badge variant="outline" className="text-green-500 bg-green-50">
¥{paymentCode.amount}
</Badge>
</div>
<div className="flex justify-center space-x-4 w-full">
<Button variant="outline" size="sm" onClick={handleDownload}>
<Download className="h-4 w-4 mr-1" />
</Button>
<Button variant="outline" size="sm" onClick={handleShare}>
<Share2 className="h-4 w-4 mr-1" />
</Button>
<Button
variant="outline"
size="sm"
onClick={() => handleCopy(`付款码:${paymentCode.name},金额:${paymentCode.amount}`)}
>
<Copy className="h-4 w-4 mr-1" />
</Button>
</div>
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="space-y-3">
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500">ID</span>
<span className="font-medium">{paymentCode.id}</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">
{paymentCode.paymentMethod === "wechat"
? "微信支付"
: paymentCode.paymentMethod === "alipay"
? "支付宝"
: "微信和支付宝"}
</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">{paymentCode.createTime}</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">{paymentCode.totalPayments}</span>
</div>
<div className="flex justify-between items-center py-2">
<span className="text-gray-500"></span>
<span className="font-medium">¥{paymentCode.totalAmount}</span>
</div>
</div>
</CardContent>
</Card>
</TabsContent>
{/* 支付记录 */}
<TabsContent value="payments" className="space-y-4">
<Card>
<CardContent className="p-4">
<div className="flex justify-between items-center mb-3">
<h3 className="font-medium"></h3>
<Button
variant="ghost"
size="sm"
className="text-blue-500"
onClick={() => router.push(`/scenarios/payment/${params.id}/payments`)}
>
</Button>
</div>
<div className="space-y-3">
{recentPayments.map((payment) => (
<div key={payment.id} className="flex justify-between items-center py-2 border-b last:border-0">
<div>
<p className="font-medium">{payment.user}</p>
<p className="text-xs text-gray-500">{payment.time}</p>
</div>
<div className="text-right">
<p className="font-medium">¥{payment.amount}</p>
<Badge variant="outline" className="text-green-500 bg-green-50 text-xs">
</Badge>
</div>
</div>
))}
</div>
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="space-y-3">
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">{paymentCode.totalPayments}</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">¥{paymentCode.totalAmount}</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">
¥{(paymentCode.totalAmount / paymentCode.totalPayments).toFixed(2)}
</span>
</div>
<div className="flex justify-between items-center py-2">
<span className="text-gray-500"></span>
<span className="font-medium">{Math.floor(paymentCode.totalPayments * 0.9)}</span>
</div>
</div>
</CardContent>
</Card>
</TabsContent>
{/* 高级设置 */}
<TabsContent value="settings" className="space-y-4">
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="flex items-center justify-between mb-3">
<span className="text-gray-500"></span>
<Switch checked={paymentCode.distribution.enabled} />
</div>
{paymentCode.distribution.enabled && (
<div className="space-y-3 pl-4 border-l-2 border-blue-100">
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">
{paymentCode.distribution.type === "percentage" ? "比例返利" : "固定金额"}
</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">{paymentCode.distribution.value}</span>
</div>
<div className="flex justify-between items-center py-2">
<span className="text-gray-500"></span>
<span className="font-medium">¥{paymentCode.distribution.totalDistributed}</span>
</div>
</div>
)}
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="flex items-center justify-between mb-3">
<span className="text-gray-500"></span>
<Switch checked={paymentCode.redPacket.enabled} />
</div>
{paymentCode.redPacket.enabled && (
<div className="space-y-3 pl-4 border-l-2 border-blue-100">
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">¥{paymentCode.redPacket.amount}</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">{paymentCode.redPacket.totalSent}</span>
</div>
<div className="flex justify-between items-center py-2">
<span className="text-gray-500"></span>
<span className="font-medium">¥{paymentCode.redPacket.totalAmount}</span>
</div>
</div>
)}
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="flex items-center justify-between mb-3">
<span className="text-gray-500"></span>
<Switch checked={paymentCode.autoWelcome.enabled} />
</div>
{paymentCode.autoWelcome.enabled && (
<div className="pl-4 border-l-2 border-blue-100">
<div className="py-2">
<span className="text-gray-500 block mb-2"></span>
<div className="bg-gray-50 p-3 rounded-md text-sm">{paymentCode.autoWelcome.message}</div>
</div>
</div>
)}
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="flex flex-wrap gap-2">
{paymentCode.tags.map((tag, index) => (
<Badge key={index} variant="outline" className="rounded-full">
{tag}
</Badge>
))}
<Button variant="outline" size="sm" className="rounded-full text-blue-500">
+
</Button>
</div>
</CardContent>
</Card>
<div className="flex justify-center mt-6">
<Button
variant="outline"
className="text-red-500 border-red-200 hover:bg-red-50"
onClick={() => {
if (confirm("确定要删除此付款码吗?删除后将无法恢复。")) {
toast({
title: "付款码已删除",
description: "付款码已成功删除",
})
router.push("/scenarios/payment")
}
}}
>
</Button>
</div>
</TabsContent>
</Tabs>
</div>
</div>
)
}