modified: .gitignore

This commit is contained in:
brusnitsyn
2026-04-21 10:08:14 +09:00
parent 0e8b6f61b4
commit 2041ab54ea
74 changed files with 7533 additions and 1544 deletions

View File

@@ -3,14 +3,13 @@
namespace App\Services;
use App\Models\Department;
use App\Models\DepartmentPatient;
use App\Models\MedicalHistorySnapshot;
use App\Models\MetrikaResult;
use App\Models\MisStationarBranch;
use App\Models\ObservationPatient;
use App\Models\Report;
use App\Models\UnwantedEvent;
use App\Models\User;
use Carbon\Carbon;
use Carbon\CarbonPeriod;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
@@ -19,8 +18,7 @@ class AutoReportService
{
public function __construct(
protected ReportService $reportService,
protected DateRangeService $dateRangeService,
protected PatientService $patientQueryService
protected DateRangeService $dateRangeService
) {}
/**
@@ -30,18 +28,26 @@ class AutoReportService
User $user,
string $startDate,
string $endDate,
$departmentId,
Department $department,
bool $force = false
): int {
$createdCount = 0;
// Для многодневного диапазона расширяем конец на 1 день,
// чтобы покрыть последние сутки (07:00 -> 07:00) целиком.
$start = \Carbon\Carbon::createFromFormat('Y-m-d', $startDate, 'Asia/Yakutsk');
$end = \Carbon\Carbon::createFromFormat('Y-m-d', $endDate, 'Asia/Yakutsk');
$periodEnd = $start->equalTo($end)
? $end->copy()
: $end->copy()->addDay();
// Создаем период по дням
$period = CarbonPeriod::create($startDate, $endDate);
$period = CarbonPeriod::create($start->toDateString(), $periodEnd->toDateString());
foreach ($period as $date) {
$dateRange = $this->dateRangeService->getNormalizedDateRange($user, $date, $date);
try {
$reportCreated = $this->createReportForDate($user, $dateRange, $departmentId, $force);
$reportCreated = $this->createReportForDate($user, $department, $dateRange, $force);
if ($reportCreated) {
$createdCount++;
@@ -58,12 +64,12 @@ class AutoReportService
/**
* Создать отчет для конкретной даты
*/
public function createReportForDate(User $user, DateRange $dateRange, $departmentId, bool $force = false): bool
public function createReportForDate(User $user, Department $department, DateRange $dateRange, bool $force = false): bool
{
$user->rf_department_id = $departmentId;
$scopedUser = $this->scopeUserToDepartment($user, $department);
// Проверяем, существует ли уже отчет на эту дату
$existingReport = Report::where('rf_department_id', $departmentId)
->whereDate('created_at', $dateRange->endSql())
$existingReport = Report::where('rf_department_id', $department->department_id)
->whereDate('sent_at', $dateRange->endSql())
->first();
@@ -73,19 +79,15 @@ class AutoReportService
// Если есть существующий отчет и force=true - удаляем его
if ($existingReport && $force) {
MetrikaResult::where('rf_report_id', $existingReport->report_id)->delete();
MedicalHistorySnapshot::where('rf_report_id', $existingReport->report_id)->delete();
UnwantedEvent::where('rf_report_id', $existingReport->report_id)->delete();
ObservationPatient::where('rf_report_id', $existingReport->report_id)->delete();
$existingReport->delete();
$this->deleteExistingReport($existingReport);
}
// Получаем данные для отчета
$reportData = $this->prepareReportData($user, $dateRange, $departmentId);
$reportData = $this->prepareReportData($scopedUser, $department, $dateRange);
// Создаем отчет
DB::transaction(function () use ($user, $reportData) {
$this->reportService->storeReport($reportData, $user);
DB::transaction(function () use ($scopedUser, $reportData) {
$this->reportService->storeReport($reportData, $scopedUser, true);
});
return true;
@@ -94,180 +96,29 @@ class AutoReportService
/**
* Подготовить данные для отчета
*/
private function prepareReportData(User $user, DateRange $dateRange, $departmentId): array
private function prepareReportData(User $user, Department $department, DateRange $dateRange): array
{
$department = Department::where('department_id', $departmentId)->first();
$branchId = $this->getBranchId($department->rf_mis_department_id);
$isHeadOrAdmin = $user->isHeadOfDepartment() || $user->isAdmin();
// Получаем метрики
$metrics = $this->calculateMetrics(
$user,
$isHeadOrAdmin,
$branchId,
$dateRange
);
// Получаем количество коек
$beds = $this->getBedCount($department);
// Формируем данные отчета
return [
'departmentId' => $department->department_id,
'userId' => $user->rf_lpudoctor_id ?? $user->id,
'dates' => [
$dateRange->startTimestamp(),
$dateRange->endTimestamp()
],
'sent_at' => $dateRange->endSql(),
'created_at' => $dateRange->endSql(),
'metrics' => $this->formatMetrics($metrics),
'observationPatients' => $this->getObservationPatients($departmentId, $dateRange),
'unwantedEvents' => [],
];
return $this->reportService->buildAutoFillReportPayload($user, $department, $dateRange);
}
/**
* Рассчитать метрики для отчета
*/
private function calculateMetrics(
User $user,
bool $isHeadOrAdmin,
int $branchId,
DateRange $dateRange
): array {
$metrics = [];
// 1. Плановые пациенты
$metrics['plan'] = $this->patientQueryService->getPlanOrEmergencyPatients(
'plan',
$isHeadOrAdmin,
$branchId,
$dateRange,
true,
false,
true,
true
);
// 2. Экстренные пациенты
$metrics['emergency'] = $this->patientQueryService->getPlanOrEmergencyPatients(
'emergency',
$isHeadOrAdmin,
$branchId,
$dateRange,
true,
false,
true,
true
);
// 3. Поступившие сегодня
$metrics['recipient'] = $this->patientQueryService->getPlanOrEmergencyPatients(
null,
$isHeadOrAdmin,
$branchId,
$dateRange,
true,
false,
false,
true
);
// 4. Выписанные
$metrics['discharged'] = $this->patientQueryService->getOutcomePatients(
$branchId,
$dateRange,
'discharged'
)->count();
// 5. Переведенные
$metrics['transferred'] = $this->patientQueryService->getOutcomePatients(
$branchId,
$dateRange,
'transferred'
)->count();
// 6. Умершие
$metrics['deceased'] = $this->patientQueryService->getOutcomePatients(
$branchId,
$dateRange,
'deceased'
)->count();
// 7. Текущие пациенты
$metrics['current'] = $this->patientQueryService->getAllPatientsInDepartment(
$isHeadOrAdmin,
$branchId,
$dateRange,
true
);
// 8. Плановые операции
$metrics['plan_surgery'] = $this->patientQueryService->getSurgicalPatients(
'plan',
$branchId,
$dateRange,
true
);
// 9. Экстренные операции
$metrics['emergency_surgery'] = $this->patientQueryService->getSurgicalPatients(
'emergency',
$branchId,
$dateRange,
true
);
return $metrics;
}
/**
* Форматировать метрики для сохранения
*/
private function formatMetrics(array $metrics): array
private function scopeUserToDepartment(User $user, Department $department): User
{
return [
'metrika_item_4' => $metrics['plan'] ?? 0, // плановые
'metrika_item_12' => $metrics['emergency'] ?? 0, // экстренные
'metrika_item_3' => $metrics['recipient'] ?? 0, // поступившие
// 'metrika_item_6' => ($metrics['plan_surgery'] ?? 0) + ($metrics['emergency_surgery'] ?? 0), // всего операций
'metrika_item_7' => $metrics['discharged'] + $metrics['deceased'], // выписанные
'metrika_item_8' => $metrics['current'] ?? 0, // текущие
'metrika_item_9' => $metrics['deceased'] ?? 0, // умершие
'metrika_item_11' => $metrics['plan_surgery'] ?? 0, // плановые операции
'metrika_item_10' => $metrics['emergency_surgery'] ?? 0, // экстренные операции
'metrika_item_13' => $metrics['transferred'] ?? 0, // переведенные
'metrika_item_14' => 0, // под наблюдением (будет заполнено отдельно)
'metrika_item_15' => $metrics['discharged'] ?? 0, // выбыло
];
$scopedUser = clone $user;
$scopedUser->rf_department_id = $department->department_id;
$scopedUser->setRelation('department', $department);
return $scopedUser;
}
/**
* Получить пациентов под наблюдением на дату
*/
private function getObservationPatients(int $departmentId, DateRange $dateRange): array
private function deleteExistingReport(Report $report): void
{
// Здесь нужно реализовать логику получения пациентов под наблюдением
// на конкретную дату. Возможно, из снапшотов или истории.
return []; // временно возвращаем пустой массив
DB::transaction(function () use ($report) {
MetrikaResult::where('rf_report_id', $report->report_id)->delete();
MedicalHistorySnapshot::where('rf_report_id', $report->report_id)->delete();
UnwantedEvent::where('rf_report_id', $report->report_id)->delete();
ObservationPatient::where('rf_report_id', $report->report_id)->delete();
DB::table('reports')->where('report_id', $report->report_id)->delete();
});
}
/**
* Получить ID отделения
*/
private function getBranchId(int $misDepartmentId): ?int
{
return MisStationarBranch::where('rf_DepartmentID', $misDepartmentId)
->value('StationarBranchID');
}
/**
* Получить количество коек
*/
private function getBedCount(Department $department): int
{
$default = $department->metrikaDefault()->where('rf_metrika_item_id', 1)->first();
return (int)($default->value ?? 0);
}
}