fixDailyTrafficLogError.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Models\NodeDailyDataFlow;
  4. use App\Models\UserDailyDataFlow;
  5. use App\Models\UserDataFlowLog;
  6. use Illuminate\Console\Command;
  7. use Log;
  8. class fixDailyTrafficLogError extends Command
  9. {
  10. protected $signature = 'fixDailyTrafficLogError';
  11. protected $description = '修复原版本的每日流量计算错误';
  12. private $end;
  13. public function handle(): void
  14. {
  15. // set value
  16. $this->end = date('Y-m-d 23:59:59', strtotime("-1 days"));
  17. $nodeArray = UserDataFlowLog::distinct()->pluck('node_id')->toArray();
  18. Log::info(
  19. '----------------------------【修复原版本的每日流量计算错误】开始----------------------------'
  20. );
  21. Log::info(
  22. '----------------------------【节点流量日志修正】开始----------------------------'
  23. );
  24. foreach (NodeDailyDataFlow::all() as $log) {
  25. NodeDailyDataFlow::whereId($log->id)->update(
  26. [
  27. 'created_at' => date(
  28. 'Y-m-d H:i:s',
  29. strtotime("$log->created_at -1 days")
  30. ),
  31. ]
  32. );
  33. }
  34. Log::info(
  35. '----------------------------【添加节点流量日志】开始----------------------------'
  36. );
  37. foreach ($nodeArray as $nodeId) {
  38. $query = UserDataFlowLog::whereNodeId($nodeId)
  39. ->whereBetween(
  40. 'log_time',
  41. [
  42. strtotime(
  43. date(
  44. 'Y-m-d',
  45. strtotime("-1 days")
  46. )
  47. ),
  48. strtotime($this->end),
  49. ]
  50. );
  51. $u = $query->sum('u');
  52. $d = $query->sum('d');
  53. $total = $u + $d;
  54. if ($total) { // 有数据才记录
  55. $obj = new NodeDailyDataFlow();
  56. $obj->node_id = $nodeId;
  57. $obj->u = $u;
  58. $obj->d = $d;
  59. $obj->total = $total;
  60. $obj->traffic = flowAutoShow($total);
  61. $obj->created_at = $this->end;
  62. $obj->save();
  63. }
  64. }
  65. Log::info(
  66. '----------------------------【添加节点流量日志】结束----------------------------'
  67. );
  68. Log::info(
  69. '----------------------------【节点流量日志修正】结束----------------------------'
  70. );
  71. Log::info(
  72. '----------------------------【用户流量日志修正】开始----------------------------'
  73. );
  74. foreach (UserDailyDataFlow::all() as $log) {
  75. UserDailyDataFlow::whereId($log->id)->update(
  76. [
  77. 'created_at' => date(
  78. 'Y-m-d H:i:s',
  79. strtotime("$log->created_at -1 days")
  80. ),
  81. ]
  82. );
  83. }
  84. Log::info(
  85. '----------------------------【用户个人流量日志修正】开始----------------------------'
  86. );
  87. foreach (
  88. UserDataFlowLog::distinct()->pluck('user_id')->toArray() as $userId
  89. ) {
  90. // 统计一次所有节点的总和
  91. $this->statisticsByUser($userId);
  92. // 统计每个节点产生的流量
  93. foreach ($nodeArray as $nodeId) {
  94. $this->statisticsByUser($userId, $nodeId);
  95. }
  96. }
  97. Log::info(
  98. '----------------------------【用户个人流量日志修正】结束----------------------------'
  99. );
  100. Log::info(
  101. '----------------------------【用户流量日志修正】结束----------------------------'
  102. );
  103. Log::info(
  104. '----------------------------【修复原版本的每日流量计算错误】结束----------------------------'
  105. );
  106. }
  107. private function statisticsByUser($user_id, $node_id = 0): void
  108. {
  109. $query = UserDataFlowLog::whereUserId($user_id)
  110. ->whereBetween(
  111. 'log_time',
  112. [
  113. strtotime(
  114. date('Y-m-d', strtotime("-1 days"))
  115. ),
  116. strtotime($this->end),
  117. ]
  118. );
  119. if ($node_id) {
  120. $query->whereNodeId($node_id);
  121. }
  122. $u = $query->sum('u');
  123. $d = $query->sum('d');
  124. $total = $u + $d;
  125. if ($total) { // 有数据才记录
  126. $obj = new UserDailyDataFlow();
  127. $obj->user_id = $user_id;
  128. $obj->node_id = $node_id;
  129. $obj->u = $u;
  130. $obj->d = $d;
  131. $obj->total = $total;
  132. $obj->traffic = flowAutoShow($total);
  133. $obj->created_at = $this->end;
  134. $obj->save();
  135. }
  136. }
  137. }