227 lines
11 KiB
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>
|