panghu před 8 měsíci
rodič
revize
77499296b8

+ 2 - 2
app/Http/Controllers/Api/GoodsController.php

@@ -58,7 +58,7 @@ class GoodsController extends ApiController
                 ->where('status',1)
                 ->where('shop_id',$shop_id)
                 ->where('category_id',$value['type'])
-                ->select(['id as goods_id','category_id','goods_name','goods_desc','goods_image','price','spec_type','line_price','sales','is_infinite','stock'])
+                ->select(['id as goods_id','category_id','goods_name','goods_desc','goods_image','price','spec_type','line_price','sales'])
                 ->orderBy('sort','desc')
                 ->get();
             foreach ($list as $goods){
@@ -111,7 +111,7 @@ class GoodsController extends ApiController
             ->where('status',1)
             ->where('shop_id',$shop_id)
             ->where('goods_name','like',"%$search%")
-            ->select(['id as goods_id','category_id','goods_name','goods_desc','goods_image','price','spec_type','line_price','sales','is_infinite','stock'])
+            ->select(['id as goods_id','category_id','goods_name','goods_desc','goods_image','price','spec_type','line_price','sales'])
             ->orderBy('sort','desc')
             ->paginate(10);
         return $this->apiResponseSuccess('获取成功', [

+ 43 - 0
app/Models/ShoppingDetail.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Models;
+
+use DateTimeInterface;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 购物车详情表
+ */
+class ShoppingDetail extends Model
+{
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected $table = 'shopping_details';
+
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected $primaryKey = 'id';
+
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public $timestamps = true;
+
+
+    /**
+     * 不能被批量赋值的属性
+     *
+     * @var array
+     */
+    protected $guarded = ['id', 'updated_at', 'created_at'];
+
+
+}

+ 106 - 82
app/Servers/ShoppingCartServer.php

@@ -10,6 +10,8 @@ use App\Models\Goods;
 use App\Models\GoodsSku;
 use App\Models\GoodsSpec;
 use App\Models\Shopping;
+use App\Models\ShoppingDetail;
+use Illuminate\Support\Facades\DB;
 
 /**
  * 购物车服务
@@ -51,7 +53,7 @@ class ShoppingCartServer
         $shopping =  Shopping::from('shopping as p')
             ->leftJoin('goods as g','g.id','=','p.goods_id')
             ->where($where)
-            ->select(['p.id as shopping_id','p.number','p.goods_spec_id','g.id as goods_id','g.shop_id','g.goods_name','g.goods_image','g.price','g.spec_type','g.category_id','g.pack_price','g.is_infinite','g.stock'])
+            ->select(['p.id as shopping_id','p.number','g.id as goods_id','g.shop_id','g.goods_name','g.goods_image','g.price','g.spec_type','g.category_id','g.pack_price'])
             ->orderBy('p.id','asc')
             ->get();
 
@@ -59,52 +61,42 @@ class ShoppingCartServer
         $total_goods_money = '0.00';//总商品费用
         $total_pack_price = 0;//打包费
         $goods_list = [];//商品列表
-        $goodsNumber = [];//记录商品一共点了多少,判断是否限购超库存
 
         foreach ($shopping as $value){
             $goods_id = $value->{'goods_id'};//商品id
             $goods_price = $value->{'price'};//商品金额
+            $goods_spec_price = 0;//商品规格金额
             $spec_type = $value->{'spec_type'};//商品类型
-            $goods_spec_id = $value->{'goods_spec_id'};//商品规格id
             $status_str = '';
             $goods_attr = "";//规则值
             $goods_number = $value['number'];//商品数量
-            $goods_spec = [];
-            //记录商品一共点了多少,判断是否限购超库存
-            if (isset($goodsNumber[$goods_id])){
-                $goodsNumber[$goods_id] = bcadd($goodsNumber[$goods_id],$goods_number);
-            }else{
-                $goodsNumber[$goods_id] = $goods_number;
-            }
-
-            if ($goods_spec_id && $spec_type == 2){//存在规格
-                $specIds = array_filter(explode('_', $goods_spec_id));
-                $goods_spec = GoodsSpec::where('goods_id',$goods_id)
-                    ->whereIn('id',$specIds)
-                    ->where('is_del',0)
-                    ->select(['spec_name','spec_price'])
+            $goods_spec_list = [];//商品所选规格信息
+
+            if ($spec_type == 2){//存在规格
+                $details = ShoppingDetail::from('shopping_details as d')
+                    ->leftJoin('goods_spec as s','s.id','=','d.goods_spec_id')
+                    ->where('d.shopping_id',$value->{'shopping_id'})
+                    ->where('d.goods_id',$value->{'goods_id'})
+                    ->where('s.is_del',0)
+                    ->select(['d.*','s.spec_name','s.spec_price'])
                     ->get();
-                foreach ($goods_spec as $spec_value){
-                    $goods_attr .= $spec_value['spec_name'] . ',';
-                    $goods_price = bcadd($spec_value['spec_price'],$goods_price,2);
-                }
-            }
-            //商品不是无限库存,判断库存是否足够
-            if ($value->{'is_infinite'} != 1){
-                if ($value->{'stock'} < $goodsNumber[$goods_id]){
-                    $status_str = '库存不足';
-                    $this->errorMsg = $value['goods_name'].'库存不足';
+                $spec_total_price = 0;//规则总价置为0
+                foreach ($details as $detail){
+
+                    $goods_attr .= $detail['spec_name'] . ',';
+                    $spec_total_price =  bcmul($detail['number'],$detail['spec_price'],2);//规格数量乘以价格等于 规格总价
                 }
+                $goods_spec_price = bcmul($goods_spec_price,$spec_total_price,2);
+                $goods_spec_list = $details;
             }
             //计算价格
-            $goods_money = bcmul($goods_price,$goods_number,2);
+            $goods_money = bcmul($goods_number,bcadd($goods_price,$goods_spec_price,2),2);//商品价格等于 商品数量X(商品底价+商品规格总价)
 
 
             $goods_list[] = [
                 'shop_id' => $value['shop_id'],
                 'category_id' => $value['category_id'],
                 'goods_id' => $goods_id,
-                'goods_spec_id' => $goods_spec_id,
                 'goods_money' => rtrim(rtrim($goods_money, '0'),'.'),
                 'goods_number' => $goods_number,
                 'goods_name' => $value['goods_name'],
@@ -113,8 +105,8 @@ class ShoppingCartServer
                 'price' => $goods_price,
                 'pack_price' => $value['pack_price'],
                 'goods_attr' => $goods_attr,
-                'is_infinite' => $value['is_infinite'],
                 'status_str' => $status_str,
+                'spec_list' => $goods_spec_list,
             ];
             //计算打包费
             $total_pack_price = bcadd($total_pack_price,bcmul($goods_number,$value['pack_price'],2),2);
@@ -165,63 +157,88 @@ class ShoppingCartServer
         //如果商品是多规格但是没选规格
         if ($goods->{'spec_type'} == 2 && empty($goods_spec_id)){
             return ['code' => 0, 'msg' => '请选择商品规格'];
-        }elseif ($goods->{'spec_type'} == 2 && $goods_spec_id){
-            //如果商品是多规格,查询规格商品是否选择全
-            $skuIds = GoodsSku::where('goods_id',$goods->{'goods_id'})->where('is_del',0)->pluck('id')->toArray();
-            $spec = array_filter(explode('_', $goods_spec_id));
-            foreach ($skuIds as $skuId){
-                $specIds = GoodsSpec::where('goods_id',$goods->{'goods_id'})->where('is_del',0)->where('sku_id',$skuId)->pluck('id')->toArray();
-
-                if (!array_intersect($spec,$specIds)){
-                    return ['code' => 0, 'msg' => '请完整选择规格'];
-                }
-            }
         }
-
-        //获取购物车是否存在此商品
-        $where = [['m_id',$m_id], ['shop_id',$shop_id], ['category_id',$category_id], ['goods_id',$goods_id]];
-        //获取此商品数量
-        $shopping_number = Shopping::where($where)->sum('number');
-        $total_number = bcadd($shopping_number,$number);
-        if ($goods_spec_id) $where[] = ['goods_spec_id',$goods_spec_id];
-        //查询
-        $shopping_info = Shopping::where($where)->select(['id', 'goods_id', 'number'])->first();
-
-        //商品不是无限库存,判断库存是否足够
-        if ($goods->{'is_infinite'} != 1){
-            if ($goods->{'stock'} < $total_number){
-                return ['code' => 0, 'msg' => '商品库存余'.$goods->{'stock'}.'份'];
-            }
+        //如果是单规格但是选择了规格
+        if ($goods->{'spec_type'} == 1 && !empty($goods_spec_id)){
+            return ['code' => 0, 'msg' => '该商品没有规格'];
         }
-        if (empty($shopping_info)) {
-            if ($number <= 0){
-                return ['code' => 0, 'msg' => '请选择数量'];
+        if (!empty($goods_spec_id)){
+            $sku_id = GoodsSpec::where('goods_id',$goods_id)->where('id',$goods_spec_id)->where('is_del',0)->value('sku_id');
+            if (empty($sku_id)){
+                return ['code' => 0, 'msg' => '商品规格错误'];
             }
-
-            //入库
-            $shopping = Shopping::create([
-                'm_id' => $m_id,
-                'type' => 1,
-                'shop_id' => $shop_id,
-                'category_id' => $category_id,
-                'goods_id' => $goods_id,
-                'goods_spec_id' => $goods_spec_id,
-                'number' => $number,
-            ]);
-
-        }else{
-            if ($number <= 0){//数量为0直接删除
-                $shopping = Shopping::where('id',$shopping_info->{'id'})->delete();
-            }else{
-                $shopping = Shopping::where('id',$shopping_info->{'id'})->update(['number' => $number]);
+            $skuInfo = GoodsSku::where('goods_id',$goods_id)->where('id',$sku_id)->where('is_del',0)->first();
+            if (empty($skuInfo)){
+                return ['code' => 0, 'msg' => '商品规格不存在'];
             }
         }
+        DB::beginTransaction();
+        try {
+            //获取购物车是否存在此商品
+            $where = [['m_id',$m_id], ['shop_id',$shop_id], ['category_id',$category_id], ['goods_id',$goods_id]];
+            //查询此商品购物车数量
+            $shopping_info = Shopping::where($where)->select(['id', 'goods_id', 'number'])->first();
+
+            if (empty($shopping_info)) {//没用购物车信息
+                if ($number <= 0){
+                    DB::rollBack();
+                    return ['code' => 0, 'msg' => '请选择数量'];
+                }
+                //入库
+                $shopping = Shopping::create([
+                    'm_id' => $m_id,
+                    'shop_id' => $shop_id,
+                    'category_id' => $category_id,
+                    'goods_id' => $goods_id,
+                    'number' => $number,
+                ]);
+                $shopping_id = $shopping->{'id'};
+                if (empty($shopping_id)) {
+                    DB::rollBack();
+                    return ['code' => 0, 'msg' => '添加失败'];
+                }
+                //如果有规则就入库规则信息
+                if (!empty($goods_spec_id)){
+                    if ($skuInfo->{'sku_type'} == 1){//商品只能单选
+                        $number = 1;//单选购物数量只能为1
+                    }elseif ($skuInfo->{'sku_type'} == 2 && $skuInfo->{'affect_quantity'} == 0){//可多选规格但是不能多添加购物车数量
+                        $number = 1;//数量只能为1
+                    }
+                    ShoppingDetail::create([
+                        'shopping_id' => $shopping_id,
+                        'goods_id' => $goods_id,
+                        'goods_spec_id' => $goods_spec_id,
+                        'number' => $number,
+                    ]);
+                }
+            }else{//有购物车信息,更新
+                if (!empty($goods_spec_id)){//选择了规则就是更新购物车详情表
+                    if ($number <= 0){//数量为0直接删除
+                        ShoppingDetail::where('shopping_id',$shopping_info->{'id'})->where('goods_id',$goods_id)->where('goods_spec_id',$goods_spec_id)->delete();//删除详情表
+                    }else{
+                        if ($skuInfo->{'sku_type'} == 2 && $skuInfo->{'affect_quantity'} == 1){//可多选规格并且能多添加购物车数量
+                            ShoppingDetail::where('shopping_id',$shopping_info->{'id'})->where('goods_id',$goods_id)->where('goods_spec_id',$goods_spec_id)->update(['number' => $number]);//跟新购物车
+                        }
+                    }
+                }else{//没选规则就是更新主表
+                    if ($number <= 0){//数量为0直接删除
+                        Shopping::where('id',$shopping_info->{'id'})->delete();//删除主表
+                        ShoppingDetail::where('shopping_id',$shopping_info->{'id'})->delete();//删除详情表
+                    }else{
+                        Shopping::where('id',$shopping_info->{'id'})->update(['number' => $number]);
+                    }
+                }
 
-        if (empty($shopping)){
+            }
+
+
+            DB::commit();
+            return ['code' => 1, 'msg' => '添加成功'];
+        }catch (\Exception $e){
+            DB::rollBack();
             return ['code' => 0, 'msg' => '添加失败'];
         }
 
-        return ['code' => 1, 'msg' => '添加成功'];
     }
 
 
@@ -234,15 +251,22 @@ class ShoppingCartServer
     function delShopping($m_id,$shop_id)
     {
         //删除数据
-        $where = [['m_id',$m_id], ['shop_id',$shop_id]];
+        DB::beginTransaction();
+        try {
+            $where = [['m_id',$m_id], ['shop_id',$shop_id]];
+
+            $shopping_info = Shopping::where($where)->select(['id', 'goods_id', 'number'])->first();
 
-        $res =  Shopping::where($where)->delete();
+            Shopping::where('id',$shopping_info->{'id'})->delete();//删除主表
+            ShoppingDetail::where('shopping_id',$shopping_info->{'id'})->delete();//删除详情表
 
-        if (empty($res)){
+            DB::commit();
+            return ['code' => 1, 'msg' => '删除成功'];
+        }catch (\Exception $e){
+            DB::rollBack();
             return ['code' => 0, 'msg' => '删除失败'];
         }
 
-        return ['code' => 1, 'msg' => '删除成功'];
     }
 
 }