-
Notifications
You must be signed in to change notification settings - Fork 1.6k
订单计算和生成
liaofei edited this page Jan 20, 2021
·
1 revision
加入购物车后拿到返回的购物车ID,发送给订单确认接口,进行确认购物车或缓存虚拟购物车ID是否存在;
下图为订单确认控制器入口
- 用购物车ID来查找当前提交的商品
- 取用户默认地址计算运费,如果没有默认地址不计算运费
- 提取秒杀,砍价,拼团商品ID提供给生成订单使用
- 计算用户付费会员和免费会员优惠力度,取其一按照优惠力度大为标准计算优惠金额
- 提取支付方式给前端使用
- 确认订单无误,返回确认订单数据,生成购物车缓存KEY,缓存KEY会保存到订单表中的
unique
字段中
订单确认接口:api/order/confirm
,接受参数 cartId
购物车ID,new
立即购买 =1 或 从购物车结算 = 0;在没有默认运费模板情况下,也不能进入确认订单;
- 从订单确认接口拿到购物车缓存KEY,检查是否有生成过订单
订单生成需要接收一下参数,提供给订单生成使用,文件路径:app\api\controller\v1\order\StoreOrderController.php
控制中的create
方法
[$addressId, $couponId, $payType, $useIntegral, $mark, $combinationId, $pinkId, $seckill_id, $bargainId, $from, $shipping_type, $real_name, $phone, $storeId, $news, $invoice_id, $quitUrl] = $request->postMore([
[['addressId', 'd'], 0], //地址ID,对应表为:user_address 主键
[['couponId', 'd'], 0], //优惠券ID,对应表:store_coupon_user 主键
['payType', ''], //支付类型 可选值为: weixin yue offline
['useIntegral', 0],//是否使用积分抵扣
['mark', ''],//订单用户备注
[['combinationId', 'd'], 0],//拼团商品ID,由订单确认接口返回
[['pinkId', 'd'], 0],//拼团团ID,对应表:store_pink 主键,由订单确认接口返回
[['seckill_id', 'd'], 0],//秒杀商品ID。对应表:store_seckill 主键,由订单确认接口返回
[['bargainId', 'd'], ''],//砍价商品IF,对应表 store_bargain 主键,由订单确认接口返回
['from', 'weixin'],//用户所在应用端
[['shipping_type', 'd'], 1],//订单配送方式 可选值为: 1 = 快递配送,2 = 门店自提
['real_name', ''],//门店自提时联系人姓名
['phone', ''],//门店自提时联系人电话
[['store_id', 'd'], 0],//所选门店
['new', 0],//立即购买或购物车下单
[['invoice_id', 'd'], 0],//发票ID
], true);
-
检查拼团订单限购,检查秒杀商品库存,库存充足扣除Reids中的虚拟库存
-
计算订单支付金额,订单金额计算逻辑由
app\services\order\StoreOrderComputedServices
内的computedOrder
方法负责计算;邮费计算逻辑由getOrderPriceGroup
方法负责计算。计算逻辑大致为: 先提取购物车内商品的的运费模板ID查询出所选运费模板信息;/** @var ShippingTemplatesRegionServices $regionServices */ $regionServices = app()->make(ShippingTemplatesRegionServices::class); $regionList = $regionServices->getTempRegionList($tempIds, [$cityId, 0]);
再次遍历循环检测是否符合包邮;
/** @var ShippingTemplatesFreeServices $freeServices */ $freeServices = app()->make(ShippingTemplatesFreeServices::class); foreach ($temp_num as $k => $v) { if (isset($temp[$v['temp_id']]['appoint']) && $temp[$v['temp_id']]['appoint']) { if ($freeServices->isFree($v['temp_id'], $v['city_id'], $v['number'], $v['price']){ unset($temp_num[$k]); } } }
把包邮的数据删除掉后再次计算邮费;还需要计算多个商品续件邮费按照当前续件最高金额来计算
-
判断支付方式是否正确
-
判断支付用户是否存在
-
从确定订单拿到的活动商品ID来计算是否能使用优惠券
-
计算优惠券使用后的订单金额
-
计算使用积分抵扣后的订单金额
-
从用户选择的地址计算当前地址的邮费金额
-
处理门店自提订单不增加邮费
-
生成订单
-
扣除库存,扣除失败回滚生成订单
-
积分抵扣,抵扣失败回滚生成订单
-
保存购物车信息
-
订单生成变动记录生成
-
设置用户购买默认地址
-
删除购物车购买过的数据
-
加入消息队列执延迟执行未支付短信提醒
-
返回订单信息
-
由控制器判定支付方式,发起支付,接口返回订单信息和支付配置信息