Files
onboard/app/Services/MetricCalculators/AverageBedDaysCalculator.php
brusnitsyn 719eb1403f * добавил исход спец контингенту
* оптимизация обновления при редактировании спец контингента
* добавил поддержку заключительных диагнозов
* изменил определение законченной операции
* добавил поддержку исхода операции
* добавил определение отмены для операции через назначение
* работа над диапазонами календарей, подсчет статистики
* добавил статусы отчетов и подкорректировал привязку спец контингента к отчету
* добавил новые сервисы для будущего кеширования
* частичное разделение логики подсчета пациентов
2026-04-22 20:35:39 +09:00

47 lines
1.4 KiB
PHP

<?php
// app/Services/MetricCalculators/AverageBedDaysCalculator.php
namespace App\Services\MetricCalculators;
use App\Services\Base\BaseMetricService;
use App\Contracts\MetricCalculatorInterface;
use Illuminate\Support\Facades\DB;
class AverageBedDaysCalculator extends BaseMetricService implements MetricCalculatorInterface
{
public function getMetricId(): int
{
return 18;
}
public function calculate(array $departmentIds, string $startDate, string $endDate): array
{
if (empty($departmentIds)) {
return [];
}
$results = DB::table('reports as r')
->join('metrika_results as mr', 'r.report_id', '=', 'mr.rf_report_id')
->whereIn('r.rf_department_id', $departmentIds)
->where('mr.rf_metrika_item_id', 18)
->where('r.period_start', '>=', $startDate)
->where('r.period_end', '<', $endDate)
->select(
'r.rf_department_id',
DB::raw('AVG(CAST(mr.value AS DECIMAL)) as avg_value')
)
->groupBy('r.rf_department_id')
->get()
->keyBy('rf_department_id');
$averages = [];
foreach ($departmentIds as $deptId) {
$averages[$deptId] = isset($results[$deptId])
? round((float)$results[$deptId]->avg_value, 1)
: 0;
}
return $averages;
}
}