pengukuran balita

This commit is contained in:
Savema 2026-03-23 08:52:02 +07:00
parent 812fdc6e06
commit 7dd6f9cb08
5 changed files with 203 additions and 48 deletions

View File

@ -2,8 +2,10 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Anak;
use App\Models\PengukuranBalita; use App\Models\PengukuranBalita;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
class PengukuranBalitaController extends Controller class PengukuranBalitaController extends Controller
{ {
@ -16,4 +18,73 @@ public function index()
// return $ibu; // return $ibu;
return view('pengukuran_balita.data', compact('p_balita')); return view('pengukuran_balita.data', compact('p_balita'));
} }
public function create()
{
$balita = Anak::all();
return view('pengukuran_balita.create', compact('balita'));
}
public function store(Request $request)
{
// Cek apakah data dari form sampai
// dd($request->all());
$request->validate([
'balita_id' => 'required',
'tanggal' => 'required',
'usia' => 'required',
'jenis_kelamin' => 'required',
'berat_badan' => 'required',
'tinggi_badan' => 'required',
'lingkar_kepala' => 'required',
]);
try {
$response = Http::post('http://127.0.0.1:5000/predict', [
'JK' => (int) $request->jenis_kelamin,
'Usia' => (int) $request->usia,
'Berat' => (float) $request->berat_badan,
'Tinggi' => (float) $request->tinggi_badan,
'LiLA' => (float) $request->lingkar_kepala,
]);
if ($response->successful()) {
$hasilML = $response->json();
$mapHasil = [
0 => 'Stunting', // Z < -3 (Sangat Pendek)
1 => 'Risiko Stunting', // Z < -2 (Pendek)
2 => 'Normal' // Z >= -2 (Normal)
];
// Variabel ini sudah mengambil teks dari array mapHasil
$teksHasil = $mapHasil[$hasilML['Status_Stunting']] ?? 'Normal';
$simpan = PengukuranBalita::create([
'balita_id' => $request->balita_id,
'user_id' => auth()->id() ?? 1,
'berat_badan' => $request->berat_badan,
'tinggi_badan' => $request->tinggi_badan,
'lingkar_kepala' => $request->lingkar_kepala,
'usia_saat_ukur' => $request->usia,
'tanggal' => $request->tanggal,
'hasil' => $teksHasil, // LANGSUNG PANGGIL VARIABELNYA DI SINI
'zs_tbu' => $hasilML['Zscore'],
'bmi' => $request->berat_badan / (($request->tinggi_badan/100) ** 2),
]);
// Jika berhasil simpan, pindah ke index
return redirect()->route('pengukuran_balita.index')->with('success', 'Berhasil!');
}
// Jika API Flask error 400/500
dd("Flask Error: " . $response->body());
} catch (\Exception $e) {
// Jika ada error database atau koneksi, layar akan jadi hitam dan muncul pesan errornya
dd("Laravel Error: " . $e->getMessage());
}
}
} }

View File

@ -12,20 +12,16 @@ class PengukuranBalita extends Model
protected $table = 'pengukuran_balita'; protected $table = 'pengukuran_balita';
protected $fillable = [ protected $fillable = [
'balita_id', 'balita_id', 'user_id', 'berat_badan', 'tinggi_badan',
'user_id', 'lingkar_kepala', 'usia_saat_ukur', 'tanggal',
'tanggal', 'hasil', 'zs_tbu', 'bmi', 'zs_bmi_u', 'status_gizi_bmi'
'berat_badan',
'tinggi_badan',
'lingkar_kepala',
'usia_saat_ukur',
'hasil',
'zs_tbu'
]; ];
public function ibuHamil() // Perbaiki relasi ini
public function balita()
{ {
return $this->belongsTo(IbuHamil::class, 'ibu_hamil_id'); // Sesuaikan 'Anak::class' dengan nama Model Balita kamu
return $this->belongsTo(Anak::class, 'balita_id');
} }
public function petugas() public function petugas()

View File

@ -1,36 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('pengukuran_balita', function (Blueprint $table) {
$table->dropColumn([
'bmi',
'zs_bmi_u',
'status_gizi_bmi'
]);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
{
Schema::table('pengukuran_balita', function (Blueprint $table) {
$table->decimal('bmi', 5, 2)->nullable();
$table->decimal('zs_bmi_u', 5, 2)->nullable();
$table->string('status_gizi_bmi', 100)->nullable();
});
}
}
};

View File

@ -0,0 +1,124 @@
@extends('layouts.dashboard')
@section('title', 'Pengukuran Balita')
@section('content')
<div class="pagetitle mb-4">
<h1 style="color: #9c3a5b;">Form Pengukuran Balita</h1>
</div>
<section class="section">
<div class="row">
<div class="col-lg-10">
<div class="card">
<div class="card-body">
<h5 class="card-title">Tambah Data Pengukuran</h5>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('pengukuran_balita.store') }}" method="POST">
@csrf
<div class="row mb-3">
<label for="tanggal" class="col-sm-2 col-form-label">Tanggal Ukur</label>
<div class="col-sm-10">
<input type="date" class="form-control" name="tanggal" id="tanggal_ukur" value="{{ date('Y-m-d') }}" required>
</div>
</div>
<div class="row mb-3">
<label class="col-sm-2 col-form-label">Nama Balita</label>
<div class="col-sm-10">
<select name="balita_id" id="balita_id" class="form-control select2" required>
<option value="">-- Pilih Balita --</option>
@foreach($balita as $b)
<option value="{{ $b->id }}" data-tgl="{{ $b->tgl_lahir }}" data-jk="{{ $b->jenis_kelamin }}">
{{ $b->nama }}
</option>
@endforeach
</select>
</div>
</div>
<div class="row mb-3">
<label class="col-sm-2 col-form-label">Jenis Kelamin</label>
<div class="col-sm-10">
<input type="text" id="jk_display" class="form-control" readonly placeholder="Otomatis">
<input type="hidden" name="jenis_kelamin" id="jk_input">
</div>
</div>
<div class="row mb-3">
<label for="usia" class="col-sm-2 col-form-label">Usia (Bulan)</label>
<div class="col-sm-10">
<input type="text" id="usia_display" class="form-control" readonly placeholder="Otomatis terisi dalam bulan">
<input type="hidden" name="usia" id="usia_input">
</div>
</div>
<div class="row mb-3">
<label for="berat_badan" class="col-sm-2 col-form-label">Berat Badan</label>
<div class="col-sm-10">
<input type="number" step="0.01" class="form-control" name="berat_badan" required placeholder="kg">
</div>
</div>
<div class="row mb-3">
<label for="tinggi_badan" class="col-sm-2 col-form-label">Tinggi Badan</label>
<div class="col-sm-10">
<input type="number" step="0.1" class="form-control" name="tinggi_badan" required placeholder="cm">
</div>
</div>
<div class="row mb-3">
<label for="lingkar_kepala" class="col-sm-2 col-form-label">Lingkar Kepala</label>
<div class="col-sm-10">
<input type="number" step="0.1" class="form-control" name="lingkar_kepala" required>
</div>
</div>
<div class="row mb-3">
<div class="col-sm-10">
<button type="submit" class="btn btn-primary">Submit Form</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</section>
<script>
function updateData() {
let sel = document.getElementById("balita_id");
let opt = sel.options[sel.selectedIndex];
if (opt.value) {
// Update JK (1=Laki, 0=Perempuan)
let jk = opt.getAttribute("data-jk");
document.getElementById("jk_display").value = (jk == 1) ? "Laki-laki" : "Perempuan";
document.getElementById("jk_input").value = jk;
// Hitung Usia
let tglLahir = new Date(opt.getAttribute("data-tgl"));
let tglUkur = new Date(document.getElementById("tanggal_ukur").value);
let totalBulan = (tglUkur.getFullYear() - tglLahir.getFullYear()) * 12 + (tglUkur.getMonth() - tglLahir.getMonth());
if (tglUkur.getDate() < tglLahir.getDate()) totalBulan--;
document.getElementById("usia_display").value = (totalBulan < 0 ? 0 : totalBulan) + " Bulan";
document.getElementById("usia_input").value = (totalBulan < 0 ? 0 : totalBulan);
}
}
document.getElementById("balita_id").addEventListener("change", updateData);
document.getElementById("tanggal_ukur").addEventListener("change", updateData);
</script>
@endsection

View File

@ -26,7 +26,7 @@
</ul> </ul>
</div> </div>
@endif @endif
<form action="{{ route('pengukuran_ibu_hamil.store') }}" method="POST"> <form action="{{ route('pengukuran_balita.store') }}" method="POST">
@csrf @csrf
<div class="row mb-3"> <div class="row mb-3">
<label for="tanggal" class="col-sm-2 col-form-label">Tanggal</label> <label for="tanggal" class="col-sm-2 col-form-label">Tanggal</label>