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

261 lines
10 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 { ChevronLeft, Download, Calendar, TrendingUp, TrendingDown } from "lucide-react"
import { Button } from "@/components/ui/button"
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"
import { LineChartComponent, BarChartComponent, PieChartComponent } from "@/app/components/common/Charts"
import { toast } from "@/components/ui/use-toast"
export default function PaymentStatsPage() {
const router = useRouter()
const [dateRange, setDateRange] = useState("week")
const [activeTab, setActiveTab] = useState("overview")
// 模拟图表数据
const lineChartData = [
{ name: "周一", 支付笔数: 24, 支付金额: 478.8 },
{ name: "周二", 支付笔数: 32, 支付金额: 636.8 },
{ name: "周三", 支付笔数: 28, 支付金额: 557.2 },
{ name: "周四", 支付笔数: 36, 支付金额: 716.4 },
{ name: "周五", 支付笔数: 42, 支付金额: 835.8 },
{ name: "周六", 支付笔数: 38, 支付金额: 756.2 },
{ name: "周日", 支付笔数: 35, 支付金额: 696.5 },
]
const barChartData = [
{ name: "社群会员付款码", 支付笔数: 156, 支付金额: 3104.4 },
{ name: "课程付款码", 支付笔数: 78, 支付金额: 7722 },
{ name: "咨询服务付款码", 支付笔数: 45, 支付金额: 8955 },
{ name: "产品购买付款码", 支付笔数: 32, 支付金额: 9568 },
]
const pieChartData = [
{ name: "微信支付", value: 75 },
{ name: "支付宝", value: 25 },
]
const lineChartConfig = {
: { label: "支付笔数", color: "#3b82f6" },
: { label: "支付金额", color: "#10b981" },
}
const barChartConfig = {
: { label: "支付笔数", color: "#3b82f6" },
: { label: "支付金额", color: "#10b981" },
}
const pieChartConfig = {
: { label: "微信支付", color: "#10b981" },
: { label: "支付宝", color: "#3b82f6" },
}
const handleExport = () => {
toast({
title: "导出成功",
description: "数据统计报表已导出为Excel文件",
})
}
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>
<Button variant="ghost" size="icon" onClick={handleExport}>
<Download className="h-5 w-5" />
</Button>
</div>
</header>
{/* 日期范围选择 */}
<div className="p-4">
<Select value={dateRange} onValueChange={setDateRange}>
<SelectTrigger>
<Calendar className="h-4 w-4 mr-2" />
<SelectValue placeholder="选择时间范围" />
</SelectTrigger>
<SelectContent>
<SelectItem value="today"></SelectItem>
<SelectItem value="week"></SelectItem>
<SelectItem value="month"></SelectItem>
<SelectItem value="quarter"></SelectItem>
<SelectItem value="year"></SelectItem>
</SelectContent>
</Select>
</div>
{/* 统计卡片 */}
<div className="px-4 pb-4">
<div className="grid grid-cols-2 gap-4">
<Card>
<CardContent className="p-4">
<div className="flex items-center justify-between mb-2">
<p className="text-sm text-gray-500"></p>
<TrendingUp className="h-4 w-4 text-green-500" />
</div>
<p className="text-2xl font-semibold">311</p>
<p className="text-xs text-green-500 mt-1">+12.5% </p>
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<div className="flex items-center justify-between mb-2">
<p className="text-sm text-gray-500"></p>
<TrendingUp className="h-4 w-4 text-green-500" />
</div>
<p className="text-2xl font-semibold">¥29,845</p>
<p className="text-xs text-green-500 mt-1">+8.3% </p>
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<div className="flex items-center justify-between mb-2">
<p className="text-sm text-gray-500"></p>
<TrendingDown className="h-4 w-4 text-red-500" />
</div>
<p className="text-2xl font-semibold">289</p>
<p className="text-xs text-red-500 mt-1">-3.2% </p>
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<div className="flex items-center justify-between mb-2">
<p className="text-sm text-gray-500"></p>
<TrendingUp className="h-4 w-4 text-green-500" />
</div>
<p className="text-2xl font-semibold">¥95.98</p>
<p className="text-xs text-green-500 mt-1">+5.6% </p>
</CardContent>
</Card>
</div>
</div>
{/* 图表标签页 */}
<div className="flex-1 px-4 pb-20">
<Tabs value={activeTab} onValueChange={setActiveTab}>
<TabsList className="grid grid-cols-3 mb-4">
<TabsTrigger value="overview"></TabsTrigger>
<TabsTrigger value="trend"></TabsTrigger>
<TabsTrigger value="distribution"></TabsTrigger>
</TabsList>
<TabsContent value="overview" className="space-y-4">
<LineChartComponent
title="支付趋势"
description="本周支付笔数和金额趋势"
data={lineChartData}
config={lineChartConfig}
height={250}
/>
<BarChartComponent
title="付款码对比"
description="各付款码支付情况对比"
data={barChartData}
config={barChartConfig}
height={250}
/>
</TabsContent>
<TabsContent value="trend" className="space-y-4">
<Card>
<CardHeader>
<CardTitle></CardTitle>
</CardHeader>
<CardContent>
<LineChartComponent data={lineChartData} config={lineChartConfig} height={300} />
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="space-y-2 text-sm">
<p> 12.5%</p>
<p> 广</p>
<p> </p>
<p> 33.6 </p>
</div>
</CardContent>
</Card>
</TabsContent>
<TabsContent value="distribution" className="space-y-4">
<PieChartComponent
title="支付方式分布"
description="各支付方式占比"
data={pieChartData}
config={pieChartConfig}
height={250}
/>
<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>
<div className="flex items-center">
<span className="font-medium mr-2">289</span>
<span className="text-sm text-gray-500">(92.9%)</span>
</div>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<div className="flex items-center">
<span className="font-medium mr-2">22</span>
<span className="text-sm text-gray-500">(7.1%)</span>
</div>
</div>
<div className="flex justify-between items-center py-2">
<span className="text-gray-500"></span>
<span className="font-medium">7.1%</span>
</div>
</div>
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"> TOP5</h3>
<div className="space-y-3">
{[
{ city: "广州", count: 89, percent: 28.6 },
{ city: "深圳", count: 67, percent: 21.5 },
{ city: "上海", count: 45, percent: 14.5 },
{ city: "北京", count: 38, percent: 12.2 },
{ city: "杭州", count: 32, percent: 10.3 },
].map((item, index) => (
<div key={index} className="flex items-center justify-between">
<span className="text-gray-600">{item.city}</span>
<div className="flex items-center">
<div className="w-24 bg-gray-200 rounded-full h-2 mr-2">
<div className="bg-blue-500 h-2 rounded-full" style={{ width: `${item.percent}%` }} />
</div>
<span className="text-sm font-medium w-12 text-right">{item.count}</span>
</div>
</div>
))}
</div>
</CardContent>
</Card>
</TabsContent>
</Tabs>
</div>
</div>
)
}