| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <?php
- namespace addons\Scratch\common\logic;
- use addons\Coupon\common\models\AddonsCouponUserRelate;
- use addons\Scratch\common\enums\ScratchEnum;
- use addons\Scratch\common\models\ScratchLogModel;
- use addons\Scratch\common\models\ScratchOrderModel;
- use common\enums\OrderStatusEnum;
- use common\enums\RedisKeyEnum;
- use common\events\order\OrderCreateEvent;
- use common\helpers\LockHelper;
- use common\models\cart\Cart;
- use common\models\goods\GoodsAttr;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\order\OrderMarketing;
- use Yii;
- use Exception;
- /**
- * Class ScratchOrderLogic
- * @package addons\Scratch\common\logic
- */
- class ScratchOrderLogic
- {
- /**
- * @param $form
- * @param $scratchLog
- * @return array|false
- * @throws \yii\db\Exception
- */
- public static function createOrder($form, $scratchLog){
- $stock_locks = [];
- try{
- $group_order_goods = $form['group_order_goods'];
- $trans = Yii::$app->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;
- }
- }
- }
|