Изменения в основном report

This commit is contained in:
brusnitsyn
2026-05-06 22:32:11 +09:00
parent c5da85763c
commit 723ccee8d3
56 changed files with 1911 additions and 3814 deletions

View File

@@ -2,20 +2,16 @@
namespace App\Http\Controllers\Api;
use App\Application\Reports\ReportSavePathService;
use App\Domain\Reports\ValueObjects\MetrikaConfig;
use App\Http\Controllers\Controller;
use App\Http\Resources\Api\DepartmentPatientOperationResource;
use App\Http\Resources\Mis\FormattedPatientResource;
use App\Models\Department;
use App\Models\MedicalHistorySnapshot;
use App\Models\MetrikaGroup;
use App\Models\MetrikaResult;
use App\Models\MisLpuDoctor;
use App\Models\MisMedicalHistory;
use App\Models\MisMigrationPatient;
use App\Models\MisMKB;
use App\Models\MisStationarBranch;
use App\Models\MisSurgicalOperation;
use App\Models\ObservationPatient;
use App\Models\Report;
@@ -36,7 +32,6 @@ class ReportController extends Controller
protected MisPatientService $misPatientService,
protected ReportService $reportService,
protected DateRangeService $dateRangeService,
protected ReportSavePathService $reportSavePathService,
) {}
public function index(Request $request)
@@ -72,368 +67,25 @@ class ReportController extends Controller
{
$user = Auth::user();
$data = $request->validate([
'metrics' => 'required',
'observationPatients' => 'nullable',
'metrics' => 'required|array',
'observationPatients' => 'nullable|array',
'departmentId' => 'required|integer',
'unwantedEvents' => 'nullable|array',
'startAt' => 'required|integer',
'endAt' => 'required|integer',
'userId' => 'required|integer',
'reportId' => 'nullable',
'reportId' => 'nullable|integer',
'status' => 'nullable|in:draft,submitted',
]);
$dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user);
if ($this->reportSavePathService->usesNewArchitecture()) {
$this->reportSavePathService->saveManual($user, [
...$data,
'dates' => [(int) $data['startAt'], (int) $data['endAt']],
]);
return response()->json([
'status' => 'ok',
'path' => 'new',
]);
}
$misDepartmentId = $user->department->rf_mis_department_id;
$branchId = MisStationarBranch::where('rf_DepartmentID', $misDepartmentId)
->value('StationarBranchID');
// Определяем, является ли пользователь заведующим/администратором
$isHeadOrAdmin = $user->isHeadOfDepartment() || $user->isAdmin();
$metrics = $data['metrics'];
$observationPatients = $data['observationPatients'];
$unwantedEvents = $data['unwantedEvents'];
// Определяем даты в зависимости от роли
$dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user);
$metriks = [];
foreach ($metrics as $key => $value) {
$metrika = new MetrikaResult;
$metrikaId = (int) Str::replace('metrika_item_', '', $key);
$metrika->rf_metrika_item_id = $metrikaId;
$metrika->value = $value;
$metriks[] = $metrika;
}
// 1. Плановые
$planIds = $this->reportService->getPatientsByStatus(
$user,
'plan',
$dateRange,
true,
true,
);
$planCount = $this->reportService->getPatientsCountByStatus($user, 'plan', $dateRange);
// 2. Экстренные
$emergencyIds = $this->reportService->getPatientsByStatus(
$user,
'emergency',
$dateRange,
true,
true,
);
$emergencyCount = $this->reportService->getPatientsCountByStatus($user, 'emergency', $dateRange);
// 3. Выписанные
$dischargedIds = $this->reportService->getPatientsByStatus(
$user,
'outcome',
$dateRange,
true,
true
);
// 4. Переведенные
$transferredIds = $this->reportService->getPatientsByStatus(
$user,
'outcome-transferred',
$dateRange,
true,
true
);
// 5. Умершие
$deceasedIds = $this->reportService->getPatientsByStatus(
$user,
'outcome-deceased',
$dateRange,
true,
true
);
// 6. Поступившие
$recipientIds = $this->reportService->getPatientsByStatus(
$user,
'recipient',
$dateRange,
true,
true
);
\DB::beginTransaction();
if (isset($data['reportId']) && $data['reportId']) {
$report = Report::updateOrCreate(
[
'report_id' => $data['reportId'],
],
[
'rf_department_id' => $data['departmentId'],
'rf_user_id' => Auth::user()->id,
'rf_lpudoctor_id' => $data['userId'],
'created_at' => $dateRange->endSql(),
'sent_at' => $dateRange->endSql(),
'period_start' => $dateRange->startSql(),
'period_end' => $dateRange->endSql(),
]
);
} else {
$report = Report::create([
'rf_department_id' => $data['departmentId'],
'rf_user_id' => Auth::user()->id,
'rf_lpudoctor_id' => $data['userId'],
'created_at' => $dateRange->endSql(),
'sent_at' => $dateRange->endSql(),
'period_start' => $dateRange->startSql(),
'period_end' => $dateRange->endSql(),
]);
}
if (count($unwantedEvents)) {
foreach ($unwantedEvents as $unwantedEvent) {
// Если есть ID - ищем по нему
if (isset($unwantedEvent['unwanted_event_id']) && $unwantedEvent['unwanted_event_id']) {
UnwantedEvent::updateOrCreate(
['unwanted_event_id' => $unwantedEvent['unwanted_event_id']],
[
'rf_report_id' => $report->report_id,
'comment' => $unwantedEvent['comment'] ?? '',
'title' => $unwantedEvent['title'] ?? '',
'is_visible' => $unwantedEvent['is_visible'] ?? true,
]
);
} else {
// Если нет ID - создаем новую запись
UnwantedEvent::create([
'rf_report_id' => $report->report_id,
'comment' => $unwantedEvent['comment'] ?? '',
'title' => $unwantedEvent['title'] ?? '',
'is_visible' => $unwantedEvent['is_visible'] ?? true,
]);
}
}
} else {
$unwantedEvents = $report->unwantedEvents;
foreach ($unwantedEvents as $unwantedEvent) {
$unwantedEvent->delete();
}
}
MetrikaResult::updateOrCreate(
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::UNWANTED_EVENTS,
],
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::UNWANTED_EVENTS,
'value' => count($unwantedEvents),
]
);
foreach ($metriks as $metrika) {
MetrikaResult::updateOrCreate(
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => $metrika->rf_metrika_item_id,
],
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => $metrika->rf_metrika_item_id,
'value' => $metrika->value,
]
);
}
if (count($observationPatients)) {
foreach ($observationPatients as $observationPatient) {
ObservationPatient::updateOrCreate(
[
'rf_medicalhistory_id' => $observationPatient['id'],
'rf_department_id' => $data['departmentId'],
],
[
'rf_department_id' => $data['departmentId'],
'rf_report_id' => $report->report_id,
'rf_medicalhistory_id' => $observationPatient['id'],
'rf_mkab_id' => null,
'comment' => $observationPatient['comment'] ?? null,
]
);
}
} else {
foreach ($report->observationPatients as $observationPatient) {
$observationPatient->delete();
}
}
MetrikaResult::updateOrCreate(
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::OBSERVATION,
],
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::OBSERVATION,
'value' => count($observationPatients),
]
);
// Сохраняем снимок для каждого типа пациентов
// Планово
// $this->getPlanOrEmergencyPatients('plan', false, $branchId, $dateRange->startSql(), $dateRange->endSql(), false, false, true);
foreach ($planIds as $id) {
MedicalHistorySnapshot::create([
'rf_report_id' => $report->report_id,
'rf_medicalhistory_id' => $id,
'patient_type' => 'plan',
]);
}
MetrikaResult::updateOrCreate(
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::PLAN,
],
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::PLAN,
'value' => $planCount,
]
);
// $this->getPlanOrEmergencyPatients('emergency', false, $branchId, $startDate, $endDate, false, false, true);
// Экстренно
foreach ($emergencyIds as $id) {
MedicalHistorySnapshot::create([
'rf_report_id' => $report->report_id,
'rf_medicalhistory_id' => $id,
'patient_type' => 'emergency',
]);
}
MetrikaResult::updateOrCreate(
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::EMERGENCY,
],
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::EMERGENCY,
'value' => $emergencyCount,
]
);
// $this->getDischargedPatients($branchId, $startDate, $endDate, true);
foreach ($dischargedIds as $id) {
MedicalHistorySnapshot::create([
'rf_report_id' => $report->report_id,
'rf_medicalhistory_id' => $id,
'patient_type' => 'discharged',
]);
}
MetrikaResult::updateOrCreate(
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::DISCHARGED,
],
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::DISCHARGED,
'value' => count($dischargedIds),
]
);
// $this->getTransferredPatients($branchId, $startDate, $endDate, true);
foreach ($transferredIds as $id) {
MedicalHistorySnapshot::create([
'rf_report_id' => $report->report_id,
'rf_medicalhistory_id' => $id,
'patient_type' => 'transferred',
]);
}
MetrikaResult::updateOrCreate(
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::TRANSFERRED,
],
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::TRANSFERRED,
'value' => count($transferredIds),
]
);
// $this->getDeceasedOutcomePatients($branchId, $startDate, $endDate, false, true);
foreach ($deceasedIds as $id) {
MedicalHistorySnapshot::create([
'rf_report_id' => $report->report_id,
'rf_medicalhistory_id' => $id,
'patient_type' => 'deceased',
]);
}
MetrikaResult::updateOrCreate(
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::DECEASED,
],
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::DECEASED,
'value' => count($deceasedIds),
]
);
// $recipientIds = $this->getPlanOrEmergencyPatients(
// null,
// $isHeadOrAdmin,
// $branchId,
// $startDate,
// $endDate,
// false,
// true,
// true,
// today: true
// );
foreach ($recipientIds as $id) {
MedicalHistorySnapshot::create([
'rf_report_id' => $report->report_id,
'rf_medicalhistory_id' => $id,
'patient_type' => 'recipient',
]);
}
MetrikaResult::updateOrCreate(
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::RECIPIENT,
],
[
'rf_report_id' => $report->report_id,
'rf_metrika_item_id' => MetrikaConfig::RECIPIENT,
'value' => count($recipientIds),
]
);
// 7. Находящиеся на лечении
// $currentIds = $this->getCurrentPatients($branchId, false, true);
// foreach ($currentIds as $id) {
// MedicalHistorySnapshot::create([
// 'rf_report_id' => $report->report_id,
// 'rf_medicalhistory_id' => $id,
// 'patient_type' => 'current'
// ]);
// }
\DB::commit();
$report = $this->reportService->storeReport([
...$data,
'dates' => [(int) $data['startAt'], (int) $data['endAt']],
'status' => $data['status'] ?? 'draft',
], $user);
return response()->json([
'message' => 'success',
'report_id' => $report->report_id,
]);
}