feat(analyze): competitor + pipeline lat/lon для слоёв карты (#999 Step 1) #1074

Merged
bot-backend merged 1 commit from feat/analyze-market-coords-999 into main 2026-06-05 11:45:06 +00:00
Collaborator

Что (#999 Step 1/2 — backend)

Добавляет nullable lat/lon (EPSG:4326, 6 dp) в /analyzecompetitors[] и pipeline_24mo.top_objects[], чтобы фронт мог рисовать рыночные слои на Leaflet-карте (#999, 958-B4).

Относится к #999 (НЕ закрывает — слои карты на фронте = Step 2, отдельный PR).

Почему так

Координаты УЖЕ есть в источнике (domrf_kn_objects.latitude/longitude — та же geom, из которой считается distance_m), но в ответ /analyze не попадали. Прод-проба подтвердила: competitors[].lat/lon = None. Это вскрылось при разборе #999 — он оказался не frontend-only.

Изменения (backend/app/api/v1/parcels.py, +44/-1)

  • 2 inline-запроса (competitors, pipeline): добавлен o.latitude AS lat, o.longitude AS lon (o = latest_obj).
  • _competitor_with_coords (spread dict(row) + округление lat/lon), _coord_round (Decimal/None-safe).
  • top_objects dict: +lat/lon.

Безопасность

Чисто аддитивно — ни одно существующее поле/форма не изменены (distance_m, geom_geojson, все остальные — как были). Объект без координат → None (без 500). Downstream-консьюмеры (_compute_confidence, market_pulse, top_sellers) читают только именованные ключи → инертны к новым полям.

Качество

  • code-reviewer: APPROVE (аддитивность, SQL-валидность o-алиаса в обоих запросах, Decimal/null-safe, downstream инертны).
  • ruff clean, pytest tests/api/v1/ 96 passed. Без новых bind-параметров (psycopg v3 CAST — не требуется).

Тест-план (post-deploy)

POST /analyze на 66:41:0702048:27competitors[0].lat/lon не null; pipeline_24mo.top_objects[0].lat/lon присутствуют.

## Что (#999 Step 1/2 — backend) Добавляет nullable `lat`/`lon` (EPSG:4326, 6 dp) в `/analyze` → `competitors[]` и `pipeline_24mo.top_objects[]`, чтобы фронт мог рисовать рыночные слои на Leaflet-карте (#999, 958-B4). Относится к #999 (НЕ закрывает — слои карты на фронте = Step 2, отдельный PR). ## Почему так Координаты УЖЕ есть в источнике (`domrf_kn_objects.latitude/longitude` — та же geom, из которой считается `distance_m`), но в ответ /analyze не попадали. Прод-проба подтвердила: `competitors[].lat/lon = None`. Это вскрылось при разборе #999 — он оказался не frontend-only. ## Изменения (`backend/app/api/v1/parcels.py`, +44/-1) - 2 inline-запроса (competitors, pipeline): добавлен `o.latitude AS lat, o.longitude AS lon` (`o` = `latest_obj`). - `_competitor_with_coords` (spread `dict(row)` + округление lat/lon), `_coord_round` (Decimal/None-safe). - `top_objects` dict: +lat/lon. ## Безопасность **Чисто аддитивно** — ни одно существующее поле/форма не изменены (`distance_m`, `geom_geojson`, все остальные — как были). Объект без координат → None (без 500). Downstream-консьюмеры (`_compute_confidence`, `market_pulse`, `top_sellers`) читают только именованные ключи → инертны к новым полям. ## Качество - `code-reviewer`: ✅ APPROVE (аддитивность, SQL-валидность `o`-алиаса в обоих запросах, Decimal/null-safe, downstream инертны). - `ruff` clean, `pytest tests/api/v1/` 96 passed. Без новых bind-параметров (psycopg v3 CAST — не требуется). ## Тест-план (post-deploy) `POST /analyze` на `66:41:0702048:27` → `competitors[0].lat/lon` не null; `pipeline_24mo.top_objects[0].lat/lon` присутствуют.
bot-backend added the
scope/backend
site-finder
GG-форсайт
labels 2026-06-05 11:45:04 +00:00
bot-backend added 1 commit 2026-06-05 11:45:04 +00:00
feat(analyze): expose competitor + pipeline lat/lon for map layers (#999)
All checks were successful
Deploy / changes (push) Successful in 6s
Deploy / build-frontend (push) Has been skipped
Deploy / build-backend (push) Successful in 1m25s
Deploy / build-worker (push) Successful in 2m32s
Deploy / deploy (push) Successful in 1m9s
a87a69af7c
Add nullable lat/lon (EPSG:4326, 6 dp) to /analyze competitors[] and
pipeline_24mo.top_objects[] so the frontend can plot Leaflet markers. Coords
come from domrf_kn_objects.latitude/longitude (same source as distance_m).
Purely additive: no existing field/shape changed. Frontend map layers follow
in a separate PR. Part of EPIC #958 (958-B4).
bot-backend merged commit a87a69af7c into main 2026-06-05 11:45:06 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#1074
No description provided.