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

2025-05-27 0 32

业务需求

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

代码环境

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

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

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

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

1 判断优惠券是否存在或者停用
2 判断活动开始时间与优惠券开始时间

接着领取活动优惠券,需要判断以下情况:
1 活动已结束
2 活动为开始时
3 活动为新用户领取,而领取的用户是老用户
4 活动为老用户领取,而领取的用户是新用户
5 优惠券是否领取完
6 已领取过优惠券提示
7 领取成功

下面核心代码实现

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157
/**

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

}

}

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46
/**

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

}

}

领取成功,则发放优惠券

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75
/**

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

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://mp.weixin.qq.com/s/vt-_Awa0wmhVNMM9CwSGqg

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 用PHP做了一个领取优惠券活动的示例代码 https://www.kuaiidc.com/71157.html

相关文章

猜你喜欢
发表评论
暂无评论