CartPurchase.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. namespace addons\Store\common\logic\order\purchase;
  3. use addons\Store\common\models\StoreCart;
  4. use addons\Store\common\models\StoreGoodsAttr;
  5. use addons\Store\common\models\StoreOrderDetail;
  6. use common\enums\GoodsTypeEnum;
  7. use common\enums\ShippingTypeEnum;
  8. use common\enums\StatusEnum;
  9. use common\helpers\ArrayHelper;
  10. use common\helpers\BcHelper;
  11. use common\models\user\User;
  12. use Yii;
  13. use yii\helpers\Json;
  14. use Exception;
  15. // 购物车付款订单处理
  16. class CartPurchase extends BasePurchase {
  17. /**
  18. * 执行
  19. * @Author bing
  20. * @DateTime 2021-09-23 09:46:41
  21. * @copyright: Copyright (c) 2020 广东七件事集团
  22. * @param $form
  23. * @return
  24. */
  25. public function execute($form)
  26. {
  27. $data = is_array($form->data)?$form->data:Json::decode($form->data,true);
  28. if(empty($data['attr_ids'])) throw new Exception('请选择商品');
  29. $attr_ids = $data['attr_ids'];
  30. $redis = Yii::$app->redis;
  31. $result = $redis->hmget(StoreCart::$key.$form->user_id,...$attr_ids);
  32. $user = User::getOne([['id'=>$form->user_id,'mall_id'=>$form->mall_id]]);
  33. if(empty($user)) throw new Exception('下单用户不存在');
  34. $carts = array_map(function ($val){
  35. return $val?json_decode($val,true):[];
  36. },$result);
  37. $attr_id_arr = array_column($carts,'attr_id');
  38. if(empty($attr_id_arr)) throw new Exception('购物车为空');
  39. $num_arr = array_column($carts,'num','attr_id');
  40. $params['where'] = [['=','status',StatusEnum::ENABLED],['id'=>$attr_id_arr]];
  41. $params['with'] = ['goods', 'goods.extra'];
  42. $sku_arr = StoreGoodsAttr::lists($params,true);
  43. $goods_type = [];
  44. $freight_type_arr = [];
  45. $form['is_virtual'] = 0;
  46. foreach($sku_arr as $k=>$sku){
  47. if(!in_array($sku['goods']['goods_type'],$goods_type)) $goods_type[] =$sku['goods']['goods_type'];
  48. $freight_type = explode(',',$sku['goods']['freight_type']);
  49. if(empty($freight_type_arr)){
  50. $freight_type_arr = $freight_type;
  51. }else{
  52. $freight_type_arr = array_intersect($freight_type_arr,$freight_type);
  53. }
  54. if($sku['goods']['goods_type']==GoodsTypeEnum::GoodsTypePhysical){
  55. // if($data['shipping_type']!=ShippingTypeEnum::PICKUP){
  56. $form['is_address'] = 1;
  57. $data['mall_id'] = $form->mall_id;
  58. $this->checkAddress($form['action'],$data,$form->user_id);
  59. // }
  60. }
  61. if($sku['goods']['goods_type']==GoodsTypeEnum::GoodsTypeVirtual){
  62. $form['is_virtual'] = 1;
  63. }
  64. }
  65. // 商品类型
  66. $goods_types = array_unique(array_column(array_column($sku_arr ?? [], 'goods'), 'goods_type'));
  67. if(count($goods_types) > 1) throw new Exception('不同类型的商品不能一起下单');
  68. if(count($sku_arr)>2){
  69. if(count($goods_type)>1) throw new Exception('不同类型的商品不能一起下单');
  70. if(empty($freight_type_arr)) throw new Exception('不同属性的商品不能一起下单');
  71. }
  72. foreach ($sku_arr as $k=>$sku){
  73. if(empty($sku) || empty($sku['goods'])) throw new Exception('该下单的产品不存在或者已经删除');
  74. if(empty($num_arr[$sku['id']])) throw new Exception('请设置正确的下单数量');
  75. $buy_num = $num_arr[$sku['id']];
  76. if ($buy_num > $sku['stock']) throw new Exception('商品' . $sku['goods']['goods_name'] . '库存不足! ');
  77. if ($sku['goods']['check_status'] != '1') throw new Exception('商品' . $sku['goods']['goods_name'] . '不是已通过审核的商品 ');
  78. if ($sku['goods']['is_on_sale'] != '1') throw new Exception('商品' . $sku['goods']['goods_name'] . '已下架 ');
  79. $order_goods = new StoreOrderDetail();
  80. $order_goods = $order_goods->loadDefaultValues();
  81. $order_goods->goods_id = $sku['goods_id'];
  82. $order_goods->goods_name = $sku['goods']['goods_name'];
  83. $order_goods->goods_attr_id = $sku['id'];
  84. $order_goods->sign_id = $sku['sign_id'];
  85. $order_goods->goods_attr_name = $sku['name'];
  86. $order_goods->num = $buy_num;
  87. $order_goods->cost_price = $sku['cost_price'];
  88. $order_goods->price = $sku['price'];
  89. $order_goods->goods_price = BcHelper::mul($order_goods->num, $order_goods->price);
  90. $order_goods->original_goods_price = $order_goods->goods_price;
  91. $order_goods->pic_url = !empty($sku['pic_url']) ? $sku['pic_url'] : $sku['goods']['cover_pic'];
  92. $order_goods->user_id = $form->user_id;
  93. $order_goods->mch_id = $sku['goods']['mch_id'] ?? 0;
  94. $order_goods->mall_id = $form->mall_id;
  95. // 默认数据带下单数量方便计算
  96. $goods = $sku['goods'];
  97. $goods['number'] = $buy_num;
  98. $order_goods_arr = ArrayHelper::toArray($order_goods);
  99. //todo 此次order_detail 没有以下字段
  100. $order_goods_arr['supplier_type'] = $sku['goods']['supplier_type'];
  101. $order_goods_arr['supplier_id'] = $sku['goods']['supplier_id'];
  102. $order_goods_arr['supplier_goods_id'] = $sku['goods']['supplier_goods_id'];
  103. switch($sku['goods']['supplier_type']){
  104. case 0:
  105. case 1:
  106. case 2:
  107. case 4:
  108. $order_goods_arr['store_id'] = $sku['goods']['store_id'];
  109. $order_goods_arr['mch_id'] = 0;
  110. break;
  111. case 3:
  112. $order_goods_arr['store_id'] = $sku['goods']['store_id'];
  113. $order_goods_arr['mch_id'] = $sku['goods']['supplier_id'];
  114. break;
  115. }
  116. $order_goods_arr['freight_type'] = $freight_type_arr;
  117. $order_goods_arr['credit_rate'] = $sku['goods']['credit_rate']??0;
  118. $order_goods_arr['mall_goods_id'] = $sku['goods']['mall_goods_id'] ?? 0;
  119. $order_goods_arr['mall_attr_id'] = $sku['mall_attr_id'] ?? 0;
  120. $form->order_goods[] = $order_goods_arr;
  121. $form->sku[$sku['goods_id']] = $sku;
  122. $form->user = $user;
  123. }
  124. return $form;
  125. }
  126. /**
  127. * 获取下单类型
  128. * @Author bing
  129. * @DateTime 2021-09-23 09:48:45
  130. * @copyright: Copyright (c) 2020 广东七件事集团
  131. * @return string
  132. */
  133. public static function getType(): string{
  134. return 'cart';
  135. }
  136. }