From a7d7dc96674049b7a3c3c4f692f87af8d3ca9ff6 Mon Sep 17 00:00:00 2001 From: lekss361 Date: Mon, 11 May 2026 19:04:29 +0300 Subject: [PATCH] =?UTF-8?q?fix(site-finder):=20dedupe=20competitors=20?= =?UTF-8?q?=E2=80=94=20same=20domrf=5Fkn=5Fobjects=203x=20snapshots=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/v1/parcels.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/backend/app/api/v1/parcels.py b/backend/app/api/v1/parcels.py index 932ead45..903623de 100644 --- a/backend/app/api/v1/parcels.py +++ b/backend/app/api/v1/parcels.py @@ -177,10 +177,18 @@ def analyze_parcel( } ) - # 5) Конкуренты в радиусе 3 км из DOM.РФ + # 5) Конкуренты в радиусе 3 км из DOM.РФ. + # NB: domrf_kn_objects имеет ~3 snapshot per obj_id → DISTINCT ON по + # latest snapshot, иначе дубликаты ЖК в выдаче. competitor_rows = ( db.execute( text(""" + WITH latest_obj AS ( + SELECT DISTINCT ON (obj_id) * + FROM domrf_kn_objects + WHERE latitude IS NOT NULL + ORDER BY obj_id, snapshot_date DESC NULLS LAST + ) SELECT obj_id, comm_name, dev_name, @@ -191,9 +199,8 @@ def analyze_parcel( ST_SetSRID(ST_MakePoint(o.longitude, o.latitude), 4326)::geography, ST_Centroid(ST_GeomFromText(:wkt, 4326))::geography ) AS distance_m - FROM domrf_kn_objects o - WHERE o.latitude IS NOT NULL - AND ST_DWithin( + FROM latest_obj o + WHERE ST_DWithin( ST_SetSRID(ST_MakePoint(o.longitude, o.latitude), 4326)::geography, ST_Centroid(ST_GeomFromText(:wkt, 4326))::geography, 3000