diff --git a/app/Http/Controllers/Web/Dashboard/SummaryController.php b/app/Http/Controllers/Web/Dashboard/SummaryController.php index 43a0eee..4875199 100644 --- a/app/Http/Controllers/Web/Dashboard/SummaryController.php +++ b/app/Http/Controllers/Web/Dashboard/SummaryController.php @@ -34,12 +34,42 @@ class SummaryController extends Controller $totalpetani = Profile::where('role', 'petani')->count(); $totallahan = Lahan::whereNotNull('path')->count(); - $petaniList = Profile::where('role', 'petani') - ->with(['lahan.tanaman.komoditas', 'desaKelurahan']) + $petaniList = Profile::select('id', 'nama', 'role', 'desa_kelurahan_id') + ->where('role', 'petani') + ->with([ + 'lahan:id,profile_id,luas_lahan', + 'desaKelurahan:id,nama,kecamatan_id', + ]) ->paginate(20); - $allLahan = Lahan::whereNotNull('path') - ->with(['profile', 'tanaman.komoditas', 'desaKelurahan.kecamatan.kabupatenKota.provinsi']) + $lahanSummaryByDesa = Lahan::whereNotNull('path') + ->whereNotNull('desa_kelurahan_id') + ->select('desa_kelurahan_id') + ->selectRaw('COUNT(*) as total_lahan') + ->selectRaw('COALESCE(SUM(luas_lahan), 0) as total_luas') + ->groupBy('desa_kelurahan_id') + ->get(); + + $desaList = DesaKelurahan::select('id', 'nama', 'path', 'kecamatan_id') + ->whereIn('id', $lahanSummaryByDesa->pluck('desa_kelurahan_id')->filter()->unique()->values()) + ->with([ + 'kecamatan:id,nama,path,kabupaten_kota_id', + 'kecamatan.kabupatenKota:id,nama,path,provinsi_id', + 'kecamatan.kabupatenKota.provinsi:id,nama,path', + ]) + ->get() + ->keyBy('id'); + + $mapLahanLimit = min(max((int) $request->integer('map_lahan_limit', 500), 0), 2000); + $mapLahan = Lahan::whereNotNull('path') + ->select('id', 'profile_id', 'desa_kelurahan_id', 'path', 'luas_lahan') + ->with([ + 'profile:id,nama', + 'tanaman:id,lahan_id,komoditas_id', + 'tanaman.komoditas:id,nama', + ]) + ->orderByDesc('updated_at') + ->limit($mapLahanLimit) ->get(); $geoProvinsi = []; @@ -48,47 +78,51 @@ class SummaryController extends Controller $geoDesa = []; $geoLahan = []; - foreach ($allLahan as $lahan) { - $desa = $lahan->desaKelurahan; + foreach ($lahanSummaryByDesa as $summary) { + $desa = $desaList->get($summary->desa_kelurahan_id); $kec = $desa ? $desa->kecamatan : null; $kab = $kec ? $kec->kabupatenKota : null; $prov = $kab ? $kab->provinsi : null; + $totalLahan = (int) $summary->total_lahan; + $totalLuas = (float) $summary->total_luas; if ($prov && $prov->path) { if (!isset($geoProvinsi[$prov->id])) { $geoProvinsi[$prov->id] = ['id' => $prov->id, 'nama' => $prov->nama, 'polygon' => $prov->path, 'total_lahan' => 0, 'total_luas' => 0]; } - $geoProvinsi[$prov->id]['total_lahan']++; - $geoProvinsi[$prov->id]['total_luas'] += $lahan->luas_lahan; + $geoProvinsi[$prov->id]['total_lahan'] += $totalLahan; + $geoProvinsi[$prov->id]['total_luas'] += $totalLuas; } if ($kab && $kab->path) { if (!isset($geoKabupaten[$kab->id])) { $geoKabupaten[$kab->id] = ['id' => $kab->id, 'parent_id' => $prov->id ?? null, 'nama' => $kab->nama, 'polygon' => $kab->path, 'total_lahan' => 0, 'total_luas' => 0]; } - $geoKabupaten[$kab->id]['total_lahan']++; - $geoKabupaten[$kab->id]['total_luas'] += $lahan->luas_lahan; + $geoKabupaten[$kab->id]['total_lahan'] += $totalLahan; + $geoKabupaten[$kab->id]['total_luas'] += $totalLuas; } if ($kec && $kec->path) { if (!isset($geoKecamatan[$kec->id])) { $geoKecamatan[$kec->id] = ['id' => $kec->id, 'parent_id' => $kab->id ?? null, 'nama' => $kec->nama, 'polygon' => $kec->path, 'total_lahan' => 0, 'total_luas' => 0]; } - $geoKecamatan[$kec->id]['total_lahan']++; - $geoKecamatan[$kec->id]['total_luas'] += $lahan->luas_lahan; + $geoKecamatan[$kec->id]['total_lahan'] += $totalLahan; + $geoKecamatan[$kec->id]['total_luas'] += $totalLuas; } if ($desa && $desa->path) { if (!isset($geoDesa[$desa->id])) { $geoDesa[$desa->id] = ['id' => $desa->id, 'parent_id' => $kec->id ?? null, 'nama' => $desa->nama, 'polygon' => $desa->path, 'total_lahan' => 0, 'total_luas' => 0]; } - $geoDesa[$desa->id]['total_lahan']++; - $geoDesa[$desa->id]['total_luas'] += $lahan->luas_lahan; + $geoDesa[$desa->id]['total_lahan'] += $totalLahan; + $geoDesa[$desa->id]['total_luas'] += $totalLuas; } + } + foreach ($mapLahan as $lahan) { $geoLahan[] = [ 'id' => $lahan->id, - 'parent_id' => $desa->id ?? null, + 'parent_id' => $lahan->desa_kelurahan_id, 'polygon' => $lahan->path, 'nama_petani' => $lahan->profile->nama ?? 'N/A', 'luas' => $lahan->luas_lahan, diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniController.php b/app/Http/Controllers/Web/Produktivitas/PetaniController.php index 04b08a7..99ce51a 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniController.php @@ -34,9 +34,16 @@ class PetaniController extends Controller abort(403); } - $provinsi = Provinsi::orderBy('kode', 'asc')->get(); + $provinsi = Provinsi::select('id', 'kode', 'nama')->orderBy('kode', 'asc')->get(); - $query = Petani::with('desakelurahan') + $query = Petani::with([ + 'desaKelurahan:id,nama,kecamatan_id', + 'desaKelurahan.kecamatan:id,nama,kabupaten_kota_id', + 'desaKelurahan.kecamatan.kabupatenKota:id,nama,provinsi_id', + 'desaKelurahan.kecamatan.kabupatenKota.provinsi:id,nama', + 'komoditas:id,nama', + 'skor:id,petani_id,skor_kesiapan_adopsi', + ]) ->orderBy('created_at', 'desc'); if ($request->search) { @@ -53,12 +60,12 @@ class PetaniController extends Controller $summaryPetaniIds = (clone $query)->pluck('id'); $petani = $query->paginate($request->per_page ?? 10); - $komoditas = Komoditas::where('is_utama', true)->get(); - $lahan = Lahan::whereIn('petani_id', $summaryPetaniIds) - ->whereIn('komoditas_id', $komoditas->pluck('id')) - ->get(); - $tanaman = Tanaman::whereIn('lahan_id', $lahan->pluck('id')) - ->get(); + $komoditas = Komoditas::select('id', 'nama')->where('is_utama', true)->get(); + $lahanQuery = Lahan::whereIn('petani_id', $summaryPetaniIds) + ->whereIn('komoditas_id', $komoditas->pluck('id')); + $lahanIds = (clone $lahanQuery)->pluck('id'); + $totalLuasLahan = (clone $lahanQuery)->sum('luas_lahan'); + $totalTanaman = Tanaman::whereIn('lahan_id', $lahanIds)->count(); $case = " CASE @@ -74,7 +81,7 @@ class PetaniController extends Controller ->groupByRaw($case) ->get(); - return view('produktivitas.petani.index', compact('petani', 'provinsi', 'lahan', 'komoditas', 'tanaman', 'skor')); + return view('produktivitas.petani.index', compact('petani', 'provinsi', 'komoditas', 'skor', 'totalLuasLahan', 'totalTanaman')); } public function create() diff --git a/resources/views/produktivitas/petani/index.blade.php b/resources/views/produktivitas/petani/index.blade.php index 2c65a89..1db4611 100644 --- a/resources/views/produktivitas/petani/index.blade.php +++ b/resources/views/produktivitas/petani/index.blade.php @@ -15,8 +15,8 @@