Browse Source

增加导出选中产品,并和导出全部合并为一个按钮

master
李可松 4 years ago
parent
commit
6350c24ed3
  1. 59
      app/AdminSupplier/Actions/Grid/ExportToExcelButton.php
  2. 5
      app/AdminSupplier/Controllers/ProductController.php
  3. 4
      app/AdminSupplier/Controllers/ProductExportLogController.php
  4. 12
      app/AdminSupplier/Extensions/ProductToExcelExporter.php
  5. 12
      app/Exports/ProductExport.php
  6. 7
      app/Jobs/ExportProductToExcel.php

59
app/AdminSupplier/Actions/Grid/ExportToExcelButton.php

@ -1,59 +0,0 @@
<?php
namespace App\AdminSupplier\Actions\Grid;
use App\Jobs\ExportProductToExcel;
use Dcat\Admin\Grid\Tools\AbstractTool;
use Dcat\Admin\Traits\HasPermissions;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
class ExportToExcelButton extends AbstractTool
{
/**
* @return string
*/
protected $title = '导入所有产品到excel';
public function html()
{
$this->appendHtmlAttribute('class', 'btn btn-primary btn-outline');
return <<<HTML
<button {$this->formatHtmlAttributes()}>{$this->title()}</button>
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 [];
}
}

5
app/AdminSupplier/Controllers/ProductController.php

@ -5,6 +5,7 @@ namespace App\AdminSupplier\Controllers;
use App\AdminSupplier\Actions\Grid\ExportToExcelButton; use App\AdminSupplier\Actions\Grid\ExportToExcelButton;
use App\AdminSupplier\Actions\Grid\ImportFromExcelButton; use App\AdminSupplier\Actions\Grid\ImportFromExcelButton;
use App\AdminSupplier\Extensions\Form\Spec; use App\AdminSupplier\Extensions\Form\Spec;
use App\AdminSupplier\Extensions\ProductToExcelExporter;
use App\AdminSupplier\Forms\ExcelImport; use App\AdminSupplier\Forms\ExcelImport;
use App\AdminSupplier\Repositories\Product; use App\AdminSupplier\Repositories\Product;
use App\Common\OrderStatus; use App\Common\OrderStatus;
@ -43,8 +44,8 @@ class ProductController extends AdminController
$grid->model()->where('supplier_id', Admin::user()->id); $grid->model()->where('supplier_id', Admin::user()->id);
$grid->tools(new ImportFromExcelButton()); $grid->tools(new ImportFromExcelButton());
$grid->tools(new ExportToExcelButton());
// $grid->export(new ProductToExcelExporter);
$grid->export(new ProductToExcelExporter);
$grid->export()->disableExportCurrentPage();
$category_id = request()->input('cid'); $category_id = request()->input('cid');
if ($category_id) { if ($category_id) {

4
app/AdminSupplier/Controllers/ProductExportLogController.php

@ -7,6 +7,7 @@ use Dcat\Admin\Form;
use Dcat\Admin\Grid; use Dcat\Admin\Grid;
use Dcat\Admin\Show; use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController; use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Widgets\Alert;
class ProductExportLogController extends AdminController class ProductExportLogController extends AdminController
{ {
@ -25,6 +26,9 @@ class ProductExportLogController extends AdminController
$grid->model()->where('supplier_id', \Admin::user()->id)->orderByDesc('id'); $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('id')->sortable();
$grid->column('filename')->downloadable(); $grid->column('filename')->downloadable();
$grid->column('created_at'); $grid->column('created_at');

12
app/AdminSupplier/Extensions/ProductToExcelExporter.php

@ -2,6 +2,7 @@
namespace App\AdminSupplier\Extensions; namespace App\AdminSupplier\Extensions;
use App\Exports\ProductExport; use App\Exports\ProductExport;
use App\Jobs\ExportProductToExcel;
use Dcat\Admin\Admin; use Dcat\Admin\Admin;
use Dcat\Admin\Grid\Exporters\AbstractExporter; use Dcat\Admin\Grid\Exporters\AbstractExporter;
use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Facades\Excel;
@ -13,6 +14,15 @@ class ProductToExcelExporter extends AbstractExporter
{ {
public function export() 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();
}
} }
} }

12
app/Exports/ProductExport.php

@ -12,15 +12,23 @@ use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
class ProductExport implements FromQuery, WithHeadings, WithColumnFormatting class ProductExport implements FromQuery, WithHeadings, WithColumnFormatting
{ {
private int $supplier_id; 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->supplier_id = $supplier_id;
$this->_export_ = $_export_;
} }
public function query() 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) public function prepareRows($rows)

7
app/Jobs/ExportProductToExcel.php

@ -12,6 +12,9 @@ use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Facades\Excel;
/**
* 导出全部产品
*/
class ExportProductToExcel implements ShouldQueue class ExportProductToExcel implements ShouldQueue
{ {
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
@ -35,8 +38,8 @@ class ExportProductToExcel implements ShouldQueue
*/ */
public function handle() 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([ ProductExportLog::create([
'supplier_id' => $this->supplier_id, 'supplier_id' => $this->supplier_id,
'filename' => $filePath, 'filename' => $filePath,

Loading…
Cancel
Save