TIF_E41210369/ems-sense/resources/views/livewire/pages/dashboard/index.blade.php

227 lines
11 KiB
PHP

<?php
use App\Models\Treatment;
use App\Models\Species;
use Livewire\Volt\Component;
use Illuminate\Support\Facades\DB;
new class extends Component {
public $totalTreatments;
public $averageSuccessRate;
public $speciesStats;
public $recentTreatments;
public $successRateByConcentration;
public $temperatureStats;
public function mount()
{
$this->loadStats();
}
public function loadStats()
{
// get total treatments
$this->totalTreatments = Treatment::count();
// get average success rate
$this->averageSuccessRate = round(Treatment::avg('successRate'), 1);
// get species statistics
$this->speciesStats = Species::withCount('treatments')
->withAvg('treatments', 'successRate')
->having('treatments_count', '>', 0)
->get();
// get recent treatments
$this->recentTreatments = Treatment::with('species')
->latest()
->take(5)
->get();
// get success rate by ems concentration
$this->successRateByConcentration = Treatment::select(
'emsConcentration',
DB::raw('AVG(successRate) as avg_success_rate'),
DB::raw('COUNT(*) as count')
)
->groupBy('emsConcentration')
->get();
// get temperature statistics
$this->temperatureStats = [
'avg_lowest' => round(Treatment::avg('lowestTemp'), 1),
'avg_highest' => round(Treatment::avg('highestTemp'), 1),
'most_successful_range' => Treatment::where('successRate', '>', 50)
->select(
DB::raw('ROUND(AVG(lowestTemp), 1) as avg_low'),
DB::raw('ROUND(AVG(highestTemp), 1) as avg_high')
)
->first()
];
}
}; ?>
<div>
<!-- overall statistics -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-6">
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
<div class="p-6">
<div class="flex items-center">
<div class="p-3 rounded-full bg-blue-100 mr-4">
<svg class="h-6 w-6 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path>
</svg>
</div>
<div>
<div class="text-sm font-medium text-gray-500">Total Treatments</div>
<div class="text-2xl font-semibold">{{ $totalTreatments }}</div>
</div>
</div>
</div>
</div>
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
<div class="p-6">
<div class="flex items-center">
<div class="p-3 rounded-full bg-green-100 mr-4">
<svg class="h-6 w-6 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"></path>
</svg>
</div>
<div>
<div class="text-sm font-medium text-gray-500">Average Success Rate</div>
<div class="text-2xl font-semibold">{{ $averageSuccessRate }}%</div>
</div>
</div>
</div>
</div>
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
<div class="p-6">
<div class="flex items-center">
<div class="p-3 rounded-full bg-yellow-100 mr-4">
<svg class="h-6 w-6 text-yellow-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"></path>
</svg>
</div>
<div>
<div class="text-sm font-medium text-gray-500">Optimal Temperature Range</div>
<div class="text-2xl font-semibold">
{{ $temperatureStats['most_successful_range']->avg_low }}°C - {{ $temperatureStats['most_successful_range']->avg_high }}°C
</div>
</div>
</div>
</div>
</div>
</div>
<!-- species statistics -->
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg mb-6">
<div class="p-6">
<h3 class="text-lg font-semibold mb-4">Species Performance</h3>
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead>
<tr>
<th class="px-6 py-3 bg-gray-50 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Species</th>
<th class="px-6 py-3 bg-gray-50 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Total Treatments</th>
<th class="px-6 py-3 bg-gray-50 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Avg Success Rate</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
@foreach($speciesStats as $species)
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
{{ $species->name }}
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
{{ $species->treatments_count }}
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
{{ round($species->treatments_avg_success_rate, 1) }}%
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<!-- recent treatments -->
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg mb-6">
<div class="p-6">
<h3 class="text-lg font-semibold mb-4">Recent Treatments</h3>
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead>
<tr>
<th class="px-6 py-3 bg-gray-50 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Species</th>
<th class="px-6 py-3 bg-gray-50 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">EMS Conc.</th>
<th class="px-6 py-3 bg-gray-50 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Duration</th>
<th class="px-6 py-3 bg-gray-50 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Temp Range</th>
<th class="px-6 py-3 bg-gray-50 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Success Rate</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
@foreach($recentTreatments as $treatment)
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
{{ $treatment->species->name }}
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
{{ $treatment->emsConcentration }}
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
{{ $treatment->soakDuration }} min
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
{{ $treatment->lowestTemp }}°C - {{ $treatment->highestTemp }}°C
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full {{ $treatment->successRate >= 50 ? 'bg-green-100 text-green-800' : 'bg-yellow-100 text-yellow-800' }}">
{{ $treatment->successRate }}%
</span>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<!-- ems concentration analysis -->
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
<div class="p-6">
<h3 class="text-lg font-semibold mb-4">EMS Concentration Analysis</h3>
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead>
<tr>
<th class="px-6 py-3 bg-gray-50 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Concentration</th>
<th class="px-6 py-3 bg-gray-50 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Treatments</th>
<th class="px-6 py-3 bg-gray-50 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Avg Success Rate</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
@foreach($successRateByConcentration as $stat)
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
{{ $stat->emsConcentration }}
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
{{ $stat->count }}
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
{{ round($stat->avg_success_rate, 1) }}%
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>