From 6313181658fe52e705bb1bd90869d21d7220bd69 Mon Sep 17 00:00:00 2001 From: lizhuoran <625237490@qq.com> Date: Thu, 12 Mar 2026 16:24:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=87=AA=E5=AE=9A=E4=B9=89=E4=BB=AA?= =?UTF-8?q?=E8=A1=A8=E6=9D=BF=EF=BC=8C=E6=B7=BB=E5=8A=A0=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93=E5=92=8C=E7=BB=88=E7=AB=AF=E7=BB=9F=E8=AE=A1=E7=BB=84?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建自定义 Dashboard 页面替换默认仪表板 - 新增 KnowledgeBaseStatsWidget 显示知识库统计信息 - 文档总数、转换完成数、转换失败数、处理中数量 - 知识库分组数量 - 转换成功率计算 - 新增 TerminalStatsWidget 显示终端统计信息 - 终端总数和激活状态 - 知识库关联数、提示词配置数 - 今日同步成功/失败统计 - 移除默认的 FilamentInfoWidget - 统计卡片支持点击跳转到相关管理页面 --- app/Filament/Pages/Dashboard.php | 25 +++++++ .../Widgets/KnowledgeBaseStatsWidget.php | 61 +++++++++++++++++ app/Filament/Widgets/TerminalStatsWidget.php | 65 +++++++++++++++++++ app/Providers/Filament/AdminPanelProvider.php | 3 +- 4 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 app/Filament/Pages/Dashboard.php create mode 100644 app/Filament/Widgets/KnowledgeBaseStatsWidget.php create mode 100644 app/Filament/Widgets/TerminalStatsWidget.php diff --git a/app/Filament/Pages/Dashboard.php b/app/Filament/Pages/Dashboard.php new file mode 100644 index 0000000..b174067 --- /dev/null +++ b/app/Filament/Pages/Dashboard.php @@ -0,0 +1,25 @@ +count(); + $failedDocuments = Document::where('conversion_status', 'failed')->count(); + $processingDocuments = Document::whereIn('conversion_status', ['pending', 'processing'])->count(); + + // 统计分组数据 + $totalGroups = Group::count(); + + // 计算转换成功率 + $conversionRate = $totalDocuments > 0 + ? round(($completedDocuments / $totalDocuments) * 100, 1) + : 0; + + return [ + Stat::make('文档总数', $totalDocuments) + ->description('知识库中的文档总数') + ->descriptionIcon('heroicon-m-document-text') + ->color('primary') + ->chart([7, 12, 15, 18, 22, 25, $totalDocuments]), + + Stat::make('转换完成', $completedDocuments) + ->description("成功率: {$conversionRate}%") + ->descriptionIcon('heroicon-m-check-circle') + ->color('success') + ->chart([5, 10, 12, 15, 18, 20, $completedDocuments]), + + Stat::make('转换失败', $failedDocuments) + ->description('需要重新处理') + ->descriptionIcon('heroicon-m-x-circle') + ->color('danger') + ->url(route('filament.admin.resources.documents.index', ['tableFilters[conversion_status][value]' => 'failed'])), + + Stat::make('处理中', $processingDocuments) + ->description('等待转换或转换中') + ->descriptionIcon('heroicon-m-arrow-path') + ->color('warning'), + + Stat::make('知识库分组', $totalGroups) + ->description('专用知识库数量') + ->descriptionIcon('heroicon-m-folder') + ->color('info') + ->url(route('filament.admin.resources.groups.index')), + ]; + } +} diff --git a/app/Filament/Widgets/TerminalStatsWidget.php b/app/Filament/Widgets/TerminalStatsWidget.php new file mode 100644 index 0000000..59e218f --- /dev/null +++ b/app/Filament/Widgets/TerminalStatsWidget.php @@ -0,0 +1,65 @@ +count(); + + // 统计知识库关联 + $totalKnowledgeBases = TerminalKnowledgeBase::count(); + + // 统计提示词 + $totalPrompts = TerminalPrompt::count(); + + // 统计最近同步 + $recentSyncs = TerminalSyncLog::where('created_at', '>=', now()->subDay()) + ->where('status', 'success') + ->count(); + + $failedSyncs = TerminalSyncLog::where('created_at', '>=', now()->subDay()) + ->where('status', 'failed') + ->count(); + + return [ + Stat::make('终端总数', $totalTerminals) + ->description("{$activeTerminals} 个激活") + ->descriptionIcon('heroicon-m-computer-desktop') + ->color('primary') + ->url(route('filament.admin.resources.terminals.index')), + + Stat::make('知识库关联', $totalKnowledgeBases) + ->description('终端知识库配置数') + ->descriptionIcon('heroicon-m-link') + ->color('info'), + + Stat::make('提示词配置', $totalPrompts) + ->description('终端提示词总数') + ->descriptionIcon('heroicon-m-chat-bubble-left-right') + ->color('success'), + + Stat::make('今日同步成功', $recentSyncs) + ->description('最近24小时') + ->descriptionIcon('heroicon-m-arrow-path') + ->color('success'), + + Stat::make('今日同步失败', $failedSyncs) + ->description($failedSyncs > 0 ? '需要检查' : '运行正常') + ->descriptionIcon($failedSyncs > 0 ? 'heroicon-m-exclamation-triangle' : 'heroicon-m-check-circle') + ->color($failedSyncs > 0 ? 'danger' : 'success'), + ]; + } +} diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index 6694332..cb6fde6 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -33,12 +33,11 @@ class AdminPanelProvider extends PanelProvider ->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources') ->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages') ->pages([ - Pages\Dashboard::class, + \App\Filament\Pages\Dashboard::class, ]) ->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets') ->widgets([ Widgets\AccountWidget::class, - Widgets\FilamentInfoWidget::class, ]) ->middleware([ EncryptCookies::class,