Разработка мобильного приложения для записи к врачу
Пациент записался на приём на следующий вторник и забыл. Врач ждёт, слот занят — фактически потерян. По статистике клиник, 15–25% записей — no-show без напоминаний. Мобильное приложение с правильно настроенными напоминаниями сокращает этот показатель до 5–8%.
Система напоминаний как ключевая функция
Три обязательных напоминания для каждой записи:
- За 24 часа — «Напоминаем о записи к врачу [ФИО врача] завтра в 14:30»
- За 2 часа — «Через 2 часа приём в [клиника], кабинет 215»
- В момент, когда нужно выходить — рассчитывается на основе геолокации пользователя и адреса клиники через Google Maps Distance Matrix API или 2GIS API
Третий тип самый ценный и самый редкий в реализации. Логика: ночью перед приёмом серверный планировщик запрашивает текущую локацию пользователя (если разрешение PERMISSION_BACKGROUND_LOCATION получено) или последнюю известную, рассчитывает время в пути, ставит задачу отправки push на appointment_time - travel_time - 15 min.
На iOS для этого нужен Background Location usage description в Info.plist и NSLocationAlwaysAndWhenInUseUsageDescription. Apple тщательно проверяет обоснование при ревью — нужно чётко объяснить пользу.
Подтверждение и отмена прямо из push-уведомления — через UNNotificationAction:
let confirmAction = UNNotificationAction(
identifier: "CONFIRM_ACTION",
title: "Подтвердить ✓",
options: []
)
let cancelAction = UNNotificationAction(
identifier: "CANCEL_ACTION",
title: "Отменить запись",
options: [.destructive]
)
Нажатие «Отменить» без открытия приложения вызывает API, освобождает слот и уведомляет клинику.
Расписание врачей: техническая реализация
Сетка расписания — самый сложный компонент на бэкенде. Каждый врач имеет:
- Базовое расписание (понедельник 9:00–13:00, среда 14:00–18:00)
- Исключения (отпуска, больничные, замены)
- Длительность слота (15, 20, 30 минут — зависит от специализации)
- Количество записей на один слот (обычно 1, но бывают групповые занятия)
Генерация доступных слотов для конкретного врача на диапазон дат: берём базовое расписание, вычитаем исключения и уже занятые слоты. Запрос к PostgreSQL с JOIN на таблицу appointments и exceptions, результат кешируется в Redis на 5 минут.
При одновременной записи двух пользователей на один слот (race condition) — транзакция с SELECT FOR UPDATE на строку слота. Первый получает подтверждение, второй — «этот слот уже занят, выберите другое время».
Клиентская часть: выбор времени
Календарь с доступными днями (TableCalendar на Flutter) → выбор слота (горизонтальный список временных кнопок). Недоступные слоты показываем серым, не скрываем — пользователь понимает заполненность расписания.
Сразу показываем ближайшее доступное время вверху — снижает время до первого тапа.
Медицинская карта и история
История посещений, выписки, результаты анализов — требует особого внимания к безопасности данных. В России — требования 152-ФЗ и приказы Минздрава по хранению медицинских данных.
Документы хранятся в зашифрованном S3 (AES-256), доступ только через backend с проверкой прав, ссылки presigned с TTL 15 минут. На клиенте документы не кешируются на диске.
Уведомления для врача и регистратуры
Врач получает push на свой планшет/телефон:
- «Новая запись на [время]» — с кратким анамнезом если пациент заполнил
- «Пациент подтвердил запись»
- «Пациент отменил за 2 часа до приёма» — освобождает слот
Регистратура видит общий список записей на день в web-кабинете (React + WebSocket для live-обновлений).
Стек и сроки
| Компонент | Технология |
|---|---|
| Mobile | Flutter (iOS + Android) |
| Backend | Node.js/Go + PostgreSQL |
| Push | FCM + APNs |
| Карты | Yandex Maps SDK / Google Maps |
| Документы | S3-compatible + encrypted |
| Масштаб | Срок |
|---|---|
| MVP: запись, напоминания, история | 8–12 недель |
| + Телемедицина (видеоконсультации) | +6–8 недель |
| + Интеграция с МИС (1С:Медицина и др.) | +4–8 недель |







