lct-hack/backend/app/domain/ekp.json

1 line
519 KiB
JSON
Raw Normal View History

feat: классификатор ЕКП — признаки вместо выбора службы (lct-32) Оператор системы-112 службу не выбирает: он проставляет формализованные признаки происшествия, комбинация признаков даёт код ЕКП, а коду соответствует список оповещения, который система собирает сама (docs/spec/DATASET.md). Прежняя модель с полем dds из пяти значений оценивала действие, которого в боевой работе нет. - scripts/import_ekp.py (make ekp): книга заказчика → app/domain/ekp.json, 1283 кода, 61 служба, 23 группы. Разовый импорт, результат под гитом: читать xlsx в рантайме — лишняя зависимость и полсекунды на старте. - domain/ekp.py: справочник с ленивой загрузкой, каскад значений признаков, список оповещения с модификаторами (нет доступа, угроза людям, пострадавшие, газификация и ещё десяток). - КИО: поля signs, incident_code, notify. Последние два только на чтение и пересчитываются при каждой правке признаков; добавленная вручную служба не теряется, удалить службу нельзя — как в боевом АРМ. - GET /api/ekp/signs отдаёт один уровень признаков, а не дерево на полмегабайта. - Карточка на фронте: три каскадных селектора вместо выбора службы. - Оценка: метрика incident_signs (E2, маршрутизация). Для размеченных сценариев dds_choice больше не считается — список оповещения производен от признаков, и штрафовать за него отдельно значит наказать дважды за одну ошибку. Разбор книги оказался основной работой: имя службы лежит то в первой строке заголовка, то во второй, то склеено с модификатором; «Классификатор МЧС» — заголовок группы колонок, а не служба. Правила разбора в докстринге импорта. 113 тестов зелёных (14 новых в tests/test_ekp.py), make typecheck чистый.
2026-09-19 20:11:50 +03:00
{"version":"046.24","source":"Классификатор-происшествий-v046.24.xlsx","imported_at":"2026-09-19T16:55:27+00:00","groups":[{"id":1,"title":"Пожары и задымления"},{"id":2,"title":"ДТП"},{"id":3,"title":"Взрывы"},{"id":4,"title":"Угрозы взрывов и террористических актов"},{"id":5,"title":"Обрушения"},{"id":6,"title":"Угрозы обрушений"},{"id":7,"title":"Опасные геологические, гидрологические и метеорологические явления"},{"id":8,"title":"Экологические происшествия"},{"id":9,"title":"Аварии на гидротехнических сооружениях"},{"id":10,"title":"Аварии на опасных и производственных объектах"},{"id":11,"title":"Угрозы выброса опасных веществ"},{"id":12,"title":"Аварии и происшествия на транспортных объектах"},{"id":13,"title":"Запах газа"},{"id":14,"title":"Аварии и происшествия в городском хозяйстве"},{"id":15,"title":"Нарушение правопорядка"},{"id":16,"title":"Проблемы на дороге"},{"id":17,"title":"Человек в опасности"},{"id":18,"title":"Ребенок в опасности"},{"id":19,"title":"Смертельный исход человека"},{"id":20,"title":"Социальная помощь"},{"id":21,"title":"Происшествия с участием животных"},{"id":22,"title":"Оказание медицинской скорой и неотложной помощи"},{"id":23,"title":"Прочие происшествия"}],"services":[{"id":"sluzhba-101","name":"Служба 101"},{"id":"ods-psc","name":"ОДС ПСЦ"},{"id":"mgpss","name":"МГПСС"},{"id":"mvd","name":"МВД"},{"id":"smp","name":"СМП"},{"id":"mosgaz","name":"МОСГАЗ"},{"id":"cemp","name":"ЦЭМП"},{"id":"fsb","name":"ФСБ"},{"id":"mosoblgaz","name":"Мособлгаз"},{"id":"avtomobilnye-dorogi","name":"Автомобильные дороги"},{"id":"mosgortrans","name":"Мосгортранс"},{"id":"gor-hozyaystvo","name":"Гор. Хозяйство"},{"id":"gormost","name":"ГОРМОСТ"},{"id":"kanal-imeni-moskvy","name":"Канал имени Москвы"},{"id":"mgts","name":"МГТС"},{"id":"metro","name":"Метро"},{"id":"mosvodokanal","name":"Мосводоканал"},{"id":"moek","name":"МОЭК"},{"id":"moesk-pao-rosseti-moskovskiy-region","name":"МОЭСК (ПАО \"Россети Московский регион\")"},{"id":"oek","name":"ОЭК"},{"id":"moslift","name":"Мослифт"},{"id":"codd","name":"ЦОДД"},{"id":"dep-zhkh","name":"Деп. ЖКХ"},{"id":"departament-rbipk-gku-mosbez","name":"Департамент РБиПК (ГКУ МОСБЕЗ)"},{"id":"mkp-analitika","name":"МКП, Аналитика"},{"id":"apparat-mera","name":"Аппарат МЭРА"},{"id":"moskollektor","name":"Москоллектор"},{"id":"rzhd-moskovskayazhd","name":"РЖД (МосковскаяЖД)"},{"id":"departament-obrazovaniya","name":"Департамент образования"},{"id":"centrregionvodhoz-moskovsko-okskoe-bvu","name":"Центррегионводхоз (Московско-Окское БВУ)"},{"id":"voennaya-komendatura","name":"Военная комендатура"},{"id":"oati","name":"ОАТИ"},{"id":"mosvodostok","name":"Мосводосток"},{"id":"departament-ppioos","name":"Департамент ППиООС"},{"id":"od-departament-tszn","name":"ОД Департамент ТСЗН"},{"id":"rsvo","name":"РСВО"},{"id":"evazhd","name":"ЭВАЖД"},{"id":"msppn","name":"МСППН"},{"id":"dtu-r-ritual","name":"ДТУ_Р (Ритуал)"},{"id":"dtu","name":"ДТУ"},{"id":"rosgvardiya","name":"Росгвардия"},{"id":"territorialnye-oiv","name":"Территориальные ОИВ"},{"id":"territorialnye-oiv-tinao","name