Browse Source

修改产品促销活动

jun 3 days ago
parent
commit
7efccbb760
2 changed files with 181 additions and 95 deletions
  1. 80 95
      app/Http/Controllers/Api/ShopCart.php
  2. 101 0
      app/Models/PromoProduct.php

+ 80 - 95
app/Http/Controllers/Api/ShopCart.php

@@ -227,75 +227,77 @@ class ShopCart extends Api{
 	 * @param	int     $id		        购物车id
 	 * @param	int     $id		        购物车id
 	 * 
 	 * 
 	 * */
 	 * */
-	public function check_list(Request $request,Model $Model,ProductSkus $ProductSkus,Business $Business,PromoProduct $PromoProduct,Custom $Custom,WeiBanTags $WeiBanTags,PayCity $PayCity,ProductCity $ProductCity){
-		// 接口验签
-		// $this->verify_sign();
+    public function check_list(Request $request,Model $Model,ProductSkus $ProductSkus,Business $Business,PromoProduct $PromoProduct,Custom $Custom,WeiBanTags $WeiBanTags,PayCity $PayCity,ProductCity $ProductCity){
+        // 接口验签
+        // $this->verify_sign();
         // 验证参数
         // 验证参数
-		$request->scene('check_list')->validate();
-		// 检查登录
-		$uid						= $this->checkLogin();
+        $request->scene('check_list')->validate();
+        // 检查登录
+        $uid						= $this->checkLogin();
         // 获取客户信息
         // 获取客户信息
         $custom						= $uid ? $Custom->getOne($uid) : [];
         $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'));
+        // 接收参数
+        $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'));
         $promoList					= $PromoProduct->getListByIds(array_column($list,'product_id'));
         // 查询用户标签
         // 查询用户标签
         $tags                       = empty($custom['weiban_extid']) ? [] : $WeiBanTags->getListByWeibanExtid($custom['weiban_extid']);
         $tags                       = empty($custom['weiban_extid']) ? [] : $WeiBanTags->getListByWeibanExtid($custom['weiban_extid']);
-		// 用户所在城市
+        // 用户所在城市
         $cityId                     = empty($custom['city_id']) ? 0 : $custom['city_id'];
         $cityId                     = empty($custom['city_id']) ? 0 : $custom['city_id'];
-		// 满减活动
+        // 满减活动
         $promoProductList           = [];
         $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;
-			}
+        // 产品价格同级,用于优惠券计算
+        $productPrice					= [];
+        // 循环处理数据
+        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 ($promoList && $cityId){
                 if (isset($promoList[$value['product_id']])){
                 if (isset($promoList[$value['product_id']])){
                     $promoInfo          =   $promoList[$value['product_id']];
                     $promoInfo          =   $promoList[$value['product_id']];
@@ -341,10 +343,10 @@ class ShopCart extends Api{
                 }
                 }
 
 
             }
             }
-			// 产品图路径
-			$value['thumb']			= path_compat($value['thumb']);
-			// 库存超出的时候
-			if($value['buy_num'] > $value['stock'] ) $value['buy_num'] = $value['stock'];
+            // 产品图路径
+            $value['thumb']			= path_compat($value['thumb']);
+            // 库存超出的时候
+            if($value['buy_num'] > $value['stock'] ) $value['buy_num'] = $value['stock'];
             // 允许城市
             // 允许城市
             $allowCity                  = $ProductCity->where([['product_id','=',$value['product_id']]])->pluck('city_id')->toArray();
             $allowCity                  = $ProductCity->where([['product_id','=',$value['product_id']]])->pluck('city_id')->toArray();
             //判断产品城市是否设置了支付
             //判断产品城市是否设置了支付
@@ -357,32 +359,16 @@ class ShopCart extends Api{
                 }
                 }
             }
             }
             $value['is_pay']        = $isPay;
             $value['is_pay']        = $isPay;
-			// 重组
-			$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;
-                    }
-                }
-            }
+            // 重组
+            $list[$key]				= $value;
+            // 计算总价
+            $productPrice[$value['product_id']]['price_total']		= bcmul($value['price'],$value['buy_num'],2) ;
         }
         }
+        /*活动优惠数据*/
+        $promoListData					    = $PromoProduct->getRebatePriceNew(array_column($list,'product_id'),$uid,$productPrice,$cityId,$tags);
+        $discount_total				        = $promoListData['discount_total'];
+        $reduction_total				    = $promoListData['reduction_total'];
+        $promoRebateIds				        = $promoListData['promo_rebate_ids'];
         $promoRebateList    =   [];
         $promoRebateList    =   [];
         //如果有赠品
         //如果有赠品
         if ($promoRebateIds){
         if ($promoRebateIds){
@@ -402,11 +388,10 @@ class ShopCart extends Api{
                 }
                 }
             }
             }
         }
         }
-        $discount = number_format($discount,2);
-		// 重组数组
-		$list						= array_values($list);
-		// 返回结果
-		return						json_send(['code'=>'success','msg'=>'获取成功','data'=>$list,'discount'=>$discount,'reduction'=>$reduction,'promoRebateList'=>$promoRebateList]);
-	}
+        // 重组数组
+        $list						= array_values($list);
+        // 返回结果
+        return						json_send(['code'=>'success','msg'=>'获取成功','data'=>$list,'discount'=>$discount_total,'reduction'=>$reduction_total,'promoRebateList'=>$promoRebateList]);
+    }
 
 
 }
 }

+ 101 - 0
app/Models/PromoProduct.php

@@ -266,5 +266,106 @@ class PromoProduct extends Model
         // 返回扣减结果
         // 返回扣减结果
         return                              ['product_price'=>$productPrice,'rebate_product'=>$list,'reduction_total'=>$reductionTotal];
         return                              ['product_price'=>$productPrice,'rebate_product'=>$list,'reduction_total'=>$reductionTotal];
     }
     }
+    /**
+     * 获取优惠券扣减金额
+     *
+     */
+    public function getRebatePriceNew($productIds,$uid,$productPrice,$cityId,$tags){
+        $reductionTotal =   0;
+        $discountTotal  =   0;
+        $promoRebateIds =   [];
+        $productPromo   =   [];
+        // 如果有产品
+        if( !$productIds )			return ['is_used'=>0,'product_price'=>$productPrice,'rebate_product'=>[],'reduction_total'=>$reductionTotal,'discount_total'=>$discountTotal,'promo_rebate_ids'=>$promoRebateIds];
+        // 获取产品活动
+        $promoList							= $this->getListByIds_new($productIds);
+        $promoProductList   =   [];
+        foreach ($promoList as $promoListItem) {
+            foreach ($promoListItem as $promoInfo){
+                $promoInfoCity      =   [];
+                if ($promoInfo['city_ids']){
+                    $promoInfoCity      =   explode(',',$promoInfo['city_ids']);
+                }
+                $promoInfo['price_total']      =   $productPrice[$promoInfo['product_id']]['price_total'];
+                // 判断是不是可以参与
+                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) {
+                                $promoProductList[$promoInfo['id']][] = $promoInfo;
+                            }
+                        }
+                    } else {
+                        $promoProductList[$promoInfo['id']][] = $promoInfo;
+                    }
+                }
+            }
+        }
+        if( !$promoProductList )			return ['is_used'=>0,'product_price'=>$productPrice,'rebate_product'=>[],'reduction_total'=>$reductionTotal,'discount_total'=>$discountTotal,'promo_rebate_ids'=>$promoRebateIds];
+        foreach ($promoProductList as $key => $value){
+            $reduction  =   0;
+            $priceSum   =   array_sum(array_column($value,'price_total'));
+            if ($priceSum >= $value[0]['std_pay']) {
+                foreach ($value as $v){
+                    $productPromo[$v['product_id']][]  = [
+                        'promo_id'      => $key,
+                        'rebate'        => $v['rebate'],
+                    ];
+                }
+            }
+        }
+        if (!$productPromo)             return ['is_used'=>0,'product_price'=>$productPrice,'rebate_product'=>[],'reduction_total'=>$reductionTotal,'discount_total'=>$discountTotal,'promo_rebate_ids'=>$promoRebateIds];
+        foreach ($productPromo as $key => $value){
+            $rebateValue        = 0;
+            $rebateKey          = 0;
+            foreach ($value as $v){
+                if($v['rebate']>$rebateValue){
+                    unset($promoProductList[$rebateKey]);
+                    $rebateValue = $v['rebate'];
+                    $rebateKey   = $v['promo_id'];
+                }else{
+                    unset($promoProductList[$v['promo_id']]);
+                }
+            }
+        }
+        foreach ($promoProductList as $key => $value){
+            $reduction  =   0;
+            $priceSum   =   array_sum(array_column($value,'price_total'));
+            if ($priceSum >= $value[0]['std_pay']) {
 
 
+                switch ($value[0]['rebate_type']){
+                    case 1:
+                        $reduction        =  $value[0]['rebate'];
+                        $reductionTotal   +=  $value[0]['rebate'];
+                        break;
+                    case 2:
+                        $discount          =  $priceSum - number_format($priceSum * $value[0]['rebate']/10,2);
+                        $discountTotal     +=  $priceSum - number_format($priceSum * $value[0]['rebate']/10,2);
+                        break;
+                    case 3:
+                        $promoRebateIds[]     =  $key;
+                }
+            }
+            if ($reduction){
+                foreach ($value as $k=>$v){
+                    // 优惠价格 = 价格占总价的比例 * 优惠的总价
+                    $productPrice[$v['product_id']]['promo_rebate_price']          = number_format( $reduction * ($productPrice[$v['product_id']]['price_total'] / $priceSum) , 2 , '.' ,'');
+                }
+            }
+        }
+        //如果有赠品
+        $list       =   [];
+        // 返回扣减结果
+        return                              ['product_price'=>$productPrice,'rebate_product'=>$list,'reduction_total'=>$reductionTotal,'discount_total'=>$discountTotal,'promo_rebate_ids'=>$promoRebateIds];
+    }
 }
 }