159 lines
5.3 KiB
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');
|
|
|
|
}}
|