215 lines
7.5 KiB
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'));
|
|
}
|
|
}
|