diff --git a/app/Console/Commands/Dealer/OrderProcessCommand.php b/app/Console/Commands/Dealer/OrderProcessCommand.php new file mode 100644 index 00000000..25aba9d0 --- /dev/null +++ b/app/Console/Commands/Dealer/OrderProcessCommand.php @@ -0,0 +1,125 @@ +load(['userInfo.dealer', 'products']); + + foreach ($orders as $order) { + try { + DB::beginTransaction(); + + $this->processOrder($order); + + DB::commit(); + } catch (Throwable $e) { + DB::rollBack(); + + report($e); + } + } + }); + + return 0; + } + + /** + * 处理经销商订单 + * + * @param \App\Models\DealerOrder $order + * @return void + */ + protected function processOrder(DealerOrder $order) + { + $tz = now(); + + $dealers = $this->getDealers($userInfo = $order->userInfo); + + // 如果当前用户的上级有管理者,则需要增加管理者的商品销售业绩 + if ($manager = $this->firstManager([$userInfo->dealer, ...$dealers])) { + DealerManagerSalesLog::insert( + $order->products->map(function ($product) use ($manager, $tz) { + return [ + 'user_id' => $manager->user_id, + 'order_id' => $product->order_id, + 'product_id' => $product->product_id, + 'lvl' => $manager->lvl, + 'sales_volume' => $product->qty, + 'created_at' => $tz, + 'updated_at' => $tz, + ]; + })->all() + ); + } + } + + /** + * 从给定的经销商中获取第一个管理者 + * + * @param array $dealers + * @return \App\Models\Dealer|null + */ + protected function firstManager(array $dealers): ?Dealer + { + foreach ($dealers as $dealer) { + if ($dealer->is_manager) { + return $dealer; + } + } + } + + /** + * 获取给定用户的上级经销商 + * + * @param \App\Models\UserInfo $userInfo + * @return array + */ + protected function getDealers(UserInfo $userInfo) + { + $ancestors = []; + + if (empty($pids = $userInfo->parent_ids)) { + return $ancestors; + } + + $ancestors = UserInfo::with(['dealer']) + ->whereIn('user_id', $pids) + ->latest('depth') + ->get(['user_id', 'depth']); + + return $ancestors->map(function ($item) { + return $item->dealer; + })->all(); + } +} diff --git a/app/Enums/DealerLvl.php b/app/Enums/DealerLvl.php new file mode 100644 index 00000000..19e3f652 --- /dev/null +++ b/app/Enums/DealerLvl.php @@ -0,0 +1,27 @@ + '普通用户', + static::Gold => '金牌经销商', + static::Special => '特邀经销商', + static::Contracted => '签约经销商', + static::Secondary => '二级经销商', + static::Top => '一级经销商', + }; + } +} diff --git a/app/Models/Dealer.php b/app/Models/Dealer.php new file mode 100644 index 00000000..df9cbadd --- /dev/null +++ b/app/Models/Dealer.php @@ -0,0 +1,28 @@ + DealerLvl::None, + 'is_sale' => false, + 'is_manager' => false, + ]; + + protected $casts = [ + 'lvl' => DealerLvl::class, + 'is_sale' => 'bool', + 'is_manager' => 'bool', + ]; + + protected $fillable = [ + 'user_id', + 'lvl', + 'is_sale', + 'is_manager', + ]; +} diff --git a/app/Models/DealerManagerSalesLog.php b/app/Models/DealerManagerSalesLog.php new file mode 100644 index 00000000..5b10d68c --- /dev/null +++ b/app/Models/DealerManagerSalesLog.php @@ -0,0 +1,26 @@ + DealerLvl::class, + 'order_completed_at' => 'datetime', + ]; + + protected $fillable = [ + 'user_id', + 'order_id', + 'product_id', + 'lvl', + 'sales_volume', + 'order_completed_at', + ]; +} diff --git a/app/Models/DealerOrder.php b/app/Models/DealerOrder.php index 76395a15..a3d2fd51 100644 --- a/app/Models/DealerOrder.php +++ b/app/Models/DealerOrder.php @@ -17,4 +17,20 @@ class DealerOrder extends Model 'status' => DealerOrderStatus::class, 'settle_state' => DealerOrderSettleState::class, ]; + + /** + * 此订单所属的用户的信息 + */ + public function userInfo() + { + return $this->belongsTo(UserInfo::class, 'user_id'); + } + + /** + * 属于此订单的商品 + */ + public function products() + { + return $this->hasMany(DealerOrderProduct::class, 'order_id'); + } } diff --git a/app/Models/UserInfo.php b/app/Models/UserInfo.php index 7b4ab73f..2ddc988d 100644 --- a/app/Models/UserInfo.php +++ b/app/Models/UserInfo.php @@ -175,6 +175,14 @@ class UserInfo extends Model return $this->hasMany(AgentUpgradeLog::class, 'user_id', 'user_id'); } + /** + * 属于此用户的经销商信息 + */ + public function dealer() + { + return $this->hasOne(Dealer::class, 'user_id', 'user_id'); + } + /** * 获取此用户的直推店铺总数 */ diff --git a/database/migrations/2022_01_12_151731_create_dealers_table.php b/database/migrations/2022_01_12_151731_create_dealers_table.php new file mode 100644 index 00000000..a4c66959 --- /dev/null +++ b/database/migrations/2022_01_12_151731_create_dealers_table.php @@ -0,0 +1,35 @@ +id(); + $table->unsignedBigInteger('user_id')->unique()->comment('用户ID'); + $table->tinyInteger('lvl')->default(0)->comment('经销商等级'); + $table->boolean('is_sale')->default(false)->comment('是否可销售'); + $table->boolean('is_manager')->default(false)->comment('是否是管理者'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('dealers'); + } +} diff --git a/database/migrations/2022_01_12_173559_create_dealer_manager_sales_logs_table.php b/database/migrations/2022_01_12_173559_create_dealer_manager_sales_logs_table.php new file mode 100644 index 00000000..4f4a25c7 --- /dev/null +++ b/database/migrations/2022_01_12_173559_create_dealer_manager_sales_logs_table.php @@ -0,0 +1,40 @@ +id(); + $table->unsignedBigInteger('user_id')->comment('经销商的用户ID'); + $table->unsignedBigInteger('order_id')->comment('订单ID'); + $table->unsignedBigInteger('product_id')->comment('商品ID'); + $table->tinyInteger('lvl')->comment('经销商等级'); + $table->unsignedBigInteger('sales_volume')->default(0)->comment('商品销量'); + $table->timestamp('order_completed_at')->nullable()->comment('订单完成时间'); + $table->timestamps(); + + $table->index('user_id'); + $table->index('order_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('dealer_manager_sales_logs'); + } +}