From 2ed93cd88acae663fad21afba02b8b4f609024fc Mon Sep 17 00:00:00 2001 From: Edward Yang Date: Wed, 24 Aug 2022 11:37:18 +0800 Subject: [PATCH] export order --- beike/Admin/Http/Controllers/Controller.php | 54 +++++++++++++++++++ .../Http/Controllers/OrderController.php | 8 +-- beike/Admin/Http/Resources/OrderSimple.php | 33 ++++++++++++ composer.json | 1 + resources/lang/en/order.php | 21 ++++++++ resources/lang/zh_cn/order.php | 21 ++++++++ 6 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 beike/Admin/Http/Resources/OrderSimple.php create mode 100644 resources/lang/en/order.php create mode 100644 resources/lang/zh_cn/order.php diff --git a/beike/Admin/Http/Controllers/Controller.php b/beike/Admin/Http/Controllers/Controller.php index 0d189118..cd14c529 100644 --- a/beike/Admin/Http/Controllers/Controller.php +++ b/beike/Admin/Http/Controllers/Controller.php @@ -4,6 +4,7 @@ namespace Beike\Admin\Http\Controllers; use Illuminate\Support\Facades\Route; use App\Http\Controllers\Controller as BaseController; +use Symfony\Component\HttpFoundation\BinaryFileResponse; abstract class Controller extends BaseController { @@ -21,6 +22,7 @@ abstract class Controller extends BaseController return request('_redirect') ?? request()->header('referer', admin_route($this->defaultRoute)); } + /** * 获取当前管理界面列表页路由 * @return string @@ -32,4 +34,56 @@ abstract class Controller extends BaseController $name = $names[1] ?? ''; return "{$name}.index"; } + + + /** + * 导出CSV + * + * @param $fileName + * @param $items + * @param string $module + * @return BinaryFileResponse + * @throws \Exception + */ + protected function downloadCsv($fileName, $items, string $module = ''): BinaryFileResponse + { + $module = $module ?: $fileName; + $charset = app()->getLocale() == 'zh-hk' ? 'BIG5' : 'GBK'; + + if (empty($items)) { + throw new \Exception(trans('empty_items')); + } + if (!str_contains($fileName, '.csv')) { + $fileName = $fileName . '-' . date('YmdHis') . '.csv'; + } + $headers = [ + 'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0', + 'Content-type' => 'application/octet-stream', + // 'Content-type' => 'text/csv', + 'Content-Disposition' => "attachment; filename={$fileName}", + 'Content-Transfer-Encoding' => 'binary', + 'Expires' => '0', + 'Pragma' => 'public' + ]; + + $columns = array_keys($items[0]); + foreach ($columns as $index => $column) { + $columns[$index] = iconv("UTF-8", "{$charset}//IGNORE", trans("$module.{$column}")); + } + foreach ($items as $index => $item) { + foreach ($item as $field => $value) { + $items[$index][$field] = iconv("UTF-8", "{$charset}//IGNORE", $value); + } + } + + $filePath = storage_path('app/' . $fileName); + $file = fopen($filePath, 'w'); + fputcsv($file, $columns); + foreach ($items as $item) { + fputcsv($file, $item); + } + fclose($file); + + return response()->download($filePath, $fileName, $headers); + } } diff --git a/beike/Admin/Http/Controllers/OrderController.php b/beike/Admin/Http/Controllers/OrderController.php index 8a885818..8a7f9c33 100644 --- a/beike/Admin/Http/Controllers/OrderController.php +++ b/beike/Admin/Http/Controllers/OrderController.php @@ -11,6 +11,7 @@ namespace Beike\Admin\Http\Controllers; +use Beike\Admin\Http\Resources\OrderSimple; use Beike\Models\Order; use Beike\Repositories\OrderRepo; use Beike\Services\StateMachineService; @@ -40,14 +41,13 @@ class OrderController extends Controller * * @param Request $request * @return mixed + * @throws \Exception */ public function export(Request $request) { $orders = OrderRepo::filterOrders($request->all()); - $data = [ - 'orders' => OrderList::collection($orders), - ]; - return view('admin::pages.orders.index', $data); + $items = OrderSimple::collection($orders)->jsonSerialize(); + return $this->downloadCsv('orders', $items, 'order'); } diff --git a/beike/Admin/Http/Resources/OrderSimple.php b/beike/Admin/Http/Resources/OrderSimple.php new file mode 100644 index 00000000..f83d4fae --- /dev/null +++ b/beike/Admin/Http/Resources/OrderSimple.php @@ -0,0 +1,33 @@ + + * @created 2022-08-24 10:51:53 + * @modified 2022-08-24 10:51:53 + */ + +namespace Beike\Admin\Http\Resources; + +use Illuminate\Http\Resources\Json\JsonResource; + +class OrderSimple extends JsonResource +{ + public function toArray($request): array + { + $data = [ + 'id' => $this->id, + 'number' => $this->number, + 'customer_name' => $this->customer_name, + 'email' => $this->email, + 'telephone' => $this->telephone, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + 'status' => trans("admin/order.{$this->status}"), + ]; + + return $data; + } +} diff --git a/composer.json b/composer.json index 51d57e4e..9106dc01 100644 --- a/composer.json +++ b/composer.json @@ -8,6 +8,7 @@ "php": "^8.0.2", "ext-json": "*", "ext-zip": "*", + "ext-iconv": "*", "doctrine/dbal": "^3.3", "fruitcake/laravel-cors": "^2.0", "guzzlehttp/guzzle": "^7.2", diff --git a/resources/lang/en/order.php b/resources/lang/en/order.php new file mode 100644 index 00000000..ae6ea8ad --- /dev/null +++ b/resources/lang/en/order.php @@ -0,0 +1,21 @@ + + * @created 2022-08-02 14:22:41 + * @modified 2022-08-02 14:22:41 + */ + +return [ + 'id' => 'ID', + 'number' => 'Number', + 'customer_name' => 'Customer Name', + 'email' => 'Email', + 'telephone' => 'Telephone', + 'created_at' => 'Created', + 'updated_at' => 'Updated', + 'status' => 'Status', +]; diff --git a/resources/lang/zh_cn/order.php b/resources/lang/zh_cn/order.php new file mode 100644 index 00000000..f7b97ca6 --- /dev/null +++ b/resources/lang/zh_cn/order.php @@ -0,0 +1,21 @@ + + * @created 2022-08-02 14:22:41 + * @modified 2022-08-02 14:22:41 + */ + +return [ + 'id' => 'ID', + 'number' => '订单号', + 'customer_name' => '客户姓名', + 'email' => 'Email', + 'telephone' => '联系电话', + 'created_at' => '创建时间', + 'updated_at' => '更新时间', + 'status' => '状态', +];