Опросник: добавлен словарь criterion_fields (20 показателей ПП-127), импортёр распознаёт строки «Показатель N …» в листе объекта и складывает в criterion_input; фильтр по сфере (берутся только применимые показатели)

This commit is contained in:
LocoAgent
2026-08-05 15:39:06 +04:00
parent dbf8c613dd
commit 8e97e10714
3 changed files with 157 additions and 0 deletions
+122
View File
@@ -319,5 +319,127 @@
"cell": "", "cell": "",
"keywords": "журнал учета посетителей|журнал учёта посетителей" "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": "вариант"
}
] ]
} }
+11
View File
@@ -556,6 +556,17 @@ def _import_187_is_list(wb, data, settings, log_fn):
if _set(field_lower, 'tech_measures', val_b): if _set(field_lower, 'tech_measures', val_b):
log_fn(f" Тех. меры: {val_b[:60]}") log_fn(f" Тех. меры: {val_b[:60]}")
continue 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: if 'интернет' in field_lower:
is_obj['isInternet'] = is_checked is_obj['isInternet'] = is_checked
continue continue
+24
View File
@@ -4782,6 +4782,29 @@ class DokoGenApp:
if data.get('informationSystems'): if data.get('informationSystems'):
self.model.information_systems.clear() self.model.information_systems.clear()
for is_data in data['informationSystems']: 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( isys = InformationSystem(
name=is_data.get('name', ''), name=is_data.get('name', ''),
description=is_data.get('description', ''), description=is_data.get('description', ''),
@@ -4815,6 +4838,7 @@ class DokoGenApp:
attacker_types=is_data.get('attacker_types', ''), attacker_types=is_data.get('attacker_types', ''),
threats=normalize_threats(is_data.get('threats', '')), threats=normalize_threats(is_data.get('threats', '')),
incidents=normalize_threats(is_data.get('incidents', '')), incidents=normalize_threats(is_data.get('incidents', '')),
criterion_input=_crit_in,
criteria_values=is_data.get('criteria_values', ''), criteria_values=is_data.get('criteria_values', ''),
criteria_justification=is_data.get('criteria_justification', ''), criteria_justification=is_data.get('criteria_justification', ''),
org_measures=is_data.get('org_measures', ''), org_measures=is_data.get('org_measures', ''),