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

* оптимизация обновления при редактировании спец контингента
* добавил поддержку заключительных диагнозов
* изменил определение законченной операции
* добавил поддержку исхода операции
* добавил определение отмены для операции через назначение
* работа над диапазонами календарей, подсчет статистики
* добавил статусы отчетов и подкорректировал привязку спец контингента к отчету
* добавил новые сервисы для будущего кеширования
* частичное разделение логики подсчета пациентов
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

@@ -10,6 +10,7 @@ use App\Models\MetrikaResult;
use App\Models\MetrikaResultValue;
use App\Models\Report;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
@@ -66,11 +67,14 @@ class MetrikaFormController extends Controller
}
// Создаем или обновляем отчет
[$periodStart, $periodEnd] = $this->getTodayPeriodBounds();
$report = Report::create(
[
'rf_user_id' => $user->id,
'created_at' => now()->toDateString(),
'sent_at' => now()->toDateString(),
'created_at' => $periodEnd,
'sent_at' => $periodEnd,
'period_start' => $periodStart,
'period_end' => $periodEnd,
'rf_department_id' => $user->department->departmentid
]
);
@@ -150,7 +154,7 @@ class MetrikaFormController extends Controller
// Находим последний отчет пользователя за сегодня
$report = Report::where('rf_user_id', $user->id)
->whereDate('created_at', now()->toDateString())
->exactPeriod(...$this->getTodayPeriodBounds())
->orderBy('created_at', 'desc')
->first();
@@ -252,6 +256,7 @@ class MetrikaFormController extends Controller
$dateStart = date('Y-m-d', $startAt) . ' 00:00:00';
$dateEnd = date('Y-m-d', $endAt) . ' 23:59:59';
$dateEndExclusive = Carbon::parse($dateEnd, 'Asia/Yakutsk')->addSecond()->format('Y-m-d H:i:s');
$group = MetrikaGroup::findOrFail($groupId);
@@ -260,9 +265,8 @@ class MetrikaFormController extends Controller
->join('metrika_result_values as mv', 'mr.metrika_result_id', '=', 'mv.rf_metrika_result_id')
->join('reports as r', 'mr.rf_report_id', '=', 'r.report_id')
->where('mr.rf_metrika_group_id', $groupId)
// ->whereBetween('r.sent_at', [$dateStart, $dateEnd])
->where('r.sent_at', '>', $dateStart)
->where('r.sent_at', '<=', $dateEnd)
->where('r.period_start', '>=', $dateStart)
->where('r.period_end', '<', $dateEndExclusive)
->when(!$user->isAdmin() && !$user->isHeadOfDepartment(), function ($query) use ($user) {
return $query->where('r.rf_user_id', $user->id);
})
@@ -355,9 +359,8 @@ class MetrikaFormController extends Controller
$endDate = date("{$year}-{$month}-t", strtotime($startDate));
$reports = Report::where('rf_user_id', $user->id)
// ->whereBetween('sent_at', [$startDate, $endDate])
->where('sent_at', '>', $startDate)
->where('sent_at', '<=', $endDate)
->where('period_start', '>=', $startDate)
->where('period_end', '<', Carbon::parse($endDate, 'Asia/Yakutsk')->addDay()->startOfDay()->format('Y-m-d H:i:s'))
->get();
// Создаем календарь
@@ -406,7 +409,7 @@ class MetrikaFormController extends Controller
// Дни месяца
for ($day = 1; $day <= $daysInMonth; $day++) {
$date = date("{$year}-{$month}-" . sprintf('%02d', $day));
$report = $reports->firstWhere('sent_at', $date);
$report = $reports->first(fn (Report $item) => $item->period_end && $item->period_end->toDateString() === $date);
$timestamp = strtotime($date) * 1000; // В миллисекундах
$dayData = [
@@ -420,7 +423,7 @@ class MetrikaFormController extends Controller
'is_weekend' => date('N', strtotime($date)) >= 6,
'has_report' => !is_null($report),
'report_status' => $report ? $report->status : null,
'sent_at' => $report && $report->sent_at ? $report->sent_at->getTimestamp() * 1000 : $timestamp
'sent_at' => $report && $report->period_end ? $report->period_end->getTimestamp() * 1000 : $timestamp
];
$calendar['days'][] = $dayData;
@@ -564,7 +567,7 @@ class MetrikaFormController extends Controller
$user = Auth::user();
$report = Report::where('rf_user_id', $user->id)
->whereDate('created_at', now()->toDateString())
->exactPeriod(...$this->getTodayPeriodBounds())
->first();
if (!$report) {
@@ -593,4 +596,14 @@ class MetrikaFormController extends Controller
];
}
private function getTodayPeriodBounds(): array
{
$now = now('Asia/Yakutsk');
return [
$now->copy()->subDay()->setTime(7, 0)->format('Y-m-d H:i:s'),
$now->copy()->setTime(7, 0)->format('Y-m-d H:i:s'),
];
}
}