TIF_E41201209/Siketas_map_FIX/app/Http/Controllers/KecelakaanController.php

307 lines
13 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Jalan;
use App\Models\Kecelakaan;
use App\Models\Rules;
use Cviebrock\EloquentSluggable\Services\SlugService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class KecelakaanController extends Controller
{
public function index($slug)
{
$jalan = Jalan::where('slug', $slug)->first();
// dd($jalan);
$data = Kecelakaan::with('jalan')->where('id_jalan', $jalan->id)->get();
// dd($data);
return view('dashboard.kecelakaan.index', ['data' => $data], ['nama_jalan' => $jalan]);
}
public function create($slug)
{
$jalan = Jalan::with('kecelakaan')->where('slug', $slug)->first();
// dd($jalan);
return view('dashboard.kecelakaan.create', ['data' => $jalan]);
}
public function store(Request $request, Jalan $jalan)
{
// dd($request);
$this->validate($request, [
'tanggal' => 'required',
'waktu_kejadian' => 'required',
'jalans_id' => 'required',
'tkp_dusun' => '',
'desa' => '',
'kecamatan' => 'required',
'kabupaten' => 'required',
'latitude' => 'required',
'longitude' => 'required',
'korban_md' => '',
'korban_lb' => '',
'korban_lr' => '',
'kondisi_kecelakaan' => 'required',
'kondisi_cahaya' => 'required',
'bentuk_geometri' => 'required',
]);
// Mengambil data dari form
$waktu_kejadian = $request->waktu_kejadian;
$kondisi_kecelakaan = $request->kondisi_kecelakaan;
$kondisi_cahaya = $request->kondisi_cahaya;
$bentuk_geometri = $request->bentuk_geometri;
$waktuKejadian = keanggotaanWaktuKejadian($waktu_kejadian);
// ---------------------------------- Kondisi Kecelakaan ---------------------------------- //
$kondisiKecelakaan = keanggotaanKondisiKecelakaan($kondisi_kecelakaan);
// ---------------------------------- Kondisi Cahaya ---------------------------------- //
$kondisiCahaya = keanggotaanKondisiCahaya($kondisi_cahaya);
// ---------------------------------- Bentuk Geometri ---------------------------------- //
$bentukGeometri = keanggotaanBentukGeometri($bentuk_geometri);
$rule = Rules::where('waktu_kejadian', $waktuKejadian['waktu_kejadianRule'])
->where('kondisi_kecelakaan', $kondisiKecelakaan['kondisi_kecelakaanRule'])
->where('kondisi_cahaya', $kondisiCahaya['kondisi_cahayaRule'])
->where('bentuk_geometri', $bentukGeometri['bentuk_geometriRule'])
->first();
// Menghitung nilai defuzzy
$Maxwaktu_kejadian = max($waktuKejadian['waktu_kejadianA'], $waktuKejadian['waktu_kejadianB'], $waktuKejadian['waktu_kejadianC'], $waktuKejadian['waktu_kejadianD']);
$Maxkondisi_kecelakaan = max($kondisiKecelakaan['kondisi_kecelakaanA'], $kondisiKecelakaan['kondisi_kecelakaanB'], $kondisiKecelakaan['kondisi_kecelakaanC']);
$Maxkondisi_cahaya = max($kondisiCahaya['kondisi_cahayaA'], $kondisiCahaya['kondisi_cahayaB']);
$Maxbentuk_geometri = max($bentukGeometri['bentuk_geometriA'], $bentukGeometri['bentuk_geometriB'], $bentukGeometri['bentuk_geometriC'], $bentukGeometri['bentuk_geometriD'], $bentukGeometri['bentuk_geometriE']);
$minRule = min($Maxwaktu_kejadian, $Maxkondisi_kecelakaan, $Maxkondisi_cahaya, $Maxbentuk_geometri);
$luasMoment = hitungLuasMoment($rule->tingkat_kerawanan, $minRule);
$defuzzy = $luasMoment['totalMoment'] / $luasMoment['totalLuas'];
// Mengambil semua data
$data = $request->all();
$data['nama_jalan'] = $jalan->nama_jalan;
$data['id_jalan'] = $jalan->id;
$slug = SlugService::createSlug(Jalan::class, 'slug', $jalan->nama_jalan);
$data['slug'] = substr($slug, 0, -2);
$data['tingkat_kerawanan'] = $rule->tingkat_kerawanan;
$data['id_rules'] = $rule->id;
$data['defuzzy'] = $defuzzy;
Kecelakaan::create($data);
if ($data) {
return redirect()
->route('jalan.kecelakaan.index', ['jalan' => $data['slug']])
->with([
'success' => 'Data Kecelakaan Berhasil Ditambahkan'
]);
} else {
return redirect()
->back()
->withInput()
->with([
'error' => 'Some problem occurred, please try again'
]);
}
}
public function show($jalan, $kecelakaan)
{
$detailkecelakaan = Kecelakaan::select('tanggal', 'waktu_kejadian', 'nama_jalan', 'tkp_dusun', 'desa', 'kecamatan', 'kabupaten', 'latitude', 'longitude', 'korban_md', 'korban_lb', 'korban_lr', 'kondisi_kecelakaan', 'kondisi_cahaya', 'bentuk_geometri')->find($kecelakaan);
// dd($detailkecelakaan);
return response()->json([
'status' => 200,
'detail' => $detailkecelakaan
]);
// dd($detailkecelakaan);
}
public function edit($jalan, $kecelakaan)
{
$jalan = Jalan::where('slug', $jalan)->first();
$kecelakaan = Kecelakaan::where('id', $kecelakaan)->first();
// dd($kecelakaan);
return view('dashboard.kecelakaan.edit', ['jalan' => $jalan, 'kecelakaan' => $kecelakaan]);
}
public function update(Request $request, Jalan $jalan, Kecelakaan $kecelakaan)
{
// Validasi data input
$data = [
'tanggal' => $request->tanggal,
'waktu_kejadian' => $request->waktu_kejadian,
'jalans_id' => $request->jalans_id,
'tkp_dusun' => $request->tkp_dusun,
'desa' => $request->desa,
'kecamatan' => $request->kecamatan,
'kabupaten' => $request->kabupaten,
'latitude' => $request->latitude,
'longitude' => $request->longitude,
'korban_md' => $request->korban_md,
'korban_lb' => $request->korban_lb,
'korban_lr' => $request->korban_lr,
'kondisi_kecelakaan' => $request->kondisi_kecelakaan,
'kondisi_cahaya' => $request->kondisi_cahaya,
'bentuk_geometri' => $request->bentuk_geometri,
'tingkat_kerawanan' => $request->tingkat_kerawanan,
'id_jalan' => $request->id_jalan,
'id_rules' => $request->id_rules,
];
// Menghitung nilai defuzzy
$waktu_kejadian = $request->waktu_kejadian;
$kondisi_kecelakaan = $request->kondisi_kecelakaan;
$kondisi_cahaya = $request->kondisi_cahaya;
$bentuk_geometri = $request->bentuk_geometri;
$waktuKejadian = keanggotaanWaktuKejadian($waktu_kejadian);
$kondisiKecelakaan = keanggotaanKondisiKecelakaan($kondisi_kecelakaan);
$kondisiCahaya = keanggotaanKondisiCahaya($kondisi_cahaya);
$bentukGeometri = keanggotaanBentukGeometri($bentuk_geometri);
$rule = Rules::where('waktu_kejadian', $waktuKejadian['waktu_kejadianRule'])
->where('kondisi_kecelakaan', $kondisiKecelakaan['kondisi_kecelakaanRule'])
->where('kondisi_cahaya', $kondisiCahaya['kondisi_cahayaRule'])
->where('bentuk_geometri', $bentukGeometri['bentuk_geometriRule'])
->first();
$Maxwaktu_kejadian = max($waktuKejadian['waktu_kejadianA'], $waktuKejadian['waktu_kejadianB'], $waktuKejadian['waktu_kejadianC'], $waktuKejadian['waktu_kejadianD']);
$Maxkondisi_kecelakaan = max($kondisiKecelakaan['kondisi_kecelakaanA'], $kondisiKecelakaan['kondisi_kecelakaanB'], $kondisiKecelakaan['kondisi_kecelakaanC']);
$Maxkondisi_cahaya = max($kondisiCahaya['kondisi_cahayaA'], $kondisiCahaya['kondisi_cahayaB']);
$Maxbentuk_geometri = max($bentukGeometri['bentuk_geometriA'], $bentukGeometri['bentuk_geometriB'], $bentukGeometri['bentuk_geometriC'], $bentukGeometri['bentuk_geometriD'], $bentukGeometri['bentuk_geometriE']);
$minRule = min($Maxwaktu_kejadian, $Maxkondisi_kecelakaan, $Maxkondisi_cahaya, $Maxbentuk_geometri);
$luasMoment = hitungLuasMoment($rule->tingkat_kerawanan, $minRule);
$defuzzy = $luasMoment['totalMoment'] / $luasMoment['totalLuas'];
// Menyimpan data
$data['nama_jalan'] = $jalan->nama_jalan;
$data['id_jalan'] = $jalan->id;
$slug = SlugService::createSlug(Jalan::class, 'slug', $jalan->nama_jalan);
$data['slug'] = substr($slug, 0, -2);
$data['tingkat_kerawanan'] = $rule->tingkat_kerawanan;
$data['id_rules'] = $rule->id;
$data['defuzzy'] = $defuzzy;
$kecelakaan->update($data);
if ($data) {
return redirect()
->route('jalan.kecelakaan.index', ['jalan' => $jalan->slug])
->with([
'success' => 'Data Kecelakaan Berhasil Diubah'
]);
} else {
return redirect()
->back()
->withInput()
->with([
'error' => 'Some problem occurred, please try again'
]);
}
}
public function detail($jalan, $kecelakaan)
{
$jalan = Jalan::where('slug', $jalan)->first();
$kecelakaan = Kecelakaan::where('id', $kecelakaan)->with(['rules', 'jalan'])->first();
// Mengambil hasil perhitungan derajat keanggotaan
$waktuKejadian = keanggotaanWaktuKejadian($kecelakaan->waktu_kejadian);
// ---------------------------------- Kondisi Kecelakaan ---------------------------------- //
$kondisiKecelakaan = keanggotaanKondisiKecelakaan($kecelakaan->kondisi_kecelakaan);
// ---------------------------------- Kondisi Cahaya ---------------------------------- //
$kondisiCahaya = keanggotaanKondisiCahaya($kecelakaan->kondisi_cahaya);
// ---------------------------------- Bentuk Geometri ---------------------------------- //
$bentukGeometri = keanggotaanBentukGeometri($kecelakaan->bentuk_geometri);
// ----------------------------------Min-Max Fungsi implikasi---------------------------------- //
$Maxwaktu_kejadian = max($waktuKejadian['waktu_kejadianA'], $waktuKejadian['waktu_kejadianB'], $waktuKejadian['waktu_kejadianC'], $waktuKejadian['waktu_kejadianD']);
$Maxkondisi_kecelakaan = max($kondisiKecelakaan['kondisi_kecelakaanA'], $kondisiKecelakaan['kondisi_kecelakaanB'], $kondisiKecelakaan['kondisi_kecelakaanC']);
$Maxkondisi_cahaya = max($kondisiCahaya['kondisi_cahayaA'], $kondisiCahaya['kondisi_cahayaB']);
$Maxbentuk_geometri = max($bentukGeometri['bentuk_geometriA'], $bentukGeometri['bentuk_geometriB'], $bentukGeometri['bentuk_geometriC'], $bentukGeometri['bentuk_geometriD'], $bentukGeometri['bentuk_geometriE']);
// Fungsi implikasi -> hitung moment (helper)
$minRule = min($Maxwaktu_kejadian, $Maxkondisi_kecelakaan, $Maxkondisi_cahaya, $Maxbentuk_geometri);
// Menyimpan nilai hasil hitung luas dan moment
$luasMoment = hitungLuasMoment($kecelakaan->tingkat_kerawanan, $minRule);
$luasA1 = $luasMoment['luasA1'];
$luasA2 = $luasMoment['luasA2'];
$luasA3 = $luasMoment['luasA3'];
// dd($luasA1, $luasA2, $luasA3);
$momentSatu = $luasMoment['momentSatu'];
$momentDua = $luasMoment['momentDua'];
$momentTiga = $luasMoment['momentTiga'];
// ---------------------------------- Defuzzifikasi(Menghitung nilai tengah) ---------------------------------- //
$defuzzy = $luasMoment['totalMoment'] / $luasMoment['totalLuas'];
$fungsiKeanggotaan = [
'waktu_kejadian' => $Maxwaktu_kejadian,
'kondisi_kecelakaan' => $Maxkondisi_kecelakaan,
'kondisi_cahaya' => $Maxkondisi_cahaya,
'bentuk_geometri' => $Maxbentuk_geometri,
];
return view('dashboard.kecelakaan.detailfix', [
//Menampilkan data
'jalan' => $jalan,
'kecelakaan' => $kecelakaan,
'keanggotaan' => $fungsiKeanggotaan,
'luasA1' => $luasA1,
'luasA2' => $luasA2,
'luasA3' => $luasA3,
'momentSatu' => $momentSatu,
'momentDua' => $momentDua,
'momentTiga' => $momentTiga,
'defuzzy' => $defuzzy,
]);
}
public function destroy($id)
{
try {
DB::table('kecelakaans')->where('id', $id)->delete();
// alihkan halaman ke halaman jalan dengan pesan sukses
return redirect()
->back()
->with([
'success' => 'Data kecelakaan Berhasil Dihapus',
]);
} catch (\Illuminate\Database\QueryException $e) {
if ($e->getCode() == '23000') {
// Integrity constraint violation
return redirect()
->back()
->with([
'error' => 'Data kecelakaan tidak dapat dihapus karena terkait dengan data kecelakaan.',
]);
}
// Tangani pengecualian lainnya
return redirect()
->back()
->with([
'warning' => 'Terjadi kesalahan saat menghapus data kecelakaan.',
]);
}
}
}