DailyJob.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Components\Helpers;
  4. use App\Models\Ticket;
  5. use App\Models\User;
  6. use App\Notifications\TicketClosed;
  7. use App\Services\OrderService;
  8. use Illuminate\Console\Command;
  9. use Log;
  10. class DailyJob extends Command
  11. {
  12. protected $signature = 'dailyJob';
  13. protected $description = '每日任务';
  14. public function handle()
  15. {
  16. $jobStartTime = microtime(true);
  17. $this->expireUser(); // 过期用户处理
  18. $this->closeTickets(); // 关闭超时未处理的工单
  19. if (sysConfig('reset_traffic')) {// 重置用户流量
  20. $this->resetUserTraffic();
  21. }
  22. $jobEndTime = microtime(true);
  23. $jobUsedTime = round(($jobEndTime - $jobStartTime), 4);
  24. Log::info('---【'.$this->description.'】完成---,耗时'.$jobUsedTime.'秒');
  25. }
  26. private function expireUser()// 过期用户处理
  27. {
  28. $isBanStatus = sysConfig('is_ban_status');
  29. User::activeUser()
  30. ->where('expired_at', '<', date('Y-m-d'))
  31. ->chunk(config('tasks.chunk'), function ($users) use ($isBanStatus) {
  32. foreach ($users as $user) {
  33. if ($isBanStatus) { // 停止服务 或 封禁账号
  34. $user->update([
  35. 'u' => 0,
  36. 'd' => 0,
  37. 'transfer_enable' => 0,
  38. 'enable' => 0,
  39. 'level' => 0,
  40. 'reset_time' => null,
  41. 'ban_time' => null,
  42. 'status' => -1,
  43. ]);
  44. $user->banedLogs()->create(['description' => '【禁止登录,清空账户】-账号已过期']);
  45. // 废除其名下邀请码
  46. $user->invites()->whereStatus(0)->update(['status' => 2]);
  47. // 写入用户流量变动记录
  48. Helpers::addUserTrafficModifyLog($user->id, null, $user->transfer_enable, 0, '[定时任务]账号已过期(禁止登录,清空账户)');
  49. } else {
  50. $user->update([
  51. 'u' => 0,
  52. 'd' => 0,
  53. 'transfer_enable' => 0,
  54. 'enable' => 0,
  55. 'level' => 0,
  56. 'reset_time' => null,
  57. 'ban_time' => null,
  58. ]);
  59. $user->banedLogs()->create(['description' => '【封禁代理,清空账户】-账号已过期']);
  60. // 写入用户流量变动记录
  61. Helpers::addUserTrafficModifyLog($user->id, null, $user->transfer_enable, 0, '[定时任务]账号已过期(封禁代理,清空账户)');
  62. }
  63. }
  64. });
  65. }
  66. private function closeTickets()// 关闭超时未处理的工单
  67. {
  68. Ticket::whereStatus(1)
  69. ->where('updated_at', '<=', date('Y-m-d', strtotime('-'.config('tasks.close.ticket').' hours')))
  70. ->chunk(config('tasks.chunk'), function ($tickets) {
  71. foreach ($tickets as $ticket) {
  72. if ($ticket->close()) {
  73. $ticket->user->notify(new TicketClosed($ticket->id, $ticket->title, route('replyTicket', ['id' => $ticket->id]),
  74. __('You have not responded this ticket in :num hours, System has auto closed your ticket.', ['num' => config('tasks.close.ticket')])));
  75. }
  76. }
  77. });
  78. }
  79. private function resetUserTraffic()// 重置用户流量
  80. {
  81. User::where('status', '<>', -1)
  82. ->where('expired_at', '>', date('Y-m-d'))
  83. ->where('reset_time', '<=', date('Y-m-d'))
  84. ->whereNotNull('reset_time')
  85. ->with('orders')->whereHas('orders')
  86. ->chunk(config('tasks.chunk'), function ($users) {
  87. foreach ($users as $user) {
  88. $order = $user->orders()->activePlan()->first(); // 取出用户正在使用的套餐
  89. if (! $order) {// 无套餐用户跳过
  90. continue;
  91. }
  92. $user->orders()->activePackage()->update(['is_expire' => 1]); // 过期生效中的加油包
  93. $oldData = $user->transfer_enable;
  94. // 重置流量与重置日期
  95. if ($user->update((new OrderService($order))->resetTimeAndData($user->expired_at))) {
  96. // 可用流量变动日志
  97. Helpers::addUserTrafficModifyLog($order->user_id, $order->id, $oldData, $user->transfer_enable, '【流量重置】重置可用流量');
  98. Log::info('用户[ID:'.$user->id.' 昵称: '.$user->username.' 邮箱: '.$user->email.'] 流量重置为 '.flowAutoShow($user->transfer_enable).'. 重置日期为 '.($user->reset_time ?: '【无】'));
  99. } else {
  100. Log::warning('用户[ID:'.$user->id.' 昵称: '.$user->username.' 邮箱: '.$user->email.'] 流量重置失败');
  101. }
  102. }
  103. });
  104. }
  105. }