CartController.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <?php
  2. namespace addons\Mch\api\modules\v1\controllers;
  3. use addons\Mch\common\models\Mch;
  4. use api\controllers\OnAuthController;
  5. use common\enums\StatusEnum;
  6. use common\models\cart\Cart;
  7. use common\models\goods\Goods;
  8. use common\models\goods\GoodsAttr;
  9. use common\models\user\UserLevel;
  10. /**
  11. * Class CartController
  12. * @package api\modules\goods\controllers
  13. */
  14. class CartController extends OnAuthController
  15. {
  16. public $modelClass = '';
  17. /**
  18. * 不用进行登录验证的方法
  19. * 例如: ['index', 'update', 'create', 'view', 'delete']
  20. * 默认全部需要验证
  21. *
  22. * @var array
  23. */
  24. protected $authOptional = [];
  25. /**
  26. * 添加购物车
  27. * @return mixed|void
  28. */
  29. public function actionAdd()
  30. {
  31. try {
  32. $params = \Yii::$app->request->post();
  33. $res = \Yii::$app->services->validate->validate($params, [
  34. [['goods_id','attr_id', 'num'], 'required'],
  35. ]);
  36. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  37. $goods = Goods::findOne([
  38. 'id'=>$params['goods_id'],
  39. 'status'=>StatusEnum::ENABLED,
  40. 'is_on_sale'=>1,
  41. 'check_status'=>1,
  42. ]);
  43. if (empty($goods)) return $this->error("商品不存在");
  44. if(!empty($goods['goods_source'])) return $this->error('该商品不允许加入购物车');
  45. if(empty($goods['mch_id'])) return $this->error('该商品不允许加入购物车');
  46. // 没有规格id则查找默认规格【寻找价格最低的规格】
  47. $where = ['goods_id' => $params['goods_id'], 'status' => StatusEnum::ENABLED];
  48. !empty($params['attr_id']) && $where['id'] = $params['attr_id'];
  49. $goods_attr = GoodsAttr::find()->where($where)->orderBy('price asc')->one();
  50. if($goods_attr->goods_id!=$params['goods_id']) return $this->error("goods_id与attr_id不配对");
  51. if (empty($goods->is_attr)) {
  52. if (empty($goods->stock)) return $this->error('库存不足');
  53. } else {
  54. //多规格
  55. if (empty($goods_attr)) return $this->error("所选的规格不存在");
  56. if (empty($goods_attr->stock)) return $this->error("所选的规格库存不足");
  57. }
  58. $params['mch_id'] = $goods['mch_id'];
  59. $params['mall_id'] = $this->mall_id;
  60. $params['user_id'] = $this->user_id;
  61. Cart::addCart($params);
  62. return $this->success('加入购物车成功', []);
  63. }catch (\Exception $e){
  64. return $this->error($e->getMessage(), []);
  65. }
  66. }
  67. /**
  68. * 删除购物车
  69. * @return mixed|void
  70. */
  71. public function actionDel()
  72. {
  73. $params = \Yii::$app->request->post();
  74. $res = \Yii::$app->services->validate->validate($params, [
  75. [['list'], 'required'],
  76. ]);
  77. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  78. $params['mall_id'] = $this->mall_id;
  79. $params['user_id'] = $this->user_id;
  80. Cart::delCart($params);
  81. return $this->success('操作成功', []);
  82. }
  83. /**
  84. * 购物车列表
  85. * @return mixed|void
  86. */
  87. public function actionIndex()
  88. {
  89. $params = \Yii::$app->request->get();
  90. $res = \Yii::$app->services->validate->validate($params, [
  91. [['mch_id'], 'safe'],
  92. ]);
  93. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  94. $list = Cart::getCartList($this->user_id);
  95. $mch_list = [];
  96. $mch_id_arr = [];
  97. if (!empty($list)) {
  98. $attr_id_arr = [];
  99. $num_arr =[];
  100. foreach ($list as $v) {
  101. $row = json_decode($v, true);
  102. if (is_array($row)) {
  103. $attr_id_arr[] = $row['attr_id'];
  104. $mch_id_arr[] = $row['mch_id'];
  105. $num_arr[$row['attr_id']] = $row['num'];
  106. }
  107. }
  108. $params['where'] = [['id' => $attr_id_arr],['>','stock',0],['status'=>StatusEnum::ENABLED]];
  109. $params['with'] = ['goods' => function ($query) {
  110. $query->select('id,mch_id,goods_name,is_on_sale,freight_type,cover_pic');
  111. }];
  112. $params['select'] = 'id,goods_id,pic_url,price,name,stock';
  113. $list = GoodsAttr::lists($params);
  114. if(!empty($params['mch_id'])){
  115. $mch_id_arr = $params['mch_id'];
  116. }
  117. $mch_list = Mch::lists(['where'=>[['id'=>$mch_id_arr]],'select'=>'id,store_name,logo_img,shop_status']);
  118. $rows = [];
  119. $user = $this->user;
  120. $user_level = UserLevel::findOne(['mall_id' => $this->mall_id, 'level' => $user['level'], 'status' => StatusEnum::ENABLED]);
  121. $discount = 10;
  122. if (isset($user_level)) $discount = $user_level['discount'];
  123. if (!empty($list)) {
  124. foreach ($list as $v) {
  125. $member_price_setting = json_decode($v['goods']['extra']['member_price_setting']);
  126. $v['member_price'] = Goods::computeMemberPrice($v['price'],$v['sign_id'],$user['level'],$v['goods']['is_attr'],
  127. $v['goods']['extra']['is_member_price'],$member_price_setting,$discount);
  128. if (!empty($v['goods']['extra']['is_member_price']) && !empty($v['extra']['member_price_setting'])) {
  129. $member_price_setting = $v['extra']['member_price_setting'];
  130. if ($v['goods']['is_attr']) {
  131. if (!empty($member_price_setting['level' . $user['level']][$v['sign_id']])) $v['price'] = $member_price_setting['level' . $user['level']][$v['sign_id']];
  132. } else {
  133. if (!empty($member_price_setting[$user['level']])) $v['price'] = $member_price_setting[$user['level']];
  134. }
  135. }
  136. if($v['goods']['is_on_sale']){
  137. $rows[$v['goods']['mch_id']][] = [
  138. 'goods_id' => $v['goods_id'],
  139. 'num' => $num_arr[$v['id']],
  140. 'attr_id' => $v['id'],
  141. 'price' => $v['price'],
  142. 'member_price' => $v['member_price'],
  143. 'cover_pic' =>$v['pic_url']?$v['pic_url']:$v['goods']['cover_pic'],
  144. 'attr' => $v['name'],
  145. 'stock' => $v['stock'],
  146. 'goods_name' => $v['goods']['goods_name'],
  147. 'is_on_sale' => $v['goods']['is_on_sale'],
  148. 'freight_type' => explode(',',$v['goods']['freight_type']),
  149. ];
  150. }
  151. }
  152. }
  153. foreach ($mch_list as &$val) {
  154. $total_price =$total_num = 0;
  155. $list = [];
  156. if(isset($rows[$val['id']])){
  157. foreach ($rows[$val['id']] as $rk => $rv) {
  158. $price_sum = 0;
  159. $total_num += $rv['num'];
  160. $price_sum = bcmul($rv['price'], $rv['num'], 2);
  161. $total_price = bcadd($total_price, $price_sum, 2);
  162. }
  163. $list=$rows[$val['id']];
  164. }
  165. $val['list'] = $list;
  166. $val['total_price'] = $total_price;
  167. $val['total_num'] = $total_num;
  168. $val['business_status'] = '';
  169. $val['business_status'] = $val['shop_status']==1?'正在营业':'休息中';
  170. }
  171. }
  172. return $this->success('操作成功', $mch_list);
  173. }
  174. public function actionClear()
  175. {
  176. $params['mall_id'] = $this->mall_id;
  177. $params['user_id'] = $this->user_id;
  178. $list = Cart::getCartList($this->user_id);
  179. if (!empty($list)) {
  180. foreach ($list as $v) {
  181. $row = json_decode($v, true);
  182. if (is_array($row)&&!empty($row['mch_id'])) {
  183. $params['list'][] = ['attr_id'=>$row['attr_id']];
  184. }
  185. }
  186. Cart::delCart($params);
  187. }
  188. return $this->success('操作成功', []);
  189. }
  190. }