From f74fd12bdf20eda5c0e4a1a95bf0e4af2f30cc20 Mon Sep 17 00:00:00 2001 From: brusnitsyn Date: Mon, 13 Jul 2026 16:54:36 +0900 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=B3=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BE=D1=82=D1=87=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=BC=D0=B5=D0=B4.=20=D1=81=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Commands/AutofillNurseReports.php | 98 +++++++++++++++++++ routes/console.php | 4 + 2 files changed, 102 insertions(+) create mode 100644 app/Console/Commands/AutofillNurseReports.php diff --git a/app/Console/Commands/AutofillNurseReports.php b/app/Console/Commands/AutofillNurseReports.php new file mode 100644 index 0000000..861ebd3 --- /dev/null +++ b/app/Console/Commands/AutofillNurseReports.php @@ -0,0 +1,98 @@ +option('date') ?: now($tz)->format('Y-m-d'), $tz); + + // Пользователь для аудита + $userId = $this->option('user') ?: env('DUTY_AUTOFILL_USER_ID'); + $user = $userId ? User::find($userId) : User::orderBy('id')->first(); + if (! $user) { + $this->error('Не найден пользователь для аудита (укажите --user или DUTY_AUTOFILL_USER_ID).'); + return CommandAlias::FAILURE; + } + + // Смена: вчера 09:00 → сегодня 09:00 (для date = сегодня) + $dateRange = $this->dateRangeService->createDateRangeForDate($date, $user); + $periodStart = $dateRange->startDateRaw; + $periodEnd = $dateRange->endDateRaw; + + $departments = Department::orderBy('department_id')->get(); + + $this->info("Смена: {$periodStart} → {$periodEnd} ({$tz})"); + $this->info("Аудит: пользователь #{$user->id}"); + if ($this->option('dry-run')) { + $this->warn('Режим DRY RUN — без записи'); + } + + $created = 0; $skipped = 0; $errors = 0; + + foreach ($departments as $dept) { + $exists = ReportNurse::where('rf_department_id', $dept->department_id) + ->where('period_start', $periodStart) + ->where('period_end', $periodEnd) + ->exists(); + + if ($exists) { + $skipped++; + continue; + } + + if ($this->option('dry-run')) { + $this->line(" нет отчёта: #{$dept->department_id} ".($dept->name_short ?? '')); + $created++; + continue; + } + + try { + $report = $this->reportService->saveReport($dateRange, $user->id, 0, $dept->department_id); + $stats = $this->reportService->saveSnapshot($dateRange, $report, $dept->rf_mis_department_id, $user->id); + $created++; + } catch (Throwable $e) { + $errors++; + Log::error('NurseAutofill', [ + 'department_id' => $dept->department_id, + 'period_start' => $periodStart, + 'period_end' => $periodEnd, + 'error' => $e->getMessage(), + ]); + $this->error("[#{$dept->department_id}] {$e->getMessage()}"); + } + } + + $this->newLine(); + $this->info("Готово. Создано: {$created} | Уже было: {$skipped} | Ошибок: {$errors}"); + + return $errors > 0 ? CommandAlias::FAILURE : CommandAlias::SUCCESS; + } +} diff --git a/routes/console.php b/routes/console.php index e6fab22..d17f1ce 100644 --- a/routes/console.php +++ b/routes/console.php @@ -13,3 +13,7 @@ Schedule::command('duty:autofill') ->dailyAt('08:59') ->timezone(config('app.timezone', 'Europe/Moscow')) ->withoutOverlapping(); +Schedule::command('nurse:autofill') + ->dailyAt('08:59') + ->timezone(config('app.timezone', 'Europe/Moscow')) + ->withoutOverlapping();