(high) page.tsx/districtLabel: KPI «X км от центра» показывает дистанцию до границы района, а не до центра ЕКБ #1414

Closed
opened 2026-06-15 05:53:46 +00:00 by bot-backend · 1 comment
Collaborator

Severity: high · Категория: report · Файл: frontend/src/app/legacy/site-finder/page.tsx:244-248

frontend/src/app/legacy/site-finder/page.tsx:247 подписывает ${(data.district.dist_to_center / 1000).toFixed(1)} км от центра. Backend (backend/app/api/v1/parcels.py:1452-1455) кладёт в district.dist_to_center величину ST_Distance(d.geom::geography, ST_Centroid(parcel)::geography) — расстояние от центроида участка до ПОЛИГОНА ближайшего района (ekb_districts.geom), выбранного ORDER BY dist_to_center ASC LIMIT 1 среди районов в радиусе 5 км (ST_DWithin 5000). Для участка внутри района это ≈0, у границы — сотни метров; это НЕ расстояние до центра города. Корректная величина — location.distance_to_center_km (parcels.py:2714, _haversine_km(centroid, EKB_CENTER)). Импакт: финдиректор видит заведомо ложную KPI-цифру (напр. «0.2 км от центра» для окраины). Тот же дефект продублирован в components/site-finder/OverviewTab.tsx:82 («км до центра»), причём рядом на OverviewTab.tsx:92 корректно выводится location.distance_to_center_km — два разных «до центра» на одном экране. Фикс: подставить data.location.distance_to_center_km (уже в км, без /1000) либо переименовать метку в «км до границы района».

Почему баг: В backend (parcels.py:1452-1455) dist_to_center = ST_Distance(d.geom::geography, ST_Centroid(parcel)), где d.geom — это ПОЛИГОН района (ekb_districts.geom, полигоны 8 районов из OSM, см. data/sql/56_schema_ekb_districts_geom.sql и 74_dedupe_unified_views.sql), а строка выбирается ORDER BY dist_to_center ASC LIMIT 1 среди районов в радиусе 5 км. То есть это расстояние от участка до ГРАНИЦЫ ближайшего полигона района: для участка внутри района оно ≈0, для участка у границы — несколько сотен метров. Это НЕ расстояние до центра города. Реальная дистанция до центра ЕКБ лежит в отдельном поле location.distance_to_center_km (ParcelLocation, parcels.py:2714 distance_to_center_km). Клиент видит, например, «0.2 км от центра» для участка на окраине — заведомо ложная цифра в клиентской KPI.

Как чинить: Подписать как «… км до границы района» ИЛИ использовать data.location?.distance_to_center_km для подписи «км от центра». Не смешивать ST_Distance(до полигона района) с семантикой «центр города».


deep-audit «армия ботов 2» · verify+harden, confidence 0.92 · unit U80

**Severity:** high · **Категория:** report · **Файл:** `frontend/src/app/legacy/site-finder/page.tsx:244-248` frontend/src/app/legacy/site-finder/page.tsx:247 подписывает `${(data.district.dist_to_center / 1000).toFixed(1)} км от центра`. Backend (backend/app/api/v1/parcels.py:1452-1455) кладёт в `district.dist_to_center` величину `ST_Distance(d.geom::geography, ST_Centroid(parcel)::geography)` — расстояние от центроида участка до ПОЛИГОНА ближайшего района (ekb_districts.geom), выбранного `ORDER BY dist_to_center ASC LIMIT 1` среди районов в радиусе 5 км (ST_DWithin 5000). Для участка внутри района это ≈0, у границы — сотни метров; это НЕ расстояние до центра города. Корректная величина — `location.distance_to_center_km` (parcels.py:2714, `_haversine_km(centroid, EKB_CENTER)`). Импакт: финдиректор видит заведомо ложную KPI-цифру (напр. «0.2 км от центра» для окраины). Тот же дефект продублирован в components/site-finder/OverviewTab.tsx:82 («км до центра»), причём рядом на OverviewTab.tsx:92 корректно выводится `location.distance_to_center_km` — два разных «до центра» на одном экране. Фикс: подставить `data.location.distance_to_center_km` (уже в км, без /1000) либо переименовать метку в «км до границы района». **Почему баг:** В backend (parcels.py:1452-1455) `dist_to_center` = `ST_Distance(d.geom::geography, ST_Centroid(parcel))`, где `d.geom` — это ПОЛИГОН района (ekb_districts.geom, полигоны 8 районов из OSM, см. data/sql/56_schema_ekb_districts_geom.sql и 74_dedupe_unified_views.sql), а строка выбирается `ORDER BY dist_to_center ASC LIMIT 1` среди районов в радиусе 5 км. То есть это расстояние от участка до ГРАНИЦЫ ближайшего полигона района: для участка внутри района оно ≈0, для участка у границы — несколько сотен метров. Это НЕ расстояние до центра города. Реальная дистанция до центра ЕКБ лежит в отдельном поле `location.distance_to_center_km` (ParcelLocation, parcels.py:2714 `distance_to_center_km`). Клиент видит, например, «0.2 км от центра» для участка на окраине — заведомо ложная цифра в клиентской KPI. **Как чинить:** Подписать как «… км до границы района» ИЛИ использовать `data.location?.distance_to_center_km` для подписи «км от центра». Не смешивать ST_Distance(до полигона района) с семантикой «центр города». --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.92 · unit U80</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:53:46 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:01 +00:00
Owner

🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)

Текущее состояние кода: frontend/src/app/legacy/site-finder/page.tsx:245-248districtLabel подписывает ${(data.district.dist_to_center / 1000).toFixed(1)} км от центра (247). Backend backend/app/api/v1/parcels.py:1450-1453 кладёт в dist_to_center величину ST_Distance(d.geom::geography, ST_Centroid(...)::geography) — расстояние от центроида участка до ПОЛИГОНА района ekb_districts.geom, выбранного ORDER BY dist_to_center ASC LIMIT 1 среди районов в радиусе 5 км (ST_DWithin 5000, 1457-1461). Для участка внутри района ≈0, у границы — сотни метров. Это НЕ расстояние до центра города.

Корректная величина есть: location.distance_to_center_km = _haversine_km(centroid, EKB_CENTER) (parcels.py:1728), в ответе на 2690 ("distance_to_center_km": round(dist_to_center_km, 2), уже в км).

Дубль дефекта подтверждён: frontend/src/components/site-finder/OverviewTab.tsx:82{(data.district.dist_to_center / 1000).toFixed(1)} км до центра, при этом рядом на OverviewTab.tsx:92 КОРРЕКТНО выводится data.location.distance_to_center_km.toFixed(1) — два разных «до центра» на одном экране.

Корень: Семантика ST_Distance(до полигона района) смешана с подписью «км от центра» города. Реальная дистанция до центра ЕКБ лежит в location.distance_to_center_km.

Что править:

  • В обоих местах подставить data.location?.distance_to_center_km (уже в км, БЕЗ /1000) для подписи «км от центра»; ИЛИ переименовать метку в «км до границы района». Не смешивать две величины.
  • page.tsx:247 и OverviewTab.tsx:82 — единым правкой.

Что посмотреть:

  • Код: frontend/src/app/legacy/site-finder/page.tsx:245-248; frontend/src/components/site-finder/OverviewTab.tsx:82, 92. Backend backend/app/api/v1/parcels.py:1450-1462 (district), 1728 + 2690 (distance_to_center_km).
  • Vault: релевантных заметок не найдено.
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `frontend/src/app/legacy/site-finder/page.tsx:245-248` — `districtLabel` подписывает `${(data.district.dist_to_center / 1000).toFixed(1)} км от центра` (247). Backend `backend/app/api/v1/parcels.py:1450-1453` кладёт в `dist_to_center` величину `ST_Distance(d.geom::geography, ST_Centroid(...)::geography)` — расстояние от центроида участка до ПОЛИГОНА района `ekb_districts.geom`, выбранного `ORDER BY dist_to_center ASC LIMIT 1` среди районов в радиусе 5 км (`ST_DWithin 5000`, 1457-1461). Для участка внутри района ≈0, у границы — сотни метров. Это НЕ расстояние до центра города. Корректная величина есть: `location.distance_to_center_km` = `_haversine_km(centroid, EKB_CENTER)` (parcels.py:1728), в ответе на 2690 (`"distance_to_center_km": round(dist_to_center_km, 2)`, уже в км). Дубль дефекта подтверждён: `frontend/src/components/site-finder/OverviewTab.tsx:82` — `{(data.district.dist_to_center / 1000).toFixed(1)} км до центра`, при этом рядом на OverviewTab.tsx:92 КОРРЕКТНО выводится `data.location.distance_to_center_km.toFixed(1)` — два разных «до центра» на одном экране. **Корень:** Семантика `ST_Distance(до полигона района)` смешана с подписью «км от центра» города. Реальная дистанция до центра ЕКБ лежит в `location.distance_to_center_km`. **Что править:** - В обоих местах подставить `data.location?.distance_to_center_km` (уже в км, БЕЗ `/1000`) для подписи «км от центра»; ИЛИ переименовать метку в «км до границы района». Не смешивать две величины. - page.tsx:247 и OverviewTab.tsx:82 — единым правкой. **Что посмотреть:** - Код: `frontend/src/app/legacy/site-finder/page.tsx:245-248`; `frontend/src/components/site-finder/OverviewTab.tsx:82, 92`. Backend `backend/app/api/v1/parcels.py:1450-1462` (district), 1728 + 2690 (`distance_to_center_km`). - Vault: релевантных заметок не найдено.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1414
No description provided.