request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['goods_id','attr_id', 'num','store_id'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $goods = StoreGoods::getOne([ ['goods_id'=>$params['goods_id']], ['store_id'=>$params['store_id']], ['status'=>StatusEnum::ENABLED], [ 'is_on_sale'=>1], ],true); if (empty($params['num'])) return $this->error("请输入数量"); if (empty($goods)) return $this->error("商品不存在"); //属性判断 $isHasAttr = StoreGoodsAttr::find()->where([ 'goods_id'=>$params['goods_id'], 'attr_id'=>$params['attr_id'], 'store_id'=>$params['store_id'], 'status'=>StatusEnum::ENABLED ])->asArray()->one(); if (empty($isHasAttr)) return $this->error("小店没有该规格库存"); if($isHasAttr['stock']<$params['num']) { return $this->error("规格库存不足"); } $cart_goods_nums = StoreCart::getCartGoodsNums($this->user_id,$params['attr_id']); $goods['num'] = $params['num']+$cart_goods_nums; if (empty($goods['stock'])) return $this->error('库存不足'); if($goods['num']>$goods['stock'])return $this->error('超库存'); $params['store_id'] = $goods['store_id']; $params['mall_id'] = $this->mall_id; $params['user_id'] = $this->user_id; StoreCart::addCart($params); return $this->success('加入购物车成功', []); }catch (\Exception $e){ return $this->error($e->getMessage(), []); } } /** * 删除购物车 * @return mixed|void */ public function actionDel() { $params = \Yii::$app->request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['list'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $params['mall_id'] = $this->mall_id; $params['user_id'] = $this->user_id; StoreCart::delCart($params); return $this->success('操作成功', []); } /** * 购物车列表 * @return mixed|void */ public function actionIndex() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['store_id'], 'safe'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $list = StoreCart::getCartList($this->user_id); $store_list = []; $store_id_arr = []; if (!empty($list)) { $attr_id_arr = []; $num_arr =[]; foreach ($list as $v) { $row = json_decode($v, true); if (is_array($row)) { $attr_id_arr[] = $row['attr_id']; $store_id_arr[] = $row['store_id']; $num_arr[$row['attr_id']] = $row['num']; } } $params['where'] = [['in','st.attr_id',$attr_id_arr],['>','st.stock',0],['=','st.status', StatusEnum::ENABLED], ['in','st.store_id',$store_id_arr]]; $params['with'] = [ 'goods' => function ($query) { $query->select('id,goods_name,is_on_sale,freight_type,cover_pic')->with(['extra']); } ]; $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'; $joins = array(['LEFT JOIN', GoodsAttr::tableName() . ' as att ', 'att.id = st.attr_id']); $params['join'] = $joins; $params['alias'] = 'st'; $list = StoreGoodsAttr::lists($params); $goods_ids= array_column($list,'goods_id'); $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(); if(!empty($params['store_id'])){ $store_id_arr = $params['store_id']; } $store_list = Store::lists(['where'=>[['id'=>$store_id_arr]],'select'=>'id,store_name,logo_img,business_time_start,business_time_end']); $rows = []; $user = $this->user; $user_level = UserLevel::findOne(['mall_id' => $this->mall_id, 'level' => $user['level'], 'status' => StatusEnum::ENABLED]); $discount = 10; if (isset($user_level)) $discount = $user_level['discount']; if (!empty($list)) { foreach ($list as $v) { if($v['is_on_sale']){ $v['member_price'] = StoreGoods::computeMemberPrice($v['price'],$v['sign_id'] ?? 0,$user['level'],$v['goods']['is_attr'] ?? 0, $v['goods']['extra']['is_member_price'],$member_price_setting ?? [],$discount); if (!empty($v['goods']['extra']['is_member_price']) && !empty($v['extra']['member_price_setting'])) { $member_price_setting = $v['extra']['member_price_setting']; if ($v['goods']['is_attr']) { if (!empty($member_price_setting['level' . $user['level']][$v['sign_id']])) $v['price'] = $member_price_setting['level' . $user['level']][$v['sign_id']]; } else { if (!empty($member_price_setting[$user['level']])) $v['price'] = $member_price_setting[$user['level']]; } } if(!empty($v['goods']['extra']['member_buy_limit_setting'])){ $member_buy_limit_setting = json_decode($v['goods']['extra']['member_buy_limit_setting'],true); } $filteredGoods = array_filter($storeGoodsList, function($item) use($v) { // 替换为你的具体条件 return $item['store_id'] == $v['store_id'] && $item['goods_id'] == $v['goods_id']; }); $firstMatch = reset($filteredGoods); $freight_type = json_decode($firstMatch['freight_type'],true); sort($freight_type); $rows[$v['store_id']][] = [ 'goods_id' => $v['goods_id'], 'num' => $num_arr[$v['attr_id']], 'attr_id' => $v['attr_id'], 'member_price' => $v['member_price'], 'price' => $v['price'], 'cover_pic' =>$v['pic_url']?$v['pic_url']:$v['goods']['cover_pic'], 'attr' => $v['name'], 'stock' => $v['stock'], 'goods_name' => $v['goods']['goods_name'], 'is_on_sale' => $v['is_on_sale'], 'freight_type' => $freight_type, 'member_buy_limit_setting' =>$member_buy_limit_setting??[], ]; } } } foreach ($store_list as &$val) { $total_price =$total_num = 0; $list = []; if(isset($rows[$val['id']])){ foreach ($rows[$val['id']] as $rk => $rv) { $price_sum = 0; $total_num += $rv['num']; $price_sum = bcmul($rv['price'], $rv['num'], 2); $total_price = bcadd($total_price, $price_sum, 2); } $list=$rows[$val['id']]; } $val['list'] = $list; $val['total_price'] = $total_price; $val['total_num'] = $total_num; } } return $this->success('操作成功', $store_list); } public function actionClear() { $get = \Yii::$app->request->get(); $params = []; $params['mall_id'] = $this->mall_id; $params['user_id'] = $this->user_id; $params['del_type'] = $get['del_type'] ?? 'del'; $params['select'] = $get['select'] ?? ''; if ($params['del_type'] == 'select') { $attr_ids = explode(',', $params['select']); $params['list'] = []; foreach ($attr_ids as $id) { $params['list'][]['attr_id'] = $id; } StoreCart::delCart($params); } else { StoreCart::clearCart($params); } return $this->success('操作成功', []); } public function actionUpdateCart() { try { $params = \Yii::$app->request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['goods_id','attr_id', 'num', 'store_id'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $goods = StoreGoods::getOne([ ['goods_id'=>$params['goods_id']], ['store_id'=>$params['store_id']], ['status'=>StatusEnum::ENABLED], [ 'is_on_sale'=>1], ],true); if (empty($params['num'])) return $this->error("请输入数量"); if (empty($goods)) return $this->error("商品不存在"); $goods['num'] = $params['num']; if (empty($goods['stock'])) return $this->error('库存不足'); if($goods['num']>$goods['stock'])return $this->error('超库存'); $params['store_id'] = $goods['store_id']; $params['mall_id'] = $this->mall_id; $params['user_id'] = $this->user_id; StoreCart::updateCart($params); return $this->success('修改购物车成功', []); }catch (\Exception $e){ return $this->error($e->getMessage(), []); } } }