Перевод на доменную архитектуру
This commit is contained in:
@@ -2,7 +2,117 @@
|
||||
|
||||
namespace App\Services\Reports;
|
||||
|
||||
use App\Models\MisMedicalHistory;
|
||||
use App\Models\MisMigrationPatient;
|
||||
use Illuminate\Support\Carbon;
|
||||
|
||||
class PatientQueryBuilder
|
||||
{
|
||||
public function __construct(
|
||||
private int $branchId,
|
||||
private string $startDate,
|
||||
private string $endDate,
|
||||
private bool $isHeadOrAdmin
|
||||
) {}
|
||||
|
||||
public function forStatus(string $status, bool $onlyIds = false): mixed
|
||||
{
|
||||
$query = match ($status) {
|
||||
'plan', 'emergency' => $this->buildPlanEmergencyQuery($status),
|
||||
'outcome', 'outcome-transferred', 'outcome-deceased' => $this->buildOutcomeQuery($status),
|
||||
'recipient' => $this->buildRecipientQuery(),
|
||||
'current' => $this->buildCurrentQuery(),
|
||||
default => throw new \InvalidArgumentException("Unknown status: $status"),
|
||||
};
|
||||
|
||||
return $onlyIds ? $query->pluck('MedicalHistoryID')->values() : $query->get();
|
||||
}
|
||||
|
||||
private function buildPlanEmergencyQuery(string $status)
|
||||
{
|
||||
// Логика из getPlanOrEmergencyPatients, но без if/else по роли внутри
|
||||
$medicalHistoryIds = $this->isHeadOrAdmin
|
||||
? MisMigrationPatient::whereInDepartment($this->branchId)
|
||||
->whereBetween('DateIngoing', [$this->startDate, $this->endDate])
|
||||
->pluck('rf_MedicalHistoryID')
|
||||
: MisMigrationPatient::currentlyInTreatment($this->branchId)
|
||||
->whereBetween('DateIngoing', [$this->startDate, $this->endDate])
|
||||
->pluck('rf_MedicalHistoryID');
|
||||
|
||||
if ($medicalHistoryIds->isEmpty()) {
|
||||
return MisMedicalHistory::query()->whereRaw('1=0'); // пустой запрос
|
||||
}
|
||||
|
||||
$query = MisMedicalHistory::whereIn('MedicalHistoryID', $medicalHistoryIds)
|
||||
->with(['surgicalOperations' => fn($q) => $q->whereBetween('Date', [$this->startDate, $this->endDate])])
|
||||
->orderBy('DateRecipient', 'DESC');
|
||||
|
||||
if ($status === 'plan') {
|
||||
$query->plan();
|
||||
} elseif ($status === 'emergency') {
|
||||
$query->emergency();
|
||||
}
|
||||
|
||||
if (! $this->isHeadOrAdmin) {
|
||||
$query->currentlyHospitalized();
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
private function buildOutcomeQuery(string $status): \Illuminate\Database\Eloquent\Builder
|
||||
{
|
||||
$visitResultIds = match ($status) {
|
||||
'outcome-transferred' => [4, 14],
|
||||
'outcome-deceased' => [5, 6, 15, 16],
|
||||
default => [1, 11, 2, 12, 7, 18, 48], // discharged
|
||||
};
|
||||
|
||||
return MisMedicalHistory::query()
|
||||
->whereDate('DateExtract', '>', Carbon::parse($this->startDate)->toDateString())
|
||||
->whereDate('DateExtract', '<=', Carbon::parse($this->endDate)->toDateString())
|
||||
->whereHas('migrations', function ($q) use ($visitResultIds) {
|
||||
$q->where('rf_StationarBranchID', $this->branchId)
|
||||
->whereIn('rf_kl_VisitResultID', $visitResultIds);
|
||||
})
|
||||
->with(['surgicalOperations'])
|
||||
->orderBy('DateRecipient', 'DESC');
|
||||
}
|
||||
|
||||
private function buildRecipientQuery(string $status): \Illuminate\Database\Eloquent\Builder
|
||||
{
|
||||
$visitResultIds = match ($status) {
|
||||
'outcome-transferred' => [4, 14],
|
||||
'outcome-deceased' => [5, 6, 15, 16],
|
||||
default => [1, 11, 2, 12, 7, 18, 48], // discharged
|
||||
};
|
||||
|
||||
return MisMedicalHistory::query()
|
||||
->whereDate('DateExtract', '>', Carbon::parse($this->startDate)->toDateString())
|
||||
->whereDate('DateExtract', '<=', Carbon::parse($this->endDate)->toDateString())
|
||||
->whereHas('migrations', function ($q) use ($visitResultIds) {
|
||||
$q->where('rf_StationarBranchID', $this->branchId)
|
||||
->whereIn('rf_kl_VisitResultID', $visitResultIds);
|
||||
})
|
||||
->with(['surgicalOperations'])
|
||||
->orderBy('DateRecipient', 'DESC');
|
||||
}
|
||||
private function buildCurrentQuery(string $status): \Illuminate\Database\Eloquent\Builder
|
||||
{
|
||||
$visitResultIds = match ($status) {
|
||||
'outcome-transferred' => [4, 14],
|
||||
'outcome-deceased' => [5, 6, 15, 16],
|
||||
default => [1, 11, 2, 12, 7, 18, 48], // discharged
|
||||
};
|
||||
|
||||
return MisMedicalHistory::query()
|
||||
->whereDate('DateExtract', '>', Carbon::parse($this->startDate)->toDateString())
|
||||
->whereDate('DateExtract', '<=', Carbon::parse($this->endDate)->toDateString())
|
||||
->whereHas('migrations', function ($q) use ($visitResultIds) {
|
||||
$q->where('rf_StationarBranchID', $this->branchId)
|
||||
->whereIn('rf_kl_VisitResultID', $visitResultIds);
|
||||
})
|
||||
->with(['surgicalOperations'])
|
||||
->orderBy('DateRecipient', 'DESC');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user