feat(sf): opportunity-ЗУ harvest → ird_overlays (future-supply, #1086) #1100
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1100
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/1086-opportunity-harvest"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #1086.
Future-supply: НСПД opportunity-ЗУ по агломерации ЕКБ
Свободная / выставляемая под застройку земля — DIRECT-сигналы «земля под застройку». В центре города такие ЗУ редки (точечный probe = 0), но по агломерации присутствуют → сплошной grid-walk по кварталам, как в ИРД-harvest.
Что добавлено
backend/app/workers/tasks/opportunity_harvest.py— Celery-taskharvest_opportunity_overlays: grid-walk opportunity-слоёв НСПД по кварталам ЕКБ (66:41:*) → upsert вird_overlays(м.132) сlayer_kind='opportunity_*'._upsert_feature(ST_Transform 3857→4326, SAVEPOINT per-row, ON CONFLICT по(source_layer_id, geom_data_id)), те же кварталы_ekb_quarters. Отличие — только набор слоёв +opportunity_*бакет.nspd_client.LAYERS: добавленkrt_territories: 37430(территории ККР). Остальные 4 opportunity-слоя (37299/37294/37298/36473) уже были.celery_app.pyinclude[] +beat_schedule.pyopportunity-harvest-monthly(1-е число месяца 05:30 МСК — реже ИРД weekly, opportunity-земля меняется медленнее).tests/workers/test_opportunity_harvest.py— 3 теста (mock NSPDClient+SessionLocal): grid-walk по всем слоям +layer_kindprefix, skip пустого квартала, регистрация ККР.Opportunity-слои → layer_kind
Валидация
pytest test_opportunity_harvest.py test_ird_harvest.py→ 6 passed (общий движок не сломан)ruff check→ clean (line-100)celery_app+build_beat_schedule()→opportunity-harvest-monthlyзарегистрирован (crontab30 5 1 * *✅)Scope
Self-contained: НЕ трогает
parcels.py. analyze-чтение opportunity-overlay — через тот жеird_overlay_lookup(фильтр поlayer_kind LIKE 'opportunity_%'), wiring в отдельном flag-gated PR. Прогон на VPS — gated до деплоя (B6).✅ APPROVE
Тонкая обёртка над уже отревьюенным движком #1090 (DRY —
_upsert_feature/_ekb_quartersимпортируются, не дублируются):krt_territories:37430добавлен;test_krt_layer_registeredверифицирует. Все 5 opportunity-ключей резолвятся —test_harvest_explicit_quartersассертит==5 executes(real LAYERS, не мокнут) → 6 passed подтверждает полноту набора.opportunity_*вird_overlays.layer_kind(TEXT, без enum в м.132) — новые значения валидны; analyze-фильтрLIKE 'opportunity_%'.30 5 1 * *(monthly) без коллизий (ird-harvest mon 05:00, прочие иные). celery_app.include корректен.Минор (advisory): cross-module импорт приватных
_upsert_feature/_ekb_quarters— приемлемо (DRY > дублирование движка), консистентно с #1090.Merge → deploy-verify.