From c5da85763c2ef77c0730a785ea265790c1bdcfbe Mon Sep 17 00:00:00 2001 From: brusnitsyn Date: Wed, 6 May 2026 20:50:07 +0900 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=BC=D0=BE=D0=BD=D1=82=20=D1=81?= =?UTF-8?q?=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BD=D0=B0=D0=BF=D1=88=D0=BE=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Web/NurseReportController.php | 2 +- app/Models/UnifiedMedicalHistory.php | 6 ++ app/Services/NurseReportService.php | 67 +++++++------------ 3 files changed, 33 insertions(+), 42 deletions(-) diff --git a/app/Http/Controllers/Web/NurseReportController.php b/app/Http/Controllers/Web/NurseReportController.php index 5783111..53df40f 100644 --- a/app/Http/Controllers/Web/NurseReportController.php +++ b/app/Http/Controllers/Web/NurseReportController.php @@ -42,7 +42,7 @@ class NurseReportController extends Controller ->where('period_end', '<=', $dateRange->endSql()) ->exists(); - $hasReport = $existsReport; + $hasReport = $existsReport && $isPastPeriod; if ($hasReport) { $inDepartmentHistories = $this->nurseMedicalHistoryService->getDepartmentHistories($dateRange, $department->rf_mis_department_id); diff --git a/app/Models/UnifiedMedicalHistory.php b/app/Models/UnifiedMedicalHistory.php index cf038e7..d7758f2 100644 --- a/app/Models/UnifiedMedicalHistory.php +++ b/app/Models/UnifiedMedicalHistory.php @@ -33,6 +33,12 @@ class UnifiedMedicalHistory extends MaterializedViewModel ->latest('ingoing_date'); } + public function latestMigrationInDepartment($query, $departmentId) + { + return $query->where('department_id', $departmentId) + ->latest('ingoing_date'); + } + public function operationsInDepartment($query, $departmentId) { return $this->operations()->where('department_id', $departmentId); diff --git a/app/Services/NurseReportService.php b/app/Services/NurseReportService.php index f758f8f..6f4c52b 100644 --- a/app/Services/NurseReportService.php +++ b/app/Services/NurseReportService.php @@ -77,29 +77,12 @@ class NurseReportService // пребывание пересекается с отчётным периодом ->where('ingoing_date', '<=', $dateRange->endSql()) ->where('ingoing_date', '>=', $startYear) - ->where(function ($sub) use ($dateRange) { - $sub->whereNull('out_date') - ->orWhere('out_date', '>=', $dateRange->startSql()) - ->where('out_date', '<=', $dateRange->endSql()); - }) ->where(function ($sub) use ($dateRange) { $sub->whereNull('out_date') ->orWhere('out_date', '>=', $dateRange->startSql()) ->where('out_date', '<=', $dateRange->endSql()); }); - }) - // Подгружаем последнее движение для денормализации - ->with(['latestMigration' => function ($q) use ($departmentId, $dateRange, $startYear) { - $q->where('department_id', $departmentId) - ->where('ingoing_date', '<=', $dateRange->endSql()) - ->where('ingoing_date', '>=', $startYear) - ->where(function ($sub) use ($dateRange) { - $sub->whereNull('out_date') - ->orWhere('out_date', '>=', $dateRange->startSql()) - ->where('out_date', '<=', $dateRange->endSql()); - }) - ->latest('ingoing_date'); // если несколько, берём последнее - }]); + }); // Получаем данные (chunk для памяти, если пациентов > 1000) $patients = $query->cursor(); @@ -144,28 +127,30 @@ class NurseReportService ]; // Подготовка данных миграции (если есть) - if (!empty($patient->latestMigration)) { - $migrationBatch[] = [ - // Временный ключ для связи с пациентом (заполним после первого upsert) - '_temp_key' => [ - 'report_nurse_id' => $reportNurseId, - 'source_type' => $patient->source_type, - 'original_id' => $patient->original_id, - ], - 'ingoing_date' => $patient->latestMigration->ingoing_date, - 'out_date' => $patient->latestMigration->out_date, - 'diagnosis_id' => $patient->latestMigration->diagnosis_id, - 'diagnosis_code' => $patient->latestMigration->diagnosis_code, - 'diagnosis_name' => $patient->latestMigration->diagnosis_name, - 'interrupted_event_id' => $patient->latestMigration->interrupted_event_id, - 'stationar_branch_id' => $patient->latestMigration->stationar_branch_id, - 'department_id' => $patient->latestMigration->department_id, - 'visit_result_id' => $patient->latestMigration->visit_result_id, - 'stat_cure_result_id' => $patient->latestMigration->stat_cure_result_id, - 'user_id' => $patient->latestMigration->user_id, - 'mis_user_id' => $patient->latestMigration->mis_user_id, - 'comment' => $patient->latestMigration->comment, - ]; + if (!empty($patient->migrations)) { + foreach ($patient->migrations as $migration) { + $migrationBatch[] = [ + // Временный ключ для связи с пациентом (заполним после первого upsert) + '_temp_key' => [ + 'report_nurse_id' => $reportNurseId, + 'source_type' => $patient->source_type, + 'original_id' => $patient->original_id, + ], + 'ingoing_date' => $migration->ingoing_date, + 'out_date' => $migration->out_date, + 'diagnosis_id' => $migration->diagnosis_id, + 'diagnosis_code' => $migration->diagnosis_code, + 'diagnosis_name' => $migration->diagnosis_name, + 'interrupted_event_id' => $migration->interrupted_event_id, + 'stationar_branch_id' => $migration->stationar_branch_id, + 'department_id' => $migration->department_id, + 'visit_result_id' => $migration->visit_result_id, + 'stat_cure_result_id' => $migration->stat_cure_result_id, + 'user_id' => $migration->user_id, + 'mis_user_id' => $migration->mis_user_id, + 'comment' => $migration->comment, + ]; + } } // Пакетная запись каждые $batchSize записей @@ -246,7 +231,7 @@ class NurseReportService if (!empty($finalMigrations)) { // UPSERT миграций - $migrationUniqueBy = ['medical_history_id']; + $migrationUniqueBy = ['medical_history_id', 'ingoing_date']; $migrationUpdateColumns = array_diff(array_keys($finalMigrations[0]), $migrationUniqueBy); DB::table('report_nurse_migration_patients')->upsert(