DailyJob.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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(
  31. '---【' . $this->description . '】完成---,耗时' . $jobUsedTime . '秒'
  32. );
  33. }
  34. private function expireUser(): void
  35. {
  36. // 过期用户处理
  37. $userList = User::activeUser()
  38. ->where('expired_at', '<', date('Y-m-d'))
  39. ->get();
  40. $isBanStatus = sysConfig('is_ban_status');
  41. foreach ($userList as $user) {
  42. if ($isBanStatus) {
  43. $user->update(
  44. [
  45. 'u' => 0,
  46. 'd' => 0,
  47. 'transfer_enable' => 0,
  48. 'enable' => 0,
  49. 'reset_time' => null,
  50. 'ban_time' => null,
  51. 'status' => -1,
  52. ]
  53. );
  54. $this->addUserBanLog($user->id, 0, '【禁止登录,清空账户】-账号已过期');
  55. // 废除其名下邀请码
  56. Invite::whereInviterId($user->id)->whereStatus(0)->update(
  57. ['status' => 2]
  58. );
  59. // 写入用户流量变动记录
  60. Helpers::addUserTrafficModifyLog(
  61. $user->id,
  62. 0,
  63. $user->transfer_enable,
  64. 0,
  65. '[定时任务]账号已过期(禁止登录,清空账户)'
  66. );
  67. } else {
  68. $user->update(
  69. [
  70. 'u' => 0,
  71. 'd' => 0,
  72. 'transfer_enable' => 0,
  73. 'enable' => 0,
  74. 'reset_time' => null,
  75. 'ban_time' => null,
  76. ]
  77. );
  78. $this->addUserBanLog($user->id, 0, '【封禁代理,清空账户】-账号已过期');
  79. // 写入用户流量变动记录
  80. Helpers::addUserTrafficModifyLog(
  81. $user->id,
  82. 0,
  83. $user->transfer_enable,
  84. 0,
  85. '[定时任务]账号已过期(封禁代理,清空账户)'
  86. );
  87. }
  88. }
  89. }
  90. /**
  91. * 添加用户封禁日志
  92. *
  93. * @param int $userId 用户ID
  94. * @param int $time 封禁时长,单位分钟
  95. * @param string $description 封禁理由
  96. *
  97. * @return bool
  98. */
  99. private function addUserBanLog(
  100. int $userId,
  101. int $time,
  102. string $description
  103. ): bool {
  104. $log = new UserBanedLog();
  105. $log->user_id = $userId;
  106. $log->time = $time;
  107. $log->description = $description;
  108. return $log->save();
  109. }
  110. // 关闭超过72小时未处理的工单
  111. private function closeTickets(): void
  112. {
  113. $ticketList = Ticket::where(
  114. 'updated_at',
  115. '<=',
  116. date('Y-m-d', strtotime("-3 days"))
  117. )->whereStatus(1)->get();
  118. foreach ($ticketList as $ticket) {
  119. $ret = Ticket::whereId($ticket->id)->update(['status' => 2]);
  120. if ($ret) {
  121. PushNotification::send(
  122. '工单关闭提醒',
  123. '工单:ID' . $ticket->id . '超过72小时未处理,系统已自动关闭'
  124. );
  125. }
  126. }
  127. }
  128. // 重置用户流量
  129. private function resetUserTraffic(): void
  130. {
  131. $userList = User::where('status', '<>', -1)
  132. ->where('expired_at', '>', date('Y-m-d'))
  133. ->where('reset_time', '<=', date('Y-m-d'))
  134. ->get();
  135. foreach ($userList as $user) {
  136. // 跳过 没有重置日期的账号
  137. if ( ! $user->reset_time) {
  138. continue;
  139. }
  140. // 取出用户正在使用的套餐
  141. $order = Order::userActivePlan($user->id)->first();
  142. // 无订单用户跳过
  143. if ( ! $order) {
  144. continue;
  145. }
  146. // 过期生效中的加油包
  147. Order::userActivePackage($user->id)->update(['is_expire' => 1]);
  148. $oldData = $user->transfer_enable;
  149. // 重置流量与重置日期 TODO 可用流量变动日志加入至UserObserver
  150. $ret = $user->update(
  151. (new OrderService($order))->resetTimeAndData($user->expired_at)
  152. );
  153. if ($ret) {
  154. // 可用流量变动日志
  155. Helpers::addUserTrafficModifyLog(
  156. $order->user_id,
  157. $order->id,
  158. $oldData,
  159. $user->transfer_enable,
  160. '【流量重置】重置可用流量'
  161. );
  162. Log::info(
  163. '用户[ID:' . $user->id . ' 昵称: ' . $user->username . ' 邮箱: ' . $user->email . '] 流量重置为 ' . flowAutoShow(
  164. $user->transfer_enable
  165. ) . '. 重置日期为 ' . ($user->reset_time ?: '【无】')
  166. );
  167. } else {
  168. Log::error(
  169. '用户[ID:' . $user->id . ' 昵称: ' . $user->username . ' 邮箱: ' . $user->email . '] 流量重置失败'
  170. );
  171. }
  172. }
  173. }
  174. }