where('recipient_date', '>=', $dateRange->startSql()) ->where('recipient_date', '<', $dateRange->endSql()) // 1. Оставляем только тех пациентов, у которых БЫЛО движение в этом отделении ->whereHas('latestMigration', fn($q) => $q->where('department_id', $departmentId)) // 2. Загружаем ТОЛЬКО последнее движение в этом отделении (не все миграции) ->with(['latestMigration' => fn($q) => $q->where('department_id', $departmentId)]); $result = $query->paginate(); return $result; } public function getUrgencyHistory(DateRange $dateRange, int $departmentId, int $urgencyId) { $query = MedicalHistory::query(); $query->where('recipient_date', '>=', $dateRange->startSql()) ->where('recipient_date', '<', $dateRange->endSql()) ->urgency($urgencyId) ->whereHas('migrations', function ($m) use ($departmentId) { $m->where('department_id', $departmentId); }) ->with([ 'migrations' => fn ($m) => $m->where('department_id', $departmentId), 'migrations.operations' ]); $result = $query->paginate(); return $result; } public function getDepartmentHistories(DateRange $dateRange, int $departmentId) { return MedicalHistory::query() ->whereHas('migrations', function ($q) use ($departmentId, $dateRange) { $q->department($departmentId)->currentOrAdmitted($dateRange); }) ->with(['latestMigration' => function ($q) use ($departmentId, $dateRange) { $q->department($departmentId)->currentOrAdmitted($dateRange)->latest('ingoing_date'); // подгружаем только отфильтрованные движения }, 'latestMigration.operations']) ->get() // Сортировка по дате поступления в отделение (поле дочерней таблицы) ->sortByDesc(fn ($mh) => $mh->latestMigration->ingoing_date ?? $mh->recipient_date) ->values(); } public function getPlannedHistories(DateRange $dateRange, int $departmentId) { return MedicalHistory::query() ->whereHas('migrations', function ($q) use ($departmentId, $dateRange) { $q->department($departmentId)->currentOrAdmitted($dateRange); }) ->with(['latestMigration' => function ($q) use ($departmentId, $dateRange) { $q->department($departmentId)->currentOrAdmitted($dateRange) ->latest('ingoing_date'); // подгружаем только отфильтрованные движения }, 'latestMigration.operations']) ->urgency(1) ->get() // Сортировка по дате поступления в отделение (поле дочерней таблицы) ->sortByDesc(fn ($mh) => $mh->latestMigration->ingoing_date ?? $mh->recipient_date) ->values(); } public function getEmergencyHistories(DateRange $dateRange, int $departmentId) { return MedicalHistory::query() ->whereHas('migrations', function ($q) use ($departmentId, $dateRange) { $q->department($departmentId)->currentOrAdmitted($dateRange); }) ->with(['latestMigration' => function ($q) use ($departmentId, $dateRange) { $q->department($departmentId)->currentOrAdmitted($dateRange)->latest('ingoing_date'); // подгружаем только отфильтрованные движения }, 'latestMigration.operations']) ->urgency(2) ->get() // Сортировка по дате поступления в отделение (поле дочерней таблицы) ->sortByDesc(fn ($mh) => $mh->latestMigration->ingoing_date ?? $mh->recipient_date) ->values(); } /** * Получить карты поступившие сегодня * @param DateRange $dateRange * @param int $departmentId */ public function getRecipientHistories(DateRange $dateRange, int $departmentId) { $now = Carbon::now(); return MedicalHistory::query() ->whereHas('migrations', function ($q) use ($departmentId, $dateRange) { $q->department($departmentId)->admitted($dateRange->startSql(), $dateRange->endSql()); }) ->with(['latestMigration' => function ($q) use ($departmentId) { $q->department($departmentId); }, 'latestMigration.operations']) ->get(); } public function getDischargedHistories(DateRange $dateRange, int $departmentId) { return MedicalHistory::query() ->whereHas('migrations', function ($q) use ($departmentId, $dateRange) { $q->department($departmentId)->discharged($dateRange->startSql(), $dateRange->endSql()); }) ->with(['latestMigration' => function ($q) use ($departmentId) { $q->department($departmentId); }, 'latestMigration.operations']) ->get(); } public function getDeceasedHistories(DateRange $dateRange, int $departmentId) { return MedicalHistory::query() ->whereHas('migrations', function ($q) use ($departmentId, $dateRange) { $q->department($departmentId)->deceased($dateRange->startSql(), $dateRange->endSql()); }) ->with(['latestMigration' => function ($q) use ($departmentId) { $q->department($departmentId); }, 'latestMigration.operations']) ->get(); } public function getTransferredHistories(DateRange $dateRange, int $departmentId) { return MedicalHistory::query() ->whereHas('migrations', function ($q) use ($departmentId, $dateRange) { $q->department($departmentId)->transferred($dateRange->startSql(), $dateRange->endSql()); }) ->with(['latestMigration' => function ($q) use ($departmentId) { $q->department($departmentId); }, 'latestMigration.operations']) ->get(); } }