db->beginTransaction(); $attr = []; $order_trade_info = []; $order_ids = []; foreach($group_order_goods as $mch_order){ $mch_order_info = $mch_order['mch_order_info']; $mch_order_info['goods_price'] = 0; $mch_order_info['pay_money'] = $mch_order_info['shipping_money']; $mch_order_info['marketing_type'] = ScratchEnum::ADDONS_NAME; $order = new Order(); $order->loadDefaultValues(); $order->load($mch_order_info,''); $order->order_status = OrderStatusEnum::NOT_PAY; empty($order->order_no) && $order->order_no = Order::generateOrderNo('s'); /** * 创建中奖兑换订单日志 */ $scratchOrder = ScratchOrderModel::setData([ 'mall_id' => $order->mall_id, 'scratch_log_id' => $scratchLog->id, 'order_id' => 0 ]); $order->marketing_id = $scratchOrder->id; $res = $order->save(); if($res === false) throw new Exception($order->getErrorMessage()); $scratchOrder->order_id = $order->id; if(!$scratchOrder->save()) throw new Exception($scratchOrder->getErrorMessage()); $order_id = $order->id; $order_ids[] = $order->id; // 总商品库存维护 $goods_stock_arr = []; // 遍历商户商品 $goods_ids = array_keys($mch_order['goods']); foreach($mch_order['goods'] as $goods_id =>$goods){ $goods['goods_price'] = 0; !isset($goods_name) && $goods_name = $goods['goods_name']; foreach($goods['goods_details'] as $goods_detail){ // $goods_detail['goods_price'] = 0; $lock_key = RedisKeyEnum::suffix(RedisKeyEnum::LOCK_GOODS_ATTR , $goods_detail['goods_attr_id']); $identification = uniqid(); if (!LockHelper::lock($lock_key, $identification, 30, 60)) throw new Exception('当前访问人数过多'); $stock_locks[$lock_key] = $identification; //操作商品库存-减 GoodsAttr::handleStock($goods_detail['goods_attr_id'],$goods_detail['num']*-1); if(!isset($goods_stock_arr[$goods_id])){ $goods_stock_arr[$goods_id] = $goods_detail['num']; }else{ $goods_stock_arr[$goods_id] += $goods_detail['num']; } // 订单详情 $order_detail = new OrderDetail(); $order_detail->loadDefaultValues(); $order_detail->load($goods_detail,''); $order_detail->order_id = $order_id; // $goods_statistics[] = ['goods_id' => $goods_detail['goods_id'], 'order_num' => 1, 'sales_num' => $goods_detail['num']]; $res = $order_detail->save(); if($res === false) throw new Exception($order_detail->getErrorMessage()); $attr[$goods_detail['goods_attr_id']] = $goods_detail['num']; // 订单营销 if (!empty($goods_detail['marketing'])) { $order_marketing = new OrderMarketing(); $order_marketing->loadDefaultValues(); $order_marketing->load($goods_detail['marketing'],''); $order_marketing->order_detail_id = $order_detail->id; $res = $order_marketing->save(); if($res === false) throw new Exception($order_marketing->getErrorMessage()); } } } $data = is_array($form->data)?$form->data:Json::decode($form->data,true); if(!empty($data['user_coupon_ids'])){ $user_coupon_id = $data['user_coupon_ids']; $res = AddonsCouponUserRelate::updateAll(['is_use'=>1], ['id' => $user_coupon_id]); if($res === false) throw new Exception($order->getErrorMessage()); } $order_trade_info[]=[ 'order_no'=>$order->order_no, 'amount'=>$order->pay_money, 'title'=> Order::getOrderTitle($order), 'notify_class'=>'common\logic\notify\Notify', 'order_type'=>'order', ]; } /** * 更新中奖日志状态 */ $scratchLog->status = ScratchLogModel::STATUS_RECEIVED; if(!$scratchLog->save()) throw new Exception($scratchLog->getErrorMessage()); $trans->commit(); LockHelper::batchUlock($stock_locks); //生成支付流水 $res = \Yii::$app->services->pay->createTrade($form['mall_id'],$form['user_id'],$order_trade_info); if($res==false) throw new Exception('生成支付流水失败'); Order::updateAll(['out_trade_no'=>$res['trade_no']],['id'=>$order_ids]); // 触发订单添加事件,事务提交完成后触发 $event = new OrderCreateEvent($form['mall_id']); Yii::$app->services->events->dispatch($event, ['order_ids' => $order_ids], $event->listeners); //删除购物车 if ($form->type == 'cart') Cart::decreaseNumb(['user_id' => $form->user_id, 'list' => $attr]); $res['order_ids'] = implode(',', $order_ids); $arr['transaction'] = $res; $arr['pay_success_page'] = Yii::$app->services->setting->mall->get($form['mall_id'], 'order.pay_after_link');// 支付成功后跳转的地址 return $arr; }catch(Exception $e){ LockHelper::batchUlock($stock_locks); if(isset($trans)) $trans->rollback(); self::$static_error = $e->getMessage(); return false; } } }