import { useMemo, useState } from "react"; import { Download, FileDown, LogIn, Search, Send } from "lucide-react"; import { Button } from "~/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "~/components/ui/card"; import { Input } from "~/components/ui/input"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "~/components/ui/table"; import { exportRowsToExcel } from "~/lib/exportExcel"; import { FilterSelect, OperationsPageHeader } from "./OperationsUi"; import { USAGE_RECORDS, type UsageRecord } from "./workflowData"; function exportUsage(rows: UsageRecord[]) { const header = ["姓名", "所属", "登录次数", "提交需求", "阅读报告", "下载报告", "最近登录"]; return exportRowsToExcel({ fileName: "平台使用统计", sheetName: "使用统计", headers: header, rows: rows.map((row) => [row.person, row.team, row.logins, row.requests, row.reportsRead, row.reportsDownloaded, row.lastLoginAt]) }); } export default function UsageStatsPage() { const [team, setTeam] = useState(""); const [keyword, setKeyword] = useState(""); const rows = useMemo(() => USAGE_RECORDS.filter((record) => ( record.team !== "管理员" && (!team || record.team === team) && (!keyword.trim() || record.person.includes(keyword.trim())) )), [keyword, team]); const business = USAGE_RECORDS.filter((record) => record.team === "业务团队"); const model = USAGE_RECORDS.filter((record) => record.team === "模型团队"); const sum = (records: UsageRecord[], key: "logins" | "requests" | "reportsRead" | "reportsDownloaded") => records.reduce((total, record) => total + record[key], 0); const metrics = [ { label: "业务团队登录", value: sum(business, "logins"), detail: `${business.length} 人 · 人均 ${(sum(business, "logins") / business.length).toFixed(1)} 次`, Icon: LogIn }, { label: "模型团队登录", value: sum(model, "logins"), detail: `${model.length} 人 · 人均 ${(sum(model, "logins") / model.length).toFixed(1)} 次`, Icon: LogIn }, { label: "提交需求", value: sum(USAGE_RECORDS, "requests"), detail: "累计业务团队发起", Icon: Send }, { label: "报告下载", value: sum(USAGE_RECORDS, "reportsDownloaded"), detail: "累计两方合计", Icon: FileDown }, ]; return (
void exportUsage(rows)}>导出 Excel} />
{metrics.map(({ label, value, detail, Icon }) => ( {value}{label}{detail} ))}
人员使用情况共 {rows.length} 人 姓名所属登录次数提交需求阅读报告下载报告最近登录活跃度{rows.map((record) => { const activity = record.logins >= 40 ? ["高", "bg-success-soft text-success-strong"] : record.logins >= 15 ? ["中", "bg-brand-soft text-primary"] : ["低", "bg-warning-soft text-warning"]; return {record.person}{record.team}{record.logins}{record.requests}{record.reportsRead}{record.reportsDownloaded}{record.lastLoginAt}{activity[0]}; })}
); }