当前位置:首页 > PHP教程 > php应用 > 列表

用PHP做了一个领取优惠券活动的示例代码

发布:smiling 来源: PHP粉丝网  添加日期:2021-12-02 15:16:10 浏览: 评论:0 

这篇文章主要介绍了用PHP做了一个领取优惠券活动的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

业务需求

优惠券活动,具体还是要根据自己的需求。以下是最近实现的优惠券活动,主要的业务需求:根据后端设置优惠券模板,用户类型设置,优惠券活动的开始与结束时间,最后生成不同的优惠券活动链接。

代码环境:

源码主要laravel5.8,一整个活动要贴的代码很多,下面主要贴核心代码,仅供参考。主要还是要根据自己的业务需求来实现功能吧。

以下是后端截图,做成模块化

PHP领取优惠券

前端需要做的设置与限制:

1 判断优惠券是否存在或者停用

2 判断活动开始时间与优惠券开始时间

接着领取活动优惠券,需要判断以下情况:

1 活动已结束

2 活动为开始时

3 活动为新用户领取,而领取的用户是老用户

4 活动为老用户领取,而领取的用户是新用户

5 优惠券是否领取完

6 已领取过优惠券提示

7 领取成功

下面核心代码实现

  1. /** 
  2.  * Function:优惠券领取处理 
  3.  * Author:cyw0413 
  4.  * @param $params 
  5.  * @return array 
  6.  * @throws \Exception 
  7.  */ 
  8. public function doCoupon($params
  9.   $activity_id = $params['activity_id']; 
  10.   if(!$params){ 
  11.     throw new \Exception("参数错误!"); 
  12.   } 
  13.  
  14.   $preg_phone = '/^1[34578]\d{9}$/ims'
  15.   $is_mobile = preg_match ($preg_phone$params['mobile']); 
  16.   if ($is_mobile == 0) { 
  17.     throw new \Exception("手机号码不正确!"); 
  18.   } 
  19.  
  20.   //隐藏手机号码中间4位 
  21.   $str_mobile = substr_replace($params['mobile'],'****',3,4); 
  22.  
  23.   $activity = $this->find($activity_id); 
  24.   if(emptyempty($activity)){ 
  25.     throw new \Exception("不存在此活动"); 
  26.   } 
  27.  
  28.   $activity_link = $activity->activityLink->where('coupon_status',0); //只选择不停用的优惠券 
  29.   if(count($activity_link) <= 0){ 
  30.     throw new \Exception("优惠券不存在或者已经停用"); 
  31.  
  32.   }else
  33.  
  34.     //查找注册用户ID 
  35.     $showUser = $this->showUser($params['mobile']); 
  36.     //主要是过滤掉领取优惠券为0的,用laravel的同学注意看看 
  37.     $detail = $activity_link->each(function($item,$indexuse ($showUser) { 
  38.  
  39.       $diffCouponQuantity = $this->diffCouponQuantity($item['config_id'],$item['quantity'],$item['activity_id'],$showUser); 
  40.       $item->title = $this->getCouponName($item['config_id'])['name']; 
  41.       $item->number = $item['quantity']; 
  42.       $item->msg  = $diffCouponQuantity ['msg']; 
  43.       $item->diff   = $diffCouponQuantity ['diff']; 
  44.       $item->code   = $diffCouponQuantity ['code']; 
  45.     })->toArray(); 
  46.  
  47.     if(count($detail) == 1){ 
  48.       foreach($detail as $val){ 
  49.         if($val['diff'] == 1 && $val['code'] == '400'){ 
  50.           throw new \Exception($detail[0]['msg']); 
  51.         } 
  52.       } 
  53.  
  54.     } 
  55.  
  56.     $collection_coupon = collect($detail); 
  57.     $collection_coupon = $collection_coupon->where('diff''<=' ,'0');  //去除优惠券剩余数量为0,或者领取优惠券数量-剩余数量 > 0 
  58.  
  59.   } 
  60.   //判断活动开始时间与优惠券开始时间 
  61.   $act_coupon = ActivityCouponBaseModel::where('activity_id',$activity['activity_id'])->first(); 
  62.   $check_time = $this-> checkCouponTime($act_coupon['start_time'],$activity_link); 
  63.   if($check_time == 'error'){ 
  64.     throw new \Exception("优惠券领取时间未开始,暂不可领取"); 
  65.   } 
  66.  
  67.   //领取活动有以下几种情况 
  68.   //1: 活动已结束 
  69.   if($activity['end_time'] < date("Y-m-d H:i:s") || $activity['status'] == 1){ 
  70.     $result = [ 
  71.       'code' => 1, 
  72.     ]; 
  73.     return $result
  74.   } 
  75.  
  76.   //6 活动为开始时 
  77.   if($activity['start_time'] > date("Y-m-d H:i:s") || $activity['status'] == 1){ 
  78.     $result = [ 
  79.       'code' => 6, 
  80.     ]; 
  81.     return $result
  82.  
  83.   } 
  84.  
  85.   $checkUser = $this->haveUser($params['mobile']); //检查是新用户,还是老用户 根据自己的业务需求做,这个方法就不贴了 
  86.   //2: 活动为新用户领取,而领取的用户是老用户 
  87.   if($activity['user_type'] == 1 && !emptyempty($checkUser)){ 
  88.     $result = [ 
  89.       'code' => 2, 
  90.     ]; 
  91.     return $result
  92.   } 
  93.  
  94.   //3:活动为老用户领取,而领取的用户是新用户 
  95.   if($activity['user_type']==2 && emptyempty($checkUser)){ 
  96.     $result = [ 
  97.       'code' => 3, 
  98.     ]; 
  99.     return $result
  100.   } 
  101.  
  102.  
  103.   //4:优惠券是否领取完 
  104.   $coupon = $this->getCouponExpire($collection_coupon,$params['mobile']); //这里提示有一个优惠券列表,根据自己的业务需求做,这个方法就不贴了 
  105.   //return $coupon; 
  106.   if($coupon == 1){ 
  107.     $result = [ 
  108.       'code' => 4, 
  109.     ]; 
  110.     return $result
  111.   } 
  112.  
  113.   //5:已领取过优惠券提示 
  114.   $userCoupon = ''
  115.   $userRate = ''
  116.   if(!emptyempty($checkUser)){ 
  117.     //user存在则为老用户,再检查是否领取过 
  118.     $userCoupon = $this->getUserCoupon($collection_coupon,$checkUser['user_id']); 
  119.     $userRate = $this->getUserCouponRate($checkUser['user_id'],$activity['activity_id']); 
  120.   }else
  121.     //新用户,检查是否注册过 
  122.     $var_user = UserBaseModel::where('user_name',$params['mobile'])->first(); 
  123.     if(!emptyempty($var_user)){ 
  124.       $userCoupon = $this->getUserCoupon($collection_coupon,$var_user['user_id']); 
  125.       $userRate = $this->getUserCouponRate($var_user['user_id'],$activity['activity_id']); 
  126.     } 
  127.   } 
  128.  
  129.   //return $userRate; 
  130.  
  131.   if($userCoupon == 1){ 
  132.     $result = [ 
  133.       'code' => 5, 
  134.       'phone'=> $str_mobile
  135.       'coupon' => $userRate
  136.       'is_get' => false, 
  137.     ]; 
  138.     return $result
  139.   } 
  140.  
  141.   //5:领取成功 
  142.   //如果活动规定是新老用户0,新用户1,老用户2 
  143.   $getCouponSuccess = $this->getCouponSuccess($activity['user_type'],$checkUser,$collection_coupon,$params['mobile']); 
  144.   //return $getCouponSuccess; 
  145.   if($getCouponSuccess['status'] == 200){ 
  146.     $result = [ 
  147.       'code' => 5, 
  148.       'phone'=> $str_mobile
  149.       'coupon' => $getCouponSuccess['result'][0], 
  150.       'is_get' => true, 
  151.     ]; 
  152.     return $result
  153.   } 
  154.  
  155.  

用户领取优惠券并发放优惠券

  1. /** 
  2.  * Function:用户领取活动 
  3.  * Author:cyw0413 
  4.  * @param $user_type 
  5.  */ 
  6. public function getCouponSuccess($user_type,$user,$coupon,$mobile
  7.   if(count($coupon) > 0){ 
  8.  
  9.     switch ($user_type){ 
  10.       case 1: 
  11.         //新用户领取,如果从来没注册过就要新增用户 
  12.         $res = $this->addUser($mobile,$coupon);  
  13.         return [ 
  14.           'result' => $res
  15.           'status' => 200 
  16.         ]; 
  17.         break
  18.       case 2: 
  19.         //老用户领取 
  20.         $res = $this->insertUserCoupon($user,$coupon); 
  21.         return [ 
  22.           'result' => $res
  23.           'status' => 200 
  24.         ]; 
  25.         break
  26.       default
  27.         //新老用户领取,判断是新用户还是老用户,这里的$user是有无配送单,有则为老用户; 
  28.         if(emptyempty($user)){ 
  29.           $res = $this->addUser($mobile,$coupon); 
  30.         }else
  31.  
  32.           $res = $this->insertUserCoupon($user,$coupon); //老用户,直接发放优惠券 
  33.         } 
  34.         return [ 
  35.           'result' => $res
  36.           'status' => 200 
  37.         ]; 
  38.         break
  39.     } 
  40.   }else
  41.     throw new \Exception("优惠券不存在或者已经停用"); 
  42.   } 

领取成功,则发放优惠券

  1. /** 
  2.  * Function:发放优惠券 
  3.  * Author:cyw0413 
  4.  * @param $user 
  5.  * @param $coupon 
  6.  */ 
  7. public function insertUserCoupon($user,$coupon
  8.   $relate = []; 
  9.   foreach($coupon as $item){ 
  10.  
  11.     $res = CouponConfigSendBaseModel::where([ 
  12.       'config_id'=>$item['config_id'], 
  13.       'status'  => 0, 
  14.     ])->first(); 
  15.  
  16.     if(emptyempty($res) || (!emptyempty($res) && $res['is_send'] == 0) ){ 
  17.       throw new \Exception("优惠券未发放,暂不可领取"); 
  18.     } 
  19.  
  20.     //发放优惠券,有多少张就添加多少张,这里扣除优惠券时,主要用不同的coupon_sn来区别 
  21.     $onlyCoupon = $this->getCouponName($item['config_id']); 
  22.     if ($onlyCoupon['expire_type'] == 0) { 
  23.       $start_time = $onlyCoupon['expire_start_time']; 
  24.       $end_time = $onlyCoupon['expire_end_time']; 
  25.     } else { 
  26.       $start_time = date('Y-m-d H:i:s'); 
  27.       $end_time = date('Y-m-d H:i:s', time()+86400*$onlyCoupon['expire_type']); 
  28.     } 
  29.  
  30.     $result = [ 
  31.       'user_id'  => $user['user_id'], 
  32.       'config_id' => $item['config_id'], 
  33.       'name'   => $onlyCoupon['name'], 
  34.       'get_type' => $onlyCoupon['get_type'], 
  35.       'amount'  => $onlyCoupon['amount'], 
  36.       'require_price' => $onlyCoupon['require_price'], 
  37.       'status'    => 1, 
  38.       'start_time'  => $start_time
  39.       'end_time'   => $end_time
  40.     ]; 
  41.     for($i=0; $i < $item['quantity'];$i++){ 
  42.       $result['coupon_sn'] = 'B'.mt_rand(1, 10000) . strtoupper(uniqid(mt_rand(1, 10000))); 
  43.       $userCoupon = UserCouponBaseModel::create($result); 
  44.     } 
  45.  
  46.     //扣除相应的优惠券数量,这里用到了锁表,防止并发时,优惠券为-1 
  47.     $couponConfig = CouponConfigBaseModel::where('config_id',$item['config_id'])->lockForUpdate()->first(); 
  48.     if($couponConfig->left_quantity > 0 ){ 
  49.       if($couponConfig->left_quantity >= $item['quantity']){ 
  50.         $couponConfig->left_quantity = $couponConfig->left_quantity-$item['quantity']; 
  51.         $couponConfig->save(); 
  52.       }else
  53.         throw new \Exception("优惠券剩余数量不够扣减"); 
  54.       } 
  55.  
  56.     } 
  57.  
  58.  
  59.     $relate = [ 
  60.       'coupon_id' => $userCoupon->coupon_id, 
  61.       'user_id'  => $user['user_id'], 
  62.       'config_id' => $item['config_id'], 
  63.       'activity_id' => $item['activity_id'
  64.     ]; 
  65.  
  66.     ActivityCouponUserRelateBaseModel::create($relate); 
  67.  
  68.     $relate[] = $this->getUserCouponRate($user['user_id'],$item['activity_id']); 
  69.  
  70.  
  71.   } 
  72.  
  73.   return $relate
  74. }

Tags: PHP领取优惠券

分享到: