panghu 7 місяців тому
батько
коміт
c270badb5b

+ 3 - 3
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'])
+                ->select(['id as goods_id','category_id','goods_name','goods_desc','goods_image','price','pack_price','spec_type','line_price','sales'])
                 ->orderBy('sort','desc')
                 ->get();
             foreach ($list as $goods){
@@ -83,7 +83,7 @@ class GoodsController extends ApiController
         $goods = Goods::where('is_del',0)
             ->where('status',1)
             ->where('id',$goods_id)
-            ->select(['id as goods_id','category_id','goods_name','goods_desc','goods_image','price','spec_type','line_price','sales'])
+            ->select(['id as goods_id','category_id','goods_name','goods_desc','goods_image','price','pack_price','spec_type','line_price','sales'])
             ->first();
 
         if (empty($goods)){
@@ -122,7 +122,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'])
+            ->select(['id as goods_id','category_id','goods_name','goods_desc','goods_image','price','pack_price','spec_type','line_price','sales'])
             ->orderBy('sort','desc')
             ->paginate(10);
         return $this->apiResponseSuccess('获取成功', [

+ 54 - 0
app/Http/Controllers/Api/OrderController.php

@@ -100,6 +100,60 @@ class OrderController extends ApiController
         return $this->apiResponseSuccess('订单创建成功', $res['data']);
     }
 
+    /**
+     * 下单
+     */
+    function createV2Order()
+    {
+        $m_id = $this->getMemberId();//用户id
+        $commonServer = CommonServer::creatServer();
+        $shop_id = $commonServer->filtrationStr('shop_id');//商家id
+        $order_type = $commonServer->filtrationStr('order_type',1);//订单类型 1堂食订单 2打包订单
+        $table_number = $commonServer->filtrationStr('table_number');//桌号
+        $diner_number = $commonServer->filtrationStr('diner_number');//就餐人数
+        $note = $commonServer->filtrationStr('note');//备注
+        $shopping_cart = request()->input('shopping_cart',[]);//商品规格数组
+
+        if (empty($shop_id)) return $this->apiResponseError('商家错误');
+        if (!in_array($order_type,[1,2])){
+            return $this->apiResponseError('就餐方式错误');
+        }
+        if (empty($table_number) || $table_number < 0) return $this->apiResponseError('桌号错误');
+        if (empty($diner_number) || $diner_number < 0) return $this->apiResponseError('就餐人数错误');
+        if (empty($shopping_cart)) return $this->apiResponseError('请添加购物车');
+
+        if ($table_number > 1000) return $this->apiResponseError('桌号最大1000');
+        if ($diner_number > 1000) return $this->apiResponseError('就餐人数最大1000');
+        if (!empty($note) && mb_strlen($note) > 50 ) return $this->apiResponseError('备注最大50');
+
+        //获取商家信息
+        $shop = ShopServer::creatServer()->getShopInfo($shop_id);
+        if (empty($shop)) return $this->apiResponseError('该商家不存在');
+        if ($shop['status'] != 1) return $this->apiResponseError('商家闭店休息中');
+        //获取购买的商品信息
+        $cartResult = ShoppingCartServer::creatServer()->getCartList($shopping_cart);
+        if ($cartResult['code'] == 0) {
+            return $this->apiResponseError($cartResult['msg']);
+        }
+        $goods = $cartResult['data'];
+        //加锁
+        $lock_key = $shop_id.'lockOrderCreate';
+        $lock_value = uniqid(bin2hex(random_bytes(10)), true);
+        $lock = RedisDataServer::creatServer()->lockKey($lock_key,$lock_value,500);
+        if (!$lock){
+            return $this->apiResponseError('下单人数过多,请稍候');
+        }
+        //下单
+        $res = OrderServer::creatServer()->createOrder($m_id,$shop_id,$order_type,$table_number,$diner_number,$note,$goods);
+
+        //删除锁key-防止死锁
+        RedisDataServer::creatServer()->unLockKey($lock_key,$lock_value);
+        if ($res['code'] == 0) {
+            return $this->apiResponseError($res['msg']);
+        }
+
+        return $this->apiResponseSuccess('订单创建成功', $res['data']);
+    }
 
     /**
      * 支付订单

+ 3 - 4
app/Models/Order.php

@@ -92,10 +92,9 @@ class Order extends Model
 
     private $orderStatusEnum=[
         1=>'待支付',
-        2=>'制作中',
-        3=>'已完成',
-        4=>'已取消',
-        5=>'退款',
+        2=>'已完成',
+        3=>'已取消',
+        4=>'退款',
     ];
     private $refundStatusEnum=[
         1=>'等待商家同意',

+ 136 - 1
app/Servers/ShoppingCartServer.php

@@ -225,7 +225,51 @@ class ShoppingCartServer
                     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($goods_spec)){//多规格商品
+                        $is_create = false;
+                        foreach ($goods_spec as $spec){
+                            $shopping_spec_number = ShoppingDetail::where('shopping_id',$shopping_info->{'id'})
+                                ->where('goods_id',$goods_id)
+                                ->where('goods_spec_id',$spec['id'])
+                                ->value('number');
+                            if ($shopping_spec_number != $spec['number']){
+                                $is_create = true;
+                            }
+                        }
+                        if ($is_create){//规格数量不一样,创建新的
+                            //入库
+                            $shopping = Shopping::create([
+                                'm_id' => $m_id,
+                                'shop_id' => $shop_id,
+                                'category_id' => $category_id,
+                                'goods_id' => $goods_id,
+                                'goods_spec_id' => $goods_spec_id,
+                                'number' => $number,
+                            ]);
+                            $shopping_id = $shopping->{'id'};
+                            if (empty($shopping_id)) {
+                                DB::rollBack();
+                                return ['code' => 0, 'msg' => '操作失败'];
+                            }
+
+                            if (!empty($goods_spec_data)){//规则明细存入
+                                foreach ($goods_spec_data as $spec){
+                                    ShoppingDetail::create([
+                                        'shopping_id' => $shopping_id,
+                                        'goods_id' => $goods_id,
+                                        'goods_spec_id' => $spec['id'],
+                                        'number' => $spec['number'],
+                                    ]);
+                                }
+                            }
+                        }else{//规格数量一样,在原来基础上增加
+                            Shopping::where('id',$shopping_info->{'id'})->increment('number',$number);
+                        }
+
+                    }else{
+                        Shopping::where('id',$shopping_info->{'id'})->update(['number' => $number]);
+                    }
                 }
             }
 
@@ -393,4 +437,95 @@ class ShoppingCartServer
 
     }
 
+    /**
+     * 本地购物车数据组装获取
+     * @param $cartInfo
+     * @return array
+     */
+    function getCartList($cartInfo)
+    {
+        $total_num = 0;//总商品数
+        $total_goods_money = '0.00';//总商品费用
+        $total_pack_price = 0;//打包费
+        $goods_list = [];
+        foreach ($cartInfo['goods_list'] as $value){
+            $goods = Goods::where('id',$value['goods_id'])
+                ->select(['id as goods_id','shop_id','status','goods_name','goods_image','price','spec_type','category_id','pack_price'])
+                ->orderBy('id','asc')
+                ->first();
+            if (empty($goods)){
+                return ['code' => 0, 'msg' => '商品不存在'];
+            }
+            if ($goods->{'status'} != 1){
+                return ['code' => 0, 'msg' => '商品已下架'];
+            }
+            $goods_price = $goods->{'price'};//商品价格
+            $goods_number = $value['goods_number'];//商品购买数量
+            $goods_spec_list = [];
+            $goods_spec_price = 0;
+            $goods_attr = '';
+            if ($goods->{'spec_type'} == 2 && !empty($value['goods_spec'])){//存在规格
+                foreach ($value['goods_spec'] as $spec){
+                    $specInfo = GoodsSpec::where('goods_id',$value['goods_id'])
+                        ->where('id',$spec['id'])
+                        ->where('is_del',0)
+                        ->select(['spec_name','spec_price'])
+                        ->first();
+                    if (empty($specInfo)){
+                        return ['code' => 0, 'msg' => '规则不存在'];
+                    }
+                    if ($spec['number'] > 1){
+                        $goods_attr .= $specInfo['spec_name'].'x'.$spec['number'] . ',';
+                    }else{
+                        $goods_attr .= $specInfo['spec_name'] . ',';
+                    }
+                    $goods_spec_price =  bcadd($goods_spec_price,bcmul($spec['number'],$specInfo['spec_price'],2),2);//规格数量乘以价格等于 规格总价
+
+                    $goods_spec_list[] = [
+                        'goods_id' => $value['goods_id'],
+                        'goods_spec_id' => $spec['id'],
+                        'spec_price' => $specInfo['spec_price'],
+                        'spec_name' => $specInfo['spec_name'],
+                        'number' => $spec['number'],
+                    ];
+                }
+            }
+            //计算价格
+            $goods_money = bcmul($goods_number,bcadd($goods_price,$goods_spec_price,2),2);//商品价格等于 商品数量X(商品底价+商品规格总价)
+
+
+            $goods_list[] = [
+                'shop_id' => $goods['shop_id'],
+                'category_id' => $goods['category_id'],
+                'goods_id' => $goods['goods_id'],
+                'goods_money' => rtrim(rtrim($goods_money, '0'),'.'),
+                'goods_number' => $goods_number,
+                'goods_name' => $goods['goods_name'],
+                'goods_image' => $goods['goods_image'],
+                'spec_type' => $goods['spec_type'],
+                'price' => $goods_price,
+                'pack_price' => $goods['pack_price'],
+                'goods_spec_id' => $goods['goods_spec_id'],
+                'goods_attr' => trim($goods_attr,','),
+                'spec_list' => $goods_spec_list,
+            ];
+            //计算打包费
+            $total_pack_price = bcadd($total_pack_price,bcmul($goods_number,$goods['pack_price'],2),2);
+            //计算总数量
+            $total_num += $goods_number;
+            //计算总商品费用
+            $total_goods_money = bcadd($total_goods_money,$goods_money,2);
+        }
+
+        //订单总价-商品总价+总包装费
+        $total_price = bcadd($total_goods_money,$total_pack_price,2);
+
+        $data['total_price'] = rtrim(rtrim($total_price, '0'),'.');
+        $data['total_num'] = (int)$total_num;
+        $data['total_goods_money'] = rtrim(rtrim($total_goods_money, '0'),'.');
+        $data['pack_price'] = $total_pack_price;
+        $data['goods_list'] = $goods_list;
+
+        return ['code' => 1, 'msg' => '成功', 'data'=>$data];
+    }
 }

+ 1 - 0
routes/api/order.php

@@ -7,6 +7,7 @@ use Illuminate\Support\Facades\Route;
 Route::group(['domain' => env('APP_HOST_API'), 'prefix' => 'order'],function (){
     Route::match(['get','post'],'status', 'OrderController@getOrderStatus')->name('order.status');//订单状态
     Route::match(['get','post'],'create', 'OrderController@createOrder')->name('order.create');//订单创建
+    Route::match(['get','post'],'create_v2', 'OrderController@createV2Order')->name('order.create_v2');//订单创建
     Route::match(['get','post'],'pay', 'OrderController@payOrder')->name('order.pay');//订单支付
     Route::match(['get','post'],'list', 'OrderController@getOrderList')->name('order.list');//订单列表
     Route::match(['get','post'],'cancel', 'OrderController@cancelOrder')->name('order.cancel');//取消订单