ホームページ > バックエンド開発 > PHPの問題 > PHPクーポンの実装とは何ですか

PHPクーポンの実装とは何ですか

藏色散人
リリース: 2023-03-14 08:56:01
オリジナル
2965 人が閲覧しました

php クーポンの実装方法: 1. フロントエンド ファイルを作成し、クーポンが存在するか無効化されているかを確認します。 2. PHP サンプル ファイルを作成します。 3. 「パブリック関数 doCoupon($params){ ...}" およびクーポン収集状況を処理するその他のメソッド。

PHPクーポンの実装とは何ですか

この記事の動作環境:Windows7システム、PHP7.4バージョン、DELL G3コンピュータ

導入方法とはphp クーポンの?

PHP を使用して、クーポン アクティビティを受信するためのサンプル コードを作成します。

ビジネス要件

クーポン アクティビティの詳細は次のとおりです。自分のニーズに合わせて。最近実装されたクーポン アクティビティの主なビジネス要件は次のとおりです。バックエンドに応じたクーポン テンプレートの設定、ユーザー タイプ、クーポン アクティビティの開始時間と終了時間の設定、そして最後にさまざまなクーポン アクティビティ リンクの生成です。

コード環境

ソースコードはlaravel5.8を中心に、アクティビティ全体で投稿するコードが多くなります。以下にコアコードを中心に掲載しますので、参考程度にしてください。主なことは、独自のビジネス ニーズに応じて機能を実装することです。

以下は、モジュール化されたバックエンドのスクリーンショットです。

フロントで行う必要がある設定と制限-end:

1 クーポンが存在するか無効になっているかを確認します。
2 イベント開始時間とクーポン開始時間を確認します。

その後、クーポンを受け取るにはイベント クーポンについては、次の状況を判断する必要があります。
1 アクティビティは終了しました
2 アクティビティは開始中です
3 アクティビティは新規ユーザーが受け取るものであり、受け取ったユーザーは古いユーザーですusers
4 このアクティビティは古いユーザーが受け取るものであり、それを受け取るユーザーは新しいユーザーです
5 クーポンが収集されたかどうか
6 すでにクーポンのプロンプトを受け取りました##7 正常に受け取りました

次のコア コードは、

/**
 * Function:优惠券领取处理
 * Author:cyw0413
 * @param $params
 * @return array
 * @throws \Exception
 */
public function doCoupon($params)
{
  $activity_id = $params['activity_id'];
  if(!$params){
    throw new \Exception("参数错误!");
  }

  $preg_phone = '/^1[34578]\d{9}$/ims';
  $is_mobile = preg_match ($preg_phone, $params['mobile']);
  if ($is_mobile == 0) {
    throw new \Exception("手机号码不正确!");
  }

  //隐藏手机号码中间4位
  $str_mobile = substr_replace($params['mobile'],'****',3,4);

  $activity = $this->find($activity_id);
  if(empty($activity)){
    throw new \Exception("不存在此活动");
  }

  $activity_link = $activity->activityLink->where('coupon_status',0); //只选择不停用的优惠券
  if(count($activity_link) <= 0){
    throw new \Exception("优惠券不存在或者已经停用");

  }else{

    //查找注册用户ID
    $showUser = $this->showUser($params[&#39;mobile&#39;]);
    //主要是过滤掉领取优惠券为0的,用laravel的同学注意看看
    $detail = $activity_link->each(function($item,$index) use ($showUser) {

      $diffCouponQuantity = $this->diffCouponQuantity($item[&#39;config_id&#39;],$item[&#39;quantity&#39;],$item[&#39;activity_id&#39;],$showUser);
      $item->title = $this->getCouponName($item[&#39;config_id&#39;])[&#39;name&#39;];
      $item->number = $item[&#39;quantity&#39;];
      $item->msg  = $diffCouponQuantity [&#39;msg&#39;];
      $item->diff   = $diffCouponQuantity [&#39;diff&#39;];
      $item->code   = $diffCouponQuantity [&#39;code&#39;];
    })->toArray();

    if(count($detail) == 1){
      foreach($detail as $val){
        if($val[&#39;diff&#39;] == 1 && $val[&#39;code&#39;] == &#39;400&#39;){
          throw new \Exception($detail[0][&#39;msg&#39;]);
        }
      }

    }

    $collection_coupon = collect($detail);
    $collection_coupon = $collection_coupon->where(&#39;diff&#39;, &#39;<=&#39; ,&#39;0&#39;);  //去除优惠券剩余数量为0,或者领取优惠券数量-剩余数量 > 0

  }
  //判断活动开始时间与优惠券开始时间
  $act_coupon = ActivityCouponBaseModel::where(&#39;activity_id&#39;,$activity[&#39;activity_id&#39;])->first();
  $check_time = $this-> checkCouponTime($act_coupon[&#39;start_time&#39;],$activity_link);
  if($check_time == &#39;error&#39;){
    throw new \Exception("优惠券领取时间未开始,暂不可领取");
  }

  //领取活动有以下几种情况
  //1: 活动已结束
  if($activity[&#39;end_time&#39;] < date("Y-m-d H:i:s") || $activity[&#39;status&#39;] == 1){
    $result = [
      &#39;code&#39; => 1,
    ];
    return $result;
  }

  //6 活动为开始时
  if($activity[&#39;start_time&#39;] > date("Y-m-d H:i:s") || $activity[&#39;status&#39;] == 1){
    $result = [
      &#39;code&#39; => 6,
    ];
    return $result;

  }

  $checkUser = $this->haveUser($params[&#39;mobile&#39;]); //检查是新用户,还是老用户 根据自己的业务需求做,这个方法就不贴了
  //2: 活动为新用户领取,而领取的用户是老用户
  if($activity[&#39;user_type&#39;] == 1 && !empty($checkUser)){
    $result = [
      &#39;code&#39; => 2,
    ];
    return $result;
  }

  //3:活动为老用户领取,而领取的用户是新用户
  if($activity[&#39;user_type&#39;]==2 && empty($checkUser)){
    $result = [
      &#39;code&#39; => 3,
    ];
    return $result;
  }


  //4:优惠券是否领取完
  $coupon = $this->getCouponExpire($collection_coupon,$params[&#39;mobile&#39;]); //这里提示有一个优惠券列表,根据自己的业务需求做,这个方法就不贴了
  //return $coupon;
  if($coupon == 1){
    $result = [
      &#39;code&#39; => 4,
    ];
    return $result;
  }

  //5:已领取过优惠券提示
  $userCoupon = &#39;&#39;;
  $userRate = &#39;&#39;;
  if(!empty($checkUser)){
    //user存在则为老用户,再检查是否领取过
    $userCoupon = $this->getUserCoupon($collection_coupon,$checkUser[&#39;user_id&#39;]);
    $userRate = $this->getUserCouponRate($checkUser[&#39;user_id&#39;],$activity[&#39;activity_id&#39;]);
  }else{
    //新用户,检查是否注册过
    $var_user = UserBaseModel::where(&#39;user_name&#39;,$params[&#39;mobile&#39;])->first();
    if(!empty($var_user)){
      $userCoupon = $this->getUserCoupon($collection_coupon,$var_user[&#39;user_id&#39;]);
      $userRate = $this->getUserCouponRate($var_user[&#39;user_id&#39;],$activity[&#39;activity_id&#39;]);
    }
  }

  //return $userRate;

  if($userCoupon == 1){
    $result = [
      &#39;code&#39; => 5,
      &#39;phone&#39;=> $str_mobile,
      &#39;coupon&#39; => $userRate,
      &#39;is_get&#39; => false,
    ];
    return $result;
  }

  //5:领取成功
  //如果活动规定是新老用户0,新用户1,老用户2
  $getCouponSuccess = $this->getCouponSuccess($activity[&#39;user_type&#39;],$checkUser,$collection_coupon,$params[&#39;mobile&#39;]);
  //return $getCouponSuccess;
  if($getCouponSuccess[&#39;status&#39;] == 200){
    $result = [
      &#39;code&#39; => 5,
      &#39;phone&#39;=> $str_mobile,
      &#39;coupon&#39; => $getCouponSuccess[&#39;result&#39;][0],
      &#39;is_get&#39; => true,
    ];
    return $result;
  }


}
ログイン後にコピー

を実装します。ユーザーはクーポンを受け取り、クーポンを発行します。

/**
 * Function:用户领取活动
 * Author:cyw0413
 * @param $user_type
 */
public function getCouponSuccess($user_type,$user,$coupon,$mobile)
{
  if(count($coupon) > 0){

    switch ($user_type){
      case 1:
        //新用户领取,如果从来没注册过就要新增用户
        $res = $this->addUser($mobile,$coupon); 
        return [
          &#39;result&#39; => $res,
          &#39;status&#39; => 200
        ];
        break;
      case 2:
        //老用户领取
        $res = $this->insertUserCoupon($user,$coupon);
        return [
          &#39;result&#39; => $res,
          &#39;status&#39; => 200
        ];
        break;
      default:
        //新老用户领取,判断是新用户还是老用户,这里的$user是有无配送单,有则为老用户;
        if(empty($user)){
          $res = $this->addUser($mobile,$coupon);
        }else{

          $res = $this->insertUserCoupon($user,$coupon); //老用户,直接发放优惠券
        }
        return [
          &#39;result&#39; => $res,
          &#39;status&#39; => 200
        ];
        break;
    }
  }else{
    throw new \Exception("优惠券不存在或者已经停用");
  }


}
ログイン後にコピー

受け取りが成功すると、クーポンが発行されます。

/**
 * Function:发放优惠券
 * Author:cyw0413
 * @param $user
 * @param $coupon
 */
public function insertUserCoupon($user,$coupon)
{
  $relate = [];
  foreach($coupon as $item){

    $res = CouponConfigSendBaseModel::where([
      &#39;config_id&#39;=>$item[&#39;config_id&#39;],
      &#39;status&#39;  => 0,
    ])->first();

    if(empty($res) || (!empty($res) && $res[&#39;is_send&#39;] == 0) ){
      throw new \Exception("优惠券未发放,暂不可领取");
    }

    //发放优惠券,有多少张就添加多少张,这里扣除优惠券时,主要用不同的coupon_sn来区别
    $onlyCoupon = $this->getCouponName($item[&#39;config_id&#39;]);
    if ($onlyCoupon[&#39;expire_type&#39;] == 0) {
      $start_time = $onlyCoupon[&#39;expire_start_time&#39;];
      $end_time = $onlyCoupon[&#39;expire_end_time&#39;];
    } else {
      $start_time = date(&#39;Y-m-d H:i:s&#39;);
      $end_time = date(&#39;Y-m-d H:i:s&#39;, time()+86400*$onlyCoupon[&#39;expire_type&#39;]);
    }

    $result = [
      &#39;user_id&#39;  => $user[&#39;user_id&#39;],
      &#39;config_id&#39; => $item[&#39;config_id&#39;],
      &#39;name&#39;   => $onlyCoupon[&#39;name&#39;],
      &#39;get_type&#39; => $onlyCoupon[&#39;get_type&#39;],
      &#39;amount&#39;  => $onlyCoupon[&#39;amount&#39;],
      &#39;require_price&#39; => $onlyCoupon[&#39;require_price&#39;],
      &#39;status&#39;    => 1,
      &#39;start_time&#39;  => $start_time,
      &#39;end_time&#39;   => $end_time,
    ];
    for($i=0; $i < $item[&#39;quantity&#39;];$i++){
      $result[&#39;coupon_sn&#39;] = &#39;B&#39;.mt_rand(1, 10000) . strtoupper(uniqid(mt_rand(1, 10000)));
      $userCoupon = UserCouponBaseModel::create($result);
    }

    //扣除相应的优惠券数量,这里用到了锁表,防止并发时,优惠券为-1
    $couponConfig = CouponConfigBaseModel::where(&#39;config_id&#39;,$item[&#39;config_id&#39;])->lockForUpdate()->first();
    if($couponConfig->left_quantity > 0 ){
      if($couponConfig->left_quantity >= $item[&#39;quantity&#39;]){
        $couponConfig->left_quantity = $couponConfig->left_quantity-$item[&#39;quantity&#39;];
        $couponConfig->save();
      }else{
        throw new \Exception("优惠券剩余数量不够扣减");
      }

    }


    $relate = [
      &#39;coupon_id&#39; => $userCoupon->coupon_id,
      &#39;user_id&#39;  => $user[&#39;user_id&#39;],
      &#39;config_id&#39; => $item[&#39;config_id&#39;],
      &#39;activity_id&#39; => $item[&#39;activity_id&#39;]
    ];

    ActivityCouponUserRelateBaseModel::create($relate);

    $relate[] = $this->getUserCouponRate($user[&#39;user_id&#39;],$item[&#39;activity_id&#39;]);


  }

  return $relate;
}
ログイン後にコピー

推奨学習: 「

PHP ビデオ チュートリアル

以上がPHPクーポンの実装とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート