import { useQuery } from '@tanstack/react-query' import api from '@/lib/api' import { FilterableTable } from '@/components/FilterableTable' import { LoadingSpinner } from '@/components/LoadingSpinner' import { CollapsibleSection } from '@/components/CollapsibleSection' import { MetricCard } from '@/components/MetricCard' import { Tabs } from '@/components/Tabs' import { formatCurrency, formatNumber, formatPercent } from '@/lib/utils' import { useState } from 'react' import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, LineChart, Line } from 'recharts' export function IntelligencePage() { const [tab, setTab] = useState('iot') const { data: deviceData, isLoading: deviceLoading } = useQuery({ queryKey: ['intelligence/iot/devices'], queryFn: () => api.get('/intelligence/iot/devices'), enabled: tab === 'iot', }) const { data: forecastData, isLoading: forecastLoading } = useQuery({ queryKey: ['intelligence/ai/forecasts'], queryFn: () => api.get('/intelligence/ai/forecasts'), enabled: tab === 'ai', }) const { data: roiData, isLoading: roiLoading } = useQuery({ queryKey: ['intelligence/strategy/roi'], queryFn: () => api.get('/intelligence/strategy/roi'), enabled: tab === 'strategy', }) const { data: brandData, isLoading: brandLoading } = useQuery({ queryKey: ['intelligence/strategy/brand-assets'], queryFn: () => api.get('/intelligence/strategy/brand-assets'), enabled: tab === 'strategy', }) const { data: realtimeData, isLoading: realtimeLoading } = useQuery({ queryKey: ['intelligence/realtime/dashboard'], queryFn: () => api.get('/intelligence/realtime/dashboard'), enabled: tab === 'realtime', }) if ((tab === 'iot' && deviceLoading) || (tab === 'ai' && forecastLoading) || (tab === 'strategy' && roiLoading) || (tab === 'realtime' && realtimeLoading)) { return } const devices = (deviceData as any)?.data || [] const forecasts = (forecastData as any)?.data || [] const rois = (roiData as any)?.data || [] const brands = (brandData as any)?.data || [] const realtime = (realtimeData as any)?.data || [] const onlineDevices = devices.filter((d: any) => d.status === 'online').length const alarmDevices = devices.filter((d: any) => d.status === 'alarm').length return (

智能升级

IoT设备 · AI预测 · 实时看板 · 战略驾驶舱

{tab === 'iot' && ( <>
{ const colors: Record = { online: 'text-green-600', offline: 'text-gray-600', alarm: 'text-red-600' } return {r.status} }}, { key: 'last_reading_at', label: '最后读数', render: (r) => r.last_reading_at ? (r.last_reading_at as string).substring(0, 19).replace('T', ' ') : '-' }, ]} /> )} {tab === 'ai' && ( <>
f.forecast_type)).size} format="number" /> f.model_type)).size} format="number" />
{forecasts.length > 0 && ( ({ date: (f.target_date || '').substring(0, 10), predicted: Number(f.predicted_value || 0), lower: Number(f.confidence_lower || 0), upper: Number(f.confidence_upper || 0), }))}> )} (r.target_date || '').substring(0, 10) }, { key: 'store_code', label: '门店' }, { key: 'predicted_value', label: '预测值', align: 'right', render: (r) => formatNumber(r.predicted_value) }, { key: 'confidence_lower', label: '下界', align: 'right', render: (r) => formatNumber(r.confidence_lower) }, { key: 'confidence_upper', label: '上界', align: 'right', render: (r) => formatNumber(r.confidence_upper) }, { key: 'model_type', label: '模型', align: 'center' }, ]} /> )} {tab === 'realtime' && ( <>
s + Number(r.today_revenue || 0), 0)} format="currency" /> s + Number(r.bill_count || 0), 0)} format="number" />
{realtime.length > 0 && ( ({ store: r.store_code, revenue: Number(r.today_revenue || 0), }))}> [formatCurrency(v), '营收']} /> )} formatCurrency(r.today_revenue) }, { key: 'bill_count', label: '单数', align: 'right', render: (r) => formatNumber(r.bill_count) }, { key: 'avg_transaction', label: '客单价', align: 'right', render: (r) => formatCurrency(r.avg_transaction) }, ]} /> )} {tab === 'strategy' && ( <>
0 ? rois.reduce((s: number, r: any) => s + Number(r.payback_months || 0), 0) / rois.length : 0} format="number" /> = 50 ? 'good' : 'warn'} />
{brands.length > 0 && ( ({ date: (b.tracking_date || '').substring(0, 10), nps: Number(b.nps_score || 0), search: Number(b.search_index || 0), }))}> )} formatCurrency(r.initial_investment) }, { key: 'monthly_revenue', label: '月营收', align: 'right', render: (r) => formatCurrency(r.monthly_revenue) }, { key: 'monthly_profit', label: '月利润', align: 'right', render: (r) => formatCurrency(r.monthly_profit) }, { key: 'payback_months', label: '回本月数', align: 'right', render: (r) => r.payback_months ? `${Number(r.payback_months).toFixed(1)}月` : '-' }, { key: 'roi_pct', label: 'ROI', align: 'right', render: (r) => formatPercent(r.roi_pct) }, ]} /> )}
) }