Files
onboard/app/Services/Analytics/DataSets/NurseShiftsDataSet.php

104 lines
3.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Services\Analytics\DataSets;
use App\Models\Department;
use App\Models\MisLpuDoctor;
use App\Services\Analytics\AbstractDataSet;
use App\Services\Analytics\AnalyticsQuery;
use App\Services\Analytics\DataSets\Concerns\PatientAggregates;
use App\Services\Analytics\Dimension;
use App\Services\Analytics\FilterDef;
use App\Services\Analytics\Measure;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\Facades\DB;
/**
* Смены медсестры — сданные журналы (ReportNurse) с показателями по пациентам.
* Позволяет медсестре сформировать и выгрузить список своих смен.
*/
class NurseShiftsDataSet extends AbstractDataSet
{
use PatientAggregates;
public function key(): string
{
return 'nurse_shifts';
}
public function label(): string
{
return 'Смены медсестры';
}
public function description(): string
{
return 'Сданные журналы медсестры с показателями по пациентам';
}
public function category(): string
{
return 'Журнал';
}
protected function dateField(): string
{
return 'rn.period_start';
}
protected function baseQuery(AnalyticsQuery $query): Builder
{
return DB::table('report_nurses as rn')
->leftJoin('report_nurse_patients as p', 'p.report_nurse_id', '=', 'rn.id')
->where('rn.rf_department_id', $query->department->department_id)
->where('rn.status_id', 2)
->where('rn.period_start', '>=', $query->dateRange->startSql())
->where('rn.period_end', '<=', $query->dateRange->endSql());
}
public function dimensions(): array
{
return [
new Dimension('shift_date', 'Дата смены', 'date', 'CAST(rn.period_start AS date)'),
new Dimension(
'nurse',
'Медсестра',
'string',
'rn.rf_lpudoctor_id',
labels: fn (array $ids) => MisLpuDoctor::whereIn('LPUDoctorID', $ids)->get()
->mapWithKeys(fn ($d) => [$d->LPUDoctorID => trim("{$d->FAM_V} {$d->IM_V} {$d->OT_V}") ?: "Сотрудник #{$d->LPUDoctorID}"])
->all(),
),
$this->urgencyDimension('p'),
$this->outcomeDimension('p'),
new Dimension(
'department',
'Отделение',
'string',
'rn.rf_department_id',
labels: fn (array $ids) => Department::whereIn('department_id', $ids)->get()
->mapWithKeys(fn ($d) => [$d->department_id => $d->name_full ?? $d->name_short])
->all(),
),
];
}
public function measures(): array
{
return [
new Measure('shifts_count', 'Количество смен', 'count', 'COUNT(DISTINCT rn.id)'),
new Measure('patients_count', 'Пациентов', 'count', 'COUNT(p.id)'),
$this->admittedMeasure('p', 'rn'),
...$this->outcomeMeasures('p'),
];
}
public function filters(): array
{
return [
new FilterDef('nurse', 'Медсестра', 'rn.rf_lpudoctor_id', 'select', null, 'nurse_doctors'),
new FilterDef('urgency', 'Срочность', 'p.urgency_id', 'select', [1 => 'Планово', 2 => 'Экстренно']),
];
}
}