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,