Отчет для врача дежурного
This commit is contained in:
@@ -4,38 +4,110 @@ namespace App\Exports;
|
||||
|
||||
use App\Models\Department;
|
||||
use App\Models\User;
|
||||
use Maatwebsite\Excel\Concerns\FromArray;
|
||||
use Maatwebsite\Excel\Concerns\WithTitle;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
class DutyReportExport implements FromArray, WithTitle
|
||||
class DutyReportExport
|
||||
{
|
||||
protected array $data;
|
||||
protected array $dateRange;
|
||||
protected User $user;
|
||||
protected Department $department;
|
||||
protected string $reportName;
|
||||
private const RU_MONTHS = [
|
||||
1 => 'январь', 2 => 'февраль', 3 => 'март', 4 => 'апрель',
|
||||
5 => 'май', 6 => 'июнь', 7 => 'июль', 8 => 'август',
|
||||
9 => 'сентябрь', 10 => 'октябрь', 11 => 'ноябрь', 12 => 'декабрь',
|
||||
];
|
||||
|
||||
public function __construct(
|
||||
array $data,
|
||||
array $dateRange,
|
||||
User $user,
|
||||
Department $department,
|
||||
string $reportName = 'Статистика по отделениям',
|
||||
) {
|
||||
$this->data = $data;
|
||||
$this->dateRange = $dateRange;
|
||||
$this->user = $user;
|
||||
$this->department = $department;
|
||||
$this->reportName = $reportName;
|
||||
protected array $patients,
|
||||
protected array $dateRange,
|
||||
protected User $user,
|
||||
protected Department $department,
|
||||
protected string $reportName = 'Отчёт дежурного врача по приёмному покою и отделению',
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Данные для Blade-шаблона PDF-отчёта.
|
||||
*/
|
||||
public function toViewData(): array
|
||||
{
|
||||
$patients = collect($this->patients);
|
||||
$endDate = Carbon::parse($this->dateRange[1]);
|
||||
|
||||
return [
|
||||
'title' => sprintf('%s «%s»', $this->reportName, $this->department->name_full ?? $this->department->name_short),
|
||||
'day' => $endDate->format('d'),
|
||||
'month' => self::RU_MONTHS[(int) $endDate->format('n')],
|
||||
'year' => $endDate->format('Y'),
|
||||
'planned' => $this->urgencyGroup($patients, 'planned'),
|
||||
'urgent' => $this->urgencyGroup($patients, 'urgent'),
|
||||
'inDepartment' => $patients->where('period_flags.current_at_end', true)->count(),
|
||||
'plannedOperations' => $this->operationsGroup($patients, [6]),
|
||||
'urgentOperations' => $this->operationsGroup($patients, [4, 5]),
|
||||
'reanimation' => $this->flagGroup($patients, 'in_reanimation'),
|
||||
'observableCount' => $patients->where('in_observable', true)->count(),
|
||||
'deceased' => $this->flagGroup($patients, 'period_flags.deceased'),
|
||||
];
|
||||
}
|
||||
|
||||
public function array(): array
|
||||
private function urgencyGroup(Collection $patients, string $flag): array
|
||||
{
|
||||
// TODO: Implement array() method.
|
||||
$filtered = $patients
|
||||
->where('period_flags.current_at_end', true)
|
||||
->where("period_flags.{$flag}", true)
|
||||
->values();
|
||||
|
||||
return [
|
||||
'count' => $filtered->count(),
|
||||
'patients' => $filtered->map(fn (array $p) => $this->presentPatient($p))->all(),
|
||||
];
|
||||
}
|
||||
|
||||
public function title(): string
|
||||
private function operationsGroup(Collection $patients, array $urgentStatuses): array
|
||||
{
|
||||
return $this->sheetTitle;
|
||||
$filtered = $patients->filter(function (array $p) use ($urgentStatuses) {
|
||||
return collect($p['operations'] ?? [])->whereIn('urgent_status', $urgentStatuses)->isNotEmpty();
|
||||
})->values();
|
||||
|
||||
return [
|
||||
'count' => $filtered->count(),
|
||||
'patients' => $filtered->map(fn (array $p) => $this->presentPatient($p, withDiagnosis: false))->all(),
|
||||
];
|
||||
}
|
||||
|
||||
private function flagGroup(Collection $patients, string $flag): array
|
||||
{
|
||||
$filtered = $patients->where($flag, true)->values();
|
||||
|
||||
return [
|
||||
'count' => $filtered->count(),
|
||||
'patients' => $filtered->map(fn (array $p) => $this->presentPatient($p))->all(),
|
||||
];
|
||||
}
|
||||
|
||||
private function presentPatient(array $patient, bool $withDiagnosis = true): array
|
||||
{
|
||||
$age = ! empty($patient['birth_date'])
|
||||
? Carbon::parse($patient['birth_date'])->diffInYears(Carbon::parse($this->dateRange[1]))
|
||||
: null;
|
||||
|
||||
return [
|
||||
'full_name' => $patient['full_name'],
|
||||
'age' => $age !== null ? "{$age} ".$this->pluralizeAge($age) : '',
|
||||
'diagnosis' => $withDiagnosis ? (data_get($patient, 'latest_migration.diagnosis_name') ?? '') : null,
|
||||
];
|
||||
}
|
||||
|
||||
private function pluralizeAge(int $age): string
|
||||
{
|
||||
$mod100 = $age % 100;
|
||||
$mod10 = $age % 10;
|
||||
|
||||
if ($mod100 >= 11 && $mod100 <= 14) {
|
||||
return 'лет';
|
||||
}
|
||||
|
||||
return match ($mod10) {
|
||||
1 => 'год',
|
||||
2, 3, 4 => 'года',
|
||||
default => 'лет',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,13 +16,12 @@ use App\Services\DutyReportService;
|
||||
use App\Services\MedicalHistoryService;
|
||||
use App\Services\NurseMedicalHistoryService;
|
||||
use App\Services\NurseReportService;
|
||||
use App\Services\StatisticsService;
|
||||
use App\Services\UnifiedMedicalHistoryService;
|
||||
use Barryvdh\DomPDF\Facade\Pdf;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Inertia\Inertia;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
|
||||
class DutyReportController extends Controller
|
||||
{
|
||||
@@ -32,7 +31,6 @@ class DutyReportController extends Controller
|
||||
protected DutyMedicalHistoryService $dutyMedicalHistoryService,
|
||||
protected DutyReportService $dutyReportService,
|
||||
protected NurseMedicalHistoryService $nurseMedicalHistoryService,
|
||||
protected StatisticsService $statisticsService
|
||||
)
|
||||
{}
|
||||
|
||||
@@ -362,22 +360,38 @@ class DutyReportController extends Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* Формирование отчета дежурного в Excel
|
||||
* Формирование отчета дежурного врача в PDF
|
||||
*/
|
||||
public function generateReport(Request $request)
|
||||
{
|
||||
$user = $request->user();
|
||||
|
||||
$queryStartDate = $request->query('startAt');
|
||||
$queryEndDate = $request->query('endAt');
|
||||
$queryDepartmentId = $request->query('departmentId', $user->department->department_id);
|
||||
$department = Department::findOrFail($queryDepartmentId);
|
||||
|
||||
[$startDate, $endDate] = $this->dateRangeService->getStatisticsDateRange($user, $queryStartDate, $queryEndDate);
|
||||
$isRangeOneDay = $this->dateRangeService->isRangeOneDay($startDate, $endDate);
|
||||
$department = Department::find($queryDepartmentId);
|
||||
$dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user);
|
||||
|
||||
$finalData = $this->statisticsService->getStatisticsDataForDepartment($department->department_id, $startDate, $endDate, $isRangeOneDay);
|
||||
$reportDutyIds = ReportDuty::where('rf_department_id', $department->department_id)
|
||||
->where('period_start', '>=', $dateRange->startSql())
|
||||
->where('period_end', '<=', $dateRange->endSql())
|
||||
->pluck('id')
|
||||
->toArray();
|
||||
|
||||
return Excel::download(new DutyReportExport($finalData['data'], [$startDate, $endDate], $user, $department), 'statistics.xlsx');
|
||||
$patients = $this->dutyMedicalHistoryService->getGroupedHistories(
|
||||
$dateRange,
|
||||
$department->rf_mis_department_id,
|
||||
$reportDutyIds
|
||||
);
|
||||
|
||||
$export = new DutyReportExport(
|
||||
$patients['data'],
|
||||
[$dateRange->startDateRaw, $dateRange->endDateRaw],
|
||||
$user,
|
||||
$department
|
||||
);
|
||||
|
||||
return Pdf::loadView('reports.duty', $export->toViewData())
|
||||
->setPaper('a4')
|
||||
->download('duty-report.pdf');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user