SignController.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. namespace App\Http\Controllers\V1\User;
  3. use App\Http\Controllers\V1\Controller;
  4. use App\Models\UserConsumeRecord;
  5. use App\Models\UserInfo;
  6. use App\Models\UserSignRecord;
  7. use Carbon\Carbon;
  8. use Illuminate\Database\QueryException;
  9. class SignController extends Controller
  10. {
  11. public function setting()
  12. {
  13. $setting = config('global.sign_config');
  14. $signDays = $this->checkSignDays();
  15. $todaySign = $this->checkTodaySign();
  16. return $this->success([
  17. 'setting' => $setting,
  18. 'signDays' => $signDays + $todaySign,
  19. 'todaySign' => $todaySign,
  20. ]);
  21. }
  22. public function handle()
  23. {
  24. if ($this->checkTodaySign()) {
  25. return $this->error('今天已经签到了,明天再来吧');
  26. }
  27. $setting = config('global.sign_config');
  28. $signDays = $this->checkSignDays();
  29. $today = Carbon::now()->toDateString();
  30. $award = $setting[$signDays + 1]['award'];
  31. try {
  32. \DB::beginTransaction();
  33. $sign = new UserSignRecord();
  34. $sign->user_id = \user()->id;
  35. $sign->date = $today;
  36. $sign->award = $award;
  37. $sign->save();
  38. $user = UserInfo::find(\user()->id);
  39. // 记录日志
  40. app(UserConsumeRecord::class)->record(
  41. \user()->id,
  42. UserConsumeRecord::TYPE_SIGN,
  43. $award,
  44. "{$today}签到奖励"
  45. );
  46. // 发放奖励
  47. $user->integral = $user->integral + $award;
  48. $user->total_integral = $user->total_integral + $award;
  49. $user->save();
  50. \DB::commit();
  51. return $this->success(['award' => $award]);
  52. } catch (QueryException $e) {
  53. \DB::rollBack();
  54. return $this->error('签到失败');
  55. } catch (\Exception $ex) {
  56. \DB::rollBack();
  57. return $this->error('签到失败');
  58. }
  59. }
  60. private function checkTodaySign()
  61. {
  62. $today = Carbon::now()->toDateString();
  63. return UserSignRecord::filterUser()->where('date', $today)->count();
  64. }
  65. // 校验连续签到了多少天
  66. private function checkSignDays()
  67. {
  68. $today = Carbon::now()->toDateString();
  69. $records = UserSignRecord::filterUser()->where('date', '<', $today)->orderByDesc('id')->limit(7)->get();
  70. $dates = $records->pluck('date')->toArray();
  71. rsort($dates);
  72. $continuedDays = 0;
  73. $days = static::getDays();
  74. // 连续签到了七天,从头开始
  75. if (!array_diff($days, $dates)) {
  76. return $continuedDays;
  77. }
  78. $count = 0;
  79. foreach ($dates as $date) {
  80. if (!static::isContinuedSign($date, $count++)) {
  81. break;
  82. }
  83. $continuedDays++;
  84. }
  85. return $continuedDays;
  86. }
  87. private static function isContinuedSign($date = [], $day = 0)
  88. {
  89. $days = static::getDays();
  90. $day = $days[$day];
  91. return $day == $date;
  92. }
  93. // 获取持续时间
  94. private static function getDays($days = 7)
  95. {
  96. $startTime = Carbon::now()->subDays($days)->timestamp;
  97. $endTime = Carbon::now()->subDays(1)->timestamp;
  98. $days = range($startTime, $endTime, 24 * 60 * 60);
  99. $days = array_map(function ($day) {
  100. return date('Y-m-d', $day);
  101. }, $days);
  102. rsort($days);
  103. return $days;
  104. }
  105. }