Опросник: добавлен словарь criterion_fields (20 показателей ПП-127), импортёр распознаёт строки «Показатель N …» в листе объекта и складывает в criterion_input; фильтр по сфере (берутся только применимые показатели)
This commit is contained in:
@@ -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": "вариант"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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', ''),
|
||||
|
||||
Reference in New Issue
Block a user