结算购物车生成订单

首先封装购物车中商品数据

我这里是在OrderBusiness中封装的

public static function getCartWithGoods(){
        $user_id=session('userInfo.id');
        // 用户购物车商品
        $cartData=Cart::with(['cartGoods','cartSpec'])->where('user_id',$user_id)->select()->toArray();
        // 用户选中商品总金额
        $totalPrice=0;
        //用户选中商品总件数
        $totalNumber=0;
        // 如果SKU存在则替换商品信息
        foreach ($cartData as &$val){
            // 价格
            if ($val['price'] && $val['price']>0){
                $val['goods_price']=$val['price'];
            }
            // 库存
            if ($val['store_count'] && $val['store_count']>0){
                $val['goods_number']=$val['store_count'];
            }
            // 冻结库存
            if ($val['store_frozen'] && $val['store_frozen']>0){
                $val['frozen_number']=$val['store_frozen'];
            }
            // 计算总金额
            $totalPrice+=$val['price'];
            // 计算总件数
            $totalNumber+=$val['number'];
        }
        unset($val);
        // 返回结算商品数据
       return[
            'totalPrice'=>$totalPrice,
            'totalNumber'=>$totalNumber,
            'cartData'=>$cartData,
        ];
    }

接下来根据收货地址和商品数据添加订单(注意要开启事务)

生成订单后就要冻结商品库存直至商品支付成功后释放冻结库存

 public function addOrder(Request $request){
        $addressId=$request->post('addressId');
        $goods=OrderBusiness::getCartWithGoods();
        // 查询出对应的地址信息
        $address=Address::findAddress($addressId)->toArray();
        // 订单随机id
        $orderId=time().rand(0000,9999);
        $user_id=session('userInfo.id');
        // 组装订单信息
        $data=[
            'consignee'=>$address['consignee'],
            'address'=>$address['area'].$address['address'],
            'phone'=>$address['phone'],
            'order_sn'=>$orderId,
            'user_id'=>$user_id,
            // 订单总价
            'order_amount'=>$goods['totalPrice']
        ];
        Db::startTrans();
        try {
            // 调用模型插入订单数据
            $order=\app\home\model\Order::addOrder($data);
            // 查询出购买的数据
            $goods=OrderBusiness::getCartWithGoods();
            // 查询要购买的商品是否充足
            foreach ($goods['cartData'] as $val){
                if ($val['number']>$val['goods_number']){
                    throw new \Exception('订购的商品有库存不足的商品');
                }
            }
            // 将查询出的商品和订单入库
            $orderGoods=[];
            foreach ($goods['cartData'] as $val){
                $orderGoods[]=[
                    // 订单编号
                    'order_id'=>$order->id,
                    // 商品id
                    'goods_id'=>$val['goods_id'],
                    // SKU  Id
                    'spec_goods_id'=>$val['spec_goods_id'],
                    // 商品数量
                    'number'=>$val['number'],
                    // 商品名称
                    'goods_name'=>$val['goods_name'],
                    'goods_logo'=>$val['goods_logo'],
                    'goods_price'=>$val['goods_price'],
                    'spec_value_names'=>$val['value_names'],
                ];
            }
            OrderGoods::addOrderGoods($orderGoods);

            // 预扣库存
            foreach ($goods['cartData'] as $val){
                // 判断是否有SKU
                if (isset($val['spec_goods_id'])&& !empty($val['spec_goods_id'])){
                   // 库存自减
                    Db::table('pyg_spec_goods')
                        ->where('id', $val['spec_goods_id'])
                        ->dec('store_count',$val['number'])
                        ->update();
                    // 冻结库存自加
                    Db::table('pyg_spec_goods')
                        ->where('id', $val['spec_goods_id'])
                        ->inc('store_frozen',$val['number'])
                        ->update();
                }else{
                    // 库存自减
                    Db::table('pyg_goods')
                        ->where('id', $val['goods_id'])
                        ->dec('goods_number',$val['number'])
                        ->update();
                    // 冻结库存自加
                    Db::table('pyg_goods')
                        ->where('id', $val['goods_id'])
                        ->inc('frozen_number',$val['number'])
                        ->update();
                }
            }
            // 提交事务
            Db::commit();
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
        }
        
        // 跳转到支付页面
        return view('pay',[
            'orderId'=>$orderId,
            'price'=>$goods['totalPrice'],
        ]);
    }

posted @   哎呀呀哈  阅读(32)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示