SignService.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace App\Modules\User\Services;
  3. use App\Modules\User\Models\User;
  4. use Illuminate\Support\Facades\DB;
  5. use Redis;
  6. /**
  7. * @property int $this->uid;
  8. * @property int $reward_list;
  9. */
  10. class SignService
  11. {
  12. protected $uid;
  13. protected $reward_list = [30, 35, 40, 45, 50, 55, 60];
  14. public function __construct(int $uid)
  15. {
  16. $this->uid = $uid;
  17. }
  18. public function setRewardList(array $data)
  19. {
  20. $this->reward_list = $data;
  21. }
  22. /**
  23. * 用户签到
  24. */
  25. public function sign()
  26. {
  27. $date = $this->getSignDate();
  28. $sign_day = $this->getSignDay();
  29. if (!$date || $date != date('Y-m-d')) {
  30. $reward = $this->getRewardCoin($sign_day);
  31. $this->saveReward($reward);
  32. $this->saveRewardInfoInRedis($reward, $sign_day);
  33. $this->addSignDay();
  34. }
  35. }
  36. /**
  37. * 获取用户签到信息
  38. */
  39. public function getSignInfo()
  40. {
  41. $date = $this->getSignDate();
  42. $is_sign = $date == date('Y-m-d');
  43. $sign_day = $this->getSignDay();
  44. $reward_list = $this->reward_list;
  45. return compact('is_sign', 'sign_day', 'reward_list');
  46. }
  47. /**
  48. * 保存奖励金额
  49. * @param int $reward 签到奖励书币
  50. */
  51. private function saveReward(int $reward)
  52. {
  53. User::where('id', $this->uid)->update([
  54. 'balance' => DB::raw('balance+' . $reward),
  55. 'reward_balance' => DB::raw('reward_balance+' . $reward)
  56. ]);
  57. }
  58. /**
  59. * 保存签到信息到redis
  60. * @param int $reward 签到奖励书币
  61. * @param int $sign_day 签到天数
  62. */
  63. private function saveRewardInfoInRedis(int $reward, int $sign_day)
  64. {
  65. $sign_data = [
  66. 'uid' => $this->uid,
  67. 'price' => $reward,
  68. 'day' => date('Y-m-d'),
  69. 'sign_time' => time(),
  70. 'created_at' => date('Y-m-d H:i:s'),
  71. 'updated_at' => date('Y-m-d H:i:s')
  72. ];
  73. Redis::sadd('user_sign:uid', $this->uid);
  74. Redis::hset('user_sign:uid:info', $this->uid, json_encode($sign_data));
  75. Redis::hset('book_read:' . $this->uid, 'sign_info', json_encode($sign_data));
  76. }
  77. /**
  78. * 获取用户签到日期
  79. * @return string|bool
  80. */
  81. private function getSignDate()
  82. {
  83. $sign_date = Redis::hget('book_read:' . $this->uid, 'sign_day');
  84. if ($sign_date && ($sign_date == date('Y-m-d', time() - 86400) || $sign_date == date('Y-m-d'))) {
  85. return $sign_date;
  86. } else {
  87. $this->delSignDay();
  88. return false;
  89. }
  90. }
  91. /**
  92. * 获取用户签到天数
  93. * @return int|bool
  94. */
  95. private function getSignDay()
  96. {
  97. $sign_day = Redis::hget('book_read:' . $this->uid, 'sign_counts');
  98. return $sign_day ? (int)$sign_day : 0;
  99. }
  100. /**
  101. * 增加签到
  102. * @return int
  103. */
  104. private function addSignDay()
  105. {
  106. Redis::hset('book_read:' . $this->uid, 'sign_day', date('Y-m-d'));
  107. return Redis::hincrby('book_read:' . $this->uid, 'sign_counts', 1);
  108. }
  109. /**
  110. * 重置签到天数
  111. */
  112. private function delSignDay()
  113. {
  114. return Redis::hDel('book_read:' . $this->uid, 'sign_counts');
  115. }
  116. /**
  117. * 获取签到奖励金额
  118. * @param int $sign_day 签到天数
  119. * @return int
  120. */
  121. private function getRewardCoin(int $sign_day)
  122. {
  123. return $this->reward_list[$sign_day % 7];
  124. }
  125. }