request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['goods_id','attr_id', 'num'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $goods = StoreGoods::getOne([ ['id'=>$params['goods_id']], ['status'=>StatusEnum::ENABLED], [ 'is_on_sale'=>1], ['check_status'=>1], ],true,['extra']); if (empty($params['num'])) return $this->error("请输入数量"); if (empty($goods)) return $this->error("商品不存在"); if(!empty($goods['goods_source'])) return $this->error('该商品不允许加入购物车'); // 没有规格id则查找默认规格【寻找价格最低的规格】 $where = ['goods_id' => $params['goods_id'], 'status' => StatusEnum::ENABLED]; !empty($params['attr_id']) && $where['id'] = $params['attr_id']; $goods_attr = StoreGoodsAttr::find()->where($where)->orderBy('price asc')->one(); if($goods_attr->goods_id!=$params['goods_id']) return $this->error("goods_id与attr_id不配对"); $cart_goods_nums = StoreCart::getCartGoodsNums($this->user_id,$params['attr_id']); $goods['num'] = $params['num']+$cart_goods_nums; $this->userLimit($this->user,$goods); if (empty($goods['is_attr'])) { if (empty($goods['stock'])) return $this->error('库存不足'); if($goods['num']>$goods['stock'])return $this->error('超库存'); } else { //多规格 if (empty($goods_attr)) return $this->error("所选的规格不存在"); if (empty($goods_attr['stock'])) return $this->error("所选的规格库存不足"); if($goods['num']>$goods_attr['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(), []); } } public function actionUpdateCart() { try { $params = \Yii::$app->request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['goods_id','attr_id', 'num'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $goods = StoreGoods::getOne([ ['id'=>$params['goods_id']], ['status'=>StatusEnum::ENABLED], [ 'is_on_sale'=>1], ['check_status'=>1], ],true,['extra']); if (empty($params['num'])) return $this->error("请输入数量"); if (empty($goods)) return $this->error("商品不存在"); if(!empty($goods['goods_source'])) return $this->error('该商品不允许加入购物车'); // 没有规格id则查找默认规格【寻找价格最低的规格】 $where = ['goods_id' => $params['goods_id'], 'status' => StatusEnum::ENABLED]; !empty($params['attr_id']) && $where['id'] = $params['attr_id']; $goods_attr = StoreGoodsAttr::find()->where($where)->orderBy('price asc')->one(); if($goods_attr->goods_id!=$params['goods_id']) return $this->error("goods_id与attr_id不配对"); $goods['num'] = $params['num']; $this->userLimit($this->user,$goods); if (empty($goods['is_attr'])) { if (empty($goods['stock'])) return $this->error('库存不足'); if($goods['num']>$goods['stock'])return $this->error('超库存'); } else { //多规格 if (empty($goods_attr)) return $this->error("所选的规格不存在"); if (empty($goods_attr['stock'])) return $this->error("所选的规格库存不足"); if($goods['num']>$goods_attr['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(), []); } } protected function userLimit($user,$goods){ $extra = $goods['extra']; if(!empty($extra)){ $member_buy_limit_setting = json_decode($extra['member_buy_limit_setting'],true); if (!empty($member_buy_limit_setting['member_level'])) { if (!in_array($user->level, $member_buy_limit_setting['member_level'])) { throw new \Exception('该商品为指定会员购买请升级购买'); } } if ($member_buy_limit_setting['nums'] > $goods['num']) { throw new \Exception('该商品起购数量为' . $member_buy_limit_setting['nums']); } if ($member_buy_limit_setting['every_num'] < $goods['num'] && $member_buy_limit_setting['every_num'] != 0) { throw new \Exception('该商品每次限购' . $member_buy_limit_setting['every_num']); } $already_buy = $this->statisticsBuyGoodsId($goods['goods_id'] ?? 0, $user['id']); if ($member_buy_limit_setting['total_num'] < $goods['num'] + $already_buy['all'] && $member_buy_limit_setting['total_num'] != 0) { throw new \Exception('该商品限购' . $member_buy_limit_setting['total_num']); } if ($member_buy_limit_setting['every_day_num'] < $goods['num'] + $already_buy['day'] && $member_buy_limit_setting['every_day_num'] != 0) { throw new \Exception('该商品每日限购' . $member_buy_limit_setting['every_day_num']); } if ($member_buy_limit_setting['every_week_num'] < $goods['num'] + $already_buy['week'] && $member_buy_limit_setting['every_week_num'] != 0) { throw new \Exception('该商品每周限购' . $member_buy_limit_setting['every_week_num']); } if ($member_buy_limit_setting['every_month_num'] < $goods['num'] + $already_buy['month'] && $member_buy_limit_setting['every_month_num'] != 0) { throw new \Exception('该商品每月限购' . $member_buy_limit_setting['every_month_num']); } } } protected function statisticsBuyGoodsId($goods_id, $user_id): array { $params['where'] = [ [ 'user_id'=>$user_id], ['goods_id'=> $goods_id], // ['is_feedback'=> OrderStatusEnum::NOT_FEEDBACK], ['>=', 'order_status', 0] ]; $params['select'] = 'created_at,num'; $already_buy = StoreOrderDetail::lists($params); $res_data = [ 'day' => 0, 'week' => 0, 'month' => 0, 'all' => 0, ]; if (!empty($already_buy)) { $time = time(); $date = date('Y-m-d', $time); $day_start = strtotime($date . ' 00:00:00'); $day_end = strtotime($date . ' 23:59:59'); $w = date('w', strtotime($date)); $week_start = strtotime(date('Y-m-d', strtotime($date . '-' . ($w ? $w - 1 : 6) . 'days')) . ' 00:00:00'); $week_end = $week_start + (86400 * 6) - 1; $date = date('Y-m', $time); $month_start = strtotime(date('Y-m-01', strtotime(date($date))) . ' 00:00:00'); $month_end = $month_start + (86400 * date('t')) - 1; foreach ($already_buy as $k) { $date = $k['created_at']; $num = $k['num']; if ($date > $day_start && $date < $day_end) { $res_data['day'] += $num; } if ($date > $week_start && $date < $week_end) { $res_data['week'] += $num; } if ($date > $month_start && $date < $month_end) { $res_data['month'] += $num; } $res_data['all'] += $num; } } return $res_data; } /** * 删除购物车 * @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'] = [['id' => $attr_id_arr],['>','stock',0],['status'=>StatusEnum::ENABLED]]; $params['with'] = ['goods' => function ($query) { $query->select('id,store_id,goods_name,is_on_sale,freight_type,cover_pic')->with(['extra']); }]; $params['select'] = 'id,goods_id,pic_url,price,name,stock'; $list = StoreGoodsAttr::lists($params); 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['goods']['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); } $freight_type = explode(',',$v['goods']['freight_type']); sort($freight_type); $rows[$v['goods']['store_id']][] = [ 'goods_id' => $v['goods_id'], 'num' => $num_arr[$v['id']], 'attr_id' => $v['id'], 'price' => $v['price'], 'member_price' => $v['member_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['goods']['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; $val['business_status'] = StoreService::checkBusinessTime($val, 'front') ?? ''; } } 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('操作成功', []); } }