123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386 |
- <?php namespace App\Http\Controllers\Api;
- use App\Http\Controllers\Api\Api;
- use App\Http\Requests\Api\ShopCart as Request;
- use App\Models\Business;
- use App\Models\Product\Skus as ProductSkus;
- use App\Models\PromoRebate;
- use App\Models\ShopCart as Model;
- use App\Models\PromoProduct as PromoProduct;
- use App\Models\Custom as Custom;
- use App\Models\WeiBan\Tags as WeiBanTags;
- /**
- * 购物车接口
- *
- * @author 刘相欣
- *
- * */
- class ShopCart extends Api{
- /**
- * 添加 /api/shop_cart/add
- *
- * @param int $product_id 产品ID
- * @param int $buy_num 添加数量
- *
- * */
- public function add(Request $request,Model $Model){
- // 接口验签
- // $this->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]);
- }
- }
|