DailyJob.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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 Illuminate\Console\Command;
  11. use Log;
  12. class DailyJob extends Command {
  13. protected static $systemConfig;
  14. protected $signature = 'dailyJob';
  15. protected $description = '每日任务';
  16. public function __construct() {
  17. parent::__construct();
  18. self::$systemConfig = Helpers::systemConfig();
  19. }
  20. public function handle(): void {
  21. $jobStartTime = microtime(true);
  22. // 过期用户处理
  23. $this->expireUser();
  24. // 关闭超过72小时未处理的工单
  25. $this->closeTickets();
  26. // 重置用户流量
  27. if(self::$systemConfig['reset_traffic']){
  28. $this->resetUserTraffic();
  29. }
  30. $jobEndTime = microtime(true);
  31. $jobUsedTime = round(($jobEndTime - $jobStartTime), 4);
  32. Log::info('---【'.$this->description.'】完成---,耗时'.$jobUsedTime.'秒');
  33. }
  34. private function expireUser(): void {
  35. // 过期用户处理
  36. $userList = User::query()->activeUser()->where('expire_time', '<', date('Y-m-d'))->get();
  37. foreach($userList as $user){
  38. if(self::$systemConfig['is_ban_status']){
  39. User::query()->whereId($user->id)->update([
  40. 'u' => 0,
  41. 'd' => 0,
  42. 'transfer_enable' => 0,
  43. 'enable' => 0,
  44. 'reset_time' => null,
  45. 'ban_time' => 0,
  46. 'status' => -1
  47. ]);
  48. $this->addUserBanLog($user->id, 0, '【禁止登录,清空账户】-账号已过期');
  49. // 废除其名下邀请码
  50. Invite::query()->whereUid($user->id)->whereStatus(0)->update(['status' => 2]);
  51. // 写入用户流量变动记录
  52. Helpers::addUserTrafficModifyLog($user->id, 0, $user->transfer_enable, 0, '[定时任务]账号已过期(禁止登录,清空账户)');
  53. }else{
  54. User::query()->whereId($user->id)->update([
  55. 'u' => 0,
  56. 'd' => 0,
  57. 'transfer_enable' => 0,
  58. 'enable' => 0,
  59. 'reset_time' => null,
  60. 'ban_time' => 0
  61. ]);
  62. $this->addUserBanLog($user->id, 0, '【封禁代理,清空账户】-账号已过期');
  63. // 写入用户流量变动记录
  64. Helpers::addUserTrafficModifyLog($user->id, 0, $user->transfer_enable, 0, '[定时任务]账号已过期(封禁代理,清空账户)');
  65. }
  66. }
  67. }
  68. /**
  69. * 添加用户封禁日志
  70. *
  71. * @param int $userId 用户ID
  72. * @param int $minutes 封禁时长,单位分钟
  73. * @param string $description 封禁理由
  74. */
  75. private function addUserBanLog($userId, $minutes, $description): void {
  76. $log = new UserBanedLog();
  77. $log->user_id = $userId;
  78. $log->minutes = $minutes;
  79. $log->description = $description;
  80. $log->save();
  81. }
  82. // 关闭超过72小时未处理的工单
  83. private function closeTickets(): void {
  84. $ticketList = Ticket::query()
  85. ->where('updated_at', '<=', date('Y-m-d', strtotime("-3 days")))
  86. ->whereStatus(1)
  87. ->get();
  88. foreach($ticketList as $ticket){
  89. $ret = Ticket::query()->whereId($ticket->id)->update(['status' => 2]);
  90. if($ret){
  91. PushNotification::send('工单关闭提醒', '工单:ID'.$ticket->id.'超过72小时未处理,系统已自动关闭');
  92. }
  93. }
  94. }
  95. // 重置用户流量
  96. private function resetUserTraffic(): void {
  97. $userList = User::query()
  98. ->where('status', '<>', -1)
  99. ->where('expire_time', '>', date('Y-m-d'))
  100. ->where('reset_time', '<=', date('Y-m-d'))
  101. ->get();
  102. foreach($userList as $user){
  103. // 跳过 没有重置日期的账号
  104. if(!$user->reset_time){
  105. continue;
  106. }
  107. // 取出用户正在使用的套餐
  108. $order = Order::query()
  109. ->with(['goods'])
  110. ->whereUserId($user->id)
  111. ->whereStatus(2)
  112. ->whereIsExpire(0)
  113. ->whereHas('goods', static function($q) {
  114. $q->whereType(2);
  115. })
  116. ->first();
  117. // 无订单的免费/特殊用户跳过
  118. if(!$order){
  119. continue;
  120. }
  121. // 过期生效中的加油包
  122. Order::query()
  123. ->with(['goods'])
  124. ->whereUserId($user->id)
  125. ->whereStatus(2)
  126. ->whereIsExpire(0)
  127. ->whereHas('goods', static function($q) {
  128. $q->whereType(1);
  129. })
  130. ->update(['is_expire' => 1]);
  131. //账号下一个重置时间
  132. $nextResetTime = date('Y-m-d', strtotime("+".$order->goods->period." days"));
  133. if($nextResetTime >= $user->expire_time){
  134. $nextResetTime = null;
  135. }
  136. // 可用流量 变动日志
  137. if($user->transfer_enable != $order->goods->traffic * MB){
  138. Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $user->transfer_enable,
  139. $order->goods->traffic * MB, '【流量重置】重置可用流量');
  140. }
  141. // 重置流量
  142. User::query()->whereId($user->id)->update([
  143. 'u' => 0,
  144. 'd' => 0,
  145. 'transfer_enable' => $order->goods->traffic * MB,
  146. 'reset_time' => $nextResetTime
  147. ]);
  148. Log::info('用户[ID:'.$user->id.' 昵称: '.$user->username.' 邮箱: '.$user->email.'] 流量重置为 '.($order->goods->traffic * MB).'. 重置日期为 '.($nextResetTime?: '【无】'));
  149. }
  150. }
  151. }