diff --git a/dokogen/import_settings.json b/dokogen/import_settings.json index 10643dc..34886a6 100644 --- a/dokogen/import_settings.json +++ b/dokogen/import_settings.json @@ -319,5 +319,127 @@ "cell": "", "keywords": "журнал учета посетителей|журнал учёта посетителей" } + ], + "criterion_fields": [ + { + "num": "1", + "name": "Максимальное число пострадавших людей", + "keywords": "пострадавш", + "unit": "человек" + }, + { + "num": "2б", + "name": "Люди с нарушенными условиями жизнедеятельности", + "keywords": "условия жизнедеятельности", + "unit": "тыс. человек" + }, + { + "num": "3б", + "name": "Люди, для которых недоступны транспортные услуги", + "keywords": "транспортн", + "unit": "тыс. человек" + }, + { + "num": "4а", + "name": "Абоненты, для которых недоступны услуги связи", + "keywords": "абонент", + "unit": "тыс. человек" + }, + { + "num": "5а", + "name": "Максимальное время недоступности государственной услуги", + "keywords": "недоступна государственная услуга|недоступности государственной", + "unit": "часов" + }, + { + "num": "5б", + "name": "Время, в течение которого госуслуга не может быть оказана", + "keywords": "регламентом|административным регламентом", + "unit": "%" + }, + { + "num": "11б", + "name": "Люди, подверженные вредным воздействиям на окружающую среду", + "keywords": "вредным воздействиям", + "unit": "тыс. человек" + }, + { + "num": "13а", + "name": "Снижение объёма продукции ГОЗ", + "keywords": "объем продукции|объём продукции", + "unit": "%" + }, + { + "num": "13б", + "name": "Увеличение времени изготовления единицы продукции ГОЗ", + "keywords": "время изготовления", + "unit": "%" + }, + { + "num": "14", + "name": "Максимальное время недоступности ИС (оборона)", + "keywords": "недоступна пользователю", + "unit": "часов" + }, + { + "num": "2а", + "name": "Территория нарушения жизнеобеспечения населения", + "keywords": "территория.*жизнедеятельности|жизнедеятельности населения", + "unit": "вариант" + }, + { + "num": "3а", + "name": "Территория нарушения транспортного сообщения", + "keywords": "территория.*транспорт", + "unit": "вариант" + }, + { + "num": "3в", + "name": "Типы нарушенных перевозок и грузов", + "keywords": "типам нарушенных перевозок|типы нарушенных перевозок", + "unit": "вариант" + }, + { + "num": "3г", + "name": "Категория объекта транспортной инфраструктуры", + "keywords": "категорированию объектов транспортной|категорию объекта транспортной", + "unit": "вариант" + }, + { + "num": "4б", + "name": "Уровень органа власти, для которого недоступны услуги связи", + "keywords": "уровню органа государственной власти", + "unit": "вариант" + }, + { + "num": "6", + "name": "Уровень государственного органа (невыполнение функции)", + "keywords": "функционирования государственного органа|государственного органа в части", + "unit": "вариант" + }, + { + "num": "7", + "name": "Уровень международного договора", + "keywords": "международного договора", + "unit": "вариант" + }, + { + "num": "11а", + "name": "Территория вредных воздействий на окружающую среду", + "keywords": "территория.*окружающую среду|окружающая среда может", + "unit": "вариант" + }, + { + "num": "12", + "name": "Уровень пункта управления (ситуационного центра)", + "keywords": "пункта управления|ситуационного центра", + "unit": "вариант" + }, + { + "num": "13.1", + "name": "Статус в кооперации головного исполнителя ГОЗ", + "keywords": "кооперации головного исполнителя|статусу в кооперации", + "unit": "вариант" + } ] } \ No newline at end of file diff --git a/dokogen/importer.py b/dokogen/importer.py index 8199b59..29db06b 100644 --- a/dokogen/importer.py +++ b/dokogen/importer.py @@ -556,6 +556,17 @@ def _import_187_is_list(wb, data, settings, log_fn): if _set(field_lower, 'tech_measures', val_b): log_fn(f" Тех. меры: {val_b[:60]}") continue + # --- Показатели критериев значимости (ПП-127) → criterion_input --- + # Строки вида «Показатель 1. …» / «Показатель 2а. …» / «Показатель 13.1. …» + m_crit = re.match(r'^показател[ья]?\s*(\d+(?:\.\d+)?)([а-яА-Я]?)', field_lower) + if m_crit: + _num_crit = m_crit.group(1) + m_crit.group(2) + # нормализация: «10.1» → «10.1», «13.1» → «13.1», «2а» → «2а» + _num_crit = _num_crit.replace(' .', '.').strip() + if val_b and 'выбрать' not in field_lower and not _is_hint(val_b): + is_obj.setdefault('criterion_input', {})[_num_crit] = str(val_b).strip() + log_fn(f" Показатель {_num_crit}: {str(val_b)[:60]}") + continue if 'интернет' in field_lower: is_obj['isInternet'] = is_checked continue diff --git a/dokogen/ui.py b/dokogen/ui.py index b45dfce..efdc732 100644 --- a/dokogen/ui.py +++ b/dokogen/ui.py @@ -4782,6 +4782,29 @@ class DokoGenApp: if data.get('informationSystems'): self.model.information_systems.clear() for is_data in data['informationSystems']: + # Фильтр по сфере: оставляем только показатели, применимые к сфере объекта + # (организация заполняет в опроснике только свои; лишнее отбрасываем). + _crit_in = dict(is_data.get('criterion_input', {}) or {}) + if _crit_in: + import re as _re_sphere + _appl = None + try: + import json as _json_sphere + _ap_path = os.path.join(os.path.dirname(__file__), + 'dictionaries', 'criteria_applicability.json') + with open(_ap_path, encoding='utf-8') as _f_sphere: + _appl_all = _json_sphere.load(_f_sphere) + _appl = _appl_all.get(is_data.get('sphere', '') or '') + except Exception: + _appl = None + if _appl: + _filtered = {} + for _n, _v in _crit_in.items(): + _m = _re_sphere.match(r'(\d+)', str(_n)) + _g = _m.group(1) if _m else str(_n) + if _g in _appl: + _filtered[_n] = _v + _crit_in = _filtered isys = InformationSystem( name=is_data.get('name', ''), description=is_data.get('description', ''), @@ -4815,6 +4838,7 @@ class DokoGenApp: attacker_types=is_data.get('attacker_types', ''), threats=normalize_threats(is_data.get('threats', '')), incidents=normalize_threats(is_data.get('incidents', '')), + criterion_input=_crit_in, criteria_values=is_data.get('criteria_values', ''), criteria_justification=is_data.get('criteria_justification', ''), org_measures=is_data.get('org_measures', ''),