TIF_NGANJUK_E41211253/app/Http/Controllers/DashboardController.php

215 lines
7.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use App\Models\SensorData;
use Illuminate\Http\Request;
use App\Charts\distanceChart;
use App\Charts\PresureChart;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
class DashboardController extends Controller
{
public function __construct()
{
$this->middleware(function ($request, $next) {
$response = $next($request);
$response->headers->set('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');
$response->headers->set('Pragma', 'no-cache');
$response->headers->set('Expires', 'Sat, 26 Jul 1997 05:00:00 GMT');
return $response;
});
}
public function index()
{
if (!Auth::check()) { // Cek apakah pengguna sudah login
return redirect()->route('login'); // Arahkan ke login jika belum login
}
$data = getDevices();
return view('admin.pages.dashboard', compact('data'));
}
public function dua(distanceChart $distanceChart, Request $request)
{
$data['distanceChart'] = $distanceChart->build();
$latestPressure = SensorData::where('device_name', 'kawedanan')
->orderBy('created_at', 'desc')
->first(['pressure']);
// Jika request adalah AJAX, kembalikan data dalam format JSON
if ($request->ajax()) {
if ($latestPressure) {
Log::info('Pressure data:', ['pressure' => $latestPressure->pressure]);
return response()->json(['pressure' => $latestPressure->pressure, 'distanceChart' => $data['distanceChart']]); // Kembalikan data dalam format JSON
} else {
Log::warning('No pressure data found for device "kawedanan".');
return response()->json(['pressure' => null, 'distanceChart' => $data['distanceChart']]); // Kembalikan null jika tidak ada data
}
}
// Mengirim data ke view jika bukan request AJAX
$data['latestPressure'] = $latestPressure; // Menambahkan data tekanan ke data view
return view('admin.pages.unit1', $data);
}
public function showUnit(string $deviceName)
{
if (!Auth::check()) {
return redirect()->route('login');
}
// Ambil data sensor terbaru (termasuk pressure dan distance)
$latestData = SensorData::where('device_name', 'like', "%$deviceName%")
->latest('created_at')
->first();
// Ambil data pressure terbaru yang valid (tidak null)
$latestPressureData = SensorData::where('device_name', 'like', "%$deviceName%")
->whereNotNull('pressure')
->orderBy('created_at', 'desc')
->first();
if ($latestPressureData) {
$pressureLatest = $latestPressureData->pressure;
$pressureLatestDate = \Carbon\Carbon::parse($latestPressureData->created_at);
} else {
$pressureLatest = null;
$pressureLatestDate = null;
}
$startOfWeek = now()->startOfWeek();
$endOfWeek = now()->endOfWeek();
$distanceData = SensorData::select(
'distance',
'created_at',
DB::raw('date_format(created_at, "%w") as day'),
'device_name'
)
->whereNotNull('distance')
->where('device_name', 'like', "%$deviceName%")
->whereBetween('created_at', [$startOfWeek, $endOfWeek])
->orderBy('created_at', 'desc')
->get()
->groupBy('day')
->map(function ($items) {
$groupedByDevice = $items->groupBy('device_name');
$latestItems = $groupedByDevice->map(fn($devItems) => $devItems->first());
$totalDistance = $latestItems->sum(fn($item) => $item->distance ?? 0);
$latestCreatedAt = $latestItems->max(fn($item) => $item->created_at);
$anyItem = $items->first();
return [
'value' => $totalDistance,
'day' => ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'][$anyItem->day],
'dayIndex' => $anyItem->day,
'created_at' => \Carbon\Carbon::parse($latestCreatedAt)->format('H:i'),
'latestCreatedAtObj' => $latestCreatedAt,
];
})
->sortBy('dayIndex')
->values();
// Ambil waktu terbaru dari semua data distance
$latestDistanceDate = $distanceData->max('latestCreatedAtObj');
$latestDistanceDate = $latestDistanceDate ? \Carbon\Carbon::parse($latestDistanceDate) : null;
$data = [
'latest' => $latestData,
'distanceData' => json_encode($distanceData),
'pressureLatest' => $pressureLatest,
'pressureLatestDate' => $pressureLatestDate,
'latestDistanceDate' => $latestDistanceDate,
'deviceName' => ucwords($deviceName),
];
return view('admin.pages.unit', $data);
}
public function getDistanceData(Request $request)
{
$startDate = Carbon::parse($request->start_date)->startOfDay();
$endDate = Carbon::parse($request->end_date)->endOfDay();
$data = DB::table('sensor_data')
->select(
DB::raw("DATE_FORMAT(created_at, '%Y-%m-%d %H:%i') as time_interval"),
DB::raw("SUM(CASE WHEN device_name = 'klampisan_atas' THEN distance ELSE 0 END) as distance_atas"),
DB::raw("SUM(CASE WHEN device_name = 'klampisan_bawah' THEN distance ELSE 0 END) as distance_bawah"),
DB::raw("SUM(distance) as total_distance")
)
->whereBetween('created_at', [$startDate, $endDate])
->whereIn('device_name', ['klampisan_atas', 'klampisan_bawah'])
->groupBy(DB::raw("FLOOR(UNIX_TIMESTAMP(created_at) / (30 * 60))"))
->orderBy('time_interval')
->get();
return response()->json($data);
}
public function profiladmin()
{
return view('admin.pages.profil');
}
public function datapegawai()
{
return view('admin.pages.datapegawai');
}
public function ambilsensor($deviceName)
{
// Mendapatkan tanggal hari ini dan 7 hari sebelumnya
$startDate = now()->subDays(7); // 7 hari yang lalu
$endDate = now(); // Hari ini
// Mengambil data untuk klampisan_atas dalam rentang waktu satu minggu terakhir
$klampisanAtas = SensorData::where('device_name', 'klampisan_atas')
->whereBetween('created_at', [$startDate, $endDate])
->select('created_at', 'distance')
->orderBy('created_at', 'asc')
->get();
// Mengambil data untuk klampisan_bawah dalam rentang waktu satu minggu terakhir
$klampisanBawah = SensorData::where('device_name', 'klampisan_bawah')
->whereBetween('created_at', [$startDate, $endDate])
->select('created_at', 'distance')
->orderBy('created_at', 'asc')
->get();
// Memisahkan label dan data untuk chart
$labels = $klampisanAtas->pluck('created_at')->map(function ($date) {
return $date->format('M d'); // Format tanggal sesuai kebutuhan
});
// Data distance untuk klampisan_atas
$dataAtas = $klampisanAtas->pluck('distance');
// Data distance untuk klampisan_bawah
$dataBawah = $klampisanBawah->pluck('distance');
// Mengirimkan data ke view
$data = [
'labels' => $labels,
'klampisan_atas' => $dataAtas,
'klampisan_bawah' => $dataBawah,
];
return view('admin.pages.datasensor', compact('data', 'deviceName'));
}
}