307 lines
13 KiB
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.',
|
|
]);
|
|
}
|
|
}
|
|
} |