RepeatedRewardsLogic.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. namespace addons\SignIn\common\logic;
  3. use addons\SignIn\common\login\SignInReward;
  4. use addons\SignIn\common\models\SignInUserPropertyAward;
  5. use common\enums\StatusEnum;
  6. use Exception;
  7. /**
  8. * 重复签到奖励
  9. */
  10. class RepeatedRewardsLogic
  11. {
  12. /**
  13. * 奖励分发
  14. * @param array $data
  15. * @param string $type
  16. * @return array|false|null
  17. * @throws Exception
  18. */
  19. public static function reward(array $data = [], string $type = 'score')
  20. {
  21. if (empty($data)) {
  22. throw new Exception("参数不能为空");
  23. }
  24. switch ($type) {
  25. case 'score':// 积分奖励
  26. return self::pointsReward($data);
  27. case 'coupon':// 优惠券奖励
  28. return self::couponReward($data);
  29. default:
  30. return null;
  31. }
  32. }
  33. /**
  34. * 积分奖励
  35. * @param array $data
  36. * @return array|false|null
  37. * @throws Exception
  38. */
  39. protected static function pointsReward(array $data)
  40. {
  41. try {
  42. $totalSignIn = (int)$data['total_sign_in']; // 获取连续签到天数
  43. $reward_score = $data['reward_score'] ?? []; // 获取连续签到积分奖励配置
  44. $mall_id = $data['mall_id']; // 商城id
  45. $user_id = $data['user_id']; // 用户id
  46. $sign_id = $data['sign_id']; // 签到id
  47. $sign_time = $data['sign_time']; // 签到时间
  48. $time = time();
  49. // 检查配置是否为空
  50. if (empty($reward_score)) {
  51. return false;
  52. }
  53. $reward_score = array_column($reward_score, null, 'day');// 将天数配置为键值对
  54. $sign_system_max = max(array_keys($reward_score)) ?? 0;// 获取系统配置连续签到最大天数
  55. if ($sign_system_max >= $totalSignIn) { // 只有当连续签到天数大于配置的连续签到天数时才进行奖励
  56. return false;
  57. }
  58. $rate = bcmod($totalSignIn, $sign_system_max);
  59. if ($rate == 0) {
  60. $rate = $sign_system_max;
  61. }
  62. $reward_score_list = $reward_score[$rate] ?? []; // 获取对应奖励配置
  63. if (empty($reward_score_list)) {// 如果当天奖励为空,则不进行奖励
  64. return false;
  65. }
  66. // 设置奖励类型
  67. $reward_type = !empty($reward_score_list['give_type']) ? $reward_score_list['give_type'] : 'score';
  68. $signInReward = new SignInReward();
  69. $result = $signInReward->giveReward($mall_id, $user_id, $reward_type, $reward_score_list['num'],
  70. $sign_id, $sign_time, $time, 2, $totalSignIn);
  71. $userPropertyAward = SignInUserPropertyAward::findOne([
  72. 'mall_id' => $mall_id,
  73. 'give_type' => $reward_type,
  74. 'user_id' => $user_id,
  75. 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  76. if (empty($userPropertyAward)) {
  77. $userPropertyAward = $signInReward->getUserPropertyAward($mall_id, $user_id, $reward_type);
  78. }
  79. $userPropertyAward->total_num += $reward_score_list['num'];
  80. $userPropertyAward->save();
  81. return $result;
  82. } catch (Exception $e) {
  83. throw new Exception("重复签到积分奖励失败");
  84. }
  85. }
  86. /**
  87. * 优惠券奖励
  88. * array $data
  89. */
  90. protected static function couponReward($data)
  91. {
  92. try {
  93. $totalSignIn = (int)$data['total_sign_in']; // 获取连续签到天数
  94. $reward_coupon = $data['reward_coupon'] ?? []; // 获取配置优惠券
  95. $couponList = $data['coupon_list']; // 优惠券列表
  96. $mall_id = $data['mall_id']; // 商城id
  97. $user_id = $data['user_id']; // 用户id
  98. $sign_id = $data['sign_id']; // 签到id
  99. $sign_time = $data['sign_time']; // 签到时间
  100. $describe = $data['describe']; // 备注信息
  101. $time = time();
  102. if (empty($reward_coupon)) {
  103. return false;
  104. }
  105. $reward_coupon = array_column($reward_coupon, null, 'day');// 将天数配置为键值对
  106. $sign_system_max = max(array_keys($reward_coupon)) ?? 0;// 获取系统配置连续签到最大天数
  107. if ($sign_system_max >= $totalSignIn) { // 只有当连续签到天数大于配置的连续签到天数时才进行奖励
  108. return false;
  109. }
  110. $reward_coupon_count = count($reward_coupon);
  111. $couponNum = 0;
  112. $rate = bcmod($totalSignIn, $reward_coupon_count);
  113. if ($rate == 0) {
  114. $rate = $reward_coupon_count;
  115. }
  116. $reward_coupon_list = $reward_coupon[$rate];
  117. if (!isset($couponList[$reward_coupon_list['coupon_id']])) return false;
  118. $couponNum += $reward_coupon_list['num'];
  119. $couponData[] = [
  120. 'mall_id' => $mall_id,
  121. 'user_id' => $user_id,
  122. 'sign_id' => $sign_id,
  123. 'num' => $reward_coupon_list['num'],
  124. 'coupon_id' => $reward_coupon_list['coupon_id'],
  125. 'type' => 2,
  126. 'describe' => $describe . '[' . $couponList[$reward_coupon_list['coupon_id']]['name'] . ']',
  127. 'sign_at' => $sign_time,
  128. 'created_at' => $time,
  129. 'updated_at' => $time
  130. ];
  131. $insertCoupon[$reward_coupon_list['coupon_id']] = $reward_coupon_list['num'];
  132. if ($couponList[$reward_coupon_list['coupon_id']]['total_count'] != -1) $subCoupon[$reward_coupon_list['coupon_id']] = $reward_coupon_list['num'];
  133. return compact("couponNum", "couponData", "insertCoupon", "subCoupon");
  134. } catch (Exception $e) {
  135. throw new Exception("重复签到优惠券奖励失败");
  136. }
  137. }
  138. }