Как я автоматизировал работу врачей на Rust

qMS работает х.уво, когда нужно подготовить выписку и пакет документов для передачи пациента в другое учреждение. Направление 057/у в системе уже заполнено: там есть ФИО, дата рождения, полис, адрес, повод обращения. Но дальше начинается бюрократия. Те же данные приходится переносить в выписку 027/у, обследования искать по разным файлам, фотографии пересылать с телефона на компьютер. Затем переводить ODT в PDF, собирать всё в нужном порядке и уменьшать итоговый файл. Одно направление готово, а работа с документами только началась.
На такой пакет уходило около 40 минут. Почти всё это время съедали повторный ввод и сборка файлов. Поэтому сделал «МеДок» на Rust. С ним оформление занимает 5–10 минут: программа забирает реквизиты из направления, помогает подготовить выписку и собирает пакет в один PDF. Диагноз, анамнез и осмотр врач пишет и проверяет сам.
Как идёт документ
На входе — направление 057/у, выгруженное из qMS в ODT. Я перетаскиваю его в окно «МеДока». Программа читает поля направления и заполняет форму выписки. Данные можно исправить вручную: например, в направлении указан адрес регистрации, а в выписке нужен фактический адрес проживания.
После этого врач дописывает медицинскую часть и сохраняет выписку 027/у в PDF. Если нужен пакет для другого учреждения, к нему добавляются исходное направление, результаты обследований, сканы и фотографии. Направление идёт первым, выписка — второй, остальные документы — за ними. Получается один файл, который можно открыть и проверить перед отправкой.

flowchart LR
A["qMS: направление 057/у · ODT"] --> B["Разбор ODT: ZIP и XML"]
B --> C["app.rs: форма и проверка · egui"]
C --> D["vypiska.rs + шаблон Typst"]
D --> E["Выписка 027/у · PDF"]
A --> F["LibreOffice: ODT → PDF"]
F --> G["package.rs: сборка пакета"]
E --> G
H["Фото и PDF обследований"] --> G
I["intake.rs: QR-код и локальная сеть"] --> H
K["store.rs: карточка пациента"] <--> C
G --> J["Один PDF"]
Что находится внутри
Интерфейс написан на egui. В app.rs живут состояние формы и логика действий врача: загрузка направления, правка полей, сохранение выписки и состав пакета. При загрузке направления другого пациента форма переключается на него вместе с данными осмотра. Для повторных обращений есть отдельная карточка пациента, чтобы не набирать одни и те же сведения каждый раз.
В настройках врач заполняет профиль, должность, добавляет подпись и печать для PDF.

ODT — это ZIP-архив с XML внутри. odt.rs читает content.xml, находит поля направления по подписям и переносит значения в форму. Для этого используются zip и quick-xml. Поля остаются редактируемыми, потому что исходный документ тоже может содержать ошибку. ФИО, дату рождения, полис и адрес перед сохранением нужно проверить.

vypiska.rs передаёт текст врача и проверенные реквизиты в шаблон assets/forma27.typ. Typst создаёт PDF формы 027/у. Для общего пакета нужно ещё сохранить само направление. package.rs вызывает установленный LibreOffice, чтобы перевести ODT в PDF с исходным бланком, а затем соединяет направление, выписку, фотографии и многостраничные PDF обследований в заданном порядке.
У готового файла есть ещё одна практическая проблема — размер. Снимки с телефона быстро раздувают пакет, а слишком сильное сжатие делает подписи и печати нечитаемыми. Поэтому «МеДок» подбирает качество изображений, сохраняя ширину страницы. После сборки файл всё равно стоит открыть и просмотреть целиком.
Фотографии можно передать прямо с телефона. intake.rs поднимает локальный HTTP-сервер и показывает QR-код со ссылкой на страницу загрузки. Телефон отправляет выбранные снимки в открытое приложение. Для этого оба устройства должны находиться в одной подходящей сети; передачу лучше включать в доверенной сети или через раздачу телефона. Файлы с диска добавляются обычным перетаскиванием.
Сборки и данные
У Windows и Linux общие исходники, но готовые файлы собираются отдельно. Есть EXE для Windows 7 x64 и версия для «Альт Рабочая станция» 10 x64. Linux-сборка сделана внутри «Альт 10», чтобы бинарник не потребовал более новую glibc. Для перевода направления в PDF на рабочем компьютере нужен LibreOffice.
«МеДок» работает локально. store.rs хранит карточки пациентов на компьютере: их содержимое защищается DPAPI в Windows и XChaCha20-Poly1305 в Linux. При этом имя файла карточки содержит СНИЛС, а готовый PDF — медицинские сведения. Такие файлы нельзя считать обезличенными и выкладывать вместе с исходниками.
Путь от направления 057/у до пакета PDF не зависит от специальности врача. Но текущая версия выросла из педиатрической практики: заготовка анамнеза, поля «Свидетельство о рождении» и «Организованность», а также подсказки по ЧДД и ЧСС рассчитаны на детей. Заготовку можно изменить, необязательные поля оставить пустыми; подсказки за пределами детского возраста не показываются.
Код и инструкция лежат на GitHub. В репозитории используются искусственные тестовые документы. Сборки для Windows и «Альт 10» доступны в релизе.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.