From 0bedac5f1fbcfc38ccb5fd7abadc1aa42d25ac9a Mon Sep 17 00:00:00 2001 From: vine_liutk <961510893@qq.com> Date: Wed, 5 Jan 2022 19:36:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AF=BC=E5=87=BA=E5=8F=91?= =?UTF-8?q?=E8=B4=A7=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Actions/Grid/Exports/ShippingOrder.php | 53 ++++++++++++ app/Admin/Controllers/OrderController.php | 37 +++++++++ app/Admin/Forms/AfterSaleShippingFill.php | 2 +- app/Admin/Forms/OrderPackage.php | 2 +- app/Admin/routes.php | 1 + app/Console/Commands/QuotaV1SendCommand.php | 29 ++++--- app/Models/CouponRange.php | 4 +- app/Models/Order.php | 21 +++-- app/Models/Tag.php | 12 +-- composer.json | 1 + composer.lock | 82 ++++++++++++++++++- 11 files changed, 214 insertions(+), 30 deletions(-) create mode 100644 app/Admin/Actions/Grid/Exports/ShippingOrder.php diff --git a/app/Admin/Actions/Grid/Exports/ShippingOrder.php b/app/Admin/Actions/Grid/Exports/ShippingOrder.php new file mode 100644 index 00000000..161cf6f9 --- /dev/null +++ b/app/Admin/Actions/Grid/Exports/ShippingOrder.php @@ -0,0 +1,53 @@ +title) { + return $this->title; + } + return ' 导出发货单  '; + } + + /** + * @param Model|Authenticatable|HasPermissions|null $user + * + * @return bool + */ + protected function authorize($user): bool + { + return $user->can('dcat.admin.articles.index'); + } + + /** + * Handle the action request. + * + * @param Request $request + * + * @return Response + */ + public function handle(Request $request) + { + // return response()->streamDownload(function () { + // $writer = WriterEntityFactory::createXLSXWriter(); + // $writer->openToBrowser('测试'.date('Ymd')); + + // $writer->addRow(WriterEntityFactory::createRowFromArray([ + // '订单编号', '商品编号', '商品名称', '数量', '姓名', '电话', '地址', '下单时间', '发货数量', '发货单号', + // ])); + // $writer->close(); + // }); + return $this->response()->download(admin_route('orders.export_shipping_orders')); + } +} diff --git a/app/Admin/Controllers/OrderController.php b/app/Admin/Controllers/OrderController.php index 30a536c9..6fcd198f 100644 --- a/app/Admin/Controllers/OrderController.php +++ b/app/Admin/Controllers/OrderController.php @@ -3,6 +3,7 @@ namespace App\Admin\Controllers; use App\Admin\Actions\Grid\CreateOrderPackage; +use App\Admin\Actions\Grid\Exports\ShippingOrder as ExportShippingOrder; use App\Admin\Actions\Grid\OrderSetTag; use App\Admin\Actions\Show\OrderConsigneeInfo; use App\Admin\Actions\Show\OrderCreatePackage; @@ -17,6 +18,7 @@ use App\Models\OrderLog; use App\Models\OrderPackage; use App\Models\OrderProduct; use App\Models\Tag; +use Box\Spout\Writer\Common\Creator\WriterEntityFactory; use Dcat\Admin\Admin; use Dcat\Admin\Form; use Dcat\Admin\Grid; @@ -40,6 +42,12 @@ class OrderController extends AdminController return Grid::make($builder, function (Grid $grid) { // $grid->column('id')->sortable(); + $grid->tools(function (Grid\Tools $tools) { + //设置规格 + if (Admin::user()->can('dcat.admin.orders.export_shipping_orders')) { + $tools->append(new ExportShippingOrder()); + } + }); $grid->column('sn')->copyable(); $grid->column('tags', '标签')->display(function ($tags) { $array = []; @@ -382,4 +390,33 @@ class OrderController extends AdminController return response()->json($query->get()); } + + public function exportShippingOrder(Request $request) + { + return response()->streamDownload(function () { + $writer = WriterEntityFactory::createXLSXWriter(); + $writer->openToBrowser('测试'.date('Ymd').'.xlsx'); + + $writer->addRow(WriterEntityFactory::createRowFromArray([ + '订单编号', '商品编号', '商品名称', '数量', '姓名', '电话', '地址', '下单时间', '发货数量', '发货单号', + ])); + foreach (OrderModel::with('products')->needShipping()->cursor() as $order) { + foreach ($order->products as $product) { + if ($product->remain_quantity > 0) { + $writer->addRow(WriterEntityFactory::createRowFromArray([ + $order->sn, + $product->sku_id, + $product->name.'数量:'.$product->remain_quantity, + $product->remain_quantity, + $order->consignee_name, + $order->consignee_telephone, + $order->consignee_zone.$order->consignee_address, + $order->created_at->toDateTimeString(), + ])); + } + } + }; + $writer->close(); + }); + } } diff --git a/app/Admin/Forms/AfterSaleShippingFill.php b/app/Admin/Forms/AfterSaleShippingFill.php index 978510c0..42713f4f 100644 --- a/app/Admin/Forms/AfterSaleShippingFill.php +++ b/app/Admin/Forms/AfterSaleShippingFill.php @@ -106,7 +106,7 @@ class AfterSaleShippingFill extends Form implements LazyRenderable 'EMS'=>'EMS', '顺丰速运'=>'顺丰速运', '德邦快递'=>'德邦快递', - ])->required(); + ])->default('韵达快递')->required(); $this->text('shipping_number', '快递单号')->required(); // $this->text('remarks', '填写补货物流单号')->required(); $this->confirm('是否确认补货完成', '该操作不可逆,确认后将完成该售后单。'); diff --git a/app/Admin/Forms/OrderPackage.php b/app/Admin/Forms/OrderPackage.php index ad89d0d7..541a52b0 100644 --- a/app/Admin/Forms/OrderPackage.php +++ b/app/Admin/Forms/OrderPackage.php @@ -76,7 +76,7 @@ class OrderPackage extends Form implements LazyRenderable 'EMS'=>'EMS', '顺丰速运'=>'顺丰速运', '德邦快递'=>'德邦快递', - ])->required(); + ])->default('韵达快递')->required(); $this->text('shipping_number')->required(); $this->hasMany('packages', function (Form $form) use ($order) { $form->select('order_product_id')->options($order->products()->where('after_sale_state', '<>', 1)->pluck('name', 'id')); diff --git a/app/Admin/routes.php b/app/Admin/routes.php index 14b63247..e2836900 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -91,6 +91,7 @@ Route::group([ 'index', 'create', 'store', 'edit', 'update', 'destroy', ]); + $router->get('orders/export/shipping-order', 'OrderController@exportShippingOrder')->name('orders.export_shipping_orders'); $router->resource('orders', 'OrderController')->only([ 'index', 'show', 'edit', 'update', ]); diff --git a/app/Console/Commands/QuotaV1SendCommand.php b/app/Console/Commands/QuotaV1SendCommand.php index 850a00cd..0378c3b8 100644 --- a/app/Console/Commands/QuotaV1SendCommand.php +++ b/app/Console/Commands/QuotaV1SendCommand.php @@ -42,19 +42,22 @@ class QuotaV1SendCommand extends Command //依次分红 foreach ($userInfos as $userInfo) { if ($userInfo->bonusable) {//只针对享受分红的人发放 - $log = new QuotaV1SendLog(); - $log->user_id = $userInfo->user_id; - $log->job_id = $job->id; - $log->amount = round(bcmul(bcdiv($job->amount, $totalQuotaV1, 5), $userInfo->quota_v1, 3)); - $log->save(); - try { - DB::beginTransaction(); - $log->update(['status'=>1]); - $walletService->changeBalance($userInfo->user, $log->amount, WalletLog::ACTION_QUOTA_V1, '老配额分红', $log); - DB::commit(); - } catch (Throwable $th) { - DB::rollBack(); - report($th); + $quotaV1amount = round(bcmul(bcdiv($job->amount, $totalQuotaV1, 5), $userInfo->quota_v1, 3)); + if ($quotaV1amount >0) { + $log = new QuotaV1SendLog(); + $log->user_id = $userInfo->user_id; + $log->job_id = $job->id; + $log->amount = $quotaV1amount; + $log->save(); + try { + DB::beginTransaction(); + $log->update(['status'=>1]); + $walletService->changeBalance($userInfo->user, $log->amount, WalletLog::ACTION_QUOTA_V1, '老配额分红', $log); + DB::commit(); + } catch (Throwable $th) { + DB::rollBack(); + report($th); + } } } } diff --git a/app/Models/CouponRange.php b/app/Models/CouponRange.php index c70fa767..23fa4bf5 100644 --- a/app/Models/CouponRange.php +++ b/app/Models/CouponRange.php @@ -17,9 +17,9 @@ class CouponRange extends Model /** * 仅查询可用的券规则 */ - public function scopeIsEnable() + public function scopeIsEnable($query) { - return $this->where('is_enable', true); + return $query->where('is_enable', true); } public function coupon() diff --git a/app/Models/Order.php b/app/Models/Order.php index d52c62c7..63b97339 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -100,18 +100,18 @@ class Order extends Model /** * 仅查询支付过期的订单 */ - public function scopeExpired() + public function scopeExpired($query) { - return $this->where('status', static::STATUS_PENDING) + return $query->where('status', static::STATUS_PENDING) ->where('created_at', '<=', now()->subSeconds(app_settings('app.order_payment_expires_at'))); } /** * 仅查询可自动完成的订单 */ - public function scopeCompletable() + public function scopeCompletable($query) { - return $this->where('status', static::STATUS_PAID) + return $query->where('status', static::STATUS_PAID) ->where('shipping_state', static::SHIPPING_STATE_PROCESSED) ->where('auto_complete_at', '<=', now()); } @@ -119,13 +119,22 @@ class Order extends Model /** * 仅查询可结算的订单 */ - public function scopeSettlable() + public function scopeSettlable($query) { - return $this->where('status', static::STATUS_COMPLETED) + return $query->where('status', static::STATUS_COMPLETED) ->where('completed_at', '<=', now()->subDays(app_settings('distribution.settle_days', 7))) ->where('is_settle', false); } + /** + * 仅查询待发货的订单 + */ + public function scopeNeedShipping($query) + { + return $query->where('status', static::STATUS_PAID) + ->where('shipping_state', '<', static::SHIPPING_STATE_PROCESSED); + } + /** * 下单人 * diff --git a/app/Models/Tag.php b/app/Models/Tag.php index e5a22c42..7a2f74c4 100644 --- a/app/Models/Tag.php +++ b/app/Models/Tag.php @@ -34,18 +34,18 @@ class Tag extends Model // return $this->morphedByMany(OrderPackage::class, 'taggable'); // } - public function scopeOrderTag() + public function scopeOrderTag($query) { - return $this->where('type', self::TYPE_ORDER); + return $query->where('type', self::TYPE_ORDER); } - public function scopeOrderPackageTag() + public function scopeOrderPackageTag($query) { - return $this->where('type', self::TYPE_PACKAGE); + return $query->where('type', self::TYPE_PACKAGE); } - public function scopeAfterSaleTag() + public function scopeAfterSaleTag($query) { - return $this->where('type', self::TYPE_AFTER_SALE); + return $query->where('type', self::TYPE_AFTER_SALE); } } diff --git a/composer.json b/composer.json index 19d7f1b3..ffe18597 100644 --- a/composer.json +++ b/composer.json @@ -15,6 +15,7 @@ "alibabacloud/sts": "^1.8", "alipaysdk/easysdk": "^2.2", "alphasnow/aliyun-oss-laravel": "^3.0", + "box/spout": "^3.3", "dcat/laravel-admin": "2.1.5-beta", "fruitcake/laravel-cors": "^2.0", "gregwar/captcha": "^1.1", diff --git a/composer.lock b/composer.lock index 76dec1c4..561d58b2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e29674f9d20d1f4352e096af590c340b", + "content-hash": "a1bf80b8df4152dc433261263b5aa05f", "packages": [ { "name": "adbario/php-dot-notation", @@ -705,6 +705,86 @@ }, "time": "2021-06-18T13:26:35+00:00" }, + { + "name": "box/spout", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/box/spout.git", + "reference": "9bdb027d312b732515b884a341c0ad70372c6295" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/box/spout/zipball/9bdb027d312b732515b884a341c0ad70372c6295", + "reference": "9bdb027d312b732515b884a341c0ad70372c6295", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-dom": "*", + "ext-xmlreader": "*", + "ext-zip": "*", + "php": ">=7.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2", + "phpunit/phpunit": "^8" + }, + "suggest": { + "ext-iconv": "To handle non UTF-8 CSV files (if \"php-intl\" is not already installed or is too limited)", + "ext-intl": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Box\\Spout\\": "src/Spout" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Adrien Loison", + "email": "adrien@box.com" + } + ], + "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way", + "homepage": "https://www.github.com/box/spout", + "keywords": [ + "OOXML", + "csv", + "excel", + "memory", + "odf", + "ods", + "office", + "open", + "php", + "read", + "scale", + "spreadsheet", + "stream", + "write", + "xlsx" + ], + "support": { + "issues": "https://github.com/box/spout/issues", + "source": "https://github.com/box/spout/tree/v3.3.0" + }, + "time": "2021-05-14T21:18:09+00:00" + }, { "name": "brick/math", "version": "0.9.3",