CartPurchase.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. namespace addons\Happiness\common\logic\order\purchase;
  3. use addons\Happiness\common\models\HappinessStoreGoods;
  4. use addons\Happiness\common\models\HappinessStoreGoodsAttr;
  5. use common\enums\AppEnum;
  6. use common\enums\GoodsTypeEnum;
  7. use common\enums\StatusEnum;
  8. use common\helpers\ArrayHelper;
  9. use common\helpers\BcHelper;
  10. use common\models\goods\Goods;
  11. use common\models\goods\GoodsAttr;
  12. use common\models\order\OrderDetail;
  13. use common\models\user\User;
  14. use common\models\user\UserSignAgreement;
  15. use addons\Happiness\common\models\StoreCart;
  16. use Yii;
  17. use yii\helpers\Json;
  18. use Exception;
  19. // 购物车付款订单处理
  20. class CartPurchase extends BasePurchase {
  21. /**
  22. * 执行
  23. * @Author bing
  24. * @DateTime 2021-09-23 09:46:41
  25. * @copyright: Copyright (c) 2020 广东七件事集团
  26. * @param $form
  27. * @return
  28. */
  29. public function execute($form){
  30. $form->data = $data = is_array($form->data)?$form->data:Json::decode($form->data,true);
  31. $attr_ids = $data['attr_ids'];
  32. $redis = Yii::$app->redis;
  33. $result = $redis->hmget(StoreCart::$key.$form->user_id,...$attr_ids);
  34. //【社安消防插件】参数存在会场id时,需在key上拼接会场id
  35. if (!empty($data['key']) && !empty($data['value'])) {
  36. $result = $redis->hmget(StoreCart::$key.$form->user_id.'_'.$data['key'].'_'.$data['value'],...$attr_ids);
  37. }
  38. $user = User::getOne([['id'=>$form->user_id,'mall_id'=>$form->mall_id]]);
  39. if(empty($user)) throw new Exception('下单用户不存在');
  40. $carts = array_map(function ($val){
  41. return $val?json_decode($val,true):[];
  42. },$result);
  43. $attr_id_arr = array_column($carts,'attr_id');
  44. if(empty($attr_id_arr)) throw new Exception('购物车为空');
  45. $num_arr = array_column($carts,'num','attr_id');
  46. $params['where'] = [['=','status',StatusEnum::ENABLED],['id'=>$attr_id_arr]];
  47. $params['with'] = ['goods','goods.extra'];
  48. $sku_arr = GoodsAttr::lists($params,true);
  49. $goods_type = [];
  50. foreach ($sku_arr as $sku){
  51. if(empty($sku['goods']['is_on_sale'])) throw new Exception('商品' . $sku['goods']['goods_name'] . '已下架! ');
  52. if(!in_array($sku['goods']['goods_type'],$goods_type)) $goods_type[] =$sku['goods']['goods_type'];
  53. }
  54. if(count($goods_type)>1) throw new Exception('不同类型的商品不能一起下单');
  55. if(!empty($goods_type)&&in_array($goods_type[0],[GoodsTypeEnum::GoodsTypePhysical])) {
  56. $data['mall_id'] = $form->mall_id;
  57. $this->checkAddress($form['action'],$data,$form->user_id);
  58. $form['is_address'] = 1;
  59. }
  60. $form['is_virtual'] = 0;
  61. if(!empty($goods_type)&&in_array($goods_type[0],[GoodsTypeEnum::GoodsTypeVirtual])) {
  62. $form['is_virtual'] = 1;
  63. }
  64. $tmp_order_goods = [];
  65. foreach ($sku_arr as $sku){
  66. if(empty($sku) || empty($sku['goods'])) throw new Exception('该下单的产品不存在或者已经删除');
  67. // if(empty($num_arr[$sku['id']])) throw new Exception('请设置正确的下单数量');
  68. $buy_num = $num_arr[$sku['id']];
  69. // if ($buy_num > $sku['stock']) throw new Exception('商品' . $sku['goods']['goods_name'] . '库存不足! ');
  70. $mch_id = $sku['goods']['mch_id'];
  71. // if ($form->action == AppEnum::ACTION_PREVIEW) {
  72. // 记录所属供应链
  73. if (empty($form->process_extra_data['supply_chain'][$sku['goods_id']])) {
  74. $form->process_extra_data['supply_chain'][$sku['goods_id']] = $sku['goods']['goods_source'];
  75. }
  76. if (!empty($sku['goods']['goods_source'])) $mch_id = $sku['goods']['goods_source'];
  77. // }
  78. $order_goods = new OrderDetail();
  79. $order_goods = $order_goods->loadDefaultValues();
  80. $order_goods->goods_id = $sku['goods_id'];
  81. $order_goods->goods_name = $sku['goods']['goods_name'];
  82. $order_goods->goods_attr_id = $sku['id'];
  83. $order_goods->sign_id = $sku['sign_id'];
  84. $order_goods->goods_attr_name = $sku['name'];
  85. $order_goods->num = $buy_num;
  86. $order_goods->cost_price = $sku['cost_price'];
  87. $order_goods->price = $sku['price'];
  88. $order_goods->goods_price = BcHelper::mul($order_goods->num, $order_goods->price);
  89. $order_goods->original_goods_price = $order_goods->goods_price;
  90. $order_goods->pic_url = !empty($sku['pic_url']) ? $sku['pic_url'] : $sku['goods']['cover_pic'];
  91. $order_goods->user_id = $form->user_id;
  92. $order_goods->mch_id = $mch_id;
  93. $order_goods->mall_id = $form->mall_id;
  94. $order_goods->is_virtual = $form->is_virtual;
  95. //获取该商品的快递方式
  96. $goods_info = HappinessStoreGoods::getOne([
  97. ['mall_id' => $form->mall_id],
  98. ['goods_id' => $sku['goods_id']],
  99. ['store_id'=>$form->store_id],
  100. ['status' => StatusEnum::ENABLED],
  101. ['is_on_sale' => 1],
  102. ]);
  103. $goods_info['freight_type']=json_decode($goods_info['freight_type'], true);
  104. if (!empty($goods_info)) {
  105. if (!in_array($form->data['shipping_type'], $goods_info['freight_type'])) $order_goods->status = 0;
  106. }
  107. if (empty($form->store_info)) {
  108. $order_goods->status = 0;
  109. } else {
  110. $today = date('Y-m-d', time());
  111. $business_time_start = $today. ' ' . $form->store_info['business_time_start'];
  112. $business_time_end = $today. ' ' . $form->store_info['business_time_end'];
  113. if (strtotime($business_time_start) > time() && strtotime($business_time_end) < time()) throw new Exception('该门店不在营业时间内');
  114. if ($form->data['shipping_type'] == 2 && $form->store_info['self_mention'] != 1) $order_goods->status = 0;
  115. if ($form->data['shipping_type'] == 3 && $form->store_info['merchant_distribution'] != 1) $order_goods->status = 0;
  116. //获取门店该商品库存
  117. $attr_data = HappinessStoreGoodsAttr::getOne([
  118. ['mall_id' => $form->mall_id],
  119. ['store_id' => $form->store_id],
  120. ['status' => StatusEnum::ENABLED],
  121. ['attr_id' => $sku['id']],
  122. ['is_on_sale' => 1],
  123. ], true);
  124. if (empty($attr_data) || $buy_num > $attr_data['stock']) $order_goods->status = 0;
  125. }
  126. // 默认数据带下单数量方便计算
  127. $goods = $sku['goods'];
  128. $goods['number'] = $buy_num;
  129. $form->order_goods[] = $tmp_order_goods =ArrayHelper::toArray($order_goods);
  130. $form->sku[$sku['goods_id']] = $sku;
  131. $form->user = $user;
  132. }
  133. if (!empty($form->process_extra_data['supply_chain'])) {
  134. $t_supply_chain = array_unique(array_values($form->process_extra_data['supply_chain']));
  135. if (count($t_supply_chain) > 2) throw new Exception("单次只能选择一个供应链的商品");
  136. }
  137. // 签署升级协判断 0不需要签署,1需要签署
  138. $is_sign_agreement = UserSignAgreement::checkIsNeedSign($user['level'], array_column($tmp_order_goods, 'goods_id'), $form->mall_id, $form->user_id);
  139. $form->is_sign_agreement = $is_sign_agreement;
  140. return $form;
  141. }
  142. /**
  143. * 获取下单类型
  144. * @Author bing
  145. * @DateTime 2021-09-23 09:48:45
  146. * @copyright: Copyright (c) 2020 广东七件事集团
  147. * @return string
  148. */
  149. public static function getType(): string{
  150. return 'cart';
  151. }
  152. }