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 { Badge } from '@/components/Badge'
import { formatCurrency, formatNumber, formatPercent } from '@/lib/utils'
import { useState, useMemo } from 'react'
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, ScatterChart, Scatter } from 'recharts'
import { MonthPicker } from '@/components/MonthPicker'
const PAGE_SIZE = 15
export function CostPage() {
const [costPage, setCostPage] = useState(1)
const [invPage, setInvPage] = useState(1)
const [catPage, setCatPage] = useState(1)
const [month, setMonth] = useState('2026-04')
const { data: costData, isLoading: costLoading } = useQuery({
queryKey: ['cost/comparison', month],
queryFn: () => api.get('/cost/comparison', { params: { month } }),
})
const { data: invData, isLoading: invLoading } = useQuery({
queryKey: ['cost/inventory', month],
queryFn: () => api.get('/cost/inventory', { params: { month } }),
})
const { data: catData, isLoading: catLoading } = useQuery({
queryKey: ['cost/category-benchmark', month],
queryFn: () => api.get('/cost/category-benchmark', { params: { month } }),
})
const costRows = (costData as any)?.data || []
const invRows = (invData as any)?.data || []
const catRows = (catData as any)?.data || []
const pageLoading = costLoading || invLoading || catLoading
const validCostRows = costRows.filter((r: any) => !r.variance_level?.includes('口径异常'))
const abnormalRows = costRows.filter((r: any) => r.variance_level?.includes('口径异常'))
const avgTheoreticalRate = validCostRows.length > 0
? validCostRows.reduce((s: number, r: any) => s + Number(r.theoretical_cost_rate_pct || 0), 0) / validCostRows.length
: 0
const avgActualRate = validCostRows.length > 0
? validCostRows.reduce((s: number, r: any) => s + Number(r.actual_food_cost_rate_pct || 0), 0) / validCostRows.length
: 0
const highVarianceCount = validCostRows.filter((r: any) => Number(r.variance_to_theoretical_pct || 0) > 20).length
const abnormalInvCount = invRows.filter((r: any) => Number(r.estimated_inventory_days) > 7 || Number(r.negative_item_lines) > 0).length
const pagedCost = useMemo(() => costRows.slice((costPage - 1) * PAGE_SIZE, costPage * PAGE_SIZE), [costRows, costPage])
const pagedInv = useMemo(() => invRows.slice((invPage - 1) * PAGE_SIZE, invPage * PAGE_SIZE), [invRows, invPage])
const pagedCat = useMemo(() => catRows.slice((catPage - 1) * PAGE_SIZE, catPage * PAGE_SIZE), [catRows, catPage])
const scatterData = validCostRows.map((r: any) => ({
name: r.store_name,
theoretical: Number(r.theoretical_cost_rate_pct || 0),
actual: Number(r.actual_food_cost_rate_pct || 0),
variance: Number(r.variance_to_theoretical_pct || 0),
}))
if (pageLoading) {
return
理论vs实际成本 · 原料分类差异 · 库存效率 · {month}
口径异常门店({abnormalRows.length}家): {abnormalRows.map((r: any) => r.store_name).join('、')} — 理论成本数据缺失或口径不一致,需先修复数据再纳入对比
{d.name}
理论: {d.theoretical.toFixed(1)}%
实际: {d.actual.toFixed(1)}%
偏差: {d.variance > 0 ? '+' : ''}{d.variance.toFixed(1)}%