CartController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. <?php
  2. namespace addons\Happiness\api\modules\v1\controllers;
  3. use addons\Happiness\common\models\HappinessStore as Store;
  4. use addons\Happiness\common\models\HappinessStoreGoods as StoreGoods;
  5. use addons\Happiness\common\models\HappinessStoreGoodsAttr as StoreGoodsAttr;
  6. use addons\Happiness\common\models\StoreCart;
  7. use api\controllers\OnAuthController;
  8. use common\enums\StatusEnum;
  9. use common\models\goods\GoodsAttr;
  10. use common\models\user\UserLevel;
  11. /**
  12. * Class CartController
  13. * @package api\modules\goods\controllers
  14. */
  15. class CartController extends OnAuthController
  16. {
  17. public $modelClass = '';
  18. /**
  19. * 不用进行登录验证的方法
  20. * 例如: ['index', 'update', 'create', 'view', 'delete']
  21. * 默认全部需要验证
  22. *
  23. * @var array
  24. */
  25. protected $authOptional = ['index'];
  26. /**
  27. * 添加购物车
  28. * @return mixed|void
  29. */
  30. public function actionAdd()
  31. {
  32. try {
  33. $params = \Yii::$app->request->post();
  34. $res = \Yii::$app->services->validate->validate($params, [
  35. [['goods_id','attr_id', 'num','store_id'], 'required'],
  36. ]);
  37. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  38. $goods = StoreGoods::getOne([
  39. ['goods_id'=>$params['goods_id']],
  40. ['store_id'=>$params['store_id']],
  41. ['status'=>StatusEnum::ENABLED],
  42. [ 'is_on_sale'=>1],
  43. ],true);
  44. if (empty($params['num'])) return $this->error("请输入数量");
  45. if (empty($goods)) return $this->error("商品不存在");
  46. //属性判断
  47. $isHasAttr = StoreGoodsAttr::find()->where([
  48. 'goods_id'=>$params['goods_id'],
  49. 'attr_id'=>$params['attr_id'],
  50. 'store_id'=>$params['store_id'],
  51. 'status'=>StatusEnum::ENABLED
  52. ])->asArray()->one();
  53. if (empty($isHasAttr)) return $this->error("小店没有该规格库存");
  54. if($isHasAttr['stock']<$params['num'])
  55. {
  56. return $this->error("规格库存不足");
  57. }
  58. $cart_goods_nums = StoreCart::getCartGoodsNums($this->user_id,$params['attr_id']);
  59. $goods['num'] = $params['num']+$cart_goods_nums;
  60. if (empty($goods['stock'])) return $this->error('库存不足');
  61. if($goods['num']>$goods['stock'])return $this->error('超库存');
  62. $params['store_id'] = $goods['store_id'];
  63. $params['mall_id'] = $this->mall_id;
  64. $params['user_id'] = $this->user_id;
  65. StoreCart::addCart($params);
  66. return $this->success('加入购物车成功', []);
  67. }catch (\Exception $e){
  68. return $this->error($e->getMessage(), []);
  69. }
  70. }
  71. /**
  72. * 删除购物车
  73. * @return mixed|void
  74. */
  75. public function actionDel()
  76. {
  77. $params = \Yii::$app->request->post();
  78. $res = \Yii::$app->services->validate->validate($params, [
  79. [['list'], 'required'],
  80. ]);
  81. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  82. $params['mall_id'] = $this->mall_id;
  83. $params['user_id'] = $this->user_id;
  84. StoreCart::delCart($params);
  85. return $this->success('操作成功', []);
  86. }
  87. /**
  88. * 购物车列表
  89. * @return mixed|void
  90. */
  91. public function actionIndex()
  92. {
  93. $params = \Yii::$app->request->get();
  94. $res = \Yii::$app->services->validate->validate($params, [
  95. [['store_id'], 'safe'],
  96. ]);
  97. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  98. $list = StoreCart::getCartList($this->user_id);
  99. $store_list = [];
  100. $store_id_arr = [];
  101. if (!empty($list)) {
  102. $attr_id_arr = [];
  103. $num_arr =[];
  104. foreach ($list as $v) {
  105. $row = json_decode($v, true);
  106. if (is_array($row)) {
  107. $attr_id_arr[] = $row['attr_id'];
  108. $store_id_arr[] = $row['store_id'];
  109. $num_arr[$row['attr_id']] = $row['num'];
  110. }
  111. }
  112. $params['where'] = [['in','st.attr_id',$attr_id_arr],['>','st.stock',0],['=','st.status',
  113. StatusEnum::ENABLED],
  114. ['in','st.store_id',$store_id_arr]];
  115. $params['with'] = [
  116. 'goods' => function ($query) {
  117. $query->select('id,goods_name,is_on_sale,freight_type,cover_pic')->with(['extra']);
  118. }
  119. ];
  120. $params['select'] = 'st.id,st.attr_id,st.store_id,st.goods_id,att.pic_url,att.price,att.name,st.stock,st.is_on_sale';
  121. $joins = array(['LEFT JOIN', GoodsAttr::tableName() . ' as att ', 'att.id = st.attr_id']);
  122. $params['join'] = $joins;
  123. $params['alias'] = 'st';
  124. $list = StoreGoodsAttr::lists($params);
  125. $goods_ids= array_column($list,'goods_id');
  126. $storeGoodsList=StoreGoods::find()->where(['store_id'=>$store_id_arr,'status'=>StatusEnum::ENABLED,'goods_id'=>$goods_ids])->select('id,freight_type,store_id,goods_id')->asArray()->all();
  127. if(!empty($params['store_id'])){
  128. $store_id_arr = $params['store_id'];
  129. }
  130. $store_list = Store::lists(['where'=>[['id'=>$store_id_arr]],'select'=>'id,store_name,logo_img,business_time_start,business_time_end']);
  131. $rows = [];
  132. $user = $this->user;
  133. $user_level = UserLevel::findOne(['mall_id' => $this->mall_id, 'level' => $user['level'], 'status' => StatusEnum::ENABLED]);
  134. $discount = 10;
  135. if (isset($user_level)) $discount = $user_level['discount'];
  136. if (!empty($list)) {
  137. foreach ($list as $v) {
  138. if($v['is_on_sale']){
  139. $v['member_price'] = StoreGoods::computeMemberPrice($v['price'],$v['sign_id'] ?? 0,$user['level'],$v['goods']['is_attr'] ?? 0,
  140. $v['goods']['extra']['is_member_price'],$member_price_setting ?? [],$discount);
  141. if (!empty($v['goods']['extra']['is_member_price']) && !empty($v['extra']['member_price_setting'])) {
  142. $member_price_setting = $v['extra']['member_price_setting'];
  143. if ($v['goods']['is_attr']) {
  144. if (!empty($member_price_setting['level' . $user['level']][$v['sign_id']])) $v['price'] = $member_price_setting['level' . $user['level']][$v['sign_id']];
  145. } else {
  146. if (!empty($member_price_setting[$user['level']])) $v['price'] = $member_price_setting[$user['level']];
  147. }
  148. }
  149. if(!empty($v['goods']['extra']['member_buy_limit_setting'])){
  150. $member_buy_limit_setting = json_decode($v['goods']['extra']['member_buy_limit_setting'],true);
  151. }
  152. $filteredGoods = array_filter($storeGoodsList, function($item) use($v) {
  153. // 替换为你的具体条件
  154. return $item['store_id'] == $v['store_id'] && $item['goods_id'] == $v['goods_id'];
  155. });
  156. $firstMatch = reset($filteredGoods);
  157. $freight_type = json_decode($firstMatch['freight_type'],true);
  158. sort($freight_type);
  159. $rows[$v['store_id']][] = [
  160. 'goods_id' => $v['goods_id'],
  161. 'num' => $num_arr[$v['attr_id']],
  162. 'attr_id' => $v['attr_id'],
  163. 'member_price' => $v['member_price'],
  164. 'price' => $v['price'],
  165. 'cover_pic' =>$v['pic_url']?$v['pic_url']:$v['goods']['cover_pic'],
  166. 'attr' => $v['name'],
  167. 'stock' => $v['stock'],
  168. 'goods_name' => $v['goods']['goods_name'],
  169. 'is_on_sale' => $v['is_on_sale'],
  170. 'freight_type' => $freight_type,
  171. 'member_buy_limit_setting' =>$member_buy_limit_setting??[],
  172. ];
  173. }
  174. }
  175. }
  176. foreach ($store_list as &$val) {
  177. $total_price =$total_num = 0;
  178. $list = [];
  179. if(isset($rows[$val['id']])){
  180. foreach ($rows[$val['id']] as $rk => $rv) {
  181. $price_sum = 0;
  182. $total_num += $rv['num'];
  183. $price_sum = bcmul($rv['price'], $rv['num'], 2);
  184. $total_price = bcadd($total_price, $price_sum, 2);
  185. }
  186. $list=$rows[$val['id']];
  187. }
  188. $val['list'] = $list;
  189. $val['total_price'] = $total_price;
  190. $val['total_num'] = $total_num;
  191. }
  192. }
  193. return $this->success('操作成功', $store_list);
  194. }
  195. public function actionClear()
  196. {
  197. $get = \Yii::$app->request->get();
  198. $params = [];
  199. $params['mall_id'] = $this->mall_id;
  200. $params['user_id'] = $this->user_id;
  201. $params['del_type'] = $get['del_type'] ?? 'del';
  202. $params['select'] = $get['select'] ?? '';
  203. if ($params['del_type'] == 'select') {
  204. $attr_ids = explode(',', $params['select']);
  205. $params['list'] = [];
  206. foreach ($attr_ids as $id) {
  207. $params['list'][]['attr_id'] = $id;
  208. }
  209. StoreCart::delCart($params);
  210. } else {
  211. StoreCart::clearCart($params);
  212. }
  213. return $this->success('操作成功', []);
  214. }
  215. public function actionUpdateCart()
  216. {
  217. try {
  218. $params = \Yii::$app->request->post();
  219. $res = \Yii::$app->services->validate->validate($params, [
  220. [['goods_id','attr_id', 'num', 'store_id'], 'required'],
  221. ]);
  222. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  223. $goods = StoreGoods::getOne([
  224. ['goods_id'=>$params['goods_id']],
  225. ['store_id'=>$params['store_id']],
  226. ['status'=>StatusEnum::ENABLED],
  227. [ 'is_on_sale'=>1],
  228. ],true);
  229. if (empty($params['num'])) return $this->error("请输入数量");
  230. if (empty($goods)) return $this->error("商品不存在");
  231. $goods['num'] = $params['num'];
  232. if (empty($goods['stock'])) return $this->error('库存不足');
  233. if($goods['num']>$goods['stock'])return $this->error('超库存');
  234. $params['store_id'] = $goods['store_id'];
  235. $params['mall_id'] = $this->mall_id;
  236. $params['user_id'] = $this->user_id;
  237. StoreCart::updateCart($params);
  238. return $this->success('修改购物车成功', []);
  239. }catch (\Exception $e){
  240. return $this->error($e->getMessage(), []);
  241. }
  242. }
  243. }