Новая утилита «Смертность стационара», наименования КСГ в отчёте экономики, имя
программы «Синяя изолента» с обновлением одним кликом и приведение всего кода к
PEP 8 / PEP 257 / PEP 20. Вывод существующих отчётов не изменился: .txt/.csv/.html
статистики.
Добавлено
- Утилита «Смертность стационара» (вкладка +
omsreg deaths/omsreg-deaths):
читает выгрузку «Отчёт по умершим» — на самом деле HTML-таблицу экспорта мед-системы,
разбирается напрямую, LibreOffice не нужен — и строит матрицу «месяц × группа причин
смерти», как ручной отчётСМЕРТНОСТЬ … СТАЦИОНАР: столбец «Всего», строка «Итого»,
приписка «(в т.ч. ИБС N, фибрилляция N)» у групп с подгруппами. Рядом с источником
сохраняются.xlsx(как образец — ширины колонок, жирная шапка, рамки),.html,
.txtи журнал.log. - Справочник причин смерти
_shared/mkb_death_groups.csv:
правила «код_от;код_до;группа;подгруппа» читаются сверху вниз, берётся первое
подходящее (инсульты I60–I69 отнесены к неврологии, а не к кровообращению). Диапазон
сопоставляется по букве и целой части кода: I20–I25 покрывает I20.0…I25.9. Свой CSV —
ключ--groupsили поле «Справочник групп», без пересборки.exe. Коды вне правил
идут в столбец «Прочие» и перечисляются в отчёте. core/xlsx.py— мини-генератор.xlsx(одна книга, один лист) на стандартной
библиотеке: ширины колонок, жирная шапка с переносом, рамки, числа записываются
числами. Сторонних зависимостей по-прежнему нет там, где CSV бессилен.- Группы КСГ в отчёте экономики подписаны официальным наименованием и профилем
медпомощи из встроенного_shared/ksg_catalog.py
(692 группы,ds…+st…) — вместо вычисляемой колонки «глава МКБ»; диагнозы из
файла остались как примеры. В.txtдлинные наименования обрезаются по ширине
колонки, в.html— многоточием, полный текст во всплывающей подсказке.
Справочник генерируетсяtools/build_ksg_catalog.pyиз официальных «Расшифровка
групп КСГ … .xlsx» и вручную не правится; веса и коэффициенты в него намеренно не
включены — они берутся из самого реестра. - Страница «О программе» (последний пункт бокового списка, отделён чертой):
версия, автор, лицензия, ссылка на GitHub, кнопки «Проверить обновление», «Обновить»
и «Страница релиза», строка статуса и галочка автопроверки. - Проверка обновлений через релизы GitHub (
core/updater.py, стандартная
библиотека): сравнение версий с учётом предвыпусков (1.5.0новее1.5.0-rc1).
Автопроверка при запуске идёт в фоновом потоке с коротким таймаутом и никогда не
показывает всплывающих ошибок — если сети нет или GitHub закрыт, статус просто
виден на странице. При ручной проверке текст ошибки отображается там же, а не
модальным окном. Когда обновление найдено, пункт списка помечается номером версии. - Обновление одним кликом: программа скачивает новый
.exe, сверяет его sha256
с суммой, опубликованной в API релиза, подменяет себя (через переименование,
которое Windows разрешает для запущенного файла) и перезапускается. При сбое подмены
прежняя версия возвращается на место, при несовпадении контрольной суммы файл
удаляется и установка отменяется. Остаток*.old.exeудаляется при следующем запуске. - Настройка
app.check_updatesвнастройки.txt(галочка на странице «О программе»).
Изменено
- Название программы: «Синяя изолента» вместо «Обработка реестров ОМС» — область
работы давно шире реестров ОМС (Excel, HTML, смертность). Подзаголовок в шапке
перечисляет фактические возможности; прежний текст про «удаление ошибочных талонов и
статистику стационара по DBF» устарел. Обновлены описание пакета и заголовок README. - PEP 8 / PEP 257 / PEP 20 по всему проекту (аудит и правка всех находок):
- докстринги приведены к PEP 257 и к фактическому поведению — убраны обещания
.csv
там, где создаётся.xlsx, мёртвая ссылка на несуществующий пакет и описание
несуществующих подпакетовremoval/stat; - приватные имена не пересекают границы модулей: слой GUI больше не импортирует
utils._shared, нужные имена реэкспортируются изomsreg.utils;_type_order
стал публичнымtype_order; DAY_KOTD_DEFAULT(«10,15,12») — единый источник истины в_shared/stat_common
(литерал был продублирован в четырёх местах, включая интерфейс);- общие поля вкладок вынесены в
gui/plugin_fields.py: вgui/plugins/остались
только модули-плагины, один файл = одна вкладка; - построители отчётов разрезаны на функции-разделы (цикломатическая сложность с
41/34/28/23/21 до ≤10), агрегаты считаются в одном слое подготовки, поэтому.txt
и.htmlне могут разойтись в цифрах; ruffужесточён:preview = true(без него правилаE301–E306недоступны) и
наборыN, D, ARG, SIM, RET, C4, PERF, PLC0415, RUF100, PTH, C90, PLR0912/0915/0913;
вignoreосознанно оставленыE501иD401(ложные срабатывания «imperative
mood» на русских докстрингах), временныеper-file-ignoresпомечены как техдолг.
- докстринги приведены к PEP 257 и к фактическому поведению — убраны обещания
- Раскраска строк журнала берётся из уровня записи, а не из подстроки «ошибк»: штатные
сообщения вроде «Найдено ошибочных талонов: N» больше не красные, у предупреждений
свой цвет. - Подпись флажка теперь на самом
Checkbuttonи тянется на всю строку — длинная
подпись в первой колонке расширяла её и перекашивала все поля вкладки.
Исправлено
- Опечатка в справочнике причин смерти больше не искажает отчёт молча: строка вида
I2O;I25(латинская «O» вместо нуля) раньше превращалась в диапазон I02–I25 и
относила, например, митральный порок к ИБС. Теперь код разбирается целиком, битое
правило отклоняется, а причина попадает в журнал — как и коды вне справочника. - Утилиты удаления больше не подделывают статистику при сбое: вместо «было 0,
удалено 0, стало 0» для файла, который мог измениться частично, в сводке печатается
«неизвестно», а первопричина уходит в.logс трассировкой (log.exception). - Сбойный плагин больше не обрывает загрузку остальных вкладок и не исчезает без следа
(предупреждение с трассировкой в журнал). - Журнал программы больше не глушит сообщения: вместо
except Exception: pass—
штатныйHandler.handleError. Внутренние ошибки задачи пишут трассировку в.log. - Настройки сообщают о непонятых строках и нечисловых значениях вместо молчаливой
подстановки значения по умолчанию (для длины кода от этого зависит, какие записи
попадут под удаление). core/dbf.py: импорт преобразователей поднят из тел трёх методов в шапку модуля —
он выполнялся на каждую прочитанную запись DBF.
Скачайте duct-tape.exe ниже — Python не нужен.
Full Changelog: v1.4.0...v1.5.0