import { useQuery } from '@tanstack/react-query'
import api from '@/lib/api'
import { DataTable } from '@/components/DataTable'
import { Pagination } from '@/components/Pagination'
import { LoadingSpinner } from '@/components/LoadingSpinner'
import { CollapsibleSection } from '@/components/CollapsibleSection'
import { MetricCard } from '@/components/MetricCard'
import { formatCurrency, formatNumber, formatPercent } from '@/lib/utils'
import { useState, useMemo } from 'react'
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, PieChart, Pie, Cell } from 'recharts'
import { MonthPicker } from '@/components/MonthPicker'
const PAGE_SIZE = 15
export function MemberPage() {
const [repeatPage, setRepeatPage] = useState(1)
const [month, setMonth] = useState('2026-04')
const { data: comparisonData, isLoading: cmpLoading } = useQuery({
queryKey: ['member/comparison'],
queryFn: () => api.get('/member/comparison'),
})
const { data: repeatData, isLoading: repeatLoading } = useQuery({
queryKey: ['member/repeat', month],
queryFn: () => api.get('/member/repeat', { params: { month } }),
})
const cmpRows = (comparisonData as any)?.data || []
const repeatRows = (repeatData as any)?.data || []
const pageLoading = cmpLoading || repeatLoading
const memberRow = cmpRows.find((r: any) => r.customer_type === '会员') || {}
const nonMemberRow = cmpRows.find((r: any) => r.customer_type === '非会员') || {}
const totalBills = Number(memberRow.bill_count || 0) + Number(nonMemberRow.bill_count || 0)
const memberBillShare = totalBills > 0 ? (Number(memberRow.bill_count || 0) / totalBills * 100) : 0
const totalReceived = Number(memberRow.received || 0) + Number(nonMemberRow.received || 0)
const memberRevenueShare = totalReceived > 0 ? (Number(memberRow.received || 0) / totalReceived * 100) : 0
const avgRepeatRate = repeatRows.length > 0
? repeatRows.reduce((s: number, r: any) => s + Number(r.repeat_rate_pct || 0), 0) / repeatRows.length
: 0
const topRepeatStore = repeatRows.length > 0
? repeatRows.reduce((best: any, r: any) => Number(r.repeat_rate_pct || 0) > Number(best?.repeat_rate_pct || 0) ? r : best, null)
: null
const lowRepeatCount = repeatRows.filter((r: any) => Number(r.repeat_rate_pct || 0) < 30).length
const cmpChartData = cmpRows.map((r: any) => ({
name: r.customer_type,
账单数: Number(r.bill_count || 0),
实收: Number(r.received || 0),
客单价: Number(r.avg_bill_value || 0),
}))
const pieData = [
{ name: '会员账单', value: Number(memberRow.bill_count || 0) },
{ name: '非会员账单', value: Number(nonMemberRow.bill_count || 0) },
]
const PIE_COLORS = ['#3b82f6', '#e5e7eb']
const pagedRepeat = useMemo(() => repeatRows.slice((repeatPage - 1) * PAGE_SIZE, repeatPage * PAGE_SIZE), [repeatRows, repeatPage])
if (pageLoading) {
return
会员对比 · 复购率 · 沉睡分析 · {month}