Rumah >pembangunan bahagian belakang >masalah PHP >Apakah pelaksanaan kupon php

Apakah pelaksanaan kupon php

藏色散人
藏色散人asal
2021-12-01 09:54:392960semak imbas

Cara melaksanakan kupon PHP: 1. Buat fail bahagian hadapan dan tentukan sama ada kupon itu wujud atau dinyahaktifkan 2. Buat fail contoh PHP 3. Melalui "public function doCoupon($params){ ...}" dan kaedah lain untuk mengendalikan situasi pengumpulan kupon.

Apakah pelaksanaan kupon php

Persekitaran pengendalian artikel ini: sistem windows7, versi PHP7.4, komputer DELL G3

Apakah kaedah pelaksanaan kupon php?

Menggunakan PHP untuk mencipta kod sampel untuk menerima aktiviti kupon

Keperluan perniagaan

Aktiviti kupon, khususnya Menurut anda keperluan sendiri. Berikut ialah keperluan perniagaan utama untuk aktiviti kupon yang dilaksanakan baru-baru ini: menetapkan templat kupon mengikut bahagian belakang, menetapkan jenis pengguna, masa mula dan tamat aktiviti kupon, dan akhirnya menjana pautan aktiviti kupon yang berbeza.

Persekitaran kod:

Kod sumber terutamanya laravel5.8. Terdapat banyak kod yang perlu disiarkan untuk keseluruhan aktiviti. Kod teras terutamanya disiarkan di bawah, untuk merujuk sahaja. Perkara utama ialah melaksanakan fungsi mengikut keperluan perniagaan anda sendiri.

Berikut ialah tangkapan skrin bahagian belakang, dijadikan modul

Tetapan dan sekatan yang perlu dibuat pada bahagian hadapan:

1 Tentukan sama ada kupon wujud atau dilumpuhkan
2 Tentukan masa mula acara dan masa mula kupon

Untuk kemudian menerima kupon acara, anda perlu menentukan situasi berikut:
1 Aktiviti telah tamat
2 Aktiviti adalah pada permulaan
3 Aktiviti ini adalah untuk pengguna baharu mengumpul, dan pengguna yang mengumpul adalah lama pengguna
4 Aktiviti ini adalah untuk pengguna lama mengumpul, dan pengguna yang mengumpul adalah pengguna baharu
5 Sama ada kupon telah dikutip
6 Telah menerima peringatan kupon
7 Berjaya diterima

Kod teras berikut dilaksanakan

/**
 * 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;
  }


}

Kupon koleksi pengguna dan kupon keluaran

/**
 * 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("优惠券不存在或者已经停用");
  }


}

Terima dengan jayanya dan keluarkan kupon

/**
 * 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;
}

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Apakah pelaksanaan kupon php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Artikel berkaitan

Lihat lagi