kphcdr hace 1 año
padre
commit
3a66358eb8

+ 12 - 0
app/Models/Cart.php

@@ -28,6 +28,8 @@ use Illuminate\Support\Arr;
  * @mixin \Eloquent
  * @property-read mixed                      $thumb
  * @property-read mixed                      $goods_name
+ * @property-read mixed                      $sn
+ * @property-read mixed                      $sku_id
  */
 class Cart extends BaseModel
 {
@@ -43,6 +45,16 @@ class Cart extends BaseModel
         return Arr::get($this->extra, "thumb", "");
     }
 
+    public function getSnAttribute()
+    {
+        return Arr::get($this->extra, "sn", "");
+    }
+
+    public function getSkuIdAttribute()
+    {
+        return Arr::get($this->extra, "sku_id", "");
+    }
+
     public function getGoodsNameAttribute()
     {
         return Arr::get($this->extra, "goods_name", "");

+ 40 - 18
app/Modules/Mini/Controllers/CartController.php

@@ -3,40 +3,62 @@
 namespace App\Modules\Mini\Controllers;
 
 use App\Base\BaseController;
+use App\Models\Cart;
+use App\Modules\Mini\Services\CartService;
 use Faker\Provider\Image;
+use Illuminate\Support\Facades\Auth;
 
 class CartController extends BaseController
 {
+    protected CartService $service;
+
+    /**
+     * @param CartService $service
+     */
+    public function __construct(CartService $service)
+    {
+        $this->service = $service;
+    }
+
     public function index()
     {
-        return $this->ok([
-            "total" => 1,
-            "page_total" => 1,
-            "list" => [
-                [
-                    "id" => 1,
-                    "goods_id" => 1,
-                    "thumb" => Image::imageUrl(),
-                    "goods_name" => 1,
-                    "sn" => "型号-xxxx",
-                    "count" => 1,
-                ],
-            ],
+        $params = $this->valid([
+            "page_size" => "int",
         ]);
+        return $this->ok($this->service->paginate(Auth::user(), $params));
     }
 
     public function del()
     {
-        return $this->ok();
+        $params = $this->valid([
+            "ids" => "required|array",
+        ]);
+        $row = Cart::whereIn("id", $params['ids'])->where("user_id", Auth::id())->delete();
+        return $this->ok([
+            "row" => $row,
+        ]);
     }
 
     public function ask()
     {
+        $params = $this->valid([
+            "ids" => "required|array",
+        ]);
+
+        return $this->ok($this->service->ask(Auth::user(), $params));
+    }
+
+    public function store()
+    {
+        $params = $this->valid([
+            "id" => "required",
+            "count" => "required",
+        ]);
+
+        $cart = app(CartService::class)->update(Auth::user(), $params);
+
         return $this->ok([
-            "id" => 1,
-            "thumb" => Image::imageUrl(),
-            "name" => "商品名称",
-            "url" => "http://baidu.com/xxxx",
+            "id" => $cart->id,
         ]);
     }
 }

+ 15 - 0
app/Modules/Mini/Controllers/GoodsController.php

@@ -4,6 +4,7 @@ namespace App\Modules\Mini\Controllers;
 
 use App\Base\BaseController;
 use App\Models\Order\Order;
+use App\Modules\Mini\Services\CartService;
 use App\Modules\Mini\Services\FavService;
 use App\Modules\Mini\Services\GoodsService;
 use App\Modules\Mini\Services\OrderService;
@@ -74,4 +75,18 @@ class GoodsController extends BaseController
 
         return $this->ok(app(OrderService::class)->askOne(Auth::user(), $params));
     }
+
+    public function cart()
+    {
+        $params = $this->valid([
+            "id" => "required",
+            "sku_id" => "required",
+            "sku_custom" => "array",
+        ]);
+        $cart = app(CartService::class)->add(Auth::user(), $params);
+        return $this->ok([
+            "id" => $cart->id,
+        ]);
+
+    }
 }

+ 78 - 0
app/Modules/Mini/Services/CartService.php

@@ -0,0 +1,78 @@
+<?php
+
+namespace App\Modules\Mini\Services;
+
+use App\Base\BaseService;
+use App\Models\Cart;
+use App\Models\Goods\Goods;
+use App\Models\Goods\GoodsSku;
+use App\Models\Order\Order;
+use App\Models\User\User;
+use Illuminate\Support\Arr;
+use Illuminate\Support\Facades\Auth;
+
+class CartService extends BaseService
+{
+    public function paginate(User $user, $params)
+    {
+        $p = Cart::where("user_id", $user->id)->orderByDesc("id")->paginate($params['page_size']);
+
+        return [
+            "total" => $p->total(),
+            "page_total" => $p->lastPage(),
+            "list" => array_map(function (Cart $model) {
+                return [
+                    "id" => $model->id,
+                    "sn" => $model->sn,
+                    "name" => $model->goods_name,
+                    "thumb" => $model->thumb,
+                    "count" => $model->count,
+                ];
+            }, $p->items()),
+        ];
+    }
+
+    public function add(User $user, $params): Cart
+    {
+        $gid = $params['id'];
+        $goods = Goods::findOrFail($gid);
+        $sku = GoodsSku::findOrFail($params['sku_id']);
+        $cart = new Cart();
+        $cart->user_id = $user->id;
+        $cart->goods_id = $goods->id;
+        $cart->count = 1;
+        $sn = $sku->sn;
+        if ($skuCustom = Arr::get($params, "sku_custom")) {
+            $sn = $sn . "-" . implode("-", Arr::pluck($skuCustom, "spec_attr_custom"));
+        }
+        $cart->extra = [
+            "goods_name" => $goods->name,
+            "thumb" => $goods->thumb,
+            "sn" => $sn,
+            "sku_id" => $sku->id,
+        ];
+        $cart->save();
+
+        return $cart;
+    }
+
+    public function update(User $user, $params)
+    {
+        $cart = Cart::where("id", $params['id'])->where("user_id", $user->id)->firstOrFail();
+
+        if ($params['count']) {
+            $cart->count = $params['count'];
+            $cart->save();
+        } else {
+            $cart->delete();
+        }
+
+        return $cart;
+    }
+
+    public function ask(User $user, $params)
+    {
+        $params['source'] = Order::SOURCE_CART;
+        return app(OrderService::class)->askByCart($user, $params);
+    }
+}

+ 37 - 0
app/Modules/Mini/Services/OrderService.php

@@ -4,6 +4,7 @@ namespace App\Modules\Mini\Services;
 
 use App\Base\BaseService;
 use App\Events\OrderCreateEvent;
+use App\Models\Cart;
 use App\Models\Goods\Goods;
 use App\Models\Goods\GoodsSku;
 use App\Models\Order\Order;
@@ -53,4 +54,40 @@ class OrderService extends BaseService
         ];
     }
 
+    public function askByCart(User $user, $params)
+    {
+        /** @var Order $order */
+        $order = DB::transaction(function () use ($user, $params) {
+            $order = new Order();
+            $order->user_id = $user->id;
+            $order->source = $params['source'];
+            $order->save();
+            foreach ($params['ids'] as $cartId) {
+                $cart = Cart::where("user_id", $user->id)->where("id", $cartId)->first();
+                if (is_null($cart)) {
+                    continue;
+                }
+                $og = new OrderGoods();
+                $og->order_id = $order->id;
+                $og->goods_id = $cart->goods_id;
+                $og->sku_id = $cart->sku_id;
+                $og->count = $cart->count;
+                $og->sn = $cart->sn;
+                $og->save();
+            }
+
+            return $order;
+        });
+
+        OrderCreateEvent::dispatch($order);
+        $gid = $order->goods->first()->goods_id;
+        $goods = Goods::find($gid);
+        return [
+            "id" => $order->id,
+            "thumb" => $goods->thumb,
+            "name" => $goods->name,
+            "url" => "http://baidu.com/xxxx",
+        ];
+    }
+
 }

+ 6 - 5
routes/mini.php

@@ -14,6 +14,7 @@ Route::middleware([\App\Http\Middleware\MiniAuthMiddleware::class])->group(funct
 
     Route::post("/goods/fav", [\App\Modules\Mini\Controllers\GoodsController::class, "fav"]);
     Route::post("/goods/ask", [\App\Modules\Mini\Controllers\GoodsController::class, "ask"]);
+    Route::post("/goods/cart", [\App\Modules\Mini\Controllers\GoodsController::class, "cart"]);
 
     Route::get("/user/address", [\App\Modules\Mini\Controllers\UserController::class, "address"]);
     Route::post("/user/addressDel", [\App\Modules\Mini\Controllers\UserController::class, "addressDel"]);
@@ -22,6 +23,11 @@ Route::middleware([\App\Http\Middleware\MiniAuthMiddleware::class])->group(funct
     Route::post("/user/company", [\App\Modules\Mini\Controllers\UserController::class, "company"]);
     Route::get("/user/fav", [\App\Modules\Mini\Controllers\UserController::class, "fav"]);
     Route::post("/user/favDel", [\App\Modules\Mini\Controllers\UserController::class, "favDel"]);
+
+    Route::get("/cart", [\App\Modules\Mini\Controllers\CartController::class, "index"]);
+    Route::post("/cart/del", [\App\Modules\Mini\Controllers\CartController::class, "del"]);
+    Route::post("/cart/store", [\App\Modules\Mini\Controllers\CartController::class, "store"]);
+    Route::post("/cart/ask", [\App\Modules\Mini\Controllers\CartController::class, "ask"]);
 });
 
 Route::get("/page/home", [\App\Modules\Mini\Controllers\PageController::class, "home"]);
@@ -33,11 +39,6 @@ Route::get("/page/search", [\App\Modules\Mini\Controllers\PageController::class,
 Route::get("/goods", [\App\Modules\Mini\Controllers\GoodsController::class, "goods"]);
 
 
-Route::get("/cart", [\App\Modules\Mini\Controllers\CartController::class, "index"]);
-Route::post("/cart/del", [\App\Modules\Mini\Controllers\CartController::class, "del"]);
-Route::post("/cart/store", [\App\Modules\Mini\Controllers\CartController::class, "store"]);
-Route::post("/cart/ask", [\App\Modules\Mini\Controllers\CartController::class, "ask"]);
-
 Route::get("/config", function () {
     return [
         "code" => 200,