CartPurchase.php 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <?php
  2. namespace addons\Purchase\common\logic\order\purchase;
  3. use common\enums\GoodsTypeEnum;
  4. use common\enums\StatusEnum;
  5. use common\helpers\ArrayHelper;
  6. use common\helpers\BcHelper;
  7. use common\models\goods\GoodsAttr;
  8. use common\models\order\OrderDetail;
  9. use common\models\user\User;
  10. use Yii;
  11. use yii\helpers\Json;
  12. use Exception;
  13. // 购物车付款订单处理
  14. class CartPurchase extends BasePurchase {
  15. /**
  16. * 执行
  17. * @Author bing
  18. * @DateTime 2021-09-23 09:46:41
  19. * @copyright: Copyright (c) 2020 广东七件事集团
  20. * @param $form
  21. * @return
  22. */
  23. public function execute($form){
  24. $form->data = $data = is_array($form->data)?$form->data:Json::decode($form->data,true);
  25. $attr_ids = $data['attr_ids'];
  26. $redis = Yii::$app->redis;
  27. $result = $redis->hmget('purchase_cart_'.$form->user_id,...$attr_ids);
  28. $user = User::getOne([['id'=>$form->user_id,'mall_id'=>$form->mall_id]]);
  29. if(empty($user)) throw new Exception('下单用户不存在');
  30. $carts = array_map(function ($val){
  31. return $val?json_decode($val,true):[];
  32. },$result);
  33. $attr_id_arr = array_column($carts,'attr_id');
  34. if(empty($attr_id_arr)) throw new Exception('购物车为空');
  35. $num_arr = array_column($carts,'num','attr_id');
  36. $params['where'] = [['=','status',StatusEnum::ENABLED],['id'=>$attr_id_arr]];
  37. $params['with'] = ['goods','goods.extra'];
  38. $sku_arr = GoodsAttr::lists($params,true);
  39. $goods_type = [];
  40. foreach ($sku_arr as $sku){
  41. if(empty($sku['goods']['is_on_sale'])) throw new Exception('商品' . $sku['goods']['goods_name'] . '已下架! ');
  42. if(!in_array($sku['goods']['goods_type'],$goods_type)) $goods_type[] =$sku['goods']['goods_type'];
  43. }
  44. if(count($goods_type)>1) throw new Exception('不同类型的商品不能一起下单');
  45. if(!empty($goods_type)&&in_array($goods_type[0],[GoodsTypeEnum::GoodsTypePhysical])) {
  46. $data['mall_id'] = $form->mall_id;
  47. $this->checkAddress($form['action'],$data,$form->user_id);
  48. $form['is_address'] = 1;
  49. }
  50. foreach ($sku_arr as $sku){
  51. if(empty($sku) || empty($sku['goods'])) throw new Exception('该下单的产品不存在或者已经删除');
  52. if(empty($num_arr[$sku['id']])) throw new Exception('请设置正确的下单数量');
  53. $buy_num = $num_arr[$sku['id']];
  54. if ($buy_num > $sku['stock']) throw new Exception('商品' . $sku['goods']['goods_name'] . '库存不足! ');
  55. $order_goods = new OrderDetail();
  56. $order_goods = $order_goods->loadDefaultValues();
  57. $order_goods->goods_id = $sku['goods_id'];
  58. $order_goods->goods_name = $sku['goods']['goods_name'];
  59. $order_goods->goods_attr_id = $sku['id'];
  60. $order_goods->sign_id = $sku['sign_id'];
  61. $order_goods->goods_attr_name = $sku['name'];
  62. $order_goods->num = $buy_num;
  63. $order_goods->cost_price = $sku['cost_price'];
  64. $order_goods->price = $sku['price'];
  65. $order_goods->goods_price = BcHelper::mul($order_goods->num, $order_goods->price);
  66. $order_goods->original_goods_price = $order_goods->goods_price;
  67. $order_goods->pic_url = !empty($sku['pic_url']) ? $sku['pic_url'] : $sku['goods']['cover_pic'];
  68. $order_goods->user_id = $form->user_id;
  69. $order_goods->mch_id = $sku['goods']['mch_id'];
  70. $order_goods->mall_id = $form->mall_id;
  71. // 默认数据带下单数量方便计算
  72. $goods = $sku['goods'];
  73. $goods['number'] = $buy_num;
  74. $form->order_goods[] = ArrayHelper::toArray($order_goods);
  75. $form->sku[$sku['goods_id']] = $sku;
  76. $form->user = $user;
  77. }
  78. return $form;
  79. }
  80. /**
  81. * 获取下单类型
  82. * @Author bing
  83. * @DateTime 2021-09-23 09:48:45
  84. * @copyright: Copyright (c) 2020 广东七件事集团
  85. * @return string
  86. */
  87. public static function getType(): string{
  88. return 'cart';
  89. }
  90. }