DailyJob.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Components\Helpers;
  4. use App\Components\PushNotification;
  5. use App\Models\Invite;
  6. use App\Models\Order;
  7. use App\Models\Ticket;
  8. use App\Models\User;
  9. use App\Models\UserBanedLog;
  10. use App\Services\OrderService;
  11. use Illuminate\Console\Command;
  12. use Log;
  13. class DailyJob extends Command
  14. {
  15. protected $signature = 'dailyJob';
  16. protected $description = '每日任务';
  17. public function handle(): void
  18. {
  19. $jobStartTime = microtime(true);
  20. // 过期用户处理
  21. $this->expireUser();
  22. // 关闭超过72小时未处理的工单
  23. $this->closeTickets();
  24. // 重置用户流量
  25. if (sysConfig('reset_traffic')) {
  26. $this->resetUserTraffic();
  27. }
  28. $jobEndTime = microtime(true);
  29. $jobUsedTime = round(($jobEndTime - $jobStartTime), 4);
  30. Log::info('---【'.$this->description.'】完成---,耗时'.$jobUsedTime.'秒');
  31. }
  32. private function expireUser(): void
  33. {
  34. // 过期用户处理
  35. $userList = User::activeUser()->where('expired_at', '<', date('Y-m-d'))->get();
  36. $isBanStatus = sysConfig('is_ban_status');
  37. foreach ($userList as $user) {
  38. if ($isBanStatus) {
  39. $user->update([
  40. 'u' => 0,
  41. 'd' => 0,
  42. 'transfer_enable' => 0,
  43. 'enable' => 0,
  44. 'level' => 0,
  45. 'reset_time' => null,
  46. 'ban_time' => null,
  47. 'status' => -1,
  48. ]);
  49. $this->addUserBanLog($user->id, 0, '【禁止登录,清空账户】-账号已过期');
  50. // 废除其名下邀请码
  51. Invite::whereInviterId($user->id)->whereStatus(0)->update(['status' => 2]);
  52. // 写入用户流量变动记录
  53. Helpers::addUserTrafficModifyLog($user->id, 0, $user->transfer_enable, 0, '[定时任务]账号已过期(禁止登录,清空账户)');
  54. } else {
  55. $user->update([
  56. 'u' => 0,
  57. 'd' => 0,
  58. 'transfer_enable' => 0,
  59. 'enable' => 0,
  60. 'level' => 0,
  61. 'reset_time' => null,
  62. 'ban_time' => null,
  63. ]);
  64. $this->addUserBanLog($user->id, 0, '【封禁代理,清空账户】-账号已过期');
  65. // 写入用户流量变动记录
  66. Helpers::addUserTrafficModifyLog($user->id, 0, $user->transfer_enable, 0, '[定时任务]账号已过期(封禁代理,清空账户)');
  67. }
  68. }
  69. }
  70. /**
  71. * 添加用户封禁日志.
  72. *
  73. * @param int $userId 用户ID
  74. * @param int $time 封禁时长,单位分钟
  75. * @param string $description 封禁理由
  76. * @return bool
  77. */
  78. private function addUserBanLog(int $userId, int $time, string $description): bool
  79. {
  80. $log = new UserBanedLog();
  81. $log->user_id = $userId;
  82. $log->time = $time;
  83. $log->description = $description;
  84. return $log->save();
  85. }
  86. // 关闭超过72小时未处理的工单
  87. private function closeTickets(): void
  88. {
  89. $ticketList = Ticket::where('updated_at', '<=', date('Y-m-d', strtotime('-3 days')))->whereStatus(1)->get();
  90. foreach ($ticketList as $ticket) {
  91. $ret = Ticket::whereId($ticket->id)->update(['status' => 2]);
  92. if ($ret) {
  93. PushNotification::send('工单关闭提醒', '工单:ID'.$ticket->id.'超过72小时未处理,系统已自动关闭');
  94. }
  95. }
  96. }
  97. // 重置用户流量
  98. private function resetUserTraffic(): void
  99. {
  100. $userList = User::where('status', '<>', -1)
  101. ->where('expired_at', '>', date('Y-m-d'))
  102. ->where('reset_time', '<=', date('Y-m-d'))
  103. ->get();
  104. foreach ($userList as $user) {
  105. // 跳过 没有重置日期的账号
  106. if (! $user->reset_time) {
  107. continue;
  108. }
  109. // 取出用户正在使用的套餐
  110. $order = Order::userActivePlan($user->id)->first();
  111. // 无订单用户跳过
  112. if (! $order) {
  113. continue;
  114. }
  115. // 过期生效中的加油包
  116. Order::userActivePackage($user->id)->update(['is_expire' => 1]);
  117. $oldData = $user->transfer_enable;
  118. // 重置流量与重置日期 TODO 可用流量变动日志加入至UserObserver
  119. $ret = $user->update((new OrderService($order))->resetTimeAndData($user->expired_at));
  120. if ($ret) {
  121. // 可用流量变动日志
  122. Helpers::addUserTrafficModifyLog($order->user_id, $order->id, $oldData, $user->transfer_enable, '【流量重置】重置可用流量');
  123. Log::info('用户[ID:'.$user->id.' 昵称: '.$user->username.' 邮箱: '.$user->email.'] 流量重置为 '.flowAutoShow($user->transfer_enable).'. 重置日期为 '.($user->reset_time ?: '【无】'));
  124. } else {
  125. Log::warning('用户[ID:'.$user->id.' 昵称: '.$user->username.' 邮箱: '.$user->email.'] 流量重置失败');
  126. }
  127. }
  128. }
  129. }