Ремонт сохранения снапшотов

This commit is contained in:
brusnitsyn
2026-05-06 20:50:07 +09:00
parent 2026a1ca9f
commit c5da85763c
3 changed files with 33 additions and 42 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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(