Files
onboard/app/Models/MisMigrationPatient.php
brusnitsyn 719eb1403f * добавил исход спец контингенту
* оптимизация обновления при редактировании спец контингента
* добавил поддержку заключительных диагнозов
* изменил определение законченной операции
* добавил поддержку исхода операции
* добавил определение отмены для операции через назначение
* работа над диапазонами календарей, подсчет статистики
* добавил статусы отчетов и подкорректировал привязку спец контингента к отчету
* добавил новые сервисы для будущего кеширования
* частичное разделение логики подсчета пациентов
2026-04-22 20:35:39 +09:00

233 lines
7.8 KiB
PHP

<?php
namespace App\Models;
use App\Services\DateRange;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Carbon;
class MisMigrationPatient extends Model
{
protected $table = 'stt_migrationpatient';
protected $primaryKey = 'MigrationPatientID';
protected $casts = [
'DateIngoing' => 'datetime:Y-m-d H:i:s',
'DateOut' => 'datetime:Y-m-d H:i:s',
];
public function branch()
{
return $this->hasOne(MisStationarBranch::class, 'StationarBranchID', 'rf_StationarBranchID');
}
public function diagnosis()
{
return $this->hasMany(MisDiagnos::class, 'rf_MigrationPatientID', 'MigrationPatientID');
}
public function mainDiagnosis()
{
return $this->hasOne(MisDiagnos::class, 'rf_MigrationPatientID', 'MigrationPatientID')
->where(function ($query) {
$query->where('rf_DiagnosTypeID', 3)
->orWhere('rf_DiagnosTypeID', 7);
});
}
public function mkb()
{
return $this->hasOne(MisMKB::class, 'MKBID', 'rf_MKBID');
}
/**
* Находятся на лечении
*/
public function scopeCurrentlyInTreatment($query, $branchId = null, DateRange $dateRange = null)
{
$query->whereNotIn('rf_kl_VisitResultID', [4])
->whereHas('medicalHistory', function ($query) use ($branchId, $dateRange) {
$query->whereDate('DateExtract', '1900-01-01');
})
->where('rf_MedicalHistoryID', '<>', 0);
if ($branchId) {
$query->where('rf_StationarBranchID', $branchId);
}
if ($dateRange) {
// $query->whereBetween('DateIngoing', [$dateRange->startSql(), $dateRange->endSql()]);
$query->where('DateIngoing', '>=', $dateRange->startSql())
->where('DateIngoing', '<=', $dateRange->endSql());
}
return $query;
}
public function scopeWhereInDepartment($query, $branchId = null)
{
$query->where('rf_MedicalHistoryID', '<>', 0);
if ($branchId) {
$query->where('rf_StationarBranchID', $branchId);
}
return $query;
}
/**
* Выбывшие пациенты (все исходы)
*/
public function scopeOutcomePatients($query, $branchId = null, DateRange $dateRange = null)
{
$query->where('rf_MedicalHistoryID', '<>', 0);
if ($branchId) {
$query->where('rf_StationarBranchID', $branchId);
}
if ($dateRange) {
$startDate = Carbon::parse($dateRange->startSql())->toDateString();
$endDate = Carbon::parse($dateRange->endSql())->toDateString();
$query->whereHas('medicalHistory', function ($mhQuery) use ($startDate, $endDate) {
$mhQuery->whereDate('DateExtract', '>', $startDate)
->whereDate('DateExtract', '<=', $endDate);
});
}
return $query;
}
/**
* Выписанные пациенты
*/
public function scopeOutcomeDischarged($query, $branchId = null, DateRange $dateRange = null)
{
// По уточненному SQL: Выписано за период
$dischargeCodes = [1, 11, 2, 12, 7, 18, 48];
$query->whereIn('rf_kl_VisitResultID', $dischargeCodes)
->where('rf_MedicalHistoryID', '<>', 0);
if ($branchId) {
$query->where('rf_StationarBranchID', $branchId);
}
if ($dateRange) {
$startDate = Carbon::parse($dateRange->startSql())->toDateString();
$endDate = Carbon::parse($dateRange->endSql())->toDateString();
$query->whereHas('medicalHistory', function ($mhQuery) use ($startDate, $endDate) {
$mhQuery->whereDate('DateExtract', '>', $startDate)
->whereDate('DateExtract', '<=', $endDate);
});
}
return $query;
}
/**
* Перевод в другое отделение
*/
public function scopeOutcomeTransferred($query, $branchId = null, DateRange $dateRange = null)
{
// По заданному SQL: только эти коды перевода
$transferCodes = [4, 14];
$query->whereIn('rf_kl_VisitResultID', $transferCodes)
->where('rf_MedicalHistoryID', '<>', 0);
if ($branchId) {
$query->where('rf_StationarBranchID', $branchId);
}
if ($dateRange) {
$startDate = Carbon::parse($dateRange->startSql())->toDateString();
$endDate = Carbon::parse($dateRange->endSql())->toDateString();
$query->whereHas('medicalHistory', function ($mhQuery) use ($startDate, $endDate) {
$mhQuery->whereDate('DateExtract', '>', $startDate)
->whereDate('DateExtract', '<=', $endDate);
});
}
return $query;
}
/**
* Умершие пациенты
*/
public function scopeDeceasedOutcome($query, $branchId = null, DateRange $dateRange = null)
{
// ID умершего
$deceasedCodes = [5, 6, 15, 16];
$query->whereIn('rf_kl_VisitResultID', $deceasedCodes)
->where('rf_MedicalHistoryID', '<>', 0);
if ($branchId) {
$query->where('rf_StationarBranchID', $branchId);
}
if ($dateRange) {
$startDate = Carbon::parse($dateRange->startSql())->toDateString();
$endDate = Carbon::parse($dateRange->endSql())->toDateString();
$query->whereHas('medicalHistory', function ($mhQuery) use ($startDate, $endDate) {
$mhQuery->whereDate('DateExtract', '>', $startDate)
->whereDate('DateExtract', '<=', $endDate);
});
}
return $query;
}
public function scopeOutcomeWithoutTransferred($query, $branchId = null, DateRange $dateRange = null)
{
// По заданной логике переводы только 4 и 14, исключаем их
$query->whereNotIn('rf_kl_VisitResultID', [4, 14])
->where('rf_kl_VisitResultID', '<>', 0)
->where('rf_MedicalHistoryID', '<>', 0);
if ($branchId) {
$query->where('rf_StationarBranchID', $branchId);
}
if ($dateRange) {
$startDate = Carbon::parse($dateRange->startSql())->toDateString();
$endDate = Carbon::parse($dateRange->endSql())->toDateString();
$query->whereHas('medicalHistory', function ($mhQuery) use ($startDate, $endDate) {
$mhQuery->whereDate('DateExtract', '>', $startDate)
->whereDate('DateExtract', '<=', $endDate);
});
}
return $query;
}
public function scopeExtractedToday($query, $branchId = null, DateRange $dateRange = null)
{
// if (is_null($startDate)) $startDate = Carbon::now()->addDays(-1)->format('Y-m-d');
// if (is_null($endDate)) $endDate = Carbon::now()->format('Y-m-d');
$query->where('rf_kl_VisitResultID', '<>', 0)
->where('rf_MedicalHistoryID', '<>', 0)
->when($dateRange, function($query) use ($dateRange) {
$startDate = Carbon::parse($dateRange->startSql())->toDateString();
$endDate = Carbon::parse($dateRange->endSql())->toDateString();
return $query->whereHas('medicalHistory', function ($mhQuery) use ($startDate, $endDate) {
$mhQuery->whereDate('DateExtract', '>', $startDate)
->whereDate('DateExtract', '<=', $endDate);
});
});
if ($branchId) {
$query->where('rf_StationarBranchID', $branchId);
}
return $query;
}
public function medicalHistory()
{
return $this->belongsTo(MisMedicalHistory::class, 'rf_MedicalHistoryID', 'MedicalHistoryID');
}
}