TIF_NGANJUK_E41211253/app/Http/Controllers/SensorDataController.php

159 lines
5.3 KiB
PHP

<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use App\Models\SensorData;
use App\Exports\DataExport;
use Maatwebsite\Excel\Facades\Excel;
use Maatwebsite\Excel\Concerns\Exportable;
use Illuminate\Http\Request;
class SensorDataController extends Controller
{
function filter(Request $req)
{
// Ambil device_name dari request atau default ke semua perangkat
$deviceNames = $req->device_name ? [$req->device_name] : getDevices();
$data = [];
foreach ($deviceNames as $deviceName) {
$builder = SensorData::select(
DB::raw('AVG(pressure) as pressure'),
DB::raw('AVG(distance) as distance')
);
// Tambahkan kolom waktu berdasarkan filter
if ($req->by == 'date') {
$builder = $builder->addSelect(DB::raw('DATE_FORMAT(created_at, "%Y-%m-%d") as waktu'));
} else if ($req->by == 'month') {
$builder = $builder->addSelect(DB::raw('DATE_FORMAT(created_at, "%Y-%m") as waktu'));
} else if ($req->by == 'year') {
$builder = $builder->addSelect(DB::raw('DATE_FORMAT(created_at, "%Y") as waktu'));
} else {
$builder = $builder->addSelect(DB::raw('DATE_FORMAT(created_at, "%Y-%m-%d %H:00") as waktu'));
}
// Filter dan grup data berdasarkan waktu
$data[$deviceName] = $builder
->where('device_name', 'like', "%$deviceName%")
->groupByRaw('waktu')
->get();
}
return [
'message' => 'Data has been fetched',
'data' => $data,
];
}
public function coba($deviceName, Request $request)
{
if ($deviceName === 'klampisan') {
$deviceNames = ['klampisan_atas', 'klampisan_bawah'];
} else {
$deviceNames = [$deviceName];
}
$start_date = $request->get('start_date');
$end_date = $request->get('end_date');
$sensors = collect();
$grouped = collect();
if ($start_date && $end_date) {
$request->validate([
'start_date' => 'required|date',
'end_date' => 'required|date',
]);
$start_date = date('Y-m-d H:i:s', strtotime($start_date));
$end_date = date('Y-m-d H:i:s', strtotime($end_date));
$sensors = DB::table('sensor_data')
->selectRaw('device_name, DATE_FORMAT(created_at, "%Y-%m-%d %H:00:00") as interval_time, MAX(distance) as max_distance')
->whereIn('device_name', $deviceNames)
->whereBetween('created_at', [$start_date, $end_date])
->groupBy('device_name', 'interval_time')
->orderBy('interval_time')
->get();
$grouped = $sensors->groupBy('device_name');
}
return view('admin.pages.dataprint', [
'deviceName' => $deviceName,
'sensors' => $sensors,
'groupedSensors' => $grouped,
'start_date' => $start_date,
'end_date' => $end_date,
]);
}
public function data($deviceName, Request $request)
{
$start_date = $request->get('start_date');
$end_date = $request->get('end_date');
$sensors = collect();
if ($start_date && $end_date) {
$request->validate([
'start_date' => 'required|date',
'end_date' => 'required|date',
]);
$sensors = DB::table('sensor_data as s1')
->joinSub(
DB::table('sensor_data')
->selectRaw('MAX(created_at) as max_time, DATE_FORMAT(created_at,
"%Y-%m-%d %H:30:00") as interval_time, MAX(distance) as last_distance')
->where('device_name', $deviceName)
->whereBetween('created_at', [$start_date, $end_date])
->groupBy('interval_time'),
's2',
's1.created_at',
'=',
's2.max_time'
)
->select('s2.interval_time', 's2.last_distance')
->get();
}
return view('admin.pages.dataprint', compact('deviceName',
'sensors', 'start_date', 'end_date'));
}
public function export(Request $request)
{
// Mengambil parameter yang dikirimkan dari form ekspor
$start_date = $request->get('start_date');
$end_date = $request->get('end_date');
$device_name = $request->get('device_name');
// Ambil data sensor yang sudah difilter berdasarkan rentang tanggal dan device_name
$sensors = DB::table('sensor_data as s1')
->joinSub(
DB::table('sensor_data')
->selectRaw('MAX(created_at) as max_time, DATE_FORMAT(created_at, "%Y-%m-%d %H:30:00") as interval_time, MAX(distance) as last_distance')
->where('device_name', $device_name)
->whereBetween('created_at', [$start_date, $end_date])
->groupBy('interval_time'),
's2',
's1.created_at',
'=',
's2.max_time'
)
->select('s2.interval_time', 's2.last_distance')
->get();
// Kirim data ke export
return Excel::download(new DataExport($sensors), 'sensor_data_' . $device_name . '.xlsx');
}}