DailyJob.php 5.0 KB

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