* изменил таблицы в основном отчете
* изменил метод сохранения пациентов основного отчета
This commit is contained in:
@@ -4,6 +4,7 @@ namespace App\Models;
|
||||
|
||||
use App\Services\DateRange;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MigrationPatient extends MaterializedViewModel
|
||||
@@ -11,6 +12,14 @@ class MigrationPatient extends MaterializedViewModel
|
||||
protected $table = 'mv_migrationpatient_details';
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
protected $casts = [
|
||||
'birth_date' => 'date:Y-m-d',
|
||||
'recipient_date' => 'datetime:Y-m-d H:i:s',
|
||||
'extract_date' => 'datetime:Y-m-d H:i:s',
|
||||
'death_date' => 'datetime:Y-m-d H:i:s',
|
||||
'male' => 'boolean',
|
||||
];
|
||||
|
||||
public function medicalHistory()
|
||||
{
|
||||
return $this->belongsTo(MedicalHistory::class, 'medical_history_id', 'id');
|
||||
@@ -18,7 +27,8 @@ class MigrationPatient extends MaterializedViewModel
|
||||
|
||||
public function operations()
|
||||
{
|
||||
return $this->hasMany(SurgicalOperation::class, 'migration_patient_id', 'id');
|
||||
return $this->hasMany(SurgicalOperation::class, 'migration_patient_id', 'id')
|
||||
->orderBy('end_date', 'desc');
|
||||
}
|
||||
|
||||
// Пересечение с отчетным периодом
|
||||
@@ -40,24 +50,6 @@ class MigrationPatient extends MaterializedViewModel
|
||||
return $query->whereIn('stationar_branch_id', $branchIds);
|
||||
}
|
||||
|
||||
// Добавляет вычисляемый столбец `category` (только для отображения)
|
||||
public function scopeWithCategory($query, string $from, string $to)
|
||||
{
|
||||
$sql = "CASE
|
||||
WHEN ingoing_date BETWEEN ? AND ? THEN 'admitted'
|
||||
WHEN out_date BETWEEN ? AND ? THEN
|
||||
CASE
|
||||
WHEN death_date IS NOT NULL AND death_date BETWEEN ? AND ? THEN 'deceased'
|
||||
WHEN stat_cure_result_id IN (3,4,7) THEN 'transferred'
|
||||
ELSE 'discharged'
|
||||
END
|
||||
WHEN ingoing_date < ? AND (out_date IS NULL OR out_date > ?) THEN 'current'
|
||||
ELSE 'historical'
|
||||
END as category";
|
||||
|
||||
return $query->selectRaw($sql, [$from, $to, $from, $to, $from, $to, $to, $to]);
|
||||
}
|
||||
|
||||
// Быстрые фильтры по статусам (используют индексы MV, а не computed column)
|
||||
public function scopeAdmitted($query, string $from, string $to)
|
||||
{
|
||||
@@ -89,7 +81,29 @@ class MigrationPatient extends MaterializedViewModel
|
||||
|
||||
public function scopeCurrent($query, DateRange $dateRange)
|
||||
{
|
||||
return $query->where('is_actually_current', true);
|
||||
return $query->whereNull('out_date')
|
||||
->whereNotNull('medical_history_id')
|
||||
->where('ingoing_date', '<', $dateRange->startSql())
|
||||
->wherehas('medicalHistory', function ($query) use ($dateRange) {
|
||||
$query->whereNull('extract_date');
|
||||
});
|
||||
}
|
||||
|
||||
public function scopeCurrentOrAdmitted($query, DateRange $dateRange)
|
||||
{
|
||||
return $query->where(function ($q) use ($dateRange) {
|
||||
// Вариант А: Пациент уже лежит (текущий)
|
||||
$q->whereNull('out_date')
|
||||
->whereNotNull('medical_history_id')
|
||||
->where('ingoing_date', '<', $dateRange->startSql())
|
||||
->wherehas('medicalHistory', function ($query) use ($dateRange) {
|
||||
$query->whereNull('extract_date');
|
||||
}); // опционально: поступил не раньше 2 лет назад
|
||||
})
|
||||
->orWhere(function ($q) use ($dateRange) {
|
||||
$q->where('ingoing_date', '<=', $dateRange->endSql())
|
||||
->where('ingoing_date', '>', $dateRange->startSql());
|
||||
});
|
||||
}
|
||||
|
||||
public function scopeCurrentMigration($query, $historyId, $departmentId)
|
||||
@@ -99,4 +113,23 @@ class MigrationPatient extends MaterializedViewModel
|
||||
->orderBy('ingoing_date', 'desc')
|
||||
->limit(1)->first();
|
||||
}
|
||||
|
||||
public function getAdmittedInCurrentAttribute(): bool
|
||||
{
|
||||
// Получаем дату поступления из последнего движения
|
||||
$ingoing = $this->ingoing_date;
|
||||
|
||||
if (!$ingoing) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$ingoingLocal = Carbon::parse($ingoing)->setTimezone(config('app.timezone', 'Europe/Moscow'));
|
||||
$now = Carbon::now(config('app.timezone', 'Europe/Moscow'));
|
||||
|
||||
// Окно смены: вчера 09:00 → сегодня 09:00
|
||||
$shiftStart = $now->copy()->subDay()->setTime(9, 0);
|
||||
$shiftEnd = $now->copy()->setTime(9, 0);
|
||||
|
||||
return $ingoingLocal->between($shiftStart, $shiftEnd);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user