104 lines
3.5 KiB
PHP
104 lines
3.5 KiB
PHP
<?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 => 'Экстренно']),
|
||
];
|
||
}
|
||
}
|