DailyJob.php 5.4 KB

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