Загрузка 0
ПОДЕЛИТЬСЯ

Мой блог

Листай вниз

Как я автоматизировал рутину врачей с помощью утилиты на Rust

Как я автоматизировал рутину врачей с помощью утилиты на Rust

Подробности изложены в материале первоисточника. Подготовка медицинских выписок и пакетов документов для перевода пациентов в другие учреждения часто превращается в изнурительную бумажную волокиту. Чтобы избавить медицинский персонал от рутинного повторного ввода данных, я разработал специальное десктопное приложение «МеДок» на языке Rust. Эта утилита позволяет сократить оформление пакета документов с сорока минут до пяти-десяти минут, используя направление 057/у в качестве основы для автоматического заполнения.

В этой статье я подробно расскажу, как устроен этот инструмент, какие технологии задействованы под капотом и как решена задача быстрой сборки итоговых PDF-файлов без лишней головной боли.

Блок-схема работы приложения МеДок
Схема движения документов от направления до итогового PDF
Окно загрузки фотографий через локальный сервер
Интерфейс передачи снимков со смартфона по QR-коду
Структура хранения карточек пациентов на компьютере
Защищенное хранилище карточек пациентов на локальном диске
Готовые дистрибутивы программы для Windows и Linux
Готовые к установке бинарные файлы МеДока

Как устроен процесс подготовки документов

На входе в программу поступает направление по форме 057/у, которое предварительно выгружается из медицинской информационной системы в формате ODT. Я просто перетаскиваю этот файл в рабочее окно «МеДока». Программа самостоятельно считывает ключевые поля направления и переносит их в форму будущей выписки. Все перенесённые данные остаются полностью доступными для ручной правки, поскольку в исходных документах нередко встречаются неточности — например, адрес регистрации в системе может отличаться от фактического адреса проживания пациента.

Реклама

После завершения автоматического переноса врач заполняет необходимую медицинскую часть осмотра и сохраняет выписку 027/у в формате PDF. Если требуется сформировать полный пакет документов для передачи больного в другую клинику, к нему автоматически присоединяются исходное направление, отсканированные результаты обследований и фотографии. Строгая последовательность соблюдается неукоснительно: направление всегда идет первым номером, следом располагается выписка, а за ними подтягиваются все остальные материалы. В результате формируется единый структурированный файл, который удобно проверить перед отправкой.

Внутреннее устройство и архитектура приложения

Интерфейс утилиты реализован с использованием графической библиотеки egui. В модуле app.rs сосредоточено управление текущим состоянием формы и логика взаимодействия врача с программой: загрузка файлов направления, редактирование полей, генерация выписки и формирование итогового пакета. При открытии документа следующего пациента интерфейс мгновенно переключается вместе со всеми сопутствующими данными осмотра. Для удобства работы с повторными обращениями предусмотрено сохранение персональных карточек пациентов, что избавляет от необходимости повторного набора одних и тех же сведений.

В системных настройках доктор может настроить личный профиль, указать занимаемую должность, а также добавить цифровую подпись и печать для встраивания в PDF-документы. Поскольку файлы ODT представляют собой не что иное как стандартные ZIP-архивы с XML-разметкой внутри, специальный модуль odt.rs с помощью библиотек zip и quick-xml производит чтение файла content.xml, находит нужные поля по текстовым подписям и аккуратно импортирует их значения в графическую форму программы.

Для генерации чистовых PDF-файлов формы 027/у используется связка модуля vypiska.rs и шаблона разметки Typst, расположенного в директории assets/forma27.typ. Что касается сборки общего пакета документов, здесь задействуется модуль package.rs, который обращается к установленному в системе LibreOffice для конвертации исходного направления из формата ODT в PDF с сохранением оригинального бланка. Затем происходит склейка всех компонентов в единую структуру.

Отдельного внимания заслуживает оптимизация размера итогового PDF. Загрузка снимков с мобильных телефонов способна существенно раздуть документ, однако избыточное сжатие делает печати и подписи неразборчивыми. «МеДок» автоматически подбирает оптимальный уровень сжатия изображений с сохранением исходной ширины страницы. Тем не менее, готовый файл всегда рекомендуется просмотреть визуально перед отправкой.

Настройки профиля врача в десктопном приложении МеДок
Панель настроек профиля и цифровой подписи врача в программе

Передавать фотографии с мобильного устройства можно напрямую в процессе работы. Встроенный модуль intake.rs запускает локальный HTTP-сервер и выводит на экран монитора QR-код. Сканируя его, телефон открывает специальную веб-страничку для быстрой отправки выбранных снимков прямо в запущенное приложение. Главное условие для этого — нахождение обоих гаджетов в единой локальной сети.

Особенности сборки, безопасности и специализации

Исходный код приложения един для операционных систем Windows и Linux, однако бинарные сборки компилируются раздельно. Программа поставляется в виде готового исполняемого файла для Windows 7 x64, а также в виде специального пакета для распределения под «Альт Рабочая станция» 10 x64. Linux-версия собирается непосредственно внутри окружения «Альт 10», чтобы избежать жестких требований к более новым версиям системной библиотеки glibc. Для конвертации документов на рабочей машине также требуется наличие LibreOffice.

Программа функционирует исключительно в локальном режиме без отправки конфиденциальных данных во внешние сети. Модуль store.rs отвечает за безопасное хранение пациентских карточек на жестком диске компьютера: в операционной системе Windows задействуется механизм шифрования DPAPI, а в Linux применяется криптографический алгоритм XChaCha20-Poly1305. Поскольку имена файлов содержат страховые номера СНИЛС, а сами PDF-документы наполнены врачебной тайной, подобные архивы ни в коем случае нельзя считать обезличенными.

Структура ODT архива и разбор XML данных направления
Схема обработки полей направления через XML-разметку

Хотя общий алгоритм движения документов от справки 057/у до готового PDF универсален для любых медицинских профилей, текущая версия утилиты исторически выросла из педиатрической практики. В ней заложены специализированные шаблоны анамнеза, поля для указания свидетельства о рождении и детской организованности, а также удобные подсказки по физиологическим нормам ЧДД и ЧСС. Все эти заготовки легко поддаются корректировке, а лишние детские поля можно просто оставлять незаполненными при работе с другими возрастными категориями.

01.