php 获取证书列表
用PHP做了一个领取优惠券活动的示例代码业务需求
优惠券活动,具体还是要根据自己的需求。以下是最近实现的优惠券活动,主要的业务需求:根据后端设置优惠券模板,用户类型设置,优惠券活动的开始与结束时间,最后生成不同的优惠券活动链接。
代码环境:
源码主要laravel5.8,一整个活动要贴的代码很多,下面主要贴核心代码,仅供参考。主要还是要根据自己的业务需求来实现功能吧。
以下是后端截图,做成模块化
前端需要做的设置与限制:
1 判断优惠券是否存在或者停用
2 判断活动开始时间与优惠券开始时间
接着领取活动优惠券,需要判断以下情况:
1 活动已结束
2 活动为开始时
3 活动为新用户领取,而领取的用户是老用户
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 [ 'mobile' ]); //主要是过滤掉领取优惠券为0的,用laravel的同学注意看看 $detail = $activity_link ->each( function ( $item , $index ) use ( $showuser ) { $diffcouponquantity = $this ->diffcouponquantity( $item [ 'config_id' ], $item [ 'quantity' ], $item [ 'activity_id' ], $showuser ); $item ->title = $this ->getcouponname( $item [ 'config_id' ])[ 'name' ]; $item ->number = $item [ 'quantity' ]; $item ->msg = $diffcouponquantity [ 'msg' ]; $item ->diff = $diffcouponquantity [ 'diff' ]; $item ->code = $diffcouponquantity [ 'code' ]; })->toarray(); if ( count ( $detail ) == 1){ foreach ( $detail as $val ){ if ( $val [ 'diff' ] == 1 && $val [ 'code' ] == '400' ){ throw new \exception( $detail [0][ 'msg' ]); } } } $collection_coupon = collect( $detail ); $collection_coupon = $collection_coupon ->where( 'diff' , '<=' , '0' ); //去除优惠券剩余数量为0,或者领取优惠券数量-剩余数量 > 0 } //判断活动开始时间与优惠券开始时间 $act_coupon = activitycouponbasemodel::where( 'activity_id' , $activity [ 'activity_id' ])->first(); $check_time = $this -> checkcoupontime( $act_coupon [ 'start_time' ], $activity_link ); if ( $check_time == 'error' ){ throw new \exception( "优惠券领取时间未开始,暂不可领取" ); } //领取活动有以下几种情况 //1: 活动已结束 if ( $activity [ 'end_time' ] < date ( "y-m-d h:i:s" ) || $activity [ 'status' ] == 1){ $result = [ 'code' => 1, ]; return $result ; } //6 活动为开始时 if ( $activity [ 'start_time' ] > date ( "y-m-d h:i:s" ) || $activity [ 'status' ] == 1){ $result = [ 'code' => 6, ]; return $result ; } $checkuser = $this ->haveuser( $params [ 'mobile' ]); //检查是新用户,还是老用户 根据自己的业务需求做,这个方法就不贴了 //2: 活动为新用户领取,而领取的用户是老用户 if ( $activity [ 'user_type' ] == 1 && ! empty ( $checkuser )){ $result = [ 'code' => 2, ]; return $result ; } //3:活动为老用户领取,而领取的用户是新用户 if ( $activity [ 'user_type' ]==2 && empty ( $checkuser )){ $result = [ 'code' => 3, ]; return $result ; } //4:优惠券是否领取完 $coupon = $this ->getcouponexpire( $collection_coupon , $params [ 'mobile' ]); //这里提示有一个优惠券列表,根据自己的业务需求做,这个方法就不贴了 //return $coupon; if ( $coupon == 1){ $result = [ 'code' => 4, ]; return $result ; } //5:已领取过优惠券提示 $usercoupon = '' ; $userrate = '' ; if (! empty ( $checkuser )){ //user存在则为老用户,再检查是否领取过 $usercoupon = $this ->getusercoupon( $collection_coupon , $checkuser [ 'user_id' ]); $userrate = $this ->getusercouponrate( $checkuser [ 'user_id' ], $activity [ 'activity_id' ]); } else { //新用户,检查是否注册过 $var_user = userbasemodel::where( 'user_name' , $params [ 'mobile' ])->first(); if (! empty ( $var_user )){ $usercoupon = $this ->getusercoupon( $collection_coupon , $var_user [ 'user_id' ]); $userrate = $this ->getusercouponrate( $var_user [ 'user_id' ], $activity [ 'activity_id' ]); } } //return $userrate; if ( $usercoupon == 1){ $result = [ 'code' => 5, 'phone' => $str_mobile , 'coupon' => $userrate , 'is_get' => false, ]; return $result ; } //5:领取成功 //如果活动规定是新老用户0,新用户1,老用户2 $getcouponsuccess = $this ->getcouponsuccess( $activity [ 'user_type' ], $checkuser , $collection_coupon , $params [ 'mobile' ]); //return $getcouponsuccess; if ( $getcouponsuccess [ 'status' ] == 200){ $result = [ 'code' => 5, 'phone' => $str_mobile , 'coupon' => $getcouponsuccess [ 'result' ][0], 'is_get' => 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 [ 'result' => $res , 'status' => 200 ]; break ; case 2: //老用户领取 $res = $this ->insertusercoupon( $user , $coupon ); return [ 'result' => $res , 'status' => 200 ]; break ; default : //新老用户领取,判断是新用户还是老用户,这里的$user是有无配送单,有则为老用户; if ( empty ( $user )){ $res = $this ->adduser( $mobile , $coupon ); } else { $res = $this ->insertusercoupon( $user , $coupon ); //老用户,直接发放优惠券 } return [ 'result' => $res , 'status' => 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([ 'config_id' => $item [ 'config_id' ], 'status' => 0, ])->first(); if ( empty ( $res ) || (! empty ( $res ) && $res [ 'is_send' ] == 0) ){ throw new \exception( "优惠券未发放,暂不可领取" ); } //发放优惠券,有多少张就添加多少张,这里扣除优惠券时,主要用不同的coupon_sn来区别 $onlycoupon = $this ->getcouponname( $item [ 'config_id' ]); if ( $onlycoupon [ 'expire_type' ] == 0) { $start_time = $onlycoupon [ 'expire_start_time' ]; $end_time = $onlycoupon [ 'expire_end_time' ]; } else { $start_time = date ( 'y-m-d h:i:s' ); $end_time = date ( 'y-m-d h:i:s' , time()+86400* $onlycoupon [ 'expire_type' ]); } $result = [ 'user_id' => $user [ 'user_id' ], 'config_id' => $item [ 'config_id' ], 'name' => $onlycoupon [ 'name' ], 'get_type' => $onlycoupon [ 'get_type' ], 'amount' => $onlycoupon [ 'amount' ], 'require_price' => $onlycoupon [ 'require_price' ], 'status' => 1, 'start_time' => $start_time , 'end_time' => $end_time , ]; for ( $i =0; $i < $item [ 'quantity' ]; $i ++){ $result [ 'coupon_sn' ] = 'b' .mt_rand(1, 10000) . strtoupper (uniqid(mt_rand(1, 10000))); $usercoupon = usercouponbasemodel::create( $result ); } //扣除相应的优惠券数量,这里用到了锁表,防止并发时,优惠券为-1 $couponconfig = couponconfigbasemodel::where( 'config_id' , $item [ 'config_id' ])->lockforupdate()->first(); if ( $couponconfig ->left_quantity > 0 ){ if ( $couponconfig ->left_quantity >= $item [ 'quantity' ]){ $couponconfig ->left_quantity = $couponconfig ->left_quantity- $item [ 'quantity' ]; $couponconfig ->save(); } else { throw new \exception( "优惠券剩余数量不够扣减" ); } } $relate = [ 'coupon_id' => $usercoupon ->coupon_id, 'user_id' => $user [ 'user_id' ], 'config_id' => $item [ 'config_id' ], 'activity_id' => $item [ 'activity_id' ] ]; activitycouponuserrelatebasemodel::create( $relate ); $relate [] = $this ->getusercouponrate( $user [ 'user_id' ], $item [ 'activity_id' ]); } return $relate ; } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://mp.weixin.qq.com/s/vt-_Awa0wmhVNMM9CwSGqg