From 71d287fbf486b2dd7f9c532a5412911a9cb9488e Mon Sep 17 00:00:00 2001 From: panliang <1163816051@qq.com> Date: Tue, 7 Jun 2022 10:38:12 +0800 Subject: [PATCH] order --- app/Admin/Controllers/OrderController.php | 20 +++++++-- .../Controllers/Store/OrderController.php | 44 +++++++++++++++---- .../Controllers/Store/ProductController.php | 35 ++++++++++++++- ...derDistribute.php => OrderGrowthValue.php} | 8 ++-- app/Listeners/OrderDistribute.php | 42 ++++++++++++++++++ app/Models/Order.php | 16 ++++--- app/Providers/EventServiceProvider.php | 1 + app/Services/DistributeService.php | 24 ++++++++-- resources/lang/zh_CN/store-order.php | 1 + 9 files changed, 166 insertions(+), 25 deletions(-) rename app/Console/Commands/{OrderDistribute.php => OrderGrowthValue.php} (86%) create mode 100644 app/Listeners/OrderDistribute.php diff --git a/app/Admin/Controllers/OrderController.php b/app/Admin/Controllers/OrderController.php index 71bfa386..c6057d90 100644 --- a/app/Admin/Controllers/OrderController.php +++ b/app/Admin/Controllers/OrderController.php @@ -122,7 +122,7 @@ class OrderController extends AdminController */ protected function grid() { - $grid = new Grid(Order::with(['user', 'tags'])); + $grid = new Grid(Order::with(['user', 'userInfo', 'tags'])); $grid->setResource('orders'); $grid->model()->orderBy('id', 'desc'); @@ -138,7 +138,16 @@ class OrderController extends AdminController $grid->column('tags', '标签')->display(function ($tags) { return $tags->implode('name'); })->label(); - $grid->column('user.phone')->copyable(); + $grid->column('user_id')->display(function () { + $nickname = $this->userInfo->nickname ?? '---'; + $avatar = $this->userInfo->avatar ?? 'https://via.placeholder.com/45x45.png'; + $phone = $this->user->phone; + return << + {$nickname} + {$phone} + HTML; + }); $grid->column('total_amount')->display(function ($value) { return bcdiv($value, 100, 2); })->prepend('¥'); @@ -183,7 +192,12 @@ class OrderController extends AdminController $grid->filter(function (Grid\Filter $filter) { $filter->panel(); $filter->like('sn')->width(3); - $filter->like('user.phone')->width(3); + $filter->where('user_id', function ($q) { + $q->where(function ($q) { + $q->whereHas('user', fn($q) => $q->where('phone', 'like', '%'.$this->input.'%')) + ->orWhereHas('userInfo', fn($q) => $q->where('nickname', 'like', '%'.$this->input.'%')); + }); + })->width(3)->placeholder('昵称/手机号'); $filter->where('tags', function ($query) { $query->whereHas('tags', function ($q) { $q->whereIn('tags.id', $this->input); diff --git a/app/Admin/Controllers/Store/OrderController.php b/app/Admin/Controllers/Store/OrderController.php index 862f2d0b..1f61834a 100644 --- a/app/Admin/Controllers/Store/OrderController.php +++ b/app/Admin/Controllers/Store/OrderController.php @@ -32,7 +32,7 @@ class OrderController extends AdminController protected function grid() { - $grid = new Grid(Order::with(['user', 'inviter', 'store'])); + $grid = new Grid(Order::with(['user', 'userInfo', 'inviter', 'inviterInfo', 'store'])); $user = Admin::user(); $canAdmin = $this->canAdmin(); @@ -45,8 +45,26 @@ class OrderController extends AdminController $grid->column('store.title', '门店'); $grid->column('sn')->copyable(); - $grid->column('user.phone')->copyable(); - $grid->column('inviter.phone')->copyable(); + $grid->column('user_id')->display(function () { + $nickname = $this->userInfo->nickname ?? '---'; + $avatar = $this->userInfo->avatar ?? 'https://via.placeholder.com/45x45.png'; + $phone = $this->user->phone; + return << + {$nickname} + {$phone} + HTML; + }); + $grid->column('inviter_id')->display(function () { + $nickname = $this->inviterInfo->nickname ?? '---'; + $avatar = $this->inviterInfo->avatar ?? 'https://via.placeholder.com/45x45.png'; + $phone = $this->inviter->phone; + return << + {$nickname} + {$phone} + HTML; + }); $grid->column('total_amount')->display(function ($value) { return bcdiv($value, 100, 2); })->prepend('¥'); @@ -70,8 +88,18 @@ class OrderController extends AdminController $filter->panel(); $filter->equal('store_id', '门店')->select('api/store')->width(3); $filter->like('sn')->width(3); - $filter->like('user.phone')->width(3); - $filter->like('inviter.phone')->width(3); + $filter->where('user_id', function ($q) { + $q->where(function ($q) { + $q->whereHas('user', fn($q) => $q->where('phone', 'like', '%'.$this->input.'%')) + ->orWhereHas('userInfo', fn($q) => $q->where('nickname', 'like', '%'.$this->input.'%')); + }); + })->width(3)->placeholder('昵称/手机号'); + $filter->where('inviter_id', function ($q) { + $q->where(function ($q) { + $q->whereHas('inviter', fn($q) => $q->where('phone', 'like', '%'.$this->input.'%')) + ->orWhereHas('inviterInfo', fn($q) => $q->where('nickname', 'like', '%'.$this->input.'%')); + }); + })->width(3)->placeholder('昵称/手机号'); $filter->equal('pay_way')->select([ PayWay::WxpayMiniProgram->value => PayWay::WxpayMiniProgram->text(), PayWay::Offline->value => PayWay::Offline->text(), @@ -107,14 +135,14 @@ class OrderController extends AdminController ])->width(3); $filter->between('created_at')->dateTime()->width(6); }); - + $grid->footer(function ($collection) use ($grid) { $query = Order::query(); $grid->model()->getQueries()->unique()->each(function ($value) use (&$query) { if (in_array($value['method'], ['paginate', 'get', 'orderBy', 'orderByDesc'], true)) { return; } - + $query = call_user_func_array([$query, $value['method']], $value['arguments'] ?? []); }); $count = $query->count(); @@ -170,7 +198,7 @@ class OrderController extends AdminController $tools->disableEdit(); $tools->disableDelete(); }); - + $row = new Row(); $row->column(5, $show); $tab = Tab::make()->withCard(); diff --git a/app/Admin/Controllers/Store/ProductController.php b/app/Admin/Controllers/Store/ProductController.php index 67fff77f..c9dc36f0 100644 --- a/app/Admin/Controllers/Store/ProductController.php +++ b/app/Admin/Controllers/Store/ProductController.php @@ -35,7 +35,7 @@ class ProductController extends AdminController protected function grid() { - $grid = new Grid(StoreProductSku::with(['store', 'productSku'])); + $grid = new Grid(StoreProductSku::with(['store', 'productSku.category'])); $user = Admin::user(); $canAdmin = $this->canAdmin(); if (!$canAdmin) { @@ -46,6 +46,7 @@ class ProductController extends AdminController $grid->column('productSku.id', 'ID'); $grid->column('store.title', '店铺'); + $grid->column('productSku.category.name', '分类'); $grid->column('productSku.name', '名称'); $grid->column('productSku.specs', '规格')->label(); $grid->column('productSku.cost_price', '成本价')->display(function ($value) { @@ -66,8 +67,40 @@ class ProductController extends AdminController $grid->filter(function (Grid\Filter $filter) { $filter->panel(); $filter->equal('store_id')->select('api/store')->width(3); + $filter->equal('productSku.category_id', '分类')->select(admin_route('api.product_categories', ['level' => 2]))->width(3); $filter->like('productSku.name', '名称')->width(3); }); + $grid->footer(function ($collection) use ($grid) { + $query = StoreProductSku::join('product_skus', 'product_skus.id', '=', 'store_product_skus.product_sku_id'); + $grid->model()->getQueries()->unique()->each(function ($value) use (&$query) { + if (in_array($value['method'], ['paginate', 'get', 'orderBy', 'orderByDesc'], true)) { + return; + } + + $query = call_user_func_array([$query, $value['method']], $value['arguments'] ?? []); + }); + $count = $query->count(); + $market_price = 0; + $cost_price = 0; + $market_price = number_format($query->sum('product_skus.market_price') / 100); + $cost_price = number_format($query->sum('product_skus.cost_price') / 100); + $stock = number_format($query->sum('store_product_skus.amount')); + return << + + + 统计 + 总数: $count + + + 成本价: $cost_price + 销售价: $market_price + 库存: $stock + + + + HTML; + }); return $grid; } diff --git a/app/Console/Commands/OrderDistribute.php b/app/Console/Commands/OrderGrowthValue.php similarity index 86% rename from app/Console/Commands/OrderDistribute.php rename to app/Console/Commands/OrderGrowthValue.php index 86c484a1..5b08a9a6 100644 --- a/app/Console/Commands/OrderDistribute.php +++ b/app/Console/Commands/OrderGrowthValue.php @@ -7,21 +7,21 @@ use App\Models\Order; use Illuminate\Support\Facades\DB; use Throwable; -class OrderDistribute extends Command +class OrderGrowthValue extends Command { /** * The name and signature of the console command. * * @var string */ - protected $signature = 'order:distribute {order?}'; + protected $signature = 'order:growth-value {order?}'; /** * The console command description. * * @var string */ - protected $description = '生成订单提成记录'; + protected $description = '发放订单成长值'; /** * Create a new command instance. @@ -52,7 +52,7 @@ class OrderDistribute extends Command $this->line('总数: ' . $orders->count()); $count = 0; foreach($orders as $order) { - $profit = $service->storeByOrder($order); + $profit = $service->incrementGrowthValue($order); if ($profit) { $count++; } diff --git a/app/Listeners/OrderDistribute.php b/app/Listeners/OrderDistribute.php new file mode 100644 index 00000000..8bd3bac1 --- /dev/null +++ b/app/Listeners/OrderDistribute.php @@ -0,0 +1,42 @@ +order->id); + try { + DB::beginTransaction(); + $service = new DistributeService(); + $service->storeByOrder($order); + DB::commit(); + } catch (Exception $e) { + DB::rollBack(); + } + } +} diff --git a/app/Models/Order.php b/app/Models/Order.php index d663e4ba..24964dd1 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -136,11 +136,6 @@ class Order extends Model return $this->belongsTo(User::class, 'user_id'); } - public function inviter() - { - return $this->belongsTo(User::class, 'inviter_id'); - } - /** * 下单人信息 */ @@ -149,6 +144,17 @@ class Order extends Model return $this->belongsTo(UserInfo::class, 'user_id', 'user_id'); } + + public function inviter() + { + return $this->belongsTo(User::class, 'inviter_id'); + } + + public function inviterInfo() + { + return $this->belongsTo(UserInfo::class, 'inviter_id', 'user_id'); + } + /** * 门店 */ diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 7426bdb0..44a34128 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -20,6 +20,7 @@ class EventServiceProvider extends ServiceProvider \App\Listeners\OrderPaidNotify::class, \App\Listeners\SendCoupons::class, \App\Listeners\OrderPackage::class, + \App\Listeners\OrderDistribute::class ], ]; diff --git a/app/Services/DistributeService.php b/app/Services/DistributeService.php index 007a5073..d5525c04 100644 --- a/app/Services/DistributeService.php +++ b/app/Services/DistributeService.php @@ -13,13 +13,13 @@ use App\Exceptions\BizException; class DistributeService { /** - * 根据订单, 更新成长值, 添加返现记录 + * 根据订单, 更新成长值 * * @param \App\Models\Order $order * - * @return \App\Models\OrderProfit + * @return boolean */ - public function storeByOrder(Order $order) + public function incrementGrowthValue(Order $order) { if (!$this->canDistribute($order)) { return false; @@ -28,7 +28,7 @@ class DistributeService $sales_value = $order->sales_value; $user = $order->user; $user_agent = $user->agent; - // 已经添加过返现记录 + // 已经处理过订单成长值 if ($user->salesValueLogs()->where('order_id', $order->id)->exists()) { return false; } @@ -60,6 +60,22 @@ class DistributeService } } + return true; + } + + /** + * 根据订单, 添加返现记录 + * + * @param \App\Models\Order $order + * + * @return \App\Models\OrderProfit + */ + public function storeByOrder(Order $order) + { + $sales_value = $order->sales_value; + $user = $order->user; + $user_agent = $user->agent; + // 上级返利 $parent_ids = array_reverse($user->userInfo->parent_ids); $parents = User::with(['userInfo', 'agent'])->whereIn('id', $parent_ids)->get(); diff --git a/resources/lang/zh_CN/store-order.php b/resources/lang/zh_CN/store-order.php index 9530973e..c65271ab 100644 --- a/resources/lang/zh_CN/store-order.php +++ b/resources/lang/zh_CN/store-order.php @@ -11,6 +11,7 @@ return [ 'user'=>[ 'phone' => '用户', ], + 'inviter_id' => '员工', 'inviter'=>[ 'phone' => '员工', ],