MuskatGroup / Продукты
Электронная очередь: от табло до кабинета врача
Живая демонстрация маршрутизации пациентов с личными сессиями, новым React-интерфейсом и Rust API.
Задача
Превратить исходный PatientQueue в самостоятельное интерактивное демо: посетитель видит общую картину очереди, следит за выбранным талоном и пробует рабочее место врача. Персональная демосессия позволяет исследовать систему, не меняя данные других посетителей.
Три режима одной системы
Табло показывает шесть кабинетов, приглашённые талоны, текущий приём и очередь. Пациент видит пройденные и оставшиеся этапы. Врач выбирает кабинет, начинает и завершает приём, управляет перерывом. При переходе к врачу автоматическое движение ставится на паузу; при возвращении к табло или пациенту продолжается.
Восемь синтетических талонов проходят разные маршруты: обычные этапы, обследование, альтернативные кабинеты консультации и завершение визита. Сервер учитывает доступность кабинетов, длительность приёма, зависимости этапов и перерывы. Виртуальный рабочий день делает сценарий доступным независимо от настоящего времени.
Модернизация
Две исходные React-части объединены в новый интерфейс на React, TypeScript и Vite. Переработаны композиция, карточки кабинетов, типографика и мобильное представление. Есть русский и английский языки, светлая и тёмная темы, полноэкранное табло и управление с клавиатуры.
Backend переписан с .NET на Rust: Axum, Tokio, SQLx и SQLite. HTTP, хранение, доменные переходы и симуляция разделены. Контракт описан в OpenAPI; типы frontend генерируются из этого контракта.
Изоляция и согласованность
Сессия определяется серверной HttpOnly cookie, все операции ограничены её состоянием. Версия снимка и Idempotency-Key защищают от конфликтов и повторной отправки. При сетевом сбое интерфейс сохраняет текущий вид и позволяет повторить команду. SQLite сохраняет сессии после перезапуска API; автоматическая очистка ограничивает время их жизни.
Административные экраны, импорт расписаний клиник и реальные данные пациентов исключены. Демонстрация использует только вымышленные талоны и не является медицинским сервисом.
Выпуск
Frontend и API имеют отдельные репозитории и собираются независимо. Собственный Compose-проект подключается к общему Caddy только через frontend. Предусмотрены согласованная копия SQLite перед миграцией, откат пары образов и базы, внешние проверки доступности и резервирование.
Публичная ссылка появится после размещения на отдельном поддомене.