diff --git a/backend/app/services/site_finder/cadastre_fetch.py b/backend/app/services/site_finder/cadastre_fetch.py index c995fe70..9c81c0a4 100644 --- a/backend/app/services/site_finder/cadastre_fetch.py +++ b/backend/app/services/site_finder/cadastre_fetch.py @@ -65,19 +65,28 @@ def validate_cad_format(cad_num: str) -> bool: def cad_exists_in_db(db: Session, cad_num: str) -> bool: - """Проверка: есть ли geometry для cad_num в любой из 3 таблиц. + """Проверка: есть ли НЕПУСТАЯ geometry для cad_num в любой из 3 таблиц. Использует EXISTS short-circuit — самая дешёвая проверка. + + NB: `geom IS NOT NULL` обязателен — есть ~964 строк в cad_parcels_geom с meta, + но NULL-геометрией. Без фильтра функция врала бы «geometry есть» → analyze + fallback решал бы "ready"/не ставил NSPD-fetch → участок навсегда застревал в + 202 (никогда не подтянул бы реальную геометрию). С фильтром null-geom участок + корректно идёт в fetch → НСПД отдаёт геометрию → analyze работает (или 404). """ row = db.execute( text( """ SELECT 1 WHERE EXISTS ( - SELECT 1 FROM cad_quarters_geom g WHERE g.cad_number = :c + SELECT 1 FROM cad_quarters_geom g + WHERE g.cad_number = :c AND g.geom IS NOT NULL UNION ALL - SELECT 1 FROM cad_buildings b WHERE b.cad_num = :c + SELECT 1 FROM cad_buildings b + WHERE b.cad_num = :c AND b.geom IS NOT NULL UNION ALL - SELECT 1 FROM cad_parcels_geom p WHERE p.cad_num = :c + SELECT 1 FROM cad_parcels_geom p + WHERE p.cad_num = :c AND p.geom IS NOT NULL ) LIMIT 1 """ ),