Обновлен стартовый экран
Переписаны запросы для статистики, отчетов Добавлена интеграция отчета сестры
This commit is contained in:
@@ -12,34 +12,43 @@ class UnifiedMedicalHistoryService
|
||||
{
|
||||
public function getGroupedHistories(DateRange $dateRange, int $departmentId): array
|
||||
{
|
||||
$startYear = $dateRange->startDate->copy()->startOfYear()->format('Y-m-d');
|
||||
|
||||
// 1. Один запрос: получаем "сырые" данные (без вычисляемых статусов)
|
||||
$all = UnifiedMedicalHistory::with([
|
||||
'latestMigration' => fn($q) => $q->where(function ($q) use ($dateRange) {
|
||||
// Вариант А: Пациент уже лежит (текущий)
|
||||
$q->whereNull('out_date')
|
||||
->whereNotNull('medical_history_id')
|
||||
->where('ingoing_date', '<', $dateRange->startSql());
|
||||
})
|
||||
->orWhere(function ($q) use ($dateRange) {
|
||||
$q->where('ingoing_date', '<=', $dateRange->endSql())
|
||||
->where('ingoing_date', '>', $dateRange->startSql());
|
||||
})
|
||||
])
|
||||
->whereNull('extract_date')
|
||||
->get()
|
||||
// Фильтр по отделению в памяти (быстро для <1000 записей)
|
||||
->filter(fn($h) => $h->latestMigration?->department_id === $departmentId);
|
||||
$all = UnifiedMedicalHistory::query()->whereHas('latestMigration', function ($q) use ($departmentId, $dateRange, $startYear) {
|
||||
$q->where('department_id', $departmentId)
|
||||
// пребывание пересекается с отчётным периодом: ingoing <= end AND (out IS NULL OR out >= start)
|
||||
->where('ingoing_date', '<=', $dateRange->endSql())
|
||||
->where('ingoing_date', '>=', $startYear)
|
||||
->where(function ($sub) use ($dateRange) {
|
||||
$sub->whereNull('out_date')
|
||||
->orWhere('out_date', '>=', $dateRange->startSql());
|
||||
});
|
||||
})->with(['latestMigration' => function ($q) use ($departmentId) {
|
||||
$q->where('department_id', $departmentId);
|
||||
}, 'latestMigration.operations'])->get();
|
||||
|
||||
// 2. Добавляем вычисляемые поля и превращаем в плоский массив
|
||||
$prepared = $all->map(function (UnifiedMedicalHistory $h) use ($dateRange) {
|
||||
$patientStatus = PatientStatusClassifier::classify($h, $dateRange);
|
||||
$patientUrgency = null;
|
||||
$patientReanimation = null;
|
||||
if (!in_array($patientStatus, [
|
||||
PatientStatusClassifier::STATUS_DECEASED,
|
||||
PatientStatusClassifier::STATUS_DISCHARGED,
|
||||
PatientStatusClassifier::STATUS_TRANSFERRED
|
||||
])) {
|
||||
$patientUrgency = PatientStatusClassifier::classifyUrgency($h->urgency_id);
|
||||
}
|
||||
return [
|
||||
// Все исходные поля модели (автоматически через toArray)
|
||||
...$h->toArray(),
|
||||
|
||||
// + вычисляемые мета-поля для фронтенда
|
||||
'patient_status' => PatientStatusClassifier::classify($h, $dateRange),
|
||||
'patient_urgency' => PatientStatusClassifier::classifyUrgency($h->urgency_id),
|
||||
'admitted_today' => PatientStatusClassifier::classifyAdmitted($h->latestMigration?->ingoing_date),
|
||||
'patient_status' => $patientStatus,
|
||||
'patient_urgency' => $patientUrgency,
|
||||
'in_reanimation' => $patientReanimation,
|
||||
'admitted_today' => PatientStatusClassifier::classifyAdmitted($h->latestMigration?->ingoing_date, $dateRange),
|
||||
];
|
||||
});
|
||||
|
||||
@@ -48,6 +57,14 @@ class UnifiedMedicalHistoryService
|
||||
$sortOrder = 'desc';
|
||||
$sorted = $prepared->sortBy($sortBy, SORT_REGULAR, $sortOrder === 'desc')->values();
|
||||
|
||||
// 4. Возвращаем плоский массив + метаданные для фронтенда
|
||||
$countInDepartment = $sorted->where('patient_status', 'in_department')->count();
|
||||
$countRecipient = $sorted->where('patient_status', 'recipient')->count();
|
||||
$countDischarged = $sorted->where('patient_status', 'discharged')->count();
|
||||
$countUrgent = $sorted->where('patient_urgency', 'urgent')->count();
|
||||
$countPlanned = $sorted->where('patient_urgency', 'planned')->count();
|
||||
$countReanimations = $sorted->where('in_reanimation', true)->count();
|
||||
|
||||
// 4. Возвращаем плоский массив + метаданные для фронтенда
|
||||
return [
|
||||
'data' => $sorted->toArray(),
|
||||
@@ -55,12 +72,13 @@ class UnifiedMedicalHistoryService
|
||||
'total' => $sorted->count(),
|
||||
'sortBy' => $sortBy,
|
||||
'sortOrder' => $sortOrder,
|
||||
// Статистика для фильтров/бейджей (опционально)
|
||||
'counts' => [
|
||||
'in_department' => $sorted->where('patient_status', 'in_department')->count(),
|
||||
'discharged' => $sorted->where('patient_status', 'discharged')->count(),
|
||||
'urgent' => $sorted->where('patient_urgency', 'urgent')->count(),
|
||||
'planned' => $sorted->where('patient_urgency', 'planned')->count(),
|
||||
'in_department' => $countInDepartment + $countRecipient,
|
||||
'recipient' => $countRecipient,
|
||||
'discharged' => $countDischarged,
|
||||
'urgent' => $countUrgent,
|
||||
'planned' => $countPlanned,
|
||||
'reanimations' => $countReanimations,
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user