main
Ilham Wara Nugroho 2025-09-04 09:54:49 +07:00
parent 685c792ae5
commit 467996fd13
6 changed files with 99 additions and 66 deletions

View File

@ -8,20 +8,17 @@ use App\Models\Master\Topik;
use App\Models\Master\Instansi; use App\Models\Master\Instansi;
use App\Models\Master\Template; use App\Models\Master\Template;
use App\Models\Master\Group; use App\Models\Master\Group;
use App\Repositories\Eloquent\DatasetRepository;
class HomeController extends Controller class HomeController extends Controller
{ {
protected $template = 'modules.dashboard'; protected $template = 'modules.dashboard';
protected $route = 'modules.dashboard'; protected $route = 'modules.dashboard';
private $datasetRepository;
/** public function __construct(DatasetRepository $datasetRepository){
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth'); $this->middleware('auth');
$this->repository = $datasetRepository;
} }
/** /**
@ -162,13 +159,22 @@ class HomeController extends Controller
return view($this->template.'.resource',$data); return view($this->template.'.resource',$data);
} }
function resource_instansi($instansi_id,$id){ function resource_instansi($instansi_id,$id){
$data['id'] = decode_id($id); $data['id'] = decode_id($id);
$data['instansi_id'] = decode_id($instansi_id); $data['instansi_id'] = decode_id($instansi_id);
$data['dataset'] = Dataset::with(['template'])->where('instansi_id',decode_id($instansi_id))->where('template_id',decode_id($id))->first(); $data['dataset'] = Dataset::with(['template'])->where('instansi_id',decode_id($instansi_id))->where('template_id',decode_id($id))->first();
$data['template'] = Template::where('MsTemplateId',decode_id($id))->first();
$data['title'] = 'Dashboard '.@$data['dataset']->template->name; $data['title'] = 'Dashboard '.@$data['dataset']->template->name;
return view($this->template.'.resource_detail',$data); return view($this->template.'.resource_detail',$data);
}
function apiChart($templateId,$instansi_id){
$template = Template::where('MsTemplateId',decode_id($templateId))->first();
$dataset = Dataset::with(['template'])->where('instansi_id',decode_id($instansi_id))->where('template_id',decode_id($templateId))->first();
$filename = pathinfo($template->template_url, PATHINFO_FILENAME);
$modelClass = "App\\Models\\Dataset\\Dataset" . ucfirst($filename);
$insert = $this->repository->getChartData($modelClass,$dataset->DatasetId,decode_id($templateId));
return $insert;
} }
} }

View File

@ -10,13 +10,65 @@ use Illuminate\Database\Eloquent\Model;
class DatasetTable11 extends Model class DatasetTable11 extends Model
{ {
use HasFactory; use HasFactory;
use SoftDeletes; use SoftDeletes;
protected $table = 'dataset_table11'; protected $table = 'dataset_table11';
protected $primaryKey = 'DatasetTable11Id'; protected $primaryKey = 'DatasetTable11Id';
protected $guarded = []; protected $guarded = [];
function dataset() { function dataset() {
return $this->belongsTo('App\Models\Dataset','dataset_id'); return $this->belongsTo('App\Models\Dataset','dataset_id');
} }
public static function dataChart($modelClass,$datasetId,$templateId){
$datasets = \App\Models\Dataset::where('template_id', $templateId)
->orderBy('tahun', 'asc')
->get()
->map(function ($dataset) use ($modelClass) {
$dataset->items = (new $modelClass)->where('dataset_id', $dataset->id)->get();
return $dataset;
});
$years = $datasets->pluck('tahun')->toArray();
$model = self::with('dataset')->whereHas('dataset',function($query) use ($years){
$query->whereIn('tahun',$years);
})->where('dataset_id',$datasetId)->get();
$result = [];
foreach ($model as $row) {
$lokasi = $row->lokasi ?? 'Unknown';
if (!isset($result[$lokasi])) {
$result[$lokasi] = [
'luas' => [],
'persen' => []
];
}
$result[$lokasi]['luas'][] = (float) $row->luas;
$result[$lokasi]['persen'][] = (float) $row->persentase_area_kerusakan;
}
return [
'title' => 'Luas & Persentase Area Kerusakan per Wilayah',
'years' => $years,
'yTitle' => 'Luas (Ha)',
'yOpposite' => 'Persentase (%)',
'series' => collect($result)->flatMap(function ($item, $lokasi) {
return [
[
'name' => "Luas - {$lokasi}",
'type' => 'column',
'data' => $item['luas']
],
[
'name' => "Persentase - {$lokasi}",
'type' => 'line',
'data' => $item['persen']
]
];
})->values()
];
}
} }

View File

@ -292,4 +292,10 @@ class DatasetRepository implements DatasetRepositoryInterface
return $masterModel; return $masterModel;
}); });
} }
public function getChartData($modelClass,$datasetId,$templateId)
{
$data = $modelClass::dataChart($modelClass,$datasetId,$templateId);
return $data;
}
} }

View File

@ -11,7 +11,7 @@
<a href="{{url('dashboard/dataset/resource/instansi/'.encode_id($dataInstansi->MsInstansiId).'/'.$id)}}"> <a href="{{url('dashboard/dataset/resource/instansi/'.encode_id($dataInstansi->MsInstansiId).'/'.$id)}}">
<?php <?php
$tahun = ''; $tahun = '';
$dataset = \App\Models\Dataset::where('instansi_id',$dataInstansi->MsInstansiId)->orderBy('tahun','ASC')->pluck('tahun')->toArray(); $year = \App\Models\Dataset::where('template_id',decode_id($id))->where('instansi_id',$dataInstansi->MsInstansiId)->orderBy('tahun','ASC')->pluck('tahun')->toArray();
$bg = 'info'; $bg = 'info';
if(@$dataInstansi->alias == 'dinas'){ if(@$dataInstansi->alias == 'dinas'){
@ -46,7 +46,7 @@
<div class=""> <div class="">
<div class="mb-2"><h5 class="text-sm font-bold mt-0 truncate">{{$dataInstansi->name}}</h5></div> <div class="mb-2"><h5 class="text-sm font-bold mt-0 truncate">{{$dataInstansi->name}}</h5></div>
<div class="mb-2"> <div class="mb-2">
@foreach ($dataset as $tahun) @foreach ($year as $tahun)
<span class="p-1 bg-info-light rounded text-white">{{ $tahun }}</span> <span class="p-1 bg-info-light rounded text-white">{{ $tahun }}</span>
@endforeach @endforeach
</div> </div>

View File

@ -26,7 +26,6 @@
<!-- end row --> <!-- end row -->
@endsection @endsection
@section('js') @section('js')
<script src="{{asset('assets/js/pages/dashboard-analytics.js')}}"></script>
<!-- Apex Charts js --> <!-- Apex Charts js -->
<script src="{{asset('assets/libs/apexcharts/apexcharts.min.js')}}"></script> <script src="{{asset('assets/libs/apexcharts/apexcharts.min.js')}}"></script>
@ -34,60 +33,29 @@
<script src="{{asset('assets/libs/jsvectormap/js/jsvectormap.min.js')}}"></script> <script src="{{asset('assets/libs/jsvectormap/js/jsvectormap.min.js')}}"></script>
<script src="{{asset('assets/libs/jsvectormap/maps/world-merc.js')}}"></script> <script src="{{asset('assets/libs/jsvectormap/maps/world-merc.js')}}"></script>
<script src="{{asset('assets/libs/jsvectormap/maps/world.js')}}"></script> <script src="{{asset('assets/libs/jsvectormap/maps/world.js')}}"></script>
<script> <script>
var options = { var base_url = '{{ url("dashboard/api/chart/".encode_id($template->MsTemplateId)."/".encode_id($instansi_id)) }}';
series: [{ fetch(base_url)
name: 'Luas Kawasan', .then(res => res.json())
data: [41176, 13176, 38176, 55176, 42176] .then(res => {
}, { const options = {
name: 'Kawasan Hutan Lindung', chart: { type: 'line', height: 480 },
data: [31176, 23176, 58176, 65176, 42176] title: { text: res.title, align: 'center' },
}, { xaxis: { categories: res.years, title: { text: 'Tahun' } },
name: 'Kawasan Air', yaxis: [
data: [11176, 23176, 58176, 25176, 12176] { title: { text: res.yTitle } },
}], { opposite: true, min: 0, max: 100, title: { text: res.yOpposite } }
chart: { ],
type: 'bar', tooltip: { shared: true, intersect: false },
height: 350 stroke: { width: [0,3] },
}, plotOptions: { bar: { columnWidth: '45%' } },
plotOptions: { legend: { position: 'bottom' },
bar: { series: res.series
horizontal: false,
columnWidth: '55%',
borderRadius: 5,
borderRadiusApplication: 'end'
},
},
dataLabels: {
enabled: false
},
stroke: {
show: true,
width: 2,
colors: ['transparent']
},
xaxis: {
categories: ['2020', '2021', '2022', '2023', '2024'],
},
yaxis: {
title: {
text: ''
}
},
fill: {
opacity: 1
},
tooltip: {
y: {
formatter: function (val) {
return " " + val + " "
}
}
}
}; };
var chart = new ApexCharts(document.querySelector("#chart"), options); new ApexCharts(document.querySelector("#chart"), options).render();
chart.render(); });
</script> </script>
@endsection @endsection

View File

@ -20,6 +20,7 @@ Route::name('dashboard.')->prefix('dashboard')->group(function () {
Route::get('/dataset/resource/instansi/{instansi_id}/{id}',[HomeController::class,'resource_instansi'])->name('resource_instansi'); Route::get('/dataset/resource/instansi/{instansi_id}/{id}',[HomeController::class,'resource_instansi'])->name('resource_instansi');
Route::get('/grid',[HomeController::class,'grid'])->name('grid'); Route::get('/grid',[HomeController::class,'grid'])->name('grid');
Route::get('/datasetGrid/{alias}',[HomeController::class,'datasetGrid'])->name('datasetGrid'); Route::get('/datasetGrid/{alias}',[HomeController::class,'datasetGrid'])->name('datasetGrid');
Route::get('/api/chart/{template_id}/{instansi_id}',[HomeController::class,'apiChart'])->name('apiChart');
}); });