ReportController.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\Order;
  5. use App\Models\User;
  6. use Illuminate\Http\Request;
  7. class ReportController extends Controller
  8. {
  9. public function accounting()
  10. {
  11. $orders = Order::where('status', '>=', 2)->whereHas('goods')->latest()->get(['created_at', 'amount']);
  12. $ordersByDay = $orders->groupBy(function ($item) {
  13. return $item->created_at->format('Y-m-d');
  14. })->map(function ($row) {
  15. return $row->sum('amount');
  16. })->toArray();
  17. $ordersByMonth = $orders->groupBy(function ($item) {
  18. return $item->created_at->format('Y-m');
  19. })->map(function ($row) {
  20. return $row->sum('amount');
  21. })->toArray();
  22. $ordersByYear = $orders->groupBy(function ($item) {
  23. return $item->created_at->format('Y');
  24. })->map(function ($row) {
  25. return $row->sum('amount');
  26. })->sort()->toArray();
  27. $currentDays = date('j');
  28. $lastDays = date('t', strtotime('-1 months'));
  29. $data['days'] = range(1, max($currentDays, $lastDays));
  30. $data['years'] = range(1, 12);
  31. for ($i = 1; $i <= $currentDays; $i++) {
  32. $data['currentMonth'][] = $ordersByDay[date(sprintf('Y-m-%02u', $i))] ?? 0;
  33. }
  34. for ($i = 1; $i <= $lastDays; $i++) {
  35. $data['lastMonth'][] = $ordersByDay[date(sprintf('Y-m-%02u', $i), strtotime('-1 months'))] ?? 0;
  36. }
  37. for ($i = 1; $i <= date('m'); $i++) {
  38. $data['currentYear'][] = $ordersByMonth[date(sprintf('Y-%02u', $i))] ?? 0;
  39. }
  40. for ($i = 1; $i <= 12; $i++) {
  41. $data['lastYear'][] = $ordersByMonth[date(sprintf('Y-%02u', $i), strtotime('-1 years'))] ?? 0;
  42. }
  43. ksort($ordersByYear);
  44. $data['ordersByYear'] = $ordersByYear;
  45. return view('admin.report.accounting', compact('data'));
  46. }
  47. public function userAnalysis(Request $request)
  48. {
  49. $uid = $request->input('uid');
  50. $username = $request->input('username');
  51. if ($uid) {
  52. $user = User::find($uid);
  53. } elseif ($username) {
  54. $user = User::whereUsername($username)->first();
  55. }
  56. $data = null;
  57. if (isset($user)) {
  58. // 用户当前小时在各线路消耗流量
  59. $data['currentHourlyFlow'] = $user->dataFlowLogs()
  60. ->where('log_time', '>=', strtotime(date('Y-m-d H:00')))
  61. ->groupBy('node_id')
  62. ->selectRaw('node_id, sum(u + d) as total')
  63. ->get()->toArray();
  64. // 用户今天各小时在各线路消耗流量
  65. $data['hours'] = range(0, 23);
  66. $data['hourlyFlow'] = $user->hourlyDataFlows()->whereNotNull('node_id')
  67. ->where('created_at', '>=', date('Y-m-d H:i:s', strtotime('-1 days')))
  68. ->selectRaw('node_id, (DATE_FORMAT(user_hourly_data_flow.created_at, "%k")) as date, total')
  69. ->get()->transform(function ($item, $key) {
  70. return [
  71. 'node_id' => $item->node_id,
  72. 'date' => (int) $item->date,
  73. 'total' => round($item->total / GB, 2),
  74. ];
  75. })->toArray();
  76. // 用户本月每天在各线路消耗流量
  77. $data['days'] = range(1, date('j'));
  78. $data['dailyFlow'] = $user->dailyDataFlows()->whereNotNull('node_id')
  79. ->whereMonth('created_at', date('n'))
  80. ->where('total', '>', 6000000)
  81. ->selectRaw('node_id, (DATE_FORMAT(user_daily_data_flow.created_at, "%e")) as date, total')
  82. ->get()->transform(function ($item, $key) {
  83. return [
  84. 'node_id' => $item->node_id,
  85. 'date' => (int) $item->date,
  86. 'total' => round($item->total / GB, 2),
  87. ];
  88. })->toArray();
  89. }
  90. return view('admin.report.userDataAnalysis', compact('data'));
  91. }
  92. }