From 0fe2f5779aa86d0f623a81381a0db0cfed357ab2 Mon Sep 17 00:00:00 2001 From: vine_liutk <961510893@qq.com> Date: Sat, 15 Jan 2022 14:50:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=95=86=E5=93=81=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E5=8F=98=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Filters/DealerUserProductLogFilter.php | 13 +++ .../Dealer/UserProductController.php | 86 +++++++++++++++++++ .../Dealer/UserProductLogResource.php | 25 ++++++ .../Resources/Dealer/UserProductResource.php | 25 ++++++ app/Endpoint/Api/routes.php | 6 ++ app/Models/DealerOrder.php | 4 +- app/Models/DealerUserProduct.php | 11 +++ app/Models/DealerUserProductLog.php | 21 +++++ app/Models/User.php | 18 ++++ app/Services/Dealer/OrderService.php | 54 +++++++++++- ...mark_to_dealer_user_product_logs_table.php | 34 ++++++++ 11 files changed, 293 insertions(+), 4 deletions(-) create mode 100644 app/Endpoint/Api/Filters/DealerUserProductLogFilter.php create mode 100644 app/Endpoint/Api/Http/Controllers/Dealer/UserProductController.php create mode 100644 app/Endpoint/Api/Http/Resources/Dealer/UserProductLogResource.php create mode 100644 app/Endpoint/Api/Http/Resources/Dealer/UserProductResource.php create mode 100644 database/migrations/2022_01_15_141159_add_remark_to_dealer_user_product_logs_table.php diff --git a/app/Endpoint/Api/Filters/DealerUserProductLogFilter.php b/app/Endpoint/Api/Filters/DealerUserProductLogFilter.php new file mode 100644 index 00000000..c9b324ea --- /dev/null +++ b/app/Endpoint/Api/Filters/DealerUserProductLogFilter.php @@ -0,0 +1,13 @@ +where('product_id', $productId); + } +} diff --git a/app/Endpoint/Api/Http/Controllers/Dealer/UserProductController.php b/app/Endpoint/Api/Http/Controllers/Dealer/UserProductController.php new file mode 100644 index 00000000..38665a82 --- /dev/null +++ b/app/Endpoint/Api/Http/Controllers/Dealer/UserProductController.php @@ -0,0 +1,86 @@ +user()->dealerProducts() + ->with('product') + ->orderBy('product_id', 'asc') + ->simplePaginate(Paginator::resolvePerPage('per_page', 20, 50)); + return UserProductResource::collection($list); + } + + public function show($id, Request $request) + { + $product = $request->user()->dealerProducts() + ->with('product') + ->where('product_id', $id) + ->first(); + return UserProductResource::make($product); + } + + public function logs(Request $request) + { + $list = $request->user()->dealerProductLogs()->filter($request->all()) + ->with('product') + ->orderBy('created_at', 'desc') + ->simplePaginate(Paginator::resolvePerPage('per_page', 20, 50)); + return UserProductLogResource::collection($list); + } + + /** + * 线下去库存 + * + * @param Request $request + * @return void + */ + public function offlineOutQty(Request $request) + { + $input = $request->validate([ + 'product_id'=>['bail', 'required', 'int', 'min:0'], + 'num'=>['bail', 'required', 'int', 'min:1'], + 'remark'=> ['bail', 'string', 'max:200'], + ], [], [ + 'product_id' => '商品', + 'num' => '数量', + 'remark'=>'备注', + ]); + $product = $request->user()->dealerProducts() + ->where('product_id', $input['product_id']) + ->first(); + if (!$product) { + throw new BizException('您还没有该商品'); + } + try { + DB::beginTransaction(); + $product->decrement('stock', $input['num']); + + DealerUserProductLog::create([ + 'user_id'=> $request->user()->id, + 'product_id'=> $input['product_id'], + 'type' => DealerUserProductLog::TYPE_OFFLINE_OUT, + 'qty'=>$input['num'], + 'remark'=>$input['remark']??null, + ]); + DB::commit(); + } catch (Throwable $th) { + DB::rollBack(); + report($th); + throw new BizException('系统繁忙,请稍后再试'); + } + return response()->noContent(); + } +} diff --git a/app/Endpoint/Api/Http/Resources/Dealer/UserProductLogResource.php b/app/Endpoint/Api/Http/Resources/Dealer/UserProductLogResource.php new file mode 100644 index 00000000..852b3bbb --- /dev/null +++ b/app/Endpoint/Api/Http/Resources/Dealer/UserProductLogResource.php @@ -0,0 +1,25 @@ + $this->product?->name, + 'remark' => $this->remark, + 'qty' => ($this->type == DealerUserProductLog::TYPE_ORDER_IN ? '+' : '-').$this->qty.$this->product?->unit, + 'created_at' => $this->created_at->toDateTimeString(), + ]; + } +} diff --git a/app/Endpoint/Api/Http/Resources/Dealer/UserProductResource.php b/app/Endpoint/Api/Http/Resources/Dealer/UserProductResource.php new file mode 100644 index 00000000..f0a4e8f6 --- /dev/null +++ b/app/Endpoint/Api/Http/Resources/Dealer/UserProductResource.php @@ -0,0 +1,25 @@ + $this->product_id, + 'name' => $this->product?->name, + 'cover' => (string) $this->product?->cover, + 'price' => (string) $this->product?->price, + 'stock' => (int) $this->stock, + ]; + } +} diff --git a/app/Endpoint/Api/routes.php b/app/Endpoint/Api/routes.php index 0d3753a4..a6db6674 100644 --- a/app/Endpoint/Api/routes.php +++ b/app/Endpoint/Api/routes.php @@ -218,6 +218,12 @@ Route::group([ ], function () { //个人信息 Route::get('me', [Dealer\UserController::class, 'show']); + //我的库存 + Route::get('user-products', [Dealer\UserProductController::class, 'index']); + Route::get('user-products/{product}', [Dealer\UserProductController::class, 'show']); + Route::get('user-products-logs', [Dealer\UserProductController::class, 'logs']); + Route::post('user-products/offline-out', [Dealer\UserProductController::class, 'offlineOutQty']); + //商品列表 Route::get('products', [Dealer\ProductController::class, 'index']); //商品详情 diff --git a/app/Models/DealerOrder.php b/app/Models/DealerOrder.php index 6c9638a7..21d6e7c9 100644 --- a/app/Models/DealerOrder.php +++ b/app/Models/DealerOrder.php @@ -71,7 +71,9 @@ class DealerOrder extends Model */ public function scopeOnlyPaid($query) { - return $query->where('status', DealerOrderStatus::Confirming); + return $query->whereBetween('status', [ + DealerOrderStatus::Confirming, DealerOrderStatus::Shipped, + ]); } /** diff --git a/app/Models/DealerUserProduct.php b/app/Models/DealerUserProduct.php index 00076f43..8dc1f283 100644 --- a/app/Models/DealerUserProduct.php +++ b/app/Models/DealerUserProduct.php @@ -8,4 +8,15 @@ use Illuminate\Database\Eloquent\Model; class DealerUserProduct extends Model { use HasFactory; + + protected $fillable = [ + 'user_id', + 'product_id', + 'stock', + ]; + + public function product() + { + return $this->belongsTo(DealerProduct::class, 'product_id'); + } } diff --git a/app/Models/DealerUserProductLog.php b/app/Models/DealerUserProductLog.php index 562d8b8a..8aed53cc 100644 --- a/app/Models/DealerUserProductLog.php +++ b/app/Models/DealerUserProductLog.php @@ -2,10 +2,31 @@ namespace App\Models; +use Dcat\Admin\Traits\HasDateTimeFormatter; +use EloquentFilter\Filterable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class DealerUserProductLog extends Model { use HasFactory; + use Filterable; + use HasDateTimeFormatter; + + public const TYPE_ORDER_IN = 1; //采购加库存 + public const TYPE_ORDER_OUT = 2; //发货扣库存 + public const TYPE_OFFLINE_OUT = 3;//线下去库存 + + protected $fillable = [ + 'user_id', + 'product_id', + 'type', + 'qty', + 'remark', + ]; + + public function product() + { + return $this->belongsTo(DealerProduct::class, 'product_id'); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 516ed9d0..1a645136 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -170,6 +170,24 @@ class User extends Model implements AuthorizableContract, AuthenticatableContrac return $this->hasMany(DealerOrder::class, 'consignor_id'); } + /** + * 经销商商品库存 + * + */ + public function dealerProducts() + { + return $this->hasMany(DealerUserProduct::class, 'user_id'); + } + + /** + * 经销商商品库存 + * + */ + public function dealerProductLogs() + { + return $this->hasMany(DealerUserProductLog::class, 'user_id'); + } + /** * 确认此用户是否是 VIP * diff --git a/app/Services/Dealer/OrderService.php b/app/Services/Dealer/OrderService.php index ddfc768a..cae65640 100644 --- a/app/Services/Dealer/OrderService.php +++ b/app/Services/Dealer/OrderService.php @@ -7,6 +7,7 @@ use App\Enums\DealerOrderStatus; use App\Exceptions\BizException; use App\Models\DealerOrder; use App\Models\DealerProduct; +use App\Models\DealerUserProductLog; use App\Models\ShippingAddress; use App\Models\User; use App\Models\UserInfo; @@ -175,11 +176,11 @@ class OrderService if (!$order->isPaid()) { throw new BizException('订单状态异常,请刷新后再试'); } - //todo-扣减发货人库存 + //扣减发货人库存 if ($order->consignor) { + $this->orderOutQty($order); } - $order->update([ 'status' => DealerOrderStatus::Shipped, 'shipping_time' => now(), @@ -191,7 +192,8 @@ class OrderService if (!$order->isShipping()) { throw new BizException('订单状态异常,请刷新后再试'); } - //todo-增加自己的库存 + //增加自己的库存 + $this->orderInQty($order); $order->update([ 'status' => DealerOrderStatus::Completed, @@ -240,6 +242,52 @@ class OrderService return $user->shippingAddresses()->where('is_default', true)->first(); } + /** + * 用户通过下单新增库存 + * + * @return void + */ + protected function orderInQty(DealerOrder $order) + { + foreach ($order->products as $product) { + $userProduct = $order->user->dealerProducts()->firstOrCreate([ + 'product_id'=> $product->product_id, + ]); + $userProduct->increment('stock', $product->qty); + + DealerUserProductLog::create([ + 'user_id'=> $order->user_id, + 'product_id'=> $product->product_id, + 'type' => DealerUserProductLog::TYPE_ORDER_IN, + 'qty'=>$product->qty, + 'remark'=>'订单:'.$order->sn, + ]); + } + } + + /** + * 用户通过订单扣减库存 + * + * @return void + */ + protected function orderOutQty(DealerOrder $order) + { + foreach ($order->products as $product) { + $userProduct = $order->consignor->dealerProducts()->firstOrCreate([ + 'product_id'=> $product->product_id, + ]); + $userProduct->decrement('stock', $product->qty); + + DealerUserProductLog::create([ + 'user_id'=> $order->consignor_id, + 'product_id'=> $product->product_id, + 'type' => DealerUserProductLog::TYPE_ORDER_OUT, + 'qty'=>$product->qty, + 'remark' =>'订单:'.$order->sn, + ]); + } + } + public function getConsignor(User $user, $totalAmount, ?User $lastConsignor = null) { //todo-改成配置 diff --git a/database/migrations/2022_01_15_141159_add_remark_to_dealer_user_product_logs_table.php b/database/migrations/2022_01_15_141159_add_remark_to_dealer_user_product_logs_table.php new file mode 100644 index 00000000..682d3972 --- /dev/null +++ b/database/migrations/2022_01_15_141159_add_remark_to_dealer_user_product_logs_table.php @@ -0,0 +1,34 @@ +string('remark')->nullable()->comment('备注'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('dealer_user_product_logs', function (Blueprint $table) { + // + $table->dropColumn('remark'); + }); + } +}