From ec54f0958dd058fa822cb3d7b15df8b7fc5a4b25 Mon Sep 17 00:00:00 2001 From: lizhuoran <625237490@qq.com> Date: Wed, 11 Mar 2026 15:19:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=96=87=E6=A1=A3):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E5=A4=B1=E8=B4=A5=E6=8A=A5=E9=94=99=E6=8F=90?= =?UTF-8?q?=E9=86=92=E5=92=8C=E9=87=8D=E8=AF=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在文档列表添加「重试转换」和「查看错误」操作按钮 - 在文档详情页添加「重试转换」功能和转换错误信息展示 - 创建错误详情视图,提供友好的错误信息和解决方案 - 重试功能会重置文档状态并重新派发转换任务 - 优化用户体验,提供清晰的错误提示和操作指引 --- app/Filament/Resources/DocumentResource.php | 51 ++++++++++++ .../DocumentResource/Pages/ViewDocument.php | 72 +++++++++++++++++ .../modals/conversion-error.blade.php | 51 ++++++++++++ .../conversion-error-detail.blade.php | 79 +++++++++++++++++++ 4 files changed, 253 insertions(+) create mode 100644 resources/views/filament/modals/conversion-error.blade.php create mode 100644 resources/views/filament/resources/document/conversion-error-detail.blade.php diff --git a/app/Filament/Resources/DocumentResource.php b/app/Filament/Resources/DocumentResource.php index 83531b4..56e633c 100644 --- a/app/Filament/Resources/DocumentResource.php +++ b/app/Filament/Resources/DocumentResource.php @@ -222,6 +222,57 @@ class DocumentResource extends Resource ->placeholder('全部状态'), ]) ->actions([ + Tables\Actions\Action::make('retry_conversion') + ->label('重试转换') + ->icon('heroicon-o-arrow-path') + ->color('warning') + ->visible(fn (Document $record): bool => $record->conversion_status === 'failed') + ->requiresConfirmation() + ->modalHeading('重试文档转换') + ->modalDescription(fn (Document $record): string => + '确定要重新转换文档 "' . $record->title . '" 吗?' . + ($record->conversion_error ? "\n\n上次失败原因:" . $record->conversion_error : '') + ) + ->modalSubmitActionLabel('确认重试') + ->action(function (Document $record) { + try { + // 重置转换状态 + $record->conversion_status = 'pending'; + $record->conversion_error = null; + $record->save(); + + // 重新派发转换任务 + \App\Jobs\ConvertDocumentToMarkdown::dispatch($record); + + \Filament\Notifications\Notification::make() + ->success() + ->title('重试成功') + ->body('文档转换任务已重新加入队列,请稍后查看转换结果。') + ->send(); + } catch (\Exception $e) { + \Filament\Notifications\Notification::make() + ->danger() + ->title('重试失败') + ->body('无法重新派发转换任务:' . $e->getMessage()) + ->send(); + } + }), + Tables\Actions\Action::make('view_error') + ->label('查看错误') + ->icon('heroicon-o-exclamation-triangle') + ->color('danger') + ->visible(fn (Document $record): bool => + $record->conversion_status === 'failed' && !empty($record->conversion_error) + ) + ->modalHeading('转换错误详情') + ->modalContent(fn (Document $record): \Illuminate\Contracts\View\View => + view('filament.modals.conversion-error', [ + 'document' => $record, + 'error' => $record->conversion_error, + ]) + ) + ->modalSubmitAction(false) + ->modalCancelActionLabel('关闭'), Tables\Actions\Action::make('preview') ->label('预览 Markdown') ->icon('heroicon-o-eye') diff --git a/app/Filament/Resources/DocumentResource/Pages/ViewDocument.php b/app/Filament/Resources/DocumentResource/Pages/ViewDocument.php index bac809c..5703743 100644 --- a/app/Filament/Resources/DocumentResource/Pages/ViewDocument.php +++ b/app/Filament/Resources/DocumentResource/Pages/ViewDocument.php @@ -20,6 +20,47 @@ class ViewDocument extends ViewRecord protected function getHeaderActions(): array { return [ + Actions\Action::make('retry_conversion') + ->label('重试转换') + ->icon('heroicon-o-arrow-path') + ->color('warning') + ->visible(fn (): bool => $this->record->conversion_status === 'failed') + ->requiresConfirmation() + ->modalHeading('重试文档转换') + ->modalDescription(fn (): string => + '确定要重新转换文档 "' . $this->record->title . '" 吗?' . + ($this->record->conversion_error ? "\n\n上次失败原因:" . $this->record->conversion_error : '') + ) + ->modalSubmitActionLabel('确认重试') + ->action(function () { + try { + // 重置转换状态 + $this->record->conversion_status = 'pending'; + $this->record->conversion_error = null; + $this->record->save(); + + // 重新派发转换任务 + \App\Jobs\ConvertDocumentToMarkdown::dispatch($this->record); + + Notification::make() + ->success() + ->title('重试成功') + ->body('文档转换任务已重新加入队列,请稍后查看转换结果。') + ->send(); + + // 刷新页面数据 + $this->refreshFormData([ + 'conversion_status', + 'conversion_error', + ]); + } catch (\Exception $e) { + Notification::make() + ->danger() + ->title('重试失败') + ->body('无法重新派发转换任务:' . $e->getMessage()) + ->send(); + } + }), Actions\Action::make('preview') ->label('预览 Markdown') ->icon('heroicon-o-eye') @@ -107,6 +148,24 @@ class ViewDocument extends ViewRecord ->label('文件大小') ->formatStateUsing(fn ($state): string => DocumentResource::formatFileSize($state)), + TextEntry::make('conversion_status') + ->label('转换状态') + ->badge() + ->color(fn (?string $state): string => match ($state) { + 'completed' => 'success', + 'processing' => 'info', + 'pending' => 'warning', + 'failed' => 'danger', + default => 'gray', + }) + ->formatStateUsing(fn (?string $state): string => match ($state) { + 'completed' => '已完成', + 'processing' => '转换中', + 'pending' => '等待转换', + 'failed' => '转换失败', + default => '未知', + }), + TextEntry::make('created_at') ->label('上传时间') ->dateTime('Y年m月d日 H:i:s'), @@ -117,6 +176,19 @@ class ViewDocument extends ViewRecord ]) ->columns(2), + Section::make('转换错误信息') + ->schema([ + ViewEntry::make('conversion_error') + ->label('') + ->view('filament.resources.document.conversion-error-detail') + ->viewData([ + 'document' => $this->record, + ]), + ]) + ->visible(fn ($record) => $record->conversion_status === 'failed' && !empty($record->conversion_error)) + ->collapsible() + ->collapsed(false), + Section::make('文档预览') ->schema([ ViewEntry::make('preview') diff --git a/resources/views/filament/modals/conversion-error.blade.php b/resources/views/filament/modals/conversion-error.blade.php new file mode 100644 index 0000000..2c9f4f7 --- /dev/null +++ b/resources/views/filament/modals/conversion-error.blade.php @@ -0,0 +1,51 @@ +
文档:{{ $document->title }}
+文件名:{{ $document->file_name }}
+失败时间:{{ $document->updated_at->format('Y年m月d日 H:i:s') }}
+{{ $error }}
+ 失败时间:{{ $document->updated_at->format('Y年m月d日 H:i:s') }}
+{{ $document->conversion_error }}
+ 您可以点击页面右上角的 "重试转换" 按钮重新尝试转换此文档。如果问题持续存在,请联系系统管理员或尝试重新上传文档。
+