import type { JSX } from "react" import Link from "next/link" import { getTranslations } from "next-intl/server" import { requirePermission } from "@/shared/lib/auth-guard" import { Permissions } from "@/shared/types/permissions" import { getTeacherClasses } from "@/modules/classes/data-access" import { getClassAttendanceStats, getClassAttendanceWarnings, getAttendanceTrend } from "@/modules/attendance/data-access-stats" import { AttendanceStatsCard } from "@/modules/attendance/components/attendance-stats-card" import { AttendanceRecordList } from "@/modules/attendance/components/attendance-record-list" import { AttendanceStatsClassSelector } from "@/modules/attendance/components/attendance-stats-class-selector" import { AttendanceWarningsCard } from "@/modules/attendance/components/attendance-warnings-card" import { AttendanceTrendChart } from "@/modules/attendance/components/attendance-trend-chart" import type { TrendGranularity } from "@/modules/attendance/trend-compute" import { Button } from "@/shared/components/ui/button" import { EmptyState } from "@/shared/components/ui/empty-state" import { getParam, type SearchParams } from "@/shared/lib/search-params" import { BarChart3, FileText } from "lucide-react" export const dynamic = "force-dynamic" export default async function AttendanceStatsPage({ searchParams, }: { searchParams: Promise }): Promise { await requirePermission(Permissions.ATTENDANCE_READ) const t = await getTranslations("attendance") const sp = await searchParams const classId = getParam(sp, "classId") const startDate = getParam(sp, "startDate") const endDate = getParam(sp, "endDate") // L-4:趋势粒度(默认 weekly) const granularityParam = getParam(sp, "granularity") const granularity: TrendGranularity = granularityParam === "daily" || granularityParam === "monthly" ? granularityParam : "weekly" const classes = await getTeacherClasses() if (classes.length === 0) { return (

{t("title.teacherStats")}

{t("description.teacherStats")}

) } const targetClassId = classId ?? classes[0].id // 并行获取统计、预警、趋势三个独立查询 const [summary, warnings, trend] = await Promise.all([ getClassAttendanceStats(targetClassId, startDate, endDate), getClassAttendanceWarnings(targetClassId, startDate, endDate), getAttendanceTrend(targetClassId, granularity, startDate, endDate), ]) const classOptions = classes.map((c) => ({ id: c.id, name: c.name })) return (

{t("title.teacherStats")}

{t("description.teacherStats")}

{summary ? ( <>

{t("stats.studentRecords")}

) : ( )}
) }