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']);
});