diff --git a/app/Http/Controllers/Api/StatisticController.php b/app/Http/Controllers/Api/StatisticController.php index a7dc363..4c5b920 100644 --- a/app/Http/Controllers/Api/StatisticController.php +++ b/app/Http/Controllers/Api/StatisticController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use App\Models\Department; use App\Models\DutyUnwantedEvent; +use App\Models\ReportDutyPatient; use App\Services\DateRangeService; use App\Services\ReportService; use Carbon\Carbon; @@ -89,4 +90,83 @@ class StatisticController extends Controller return response()->json($observablePatients); } + + public function getDeadPatients(Request $request) + { + $user = Auth::user(); + $departmentType = $request->query('departmentType'); + $availableDepartments = $user->availableDepartments()->pluck('department_id')->all(); + + $validated = $request->validate([ + 'startAt' => 'required', + 'endAt' => 'required', + ]); + + $dateRange = $this->dateRangeService->getNormalizedDateRange($user, $validated['startAt'], $validated['endAt']); + + $lastMigrations = DB::table('report_duty_migration_patients') + ->select('id', DB::raw('MAX(ingoing_date) as max_ingoing_date')) + ->where('ingoing_date', '>=', $dateRange->startSql()) + ->where('ingoing_date', '<=', $dateRange->endSql()) + ->groupBy('id'); + + $deadPatients = DB::table('report_duty_migration_patients as rdm') + ->joinSub($lastMigrations, 'last_rdm', function ($join) { + $join->on('rdm.id', '=', 'last_rdm.id') + ->on('rdm.ingoing_date', '=', 'last_rdm.max_ingoing_date'); + }) + ->leftJoin('report_duty_patients as rdp', 'rdm.id', '=', 'rdp.id') + ->join('report_duties as rd', 'rd.id', '=', 'rdp.report_duty_id') + ->join('departments as dep', 'dep.department_id', '=', 'rd.rf_department_id') + ->whereIn('rd.rf_department_id', $availableDepartments) + ->whereNotNull('rdp.death_date') + ->select( + 'rdp.id', 'rdp.full_name', 'rdp.birth_date', 'rdp.recipient_date', 'rdm.ingoing_date', + 'rdm.diagnosis_code', 'rdm.diagnosis_name', 'dep.name_full' + ) + ->orderBy('rdm.ingoing_date', 'desc') + ->orderBy('rdm.id', 'desc') + ->get() + ->groupBy('medical_history_id') // Группируем по id пациента + ->map(fn ($rows) => $rows->first()) // Берем первую (самую последнюю) запись + ->values() + ->map(fn ($row) => [ + 'id' => $row->id, + 'full_name' => $row->full_name, + 'birth_date' => $row->birth_date, + 'ingoing_date' => $row->ingoing_date ?? $row->recipient_date, + 'diagnosis_code' => $row->diagnosis_code, + 'diagnosis_name' => $row->diagnosis_name, + 'department_name' => $row->name_full, + ]); + + $deadPatients = ReportDutyPatient::query() + ->whereHas('latestMigration', function ($query) use ($dateRange) { + $query->where('ingoing_date', '<=', $dateRange->endSql()) + ->where(function ($sub) use ($dateRange) { + // Миграции без out_date (еще лежат) + $sub->whereNull('out_date'); + + // Миграции с out_date (закрытые) + $sub->orWhere(function ($sub2) use ($dateRange) { + $sub2->whereNotNull('out_date') + ->where('out_date', '>', $dateRange->startSql()); + }); + }); + }) + ->with('latestMigration') + ->whereNotNull('death_date') + ->get()->unique('original_id')->values() + ->map(fn ($row) => [ + 'id' => $row->id, + 'full_name' => $row->full_name, + 'birth_date' => $row->birth_date, + 'ingoing_date' => $row->latestMigration->ingoing_date ?? $row->recipient_date, + 'diagnosis_code' => $row->latestMigration->diagnosis_code, + 'diagnosis_name' => $row->latestMigration->diagnosis_name, + 'department_name' => $row->latestMigration->department->name_full, + ]); + + return response()->json($deadPatients); + } } diff --git a/app/Models/ReportDutyMigrationPatient.php b/app/Models/ReportDutyMigrationPatient.php index 0190c0f..5b43371 100644 --- a/app/Models/ReportDutyMigrationPatient.php +++ b/app/Models/ReportDutyMigrationPatient.php @@ -42,6 +42,11 @@ class ReportDutyMigrationPatient extends Model return $this->hasMany(SurgicalOperation::class, 'migration_patient_id', 'original_id'); } + public function department() + { + return $this->hasOne(Department::class, 'rf_mis_department_id', 'department_id'); + } + public function reanimations() { return $this->hasMany(Reanimation::class, 'migration_patient_id', 'original_id') diff --git a/resources/js/Pages/Statistic/Components/ModalDeathPatients.vue b/resources/js/Pages/Statistic/Components/ModalDeathPatients.vue new file mode 100644 index 0000000..ed1bb1b --- /dev/null +++ b/resources/js/Pages/Statistic/Components/ModalDeathPatients.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/resources/js/Pages/Statistic/Index.vue b/resources/js/Pages/Statistic/Index.vue index bc75eea..ae0a072 100644 --- a/resources/js/Pages/Statistic/Index.vue +++ b/resources/js/Pages/Statistic/Index.vue @@ -23,6 +23,7 @@ import ModalObservablePatients from "./Components/ModalObservablePatients.vue"; import StatisticRecipientPlanOfYear from "../../Layouts/Components/Statistic/StatisticRecipientPlanOfYear.vue"; import {percentType} from "../../Utils/numbers.js"; import OutcomeColumn from "./Components/OutcomeColumn.vue"; +import ModalDeathPatients from "./Components/ModalDeathPatients.vue"; const props = defineProps({ data: { @@ -248,6 +249,19 @@ const columns = ref([ width: 48, titleAlign: 'center', align: 'center', + render: (row) => { + if (row.isTotalRow) { + return h( + 'span', + { + onClick: () => onShowDeathPatientsModal() + }, + row.deceased + ) + } + + return row.deceased + } }, { title: 'Мед. персонал', @@ -261,6 +275,8 @@ const columns = ref([ const currentDepartmentId = ref(null) const showUnwantedEventsModal = ref(false) const showObservablePatientsModal = ref(false) +const showDeathPatientsModal = ref(false) + const onShowUnwantedEventsModal = (departmentId) => { currentDepartmentId.value = departmentId showUnwantedEventsModal.value = true @@ -269,6 +285,9 @@ const onShowObservablePatientsModal = (departmentId) => { currentDepartmentId.value = departmentId showObservablePatientsModal.value = true } +const onShowDeathPatientsModal = () => { + showDeathPatientsModal.value = true +} const rowProps = (row) => { if (row.isGroupHeader) return { @@ -371,6 +390,7 @@ const buildReportHref = (departmentId, startAt, endAt) => { + diff --git a/routes/api.php b/routes/api.php index cd9a913..39d4ec7 100644 --- a/routes/api.php +++ b/routes/api.php @@ -57,6 +57,7 @@ Route::middleware(['auth:sanctum'])->group(function () { Route::prefix('reports')->group(function () { Route::get('/unwanted-events', [\App\Http\Controllers\Api\StatisticController::class, 'getUnwantedEvents']); Route::get('/observable-patients', [\App\Http\Controllers\Api\StatisticController::class, 'getObservablePatients']); + Route::get('/dead-patients', [\App\Http\Controllers\Api\StatisticController::class, 'getDeadPatients']); }); Route::get('/headquarters', [\App\Http\Controllers\Api\HeadquartersController::class, 'stats']); });