结算购物车生成订单
首先封装购物车中商品数据
我这里是在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'],
]);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具