"use client";
import Link from "next/link";
import { useEffect, useMemo, useState } from "react";
import data from "../data/big-screen.json";
import styles from "./BigScreen.module.css";
export default function BigScreenPage() {
const [now, setNow] = useState(new Date());
const [autoRefresh, setAutoRefresh] = useState(true);
const [regionMetric, setRegionMetric] = useState<"amount" | "orders">("amount");
const [toast, setToast] = useState("");
useEffect(() => {
const timer = window.setInterval(() => setNow(new Date()), 1000);
return () => window.clearInterval(timer);
}, []);
const notify = (message: string) => {
setToast(message);
window.setTimeout(() => setToast(""), 2200);
};
const enterFullscreen = async () => {
try {
if (!document.fullscreenElement) await document.documentElement.requestFullscreen();
else await document.exitFullscreen();
} catch { notify("当前预览环境不支持全屏切换"); }
};
return (
←华东区域 · 实时经营 {autoRefresh ? "数据连接正常" : "自动刷新已暂停"}
{data.title}
{data.subtitle}
{now.toLocaleTimeString("zh-CN", { hour12: false })}{now.toLocaleDateString("zh-CN", { year: "numeric", month: "2-digit", day: "2-digit", weekday: "short" })}
{data.kpis.map((kpi, index) => {["¥", "单", "客", "价", "%"][index]}{kpi.label}
{kpi.value}{kpi.delta} {kpi.unit} )}
} className={styles.trendPanel}>
notify("已刷新实时订单")}>刷新} className={styles.orderPanel}>
}>
{data.alerts.length} 条待关注}>
数据更新时间 {data.updatedAt}}>
{toast && ✓{toast}
}
);
}
function Panel({ title, code, extra, children, className = "" }: { title: string; code: string; extra?: React.ReactNode; children: React.ReactNode; className?: string }) {
return ;
}
function ChannelChart() {
return
渠道成交额284.6万元
{data.channels.map((item) =>
{item.name}{item.amount}
{item.value}%)}
;
}
function FunnelChart() {
return {data.funnel.map((item, index) =>
{index + 1}{item.name}{item.value.toLocaleString()}
{item.rate}%{index < data.funnel.length - 1 &&
↓}
)}
;
}
function TrendChart() {
const maxAmount = Math.max(...data.hourlyTrend.map((item) => item.amount));
const maxOrders = Math.max(...data.hourlyTrend.map((item) => item.orders));
const points = useMemo(() => data.hourlyTrend.map((item, index) => ({ x: (index / (data.hourlyTrend.length - 1)) * 100, y: 91 - (item.orders / maxOrders) * 72, item })), [maxOrders]);
return 100 万75 万50 万25 万0
{[0,1,2,3,4].map((line) => )}
{data.hourlyTrend.map((item) =>
{item.time}
)}
{points.map((point, index) =>
{point.item.orders.toLocaleString()} 单{index < points.length - 1 && }
)}
;
}
function RealtimeOrders() {
return 订单编号区域客户成交金额状态时间
{data.realtimeOrders.map((order) =>
{order.id}{order.city}{order.customer}{order.amount}{order.status}
)}
;
}
function RegionRanking({ metric }: { metric: "amount" | "orders" }) {
const max = Math.max(...data.regions.map((item) => metric === "amount" ? item.amount : item.orders));
return {data.regions.map((region, index) => { const value = metric === "amount" ? region.amount : region.orders; return
{index + 1}{region.name}{metric === "amount" ? `${region.amount.toFixed(1)} 万` : `${region.orders.toLocaleString()} 单`}
+{region.delta}% ; })}
;
}
function AlertList() {
return {data.alerts.map((alert) =>
{alert.level === "high" ? "!" : alert.level === "medium" ? "△" : alert.level === "low" ? "◷" : "i"}{alert.title}{alert.detail}
)}
;
}
function CategoryPerformance() {
return {data.categories.map((category, index) =>
{String(index + 1).padStart(2, "0")}{category.name}年度累计 {category.amount}
= category.target ? styles.targetMet : ""}>{category.actual}% 目标 {category.target}%
)}
;
}