import { NavLink, Outlet, useLocation, useNavigate, Navigate } from "react-router-dom"; import { QrCode, Package, ArrowLeft, LayoutDashboard, Smartphone, GitBranch, LogOut, User, Users, BarChart3, Table2, Tv, ScrollText, ShieldCheck } from "lucide-react"; import { useAuth } from "../../contexts/AuthContext"; const MENU = [ { title: "全局概览", path: "/admin/dashboard", icon: LayoutDashboard, description: "生产数据总览 · 产品 + 任务统计", }, { title: "产品管理", path: "/admin/products", icon: Package, description: "创建产品 · 生成二维码 · 打印标签", }, { title: "任务全景", path: "/admin/tasks", icon: GitBranch, description: "身份证查任务树 · 裂变/返工可视化", }, { title: "人员看板", path: "/admin/people", icon: Users, description: "按负责人查看在制品设备分布", }, { title: "效能分析", path: "/admin/analytics", icon: BarChart3, description: "人员效能 / 设备流转 ECharts 可视化", }, { title: "WIP 分布矩阵", path: "/admin/matrix", icon: Table2, description: "规格型号 × 人员/工序 在制品透视表", }, { title: "业务分组", path: "/admin/groups", icon: ShieldCheck, description: "生产组 / 维修组 · 决定成员可见的数据范围", }, { title: "操作审计", path: "/admin/audit", icon: ScrollText, description: "谁在何时操作了什么 · 含失败与被拒请求", }, { title: "管理层大屏", path: "/admin/screen", icon: Tv, description: "全屏数据大盘 · 直通率 / 产量趋势 / 不良分布", }, ]; export default function AdminLayout() { const location = useLocation(); const navigate = useNavigate(); const { user, logout, isAuthenticated, loading } = useAuth(); // 数据范围徽标 —— 让用户看得见「我为什么只看到这些」。 // 空范围(未分组)必须显眼:列表全空却没有任何提示,用户会以为系统坏了, // 这是最难排查的一类反馈。 const scope = user?.scope; const scopeBadge = !scope ? null : scope.is_empty ? { text: "未分组 · 暂无数据权限", cls: "bg-orange-50 text-orange-600", tip: "你未被分入任何业务组,列表会是空的。请联系管理员把你分配到对应分组。", } : scope.is_unrestricted ? { text: "全厂", cls: "bg-gray-100 text-gray-500", tip: "可查看全部数据" } : { text: `${scope.groups.join(" / ") || "已分组"} · ${scope.phase_labels.join(" / ")}`, cls: "bg-blue-50 text-blue-600", tip: `可见数据范围:${scope.phase_labels.join("、")}`, }; // 认证加载中 if (loading) { return (