Files
onboard/app/Http/Controllers/Api/StatisticController.php
brusnitsyn 739168d427 Обновлен стартовый экран
Переписаны запросы для статистики, отчетов
Добавлена интеграция отчета сестры
2026-05-28 22:10:00 +09:00

93 lines
3.7 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Department;
use App\Models\DutyUnwantedEvent;
use App\Services\DateRangeService;
use App\Services\ReportService;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class StatisticController extends Controller
{
public function __construct(
protected DateRangeService $dateRangeService,
protected ReportService $reportService
) {}
public function getUnwantedEvents(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'startAt' => 'required',
'endAt' => 'required',
'departmentId' => 'required',
]);
$dateRange = $this->dateRangeService->getNormalizedDateRange($user, $validated['startAt'], $validated['endAt']);
$department = Department::findSole($request->departmentId, 'department_id');
$unwantedEvents = DutyUnwantedEvent::query()
->whereHas('reportDuty', function ($q) use ($department, $dateRange) {
$q->where('rf_department_id', $department->department_id)
->where('period_start', '>=', $dateRange->startSql())
->where('period_end', '<=', $dateRange->endSql());
})
->get()
->map(fn ($e) => [
...$e->toArray(),
'created_at' => Carbon::parse($e->created_at)->format('Создано d.m.Y в H:i'),
]);
return response()->json($unwantedEvents);
}
public function getObservablePatients(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'startAt' => 'required',
'endAt' => 'required',
'departmentId' => 'required',
]);
$dateRange = $this->dateRangeService->getNormalizedDateRange($user, $validated['startAt'], $validated['endAt']);
$department = Department::findSole($request->departmentId, 'department_id');
$observablePatients = DB::table('observable_medical_histories as omh')
->join('report_duty_patients as rdp', 'rdp.original_id', '=', 'omh.original_id')
->join('report_duties as rd', 'rd.id', '=', 'rdp.report_duty_id')
->leftJoin('report_duty_migration_patients as rdm', function ($join) {
$join->on('rdm.medical_history_id', '=', 'rdp.id')
->whereNull('rdm.out_date');
})
->where('rd.rf_department_id', $department->department_id)
->where('omh.observable_in', '>=', $dateRange->startSql())
->where('omh.observable_in', '<=', $dateRange->endSql())
->select('omh.*', 'rdm.diagnosis_code', 'rdm.diagnosis_name', 'rdm.ingoing_date as migration_ingoing_date')
->distinct()
->get()
->map(fn ($row) => [
'id' => $row->id,
'full_name' => $row->full_name,
'birth_date' => $row->birth_date,
'comment' => $row->comment,
'observable_reason'=> $row->observable_reason,
'observable_in' => $row->observable_in,
'observable_out' => $row->observable_out,
'migrations' => [[
'ingoing_date' => $row->migration_ingoing_date ?? $row->recipient_date,
'diagnosis_code' => $row->diagnosis_code,
'diagnosis_name' => $row->diagnosis_name,
]],
'operations' => [],
]);
return response()->json($observablePatients);
}
}