feat(scrapers): реестр РНС/РВЭ ГИСОГД-СО из открытого API — миграция + лоадер (#2367 PR-1) #2370

Merged
bot-backend merged 2 commits from feat/gisogd66-permits-loader into main 2026-07-04 03:26:08 +00:00
Collaborator

Что

Первый из двух PR по #2367: данные РНС (разрешения на строительство) + РВЭ (ввод в эксплуатацию) Свердловской области из открытого JSON-API портала ГИСОГД gisogd66.midural.ru (разведка в issue: без ЕСИА/токенов, ~4191 РНС + 4019 РВЭ по региону, обновляется почти ежедневно, кадастры + GeoJSON-полигоны).

Зачем: РНС появляется в ГИСОГД раньше, чем стройка доходит до проектных деклараций ЕИСЖС (наш domrf-pipeline) — это самый ранний сигнал будущего предложения для §6.

  • Миграция 187_gisogd_permits: таблица с бизнес-ключом UNIQUE(doc_group, doc_num), geom MultiPolygon 4326 (GIST), cad_nums TEXT[] (GIN), идемпотентная, БЕЗ CONCURRENTLY (новая пустая таблица — в деплой-транзакции безопасно)
  • Лоадер gisogd66.py: инкрементальный (сверка (source_key, date_reg), карточки только для новых/изменённых), обе схемы (ЕКБ свежее агрегата на ~неделю), дедуп по бизнес-ключу с WHERE-гейтом «поздний date_reg», SAVEPOINT per-row, politeness (5 коннекций + sleep), валидация кадастров regex'ом, битый GeoJSON → NULL
  • Celery weekly (вт 06:30 МСК, time_limit 3600/3300 по конвенции) + on-demand admin-триггер + freshness-реестр (data-table по fetched_at, 14/45)

Проверки

  • 38 тестов на реальных фрагментах API-ответов (multi-кадастр, битый GeoJSON, конфликт двух схем, skip unchanged) — passed
  • ruff + pinned pre-commit v0.7.4 — Passed; :[a-z_]+::[a-z]-grep пуст
  • code-reviewer: APPROVE (миграция прошла все hard-checks; отмеченные им minor'ы: инкрементальность для overlap-сета двух схем — перефетч с гейт-отказом, данные корректны; breadcrumb при недоступности списка — в PR-2)

Post-merge план

  1. Verify миграции на проде (deploy success ≠ применилось): \d gisogd_permits
  2. POST admin-триггер → холодный прогон (~6k карточек, минуты) → проверка счётчиков и рядов (ожидаю ~4-5k строк после дедупа RS+RV, у ЕКБ-части кадастры + геометрия)
  3. PR-2: analyze-поля recent_permits_500m + §6-рендер + полный отчёт

Refs #2367

## Что Первый из двух PR по #2367: данные РНС (разрешения на строительство) + РВЭ (ввод в эксплуатацию) Свердловской области из **открытого JSON-API портала ГИСОГД** `gisogd66.midural.ru` (разведка в issue: без ЕСИА/токенов, ~4191 РНС + 4019 РВЭ по региону, обновляется почти ежедневно, кадастры + GeoJSON-полигоны). **Зачем**: РНС появляется в ГИСОГД раньше, чем стройка доходит до проектных деклараций ЕИСЖС (наш domrf-pipeline) — это самый ранний сигнал будущего предложения для §6. - **Миграция `187_gisogd_permits`**: таблица с бизнес-ключом UNIQUE(doc_group, doc_num), geom MultiPolygon 4326 (GIST), cad_nums TEXT[] (GIN), идемпотентная, БЕЗ CONCURRENTLY (новая пустая таблица — в деплой-транзакции безопасно) - **Лоадер `gisogd66.py`**: инкрементальный (сверка (source_key, date_reg), карточки только для новых/изменённых), обе схемы (ЕКБ свежее агрегата на ~неделю), дедуп по бизнес-ключу с WHERE-гейтом «поздний date_reg», SAVEPOINT per-row, politeness (5 коннекций + sleep), валидация кадастров regex'ом, битый GeoJSON → NULL - **Celery weekly** (вт 06:30 МСК, time_limit 3600/3300 по конвенции) + **on-demand admin-триггер** + **freshness-реестр** (data-table по fetched_at, 14/45) ## Проверки - 38 тестов на реальных фрагментах API-ответов (multi-кадастр, битый GeoJSON, конфликт двух схем, skip unchanged) — passed - ruff + pinned pre-commit v0.7.4 — Passed; `:[a-z_]+::[a-z]`-grep пуст - code-reviewer: ✅ APPROVE (миграция прошла все hard-checks; отмеченные им minor'ы: инкрементальность для overlap-сета двух схем — перефетч с гейт-отказом, данные корректны; breadcrumb при недоступности списка — в PR-2) ## Post-merge план 1. Verify миграции на проде (deploy success ≠ применилось): `\d gisogd_permits` 2. POST admin-триггер → холодный прогон (~6k карточек, минуты) → проверка счётчиков и рядов (ожидаю ~4-5k строк после дедупа RS+RV, у ЕКБ-части кадастры + геометрия) 3. PR-2: analyze-поля recent_permits_500m + §6-рендер + полный отчёт Refs #2367
bot-backend added 1 commit 2026-07-04 02:59:28 +00:00
feat(scrapers): реестр РНС/РВЭ ГИСОГД-СО из открытого API (#2367 PR-1)
Some checks failed
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Failing after 1m56s
CI / backend-tests (pull_request) Successful in 14m37s
1b96ec1baf
Ранний сигнал future-supply: разрешения на строительство появляются в
ГИСОГД до проектных деклараций ЕИСЖС. Старый minstroy-путь мёртв (WAF),
портал gisogd66.midural.ru отдаёт открытый JSON-API без авторизации.

Миграция 187_gisogd_permits (RS+RV, UNIQUE(doc_group,doc_num), GIST geom
4326, GIN cad_nums) + инкрементальный httpx-лоадер (схемы agate_ekbgo +
agate_sverdregion, сверка по (source_key,date_reg), карточки только для
новых/изменённых, SAVEPOINT per-row, WHERE-гейт предпочтения позднего
date_reg) + Celery weekly (вт 06:30 МСК, limit 3600/3300) + on-demand
admin-триггер + freshness-реестр (data-table, 14/45).

Refs #2367
Light1YT added 1 commit 2026-07-04 03:04:25 +00:00
chore(codegen): regen api-types.ts для gisogd-permits-sync admin-эндпоинта
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 1m24s
CI / openapi-codegen-check (pull_request) Successful in 2m19s
CI / backend-tests (pull_request) Successful in 14m56s
86206b6783
bot-backend scheduled this pull request to auto merge when all checks succeed 2026-07-04 03:25:37 +00:00
bot-backend merged commit 282c92747e into main 2026-07-04 03:26:08 +00:00
bot-backend deleted branch feat/gisogd66-permits-loader 2026-07-04 03:26:08 +00:00
Sign in to join this conversation.
No reviewers
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#2370
No description provided.