Добавил предпросмотр пациентов для поступления

This commit is contained in:
brusnitsyn
2026-07-30 17:05:26 +09:00
parent 232dd53e0c
commit 2dd55b9d11
7 changed files with 421 additions and 1 deletions

View File

@@ -125,4 +125,123 @@ class StatisticController extends Controller
return response()->json($deadPatients);
}
public function getTransferredPatients(Request $request)
{
$user = Auth::user();
$departmentType = $request->query('departmentType');
$availableDepartments = $user->misDepartments->pluck('rf_mis_department_id')->toArray();
$validated = $request->validate([
'startAt' => 'required',
'endAt' => 'required',
]);
$dateRange = $this->dateRangeService->getNormalizedDateRange($user, $validated['startAt'], $validated['endAt']);
$deadPatients = ReportDutyPatient::query()
->whereHas('latestMigration', function ($q) use ($availableDepartments) {
$q->whereIn('department_id', $availableDepartments);
})
->with('latestMigration')
->where('death_date', '>', $dateRange->startSql())
->where('death_date', '<=', $dateRange->endSql())
->orderBy('death_date', 'desc')
->get()->unique('original_id')->values()
->map(fn ($row) => [
'id' => $row->id,
'full_name' => $row->full_name,
'birth_date' => $row->birth_date,
'ingoing_date' => $row->latestMigration->ingoing_date ?? $row->recipient_date,
'diagnosis_code' => $row->latestMigration->diagnosis_code,
'diagnosis_name' => $row->latestMigration->diagnosis_name,
'department_name' => $row->latestMigration->department->name_full,
]);
return response()->json($deadPatients);
}
public function getPatients(Request $request)
{
$user = Auth::user();
$departmentType = $request->query('departmentType');
$availableDepartments = $user->misDepartments->pluck('rf_mis_department_id')->toArray();
$validated = $request->validate([
'startAt' => 'required',
'endAt' => 'required',
'type' => 'required',
'departmentId' => 'nullable'
]);
$dateRange = $this->dateRangeService->getNormalizedDateRange($user, $validated['startAt'], $validated['endAt']);
$query = ReportDutyPatient::join('report_duties', 'report_duty_patients.report_duty_id', '=', 'report_duties.id')
->where('report_duties.period_start', '>=', $dateRange->startSql())
->where('report_duties.period_start', '<=', $dateRange->endSql())
->select('report_duty_patients.*')
->when(isset($validated['departmentId']), function ($query) use ($validated) {
return $query->where('rf_department_id', $validated['departmentId']);
})
->distinct(['original_id']);
$filterQuery = $this->getQueryByType($validated['type']);
if (isset($validated['type'])) {
$filterQuery($query, $dateRange->startDate, $dateRange->endDate);
}
$patients = $query->get();
return response()->json($patients);
}
private function getQueryByType($type) {
$types = [
'RECIPIENT_ALL' => function ($query, $start, $end) {
$query->where('report_duty_patients.recipient_date', '>=', $start)
->where('report_duty_patients.recipient_date', '<=', $end);
},
'RECIPIENT_PLAN' => function ($query, $start, $end) {
$query->where('report_duty_patients.urgency_id', 1);
},
'RECIPIENT_EMERGENCY' => function ($query, $start, $end) {
$query->where('report_duty_patients.recipient_date', '>', $start)
->where('report_duty_patients.recipient_date', '<', $end)
->where('report_duty_patients.urgency_id', 2);
},
'RECIPIENT_TRANSFERRED' => function ($query, $start, $end) {
$query->whereIn('report_duty_patients.visit_result_id', [4, 14]);
},
'OUTCOME' => function ($query, $start, $end) {
$query->whereBetween('report_duty_patients.extract_date', [$start, $end]);
},
'CONSIST' => function ($query, $start, $end) {
// Пациенты, которые числятся в отчётах за период и не выписаны/не умерли на конец периода
$query->where(function ($q) use ($end) {
$q->whereNull('report_duty_patients.extract_date')
->orWhere('report_duty_patients.extract_date', '>', $end);
})
->where(function ($q) use ($end) {
$q->whereNull('report_duty_patients.death_date')
->orWhere('report_duty_patients.death_date', '>', $end);
});
},
'DECEASED' => function ($query, $start, $end) {
$query->whereBetween('report_duty_patients.death_date', [$start, $end]);
},
'SURGICAL_PLAN' => function ($query, $start, $end) {
$query->whereHas('operations', function ($q) use ($start, $end) {
$q->whereBetween('surgical_operations.Date', [$start, $end])
->where('surgical_operations.type', 'plan');
});
},
'SURGICAL_EMERGENCY' => function ($query, $start, $end) {
$query->whereHas('operations', function ($q) use ($start, $end) {
$q->whereBetween('surgical_operations.Date', [$start, $end])
->where('surgical_operations.type', 'emergency');
});
},
// ... остальные
];
return $types[$type];
}
}