DataChart.php 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <?php
  2. namespace App\Helpers;
  3. use App\Models\NodeDailyDataFlow;
  4. use App\Models\NodeHourlyDataFlow;
  5. use App\Models\UserDailyDataFlow;
  6. use App\Models\UserDataFlowLog;
  7. use App\Models\UserHourlyDataFlow;
  8. use DB;
  9. trait DataChart
  10. {
  11. /**
  12. * 流量统计
  13. *
  14. * @param int $id 用户ID 或者 节点ID
  15. * @param bool $is_node 决定 id 是否为节点ID
  16. * @return array 用户/节点 流量统计
  17. */
  18. public function dataFlowChart(int $id, bool $is_node = false): array // 流量使用图表
  19. {
  20. $lastHour = (int) date('G') + 1;
  21. $lastDay = date('j');
  22. $hourlyData = array_fill(0, $lastHour, 0);
  23. $dailyData = array_fill(0, $lastDay - 1, 0);
  24. if ($is_node) {
  25. $currentFlow = UserDataFlowLog::whereNodeId($id);
  26. $hourlyFlow = NodeHourlyDataFlow::whereNodeId($id)->whereDate('created_at', date('Y-m-d'))->selectRaw('(DATE_FORMAT(node_hourly_data_flow.created_at, "%k")) as date, total')->pluck('total', 'date');
  27. $dailyFlow = NodeDailyDataFlow::whereNodeId($id)->whereMonth('created_at', date('n'))->selectRaw('(DATE_FORMAT(node_daily_data_flow.created_at, "%e")) as date, total')->pluck('total', 'date');
  28. } else {
  29. $currentFlow = UserDataFlowLog::whereUserId($id);
  30. $hourlyFlow = UserHourlyDataFlow::userHourly($id)->whereDate('created_at', date('Y-m-d'))->selectRaw('(DATE_FORMAT(user_hourly_data_flow.created_at, "%k")) as date, total')->pluck('total', 'date');
  31. $dailyFlow = UserDailyDataFlow::userDaily($id)->whereMonth('created_at', date('n'))->selectRaw('(DATE_FORMAT(user_daily_data_flow.created_at, "%e")) as date, total')->pluck('total', 'date');
  32. }
  33. $currentFlow = $currentFlow->where('log_time', '>=', strtotime(date('Y-m-d H:0')))->sum(DB::raw('u + d'));
  34. // 节点一天内的流量
  35. foreach ($hourlyFlow as $date => $dataFlow) {
  36. $hourlyData[$date] = round($dataFlow / GiB, 3);
  37. }
  38. $hourlyData[$lastHour] = round($currentFlow / GiB, 3);
  39. // 节点一个月内的流量
  40. foreach ($dailyFlow as $date => $dataFlow) {
  41. $dailyData[$date - 1] = round($dataFlow / GiB, 3);
  42. }
  43. $dailyData[$lastDay - 1] = round(array_sum($hourlyData) + $currentFlow / GiB, 3);
  44. return [
  45. 'trafficDaily' => $dailyData,
  46. 'trafficHourly' => $hourlyData,
  47. 'monthDays' => range(1, $lastDay), // 本月天数
  48. 'dayHours' => range(0, $lastHour), // 本日小时
  49. ];
  50. }
  51. }