fix(ptica): пустой слой риск-зон перестаёт означать «рисков нет» (#2934) #2940

Merged
bot-backend merged 1 commit from fix/2934-risk-coverage-signal into main 2026-08-19 16:34:27 +00:00

1 commit

Author SHA1 Message Date
a64119ad8f fix(ptica): пустой слой риск-зон перестаёт означать «рисков нет» (#2934)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 8s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 1m36s
CI / openapi-codegen-check (pull_request) Successful in 2m31s
CI / backend-tests (pull_request) Successful in 17m34s
Бэкенд ВСЕГДА присылает nspd_risk_zones — пустым списком, если ничего нет.
Условие показа в LandTab (`!== undefined`) поэтому истинно всегда, а ветка
zones.length === 0 рисовала ЗЕЛЁНУЮ плашку «Риски не обнаружены» с текстом
«Риск-зоны НСПД на участке не выявлены».

Пустой список неоднозначен: «слой опрошен, на участке чисто» и «слой не дал
ничего вообще» выглядят одинаково. Замер на проде 19.08: risks_count = 0 у ВСЕХ
669 дампов (для сравнения zouit_count > 0 у 581) — одиннадцать слоёв природного
риска ни разу не вернули ни одного объекта. То есть плашка показывалась всегда и
всегда без основания.

Провёл наружу risks_count из строки дампа (он уже вычитывался, в ответ не
попадал). Три состояния вместо двух:

    risks_count > 0     -> «Риски не обнаружены» — законно, слой отработал
    risks_count == 0    -> «Не проверено», нейтральным серым
    risks_count is None -> «Не проверено» (дампа нет; None, а не 0, потому что
                           ноль означал бы «спросили и не нашли»)

layers_fetched наружу НЕ отдаю: append в nspd_client.py:956 стоит ДО запроса,
поэтому как признак «слой опрошен» он лжёт. Записано в коде, чтобы следующий
читатель не подхватил его как готовый признак.

Заодно счётчик слоя в тумблере карты: при пустом слое «н/д» вместо «0». Ноль в
одном ряду с измеренными «Конкуренты 14» и «Красные линии 2» читался как
измеренный ноль.

Тесты двусторонние: на origin/main обе проверки падают с «Unable to find an
element with the text: Не проверено»; два контроля (слой отработал → зелёная
плашка законна; зоны найдены → карточки) зелёные с обеих сторон.

Большой дифф CpLayerControlPanel.tsx (267 строк при правке в две) — работа
pre-commit prettier: файл НЕ проходил prettier уже на origin/main (проверено
отдельно), хук нормализовал его целиком, когда я его тронул. Тот же класс, что
расхождение ruff в #2864: хук гоняется только по staged-файлам, поэтому файлы,
которых давно не касались, остаются нестандартизованными.

tsc --noEmit rc=0 · vitest 35 файлов / 275 тестов rc=0 (перепрогнано ПОСЛЕ хуков)
pytest tests/test_quarter_dump_lookup.py: 23 passed
pytest tests/api/v1 (контракт ответа): 354 passed, 1 skipped, rc=0

Refs #2934
2026-08-19 21:05:51 +05:00