* добавил исход спец контингенту

* оптимизация обновления при редактировании спец контингента
* добавил поддержку заключительных диагнозов
* изменил определение законченной операции
* добавил поддержку исхода операции
* добавил определение отмены для операции через назначение
* работа над диапазонами календарей, подсчет статистики
* добавил статусы отчетов и подкорректировал привязку спец контингента к отчету
* добавил новые сервисы для будущего кеширования
* частичное разделение логики подсчета пациентов
This commit is contained in:
brusnitsyn
2026-04-22 20:35:39 +09:00
parent 2041ab54ea
commit 719eb1403f
39 changed files with 1458 additions and 763 deletions

View File

@@ -63,8 +63,9 @@ class StatisticsService
$metrics = DB::table('reports as r')
->join('metrika_results as mr', 'r.report_id', '=', 'mr.rf_report_id')
->whereIn('r.rf_department_id', $allDeptIds)
->whereDate('r.sent_at', '>=', $startDate)
->whereDate('r.sent_at', '<=', $endDate)
->where('r.period_start', '>=', $startDate)
->where('r.period_start', '<=', $endDate)
->where('r.status', 'submitted')
->select(
'r.rf_department_id',
'mr.rf_metrika_item_id',
@@ -81,10 +82,10 @@ class StatisticsService
->join('metrika_results as mr', 'r.report_id', '=', 'mr.rf_report_id')
->whereIn('r.rf_department_id', $allDeptIds)
->where('mr.rf_metrika_item_id', 8)
->where('r.sent_at', '<=', $endDate)
->where('r.period_start', '<=', $endDate)
->select('r.rf_department_id', 'mr.value', 'r.created_at')
->orderBy('r.rf_department_id') // Сначала поле из DISTINCT ON
->orderBy('r.sent_at', 'desc') // Потом остальные
->orderBy('r.period_end', 'desc') // Потом остальные
->distinct('r.rf_department_id')
->get()
->keyBy('rf_department_id');
@@ -109,10 +110,16 @@ class StatisticsService
foreach ($deptList as $dept) {
$deptId = $dept->department_id;
$lastReport = Report::where('rf_department_id', $deptId)
->whereDate('sent_at', '>=', Carbon::parse($startDate)->format('Y-m-d'))
->whereDate('sent_at', '<=', Carbon::parse($endDate)->format('Y-m-d'))
->orderBy('sent_at', 'desc')
$lastReportQuery = Report::where('rf_department_id', $deptId);
if ($isRangeOneDay) {
$lastReportQuery->exactPeriod($startDate, $endDate);
} else {
$lastReportQuery->withinPeriod($startDate, $endDate);
}
$lastReport = $lastReportQuery
->onlySubmitted()
->orderBy('period_end', 'desc')
->first();
// Базовые показатели
@@ -141,6 +148,7 @@ class StatisticsService
$observable = 0;
$unwanted = 0;
$bedDaysSum = 0;
$avgBedDays = 0;
if (isset($metrics[$deptId])) {
foreach ($metrics[$deptId] as $item) {
@@ -219,7 +227,7 @@ class StatisticsService
'lethality' => $lethality,
'type' => $typeName,
'isDepartment' => true,
'isReportToday' => $lastReport ? Carbon::parse($lastReport->sent_at)->isSameDay($endDate) : null,
'isReportToday' => $lastReport ? Carbon::parse($lastReport->period_end)->isSameDay($endDate) : null,
];
$groupedData[$typeName][] = $data;