diff --git a/app/AdminSupplier/Actions/Grid/ExportToExcelButton.php b/app/AdminSupplier/Actions/Grid/ExportToExcelButton.php deleted file mode 100644 index d9f665b..0000000 --- a/app/AdminSupplier/Actions/Grid/ExportToExcelButton.php +++ /dev/null @@ -1,59 +0,0 @@ -appendHtmlAttribute('class', 'btn btn-primary btn-outline'); - - return <<formatHtmlAttributes()}>{$this->title()} -HTML; - } - - public function handle(Request $request) - { - ExportProductToExcel::dispatch(\Admin::user()->id); - return $this->response()->success('导出成功,稍后到导出列表下载')->redirect(admin_url('product/export')); - } - - /** - * @return string|array|void - */ - public function confirm() - { - // return ['Confirm?', 'contents']; - } - - /** - * @param Model|Authenticatable|HasPermissions|null $user - * - * @return bool - */ - protected function authorize($user): bool - { - return true; - } - - /** - * @return array - */ - protected function parameters() - { - return []; - } -} diff --git a/app/AdminSupplier/Controllers/ProductController.php b/app/AdminSupplier/Controllers/ProductController.php index 2aa88e0..f4c99b3 100644 --- a/app/AdminSupplier/Controllers/ProductController.php +++ b/app/AdminSupplier/Controllers/ProductController.php @@ -5,6 +5,7 @@ namespace App\AdminSupplier\Controllers; use App\AdminSupplier\Actions\Grid\ExportToExcelButton; use App\AdminSupplier\Actions\Grid\ImportFromExcelButton; use App\AdminSupplier\Extensions\Form\Spec; +use App\AdminSupplier\Extensions\ProductToExcelExporter; use App\AdminSupplier\Forms\ExcelImport; use App\AdminSupplier\Repositories\Product; use App\Common\OrderStatus; @@ -43,8 +44,8 @@ class ProductController extends AdminController $grid->model()->where('supplier_id', Admin::user()->id); $grid->tools(new ImportFromExcelButton()); - $grid->tools(new ExportToExcelButton()); -// $grid->export(new ProductToExcelExporter); + $grid->export(new ProductToExcelExporter); + $grid->export()->disableExportCurrentPage(); $category_id = request()->input('cid'); if ($category_id) { diff --git a/app/AdminSupplier/Controllers/ProductExportLogController.php b/app/AdminSupplier/Controllers/ProductExportLogController.php index a069188..d37c1ad 100644 --- a/app/AdminSupplier/Controllers/ProductExportLogController.php +++ b/app/AdminSupplier/Controllers/ProductExportLogController.php @@ -7,6 +7,7 @@ use Dcat\Admin\Form; use Dcat\Admin\Grid; use Dcat\Admin\Show; use Dcat\Admin\Http\Controllers\AdminController; +use Dcat\Admin\Widgets\Alert; class ProductExportLogController extends AdminController { @@ -25,6 +26,9 @@ class ProductExportLogController extends AdminController $grid->model()->where('supplier_id', \Admin::user()->id)->orderByDesc('id'); + $grid->header(Alert::make('提示:只要导出全部才会在此列表显示。导出全部产品可能需要几分钟,请稍后再刷新查看!')->info()); + \Admin::style('.alert.alert-info{margin-top:1rem;}'); + $grid->column('id')->sortable(); $grid->column('filename')->downloadable(); $grid->column('created_at'); diff --git a/app/AdminSupplier/Extensions/ProductToExcelExporter.php b/app/AdminSupplier/Extensions/ProductToExcelExporter.php index ad6bc0e..839feee 100644 --- a/app/AdminSupplier/Extensions/ProductToExcelExporter.php +++ b/app/AdminSupplier/Extensions/ProductToExcelExporter.php @@ -2,6 +2,7 @@ namespace App\AdminSupplier\Extensions; use App\Exports\ProductExport; +use App\Jobs\ExportProductToExcel; use Dcat\Admin\Admin; use Dcat\Admin\Grid\Exporters\AbstractExporter; use Maatwebsite\Excel\Facades\Excel; @@ -13,6 +14,15 @@ class ProductToExcelExporter extends AbstractExporter { public function export() { - return Excel::download(new ProductExport(Admin::user()->id), '导出产品-' . date('Y-m-d H:i:s') . '.xlsx')->send(); + $export_type = request('_export_'); + if ($export_type == 'all') { + ExportProductToExcel::dispatch(\Admin::user()->id); + return redirect(admin_url('product/export'))->send(); + } else if (str_starts_with($export_type, 'selected:')) { + $ids = explode(',', substr($export_type, strlen('selected:'))); + $ids = array_filter($ids, fn($v) => preg_match('/^\d+$/', $v)); + + return Excel::download(new ProductExport(Admin::user()->id, $ids), '导出选择产品-' . date('Y-m-d H:i:s') . '.xlsx')->send(); + } } } diff --git a/app/Exports/ProductExport.php b/app/Exports/ProductExport.php index 981d68b..8ccd662 100644 --- a/app/Exports/ProductExport.php +++ b/app/Exports/ProductExport.php @@ -12,15 +12,23 @@ use PhpOffice\PhpSpreadsheet\Style\NumberFormat; class ProductExport implements FromQuery, WithHeadings, WithColumnFormatting { private int $supplier_id; + private string|array|null $_export_ = null; - public function __construct(int $supplier_id) + public function __construct(int $supplier_id, string|array $_export_ = null) { $this->supplier_id = $supplier_id; + $this->_export_ = $_export_; } public function query() { - return Product::with('category:id,name')->where('supplier_id', $this->supplier_id); + if ($this->_export_ == 'all') { + return Product::with('category:id,name')->where('supplier_id', $this->supplier_id); + } else if (!empty($this->_export_) && is_array($this->_export_)) { + return Product::with('category:id,name')->where('supplier_id', $this->supplier_id)->whereIn('id', $this->_export_); + } else { + return Product::with('category:id,name')->where('supplier_id', $this->supplier_id)->limit(15); + } } public function prepareRows($rows) diff --git a/app/Jobs/ExportProductToExcel.php b/app/Jobs/ExportProductToExcel.php index 1633d23..a1465d7 100644 --- a/app/Jobs/ExportProductToExcel.php +++ b/app/Jobs/ExportProductToExcel.php @@ -12,6 +12,9 @@ use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Maatwebsite\Excel\Facades\Excel; +/** + * 导出全部产品 + */ class ExportProductToExcel implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; @@ -35,8 +38,8 @@ class ExportProductToExcel implements ShouldQueue */ public function handle() { - $filePath = "supplier/export/{$this->supplier_id}/" . date('Y-m') . "/导出产品-" . date('Y-m-d_H-i-s') . '.xlsx'; - Excel::store(new ProductExport($this->supplier_id), $filePath, 'public'); + $filePath = "supplier/export/{$this->supplier_id}/" . date('Y-m') . "/导出全部产品-" . date('Y-m-d_H-i-s') . '.xlsx'; + Excel::store(new ProductExport($this->supplier_id, 'all'), $filePath, 'public'); ProductExportLog::create([ 'supplier_id' => $this->supplier_id, 'filename' => $filePath,