Reward.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Services;
  4. use App\Models\Config;
  5. use App\Models\Payback;
  6. use App\Models\User;
  7. use App\Models\UserMoneyLog;
  8. use App\Utils\Tools;
  9. use Exception;
  10. use function random_int;
  11. use function time;
  12. final class Reward
  13. {
  14. public static function issuePaybackReward($user_id, $ref_user_id, $total, $invoice_id): void
  15. {
  16. $ref_get = 0;
  17. $ref_user = (new User())->where('id', $ref_user_id)
  18. ->where('is_banned', 0)
  19. ->where('is_shadow_banned', 0)
  20. ->first();
  21. $exsit_payback = (new Payback())->where('userid', $user_id)
  22. ->where('invoice_id', $invoice_id)
  23. ->first();
  24. if ($ref_user !== null && $exsit_payback === null) {
  25. $invite_reward_mode = Config::obtain('invite_reward_mode');
  26. $invite_reward_rate = Config::obtain('invite_reward_rate');
  27. if ($invite_reward_mode === 'reward_count') {
  28. $invite_reward_count_limit = Config::obtain('invite_reward_count_limit');
  29. $invite_reward_count = (new Payback())->where('userid', $user_id)
  30. ->where('ref_by', $ref_user_id)
  31. ->count();
  32. if ($invite_reward_count < $invite_reward_count_limit) {
  33. $ref_get = $total * $invite_reward_rate;
  34. }
  35. }
  36. if ($invite_reward_mode === 'reward_total') {
  37. $invite_reward_total_limit = Config::obtain('invite_reward_total_limit');
  38. $invite_reward_total = (new Payback())->where('userid', $user_id)
  39. ->where('ref_by', $ref_user_id)
  40. ->sum('ref_get');
  41. if ($invite_reward_total < $invite_reward_total_limit) {
  42. $ref_get = $total * $invite_reward_rate;
  43. if ($invite_reward_total + $ref_get > $invite_reward_total_limit) {
  44. $ref_get = $invite_reward_total_limit - $invite_reward_total;
  45. }
  46. }
  47. }
  48. }
  49. if ($ref_get !== 0) {
  50. $money_before = $ref_user->money;
  51. $ref_user->money += $ref_get;
  52. $ref_user->save();
  53. // 添加余额记录
  54. (new UserMoneyLog())->add(
  55. $ref_user->id,
  56. (float) $money_before,
  57. (float) $ref_user->money,
  58. $ref_get,
  59. '邀请用户 #' . $user_id . ' 返利',
  60. );
  61. // 添加返利记录
  62. (new Payback())->add(
  63. (float) $total,
  64. $user_id,
  65. $ref_user_id,
  66. (float) $ref_get,
  67. $invoice_id,
  68. );
  69. }
  70. }
  71. public static function issueRegReward($user_id, $ref_user_id): void
  72. {
  73. $invite_reg_money_reward = Config::obtain('invite_reg_money_reward');
  74. $invite_reg_traffic_reward = Config::obtain('invite_reg_traffic_reward');
  75. $user = (new User())->where('id', $user_id)->first();
  76. $ref_user = (new User())->where('id', $ref_user_id)
  77. ->where('is_banned', 0)
  78. ->where('is_shadow_banned', 0)
  79. ->first();
  80. if ($user !== null && $ref_user !== null) {
  81. if ($invite_reg_money_reward !== 0) {
  82. $money_before = $user->money;
  83. $user->money += $invite_reg_money_reward;
  84. $user->save();
  85. // 添加余额记录
  86. (new UserMoneyLog())->add(
  87. $user->id,
  88. (float) $money_before,
  89. (float) $user->money,
  90. $invite_reg_money_reward,
  91. '被用户 #' . $ref_user_id . ' 邀请注册奖励',
  92. );
  93. }
  94. if ($invite_reg_traffic_reward !== 0) {
  95. $ref_user->transfer_enable += Tools::toGB($invite_reg_traffic_reward);
  96. $ref_user->save();
  97. }
  98. }
  99. }
  100. public static function issueCheckinReward($user_id): int|false
  101. {
  102. $user = (new User())->where('id', $user_id)->first();
  103. if ($user === null) {
  104. return false;
  105. }
  106. $checkin_min = Config::obtain('checkin_min');
  107. $checkin_max = Config::obtain('checkin_max');
  108. if ($checkin_min === $checkin_max) {
  109. $traffic = $checkin_min;
  110. } else {
  111. try {
  112. $traffic = random_int($checkin_min, $checkin_max);
  113. } catch (Exception $e) {
  114. $traffic = 0;
  115. }
  116. }
  117. if ($traffic !== 0) {
  118. $user->transfer_enable += Tools::toMB($traffic);
  119. $user->last_check_in_time = time();
  120. $user->save();
  121. }
  122. return $traffic;
  123. }
  124. }