verify_sign(); // 验证参数 $request->scene('add')->validate(); // 检查登录 $uid = $this->checkLogin(); // 接收参数 $data['product_id'] = request('product_id',0); $data['skuid'] = request('skuid',0); $data['buy_num'] = request('buy_num',1); $data['custom_uid'] = $uid; // 查询 $id = $Model->query()->where([['custom_uid','=',$uid],['product_id','=',$data['product_id']],['skuid','=',$data['skuid']]])->value('id'); // 如果存在id,更新数量 $result = $id ? $Model->incrBuyNum($id,$uid,$data['buy_num']) : $Model->add($data); // 提交结果 if( !$result ) return json_send(['code'=>'success','msg'=>'加入购物车失败','data'=>['error'=>'加入购物车失败']]); // 返回结果 return json_send(['code'=>'success','msg'=>'添加成功','data'=>$data]); } /** * 更新 /api/shop_cart/edit * * @param int $id 购物车id * * */ public function edit(Request $request,Model $Model){ // 接口验签 // $this->verify_sign(); // 验证参数 $request->scene('edit')->validate(); // 检查登录 $uid = $this->checkLogin(); // 接收参数 $id = request('id',0); $data['buy_num'] = request('buy_num',1); // 如果存在id,更新数量 $result = $Model->edit($id,$uid,$data); // 提交结果 if( !$result ) return json_send(['code'=>'success','msg'=>'更新失败','data'=>['error'=>'更新购物车失败']]); // 返回结果 return json_send(['code'=>'success','msg'=>'更新成功','data'=>$data]); } /** * 更新 /api/shop_cart/del * * @param int $id 购物车id * * */ public function del(Request $request,Model $Model){ // 接口验签 // $this->verify_sign(); // 验证参数 $request->scene('del')->validate(); // 检查登录 $uid = $this->checkLogin(); // 接收参数 $id = request('id',0); // 如果存在id,更新数量 $result = $Model->del($id,$uid); // 提交结果 if( !$result ) return json_send(['code'=>'success','msg'=>'删除失败','data'=>['error'=>'删除购物车失败']]); // 返回结果 return json_send(['code'=>'success','msg'=>'删除成功','data'=>['id'=>$id]]); } /** * 获取列表 /api/shop_cart/get_list * * @param int $id 购物车id * * */ public function get_list(Request $request,Model $Model,ProductSkus $ProductSkus,Business $Business,PromoProduct $PromoProduct,Custom $Custom,WeiBanTags $WeiBanTags){ // 接口验签 // $this->verify_sign(); // 验证参数 $request->scene('get_list')->validate(); // 检查登录 $uid = $this->checkLogin(); // 获取客户信息 $custom = $uid ? $Custom->getOne($uid) : []; // 显示 $map = [['shop_cart.custom_uid','=',$uid]]; // 查询 $list = $Model->query() ->join('product','shop_cart.product_id','=','product.id') ->where($map) ->get([ 'shop_cart.id','shop_cart.checked','shop_cart.product_id','shop_cart.skuid','shop_cart.buy_num', 'product.stock','product.business_id','product.spec','product.thumb','product.name','product.price','product.market_price','product.status as product_status' ]) ->toArray(); // 判断结果 $skusList = $ProductSkus->getListByIds(array_column($list,'skuid')); //查询产品活动 $promoList = $PromoProduct->getListByIds(array_column($list,'product_id')); // 查询用户标签 $tags = empty($custom['weiban_extid']) ? [] : $WeiBanTags->getListByWeibanExtid($custom['weiban_extid']); // 用户所在城市 $cityId = empty($custom['city_id']) ? 0 : $custom['city_id']; // 循环处理数据 foreach ($list as $key => $value) { // 获取商业公司名称 $value['business_name'] = $value['business_id'] ? (string) $Business->getOne($value['business_id'],'name') : ''; // 如果有sku if( $value['skuid'] ) { // 是否存在 $isExist = false; // 循环SKU foreach ($skusList as $sku) { // 如果SKU存在的话 if( $sku['sku_id'] == $value['skuid'] ) { $value['price'] = $sku['price']; $value['spec'] = $sku['sku_attr_names']; $value['stock'] = $sku['stock']; $isExist = true; } } // 如果不存在,状态变动 if( !$isExist ) $value['product_status'] = 4; } // 满减活动 if ($promoList && $cityId){ if (isset($promoList[$value['product_id']])){ $promoInfo = $promoList[$value['product_id']]; $promoTitle = "满". $promoInfo['std_pay']. "元"; if ($promoInfo['rebate_type'] == 1){ $promoTitle .= "减". $promoInfo['rebate']. "元"; }elseif ($promoInfo['rebate_type'] == 2){ $promoTitle .= "打". $promoInfo['rebate']. "折"; }elseif ($promoInfo['rebate_type'] == 3){ $rebate = (string) PromoRebate::query()->join('product','promo_rebate.product_id','=','product.id')->where([['promo_id','=',$promoInfo['id']]])->value('product.name'); $promoTitle .= "赠送". $rebate; } $promoInfoCity = []; if ($promoInfo['city_ids']){ $promoInfoCity = explode(',',$promoInfo['city_ids']); } // 判断是不是可以参与 if (!$promoInfoCity || in_array($cityId,$promoInfoCity)){ if( $promoInfo['tag_scope']) { // 解析数组 $promoInfo['tag_scope'] = explode(',',$promoInfo['tag_scope']); // 标签范围限定时,默认不能参与 $allowJoin = 0; // 判断标签是不是存在 if ($tags){ foreach ($tags as $v) { // 标签范围内,允许参加 if( in_array($v['name'],$promoInfo['tag_scope']) ) $allowJoin = 1; } // 在范围 if( $allowJoin ) { $value['promo_title'] = $promoTitle; } } }else{ $value['promo_title'] = $promoTitle; } } } } // 产品图路径 $value['thumb'] = path_compat($value['thumb']); // 库存超出的时候 if($value['buy_num'] > $value['stock'] ) $value['buy_num'] = $value['stock']; // 重组 $list[$key] = $value; } // 返回结果 return json_send(['code'=>'success','msg'=>'获取成功','data'=>$list]); } /** * 结算列表 /api/shop_cart/check_list * * @param int $id 购物车id * * */ public function check_list(Request $request,Model $Model,ProductSkus $ProductSkus,Business $Business,PromoProduct $PromoProduct,Custom $Custom,WeiBanTags $WeiBanTags){ // 接口验签 // $this->verify_sign(); // 验证参数 $request->scene('check_list')->validate(); // 检查登录 $uid = $this->checkLogin(); // 获取客户信息 $custom = $uid ? $Custom->getOne($uid) : []; // 接收参数 $cartIds = request('cart_ids',''); // 转成数组 $cartIds = explode(',',$cartIds); // 循环处理 foreach ($cartIds as $key => $value) { // 如果不是数值 if( $value < 1 ) unset($cartIds[$key]); } // 如果不存在的话 if( !$cartIds ) return json_send(['code'=>'error','msg'=>'请选择可用产品','data'=>['error'=>request('cart_ids','')]]); // 显示 $map = [['shop_cart.custom_uid','=',$uid],['product.status','=',0]]; // 查询 $list = $Model->query() ->join('product','shop_cart.product_id','=','product.id') ->whereIn('shop_cart.id',$cartIds)->where($map) ->get([ 'shop_cart.id','shop_cart.checked','shop_cart.product_id','shop_cart.skuid','shop_cart.buy_num', 'product.stock','product.business_id','product.spec','product.thumb','product.name','product.price','product.market_price','product.status as product_status' ])->toArray(); // 判断结果 $skusList = $ProductSkus->getListByIds(array_column($list,'skuid')); //查询产品活动 $promoList = $PromoProduct->getListByIds(array_column($list,'product_id')); // 查询用户标签 $tags = empty($custom['weiban_extid']) ? [] : $WeiBanTags->getListByWeibanExtid($custom['weiban_extid']); // 用户所在城市 $cityId = empty($custom['city_id']) ? 0 : $custom['city_id']; // 满减活动 $promoProductList = []; // 循环处理数据 foreach ($list as $key => $value) { // 获取商业公司名称 $value['business_name'] = $value['business_id'] ? (string)$Business->getOne($value['business_id'],'name') : ''; // 如果有sku if( $value['skuid'] ) { // 是否存在 $isExist = false; // 循环SKU foreach ($skusList as $sku) { // 如果SKU存在的话 if( $sku['sku_id'] == $value['skuid'] ) { $value['price'] = $sku['price']; $value['spec'] = $sku['sku_attr_names']; $value['stock'] = $sku['stock']; $isExist = true; } } // 如果不存在,状态变动 if( !$isExist ) { unset($list[$key]); continue; } } // 如果不存在,状态变动 if( $value['stock'] <= 0 ) { unset($list[$key]); continue; } if ($promoList && $cityId){ if (isset($promoList[$value['product_id']])){ $promoInfo = $promoList[$value['product_id']]; $promoInfo['price'] = $value['price'] * $value['buy_num']; $promoTitle = "满". $promoInfo['std_pay']. "元"; if ($promoInfo['rebate_type'] == 1){ $promoTitle .= "减". $promoInfo['rebate']. "元"; }elseif ($promoInfo['rebate_type'] == 2){ $promoTitle .= "打". $promoInfo['rebate']. "折"; }elseif ($promoInfo['rebate_type'] == 3){ $rebate = (string) PromoRebate::query()->join('product','promo_rebate.product_id','=','product.id')->where([['promo_id','=',$promoInfo['id']]])->value('product.name'); $promoTitle .= "赠送". $rebate; } $promoInfoCity = []; if ($promoInfo['city_ids']){ $promoInfoCity = explode(',',$promoInfo['city_ids']); } // 判断是不是可以参与 if (!$promoInfoCity || in_array($cityId,$promoInfoCity)){ if( $promoInfo['tag_scope']) { // 解析数组 $promoInfo['tag_scope'] = explode(',',$promoInfo['tag_scope']); // 标签范围限定时,默认不能参与 $allowJoin = 0; // 判断标签是不是存在 if ($tags){ foreach ($tags as $v) { // 标签范围内,允许参加 if( in_array($v['name'],$promoInfo['tag_scope']) ) $allowJoin = 1; } // 在范围 if( $allowJoin ) { $value['promo_title'] = $promoTitle; $promoProductList[$promoInfo['id']][] = $promoInfo; } } }else{ $value['promo_title'] = $promoTitle; $promoProductList[$promoInfo['id']][] = $promoInfo; } } } } // 产品图路径 $value['thumb'] = path_compat($value['thumb']); // 库存超出的时候 if($value['buy_num'] > $value['stock'] ) $value['buy_num'] = $value['stock']; // 重组 $list[$key] = $value; } $promoRebateIds = []; //满折扣 $discount = 0; //满减 $reduction = 0; //计算产品促销活动优惠价格 if ($promoProductList){ foreach ($promoProductList as $key => $value){ $priceSum = array_sum(array_column($value,'price')); if ($priceSum >= $value[0]['std_pay']) { switch ($value[0]['rebate_type']){ case 1: $reduction += $value[0]['rebate']; break; case 2: $discount += $priceSum - number_format($priceSum * $value[0]['rebate']/10,2); break; case 3: $promoRebateIds[] = $key; } } } } $promoRebateList = []; //如果有赠品 if ($promoRebateIds){ $promoRebateList = PromoRebate::query() ->join('product','promo_rebate.product_id','=','product.id') ->where('status','=',0) ->whereIn('promo_id',$promoRebateIds) ->select(['promo_rebate.id as promo_rebate_id','promo_rebate.rebate_num as buy_num','product.stock','product.spec','product.thumb','product.name','product.price','product.market_price','product.status as product_status']) ->get() ->toArray(); if ($promoRebateList){ foreach ($promoRebateList as &$value){ // 产品图路径 $value['thumb'] = path_compat($value['thumb']); // 库存超出的时候 if($value['buy_num'] > $value['stock'] && $value['stock'] > 0) $value['buy_num'] = $value['stock']; } } } $discount = number_format($discount,2); // 重组数组 $list = array_values($list); // 返回结果 return json_send(['code'=>'success','msg'=>'获取成功','data'=>$list,'discount'=>$discount,'reduction'=>$reduction,'promoRebateList'=>$promoRebateList]); } }