BuyNowPurchase.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. namespace addons\Seckill\common\logic\order\purchase;
  3. use addons\GroupBuy\common\models\GroupBuyActiveGoodsAttr;
  4. use addons\ScoreMall\common\enums\ScoreMallEnum;
  5. use addons\ScoreMall\common\models\ScoreMallGoods;
  6. use addons\Seckill\common\enums\SeckillEnum;
  7. use addons\Seckill\common\logic\ActivityLogic;
  8. use addons\Seckill\common\models\SeckillActivity;
  9. use common\enums\GoodsTypeEnum;
  10. use common\enums\StatusEnum;
  11. use common\helpers\ArrayHelper;
  12. use common\helpers\BcHelper;
  13. use addons\GroupBuy\common\logic\order\OrderFormLogic;
  14. use common\models\goods\GoodsAttr;
  15. use common\models\mall\Mall;
  16. use common\models\order\OrderDetail;
  17. use common\models\user\User;
  18. use Exception;
  19. use yii\helpers\Json;
  20. /**
  21. * 立即付款订单处理
  22. * @Author bing
  23. * @DateTime 2021-09-23 09:40:40
  24. * @copyright: Copyright (c) 2020 广东七件事集团
  25. */
  26. class BuyNowPurchase extends BasePurchase {
  27. /**
  28. * @desc:执行
  29. * @Author: hua
  30. * @Date: 2021/12/15
  31. * @Time: 9:56
  32. * @Copyright: copyright (c) 2021 广东七件事集团
  33. * @param $form
  34. * @return object|false
  35. */
  36. public function execute( $form){
  37. try {
  38. //开关设置
  39. $config = \Yii::$app->services->setting->addons->get($form->mall_id, SeckillEnum::ADDONS_NAME, 'basic');
  40. if($config && !$config['status']){
  41. throw new Exception('活动不存在');
  42. }
  43. $data = is_array($form->data)?$form->data:Json::decode($form->data,true);
  44. //秒杀活动检测
  45. if(!isset($data['activity_id'])) throw new Exception('参数不合理');
  46. $activity = SeckillActivity::getActivityByCache($data['activity_id']);
  47. if(!$activity || $activity['mall_id'] != $form->mall_id ){
  48. throw new Exception('活动不存在');
  49. }
  50. //替换传参过来的 attr_id
  51. $data['attr_id'] = $activity['attr_id'];
  52. // 合法性验证
  53. $user = User::getOne([['id'=>$form->user_id,'mall_id'=>$form->mall_id]]);
  54. if(empty($user)) throw new Exception('下单用户不存在');
  55. if(!isset($data['num']) || (int)$data['num'] < 1) throw new Exception('请设置正确的下单数量');
  56. $sku = GoodsAttr::getOne([['<>','status',StatusEnum::DELETE],['id'=>$data['attr_id']]],true,['goods','goods.extra']);
  57. if(empty($sku) || empty($sku['goods'])) throw new Exception('找不到产品信息');
  58. if($sku['goods']['is_on_sale']==0) throw new Exception('商品已下架');
  59. if(in_array($sku['goods']['goods_type'],[GoodsTypeEnum::GoodsTypePhysical])) {
  60. $data['mall_id'] = $form->mall_id;
  61. $this->checkAddress($form['action'],$data,$form->user_id);
  62. $form['is_address'] = 1;
  63. }
  64. //$buy_num = $data['num'];
  65. $buy_num = 1; //秒杀只能1件
  66. if ($buy_num > $sku['stock']) throw new Exception('商品' . $sku['goods']['goods_name'] . '库存不足! ');
  67. //秒杀活动状态检测
  68. $activity['activity_status'] = SeckillActivity::checkActivityStatus($activity['begin_time'],$activity['end_time']);
  69. if($activity['activity_status'] == SeckillActivity::ACTIVITY_STATUS_WAIT){
  70. throw new Exception('活动尚未开始');
  71. }
  72. if($activity['activity_status'] == SeckillActivity::ACTIVITY_STATUS_END){
  73. throw new Exception('活动已结束');
  74. }
  75. //秒杀活动库存检测
  76. $stock = ActivityLogic::getNowStock($data['activity_id']);
  77. if($stock <= 0 ){
  78. throw new Exception('商品已售罄');
  79. }
  80. $order_goods = new OrderDetail();
  81. $order_goods = $order_goods->loadDefaultValues();
  82. $order_goods->goods_id = $sku['goods_id'];
  83. $order_goods->goods_name = $sku['goods']['goods_name'];
  84. $order_goods->goods_attr_id = $sku['id'];
  85. $order_goods->sign_id = $sku['sign_id'];
  86. $order_goods->goods_attr_name = $sku['name'];
  87. $order_goods->num = $buy_num;
  88. $order_goods->cost_price = $sku['cost_price'];
  89. $order_goods->price = $activity['price']; //秒杀活动价格
  90. $order_goods->goods_price = BcHelper::mul($order_goods->num, $order_goods->price);
  91. $order_goods->original_goods_price = $order_goods->goods_price;
  92. $order_goods->pic_url = !empty($sku['pic_url']) ? $sku['pic_url'] : $sku['goods']['cover_pic'];
  93. $order_goods->user_id = $form->user_id;
  94. $order_goods->mch_id = $sku['goods']['mch_id'];
  95. $order_goods->mall_id = $form->mall_id;
  96. // 默认数据带下单数量方便计算
  97. $goods = $sku['goods'];
  98. $goods['number'] = $buy_num;
  99. $form->order_goods[] = ArrayHelper::toArray($order_goods);
  100. // unset($sku['product']);
  101. $form->sku[$sku['goods_id']] = $sku;
  102. $form->user = $user;
  103. $form->activity = $activity;
  104. return $form;
  105. } catch (Exception $e) {
  106. $this->setError($e->getMessage());
  107. return false;
  108. }
  109. }
  110. /**
  111. * 获取下单类型
  112. * @Author bing
  113. * @DateTime 2021-09-23 09:48:45
  114. * @copyright: Copyright (c) 2020 广东七件事集团
  115. * @return string
  116. */
  117. public static function getType(): string{
  118. return 'buy_now';
  119. }
  120. }