* работа над функционалом автоматического заполнения

* исправил фантомный сдвиг даты
* переделал получение ФИО врачей из отделений
* добавил возможность поиска врача
* переписал сохранение отчета
This commit is contained in:
brusnitsyn
2026-02-05 17:11:43 +09:00
parent eab78a0291
commit 10fb138c30
22 changed files with 1192 additions and 654 deletions

View File

@@ -0,0 +1,98 @@
<?php
namespace App\Console\Commands;
use App\Models\Department;
use App\Models\User;
use App\Services\AutoReportService;
use Illuminate\Console\Command;
use Illuminate\Support\Carbon;
class FillReportsFromDate extends Command
{
protected $signature = 'reports:fill
{--date= : Дата начала в формате YYYY-MM-DD}
{--end-date= : Дата окончания (по умолчанию сегодня)}
{--department= : ID отделения (опционально)}
{--user= : ID пользователя для отчета (опционально)}
{--force : Перезаписать существующие отчеты}';
protected $description = 'Автоматически заполнить отчеты с указанной даты';
public function __construct(
protected AutoReportService $autoReportService
) {
parent::__construct();
}
public function handle()
{
$startDate = $this->option('date') ?? Carbon::now()->subDays(7)->format('Y-m-d');
$endDate = $this->option('end-date') ?? Carbon::now()->format('Y-m-d');
$departmentId = $this->option('department');
$userId = $this->option('user');
$force = $this->option('force');
$this->info("Заполнение отчетов с {$startDate} по {$endDate}");
// Получаем отделения
$departments = $departmentId
? Department::where('department_id', $departmentId)->get()
: Department::all();
if ($departments->isEmpty()) {
$this->error('Отделения не найдены');
return 1;
}
$totalReports = 0;
$totalErrors = 0;
foreach ($departments as $department) {
$this->info("Обработка отделения: {$department->name}");
// Получаем пользователей отделения
$users = $userId
? User::where('id', $userId)->where('rf_department_id', $department->department_id)->get()
: $this->getDepartmentUsers($department);
if ($users->isEmpty()) {
$this->warn("В отделении {$department->name} нет пользователей");
continue;
}
foreach ($users as $user) {
try {
$created = $this->autoReportService->fillReportsForUser(
$user,
$startDate,
$endDate,
$force
);
$totalReports += $created;
$this->info("Для пользователя {$user->name} создано {$created} отчетов");
} catch (\Exception $e) {
$totalErrors++;
$this->error("Ошибка для пользователя {$user->name}: {$e->getMessage()}");
}
}
}
$this->info("Готово! Создано отчетов: {$totalReports}, ошибок: {$totalErrors}");
return 0;
}
private function getDepartmentUsers(Department $department)
{
// Получаем пользователей, которые могут создавать отчеты
return User::where('rf_department_id', $department->department_id)
->where(function ($query) {
$query->where('role', 'doctor')
->orWhere('role', 'head_of_department');
})
->where('is_active', true)
->get();
}
}