Skip to content

订单计算和生成

liaofei edited this page Jan 20, 2021 · 1 revision

订单计算和生成

加入购物车后拿到返回的购物车ID,发送给订单确认接口,进行确认购物车或缓存虚拟购物车ID是否存在;

订单确认流程

下图为订单确认控制器入口 输入图片说明

  1. 用购物车ID来查找当前提交的商品
  2. 取用户默认地址计算运费,如果没有默认地址不计算运费
  3. 提取秒杀,砍价,拼团商品ID提供给生成订单使用
  4. 计算用户付费会员和免费会员优惠力度,取其一按照优惠力度大为标准计算优惠金额
  5. 提取支付方式给前端使用
  6. 确认订单无误,返回确认订单数据,生成购物车缓存KEY,缓存KEY会保存到订单表中的unique字段中

订单确认接口:api/order/confirm,接受参数 cartId 购物车ID,new 立即购买 =1 或 从购物车结算 = 0;在没有默认运费模板情况下,也不能进入确认订单;

订单生成流程

  1. 从订单确认接口拿到购物车缓存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);
  1. 检查拼团订单限购,检查秒杀商品库存,库存充足扣除Reids中的虚拟库存

  2. 计算订单支付金额,订单金额计算逻辑由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]);
           }
        }
     }
    

    把包邮的数据删除掉后再次计算邮费;还需要计算多个商品续件邮费按照当前续件最高金额来计算

  3. 判断支付方式是否正确

  4. 判断支付用户是否存在

  5. 从确定订单拿到的活动商品ID来计算是否能使用优惠券

  6. 计算优惠券使用后的订单金额

  7. 计算使用积分抵扣后的订单金额

  8. 从用户选择的地址计算当前地址的邮费金额

  9. 处理门店自提订单不增加邮费

  10. 生成订单

  11. 扣除库存,扣除失败回滚生成订单

  12. 积分抵扣,抵扣失败回滚生成订单

  13. 保存购物车信息

  14. 订单生成变动记录生成

  15. 设置用户购买默认地址

  16. 删除购物车购买过的数据

  17. 加入消息队列执延迟执行未支付短信提醒

  18. 返回订单信息

  19. 由控制器判定支付方式,发起支付,接口返回订单信息和支付配置信息

Clone this wiki locally