gendesign/data/sql/134_planning_projects.sql
bot-backend b5c61d295b
All checks were successful
CI / changes (push) Successful in 6s
CI / changes (pull_request) Successful in 6s
CI / backend-tests (push) Successful in 5m47s
CI / backend-tests (pull_request) Successful in 5m45s
feat(sf): ППТ/ПМТ WFS ingest → planning_projects (future-supply, #1085)
2026-06-06 23:18:23 +03:00

78 lines
6.1 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 134_planning_projects.sql
-- #1085 (Site Finder v2 / future-supply «GG-форсайт») — store ППТ/ПМТ ЕКБ (геометрия + реквизиты).
--
-- Future-supply: что/где утверждено к застройке. Источник — ЕКБ-геопортал GeoServer WFS
-- (ekb_geoportal_client.py, #1083): слои portal_geo_dmd_prj_plan (ППТ — проекты планировки) и
-- portal_geo_dmd_prj_mej (ПМТ — проекты межевания). Каждая фича — утверждённый документ
-- планировки с геометрией охвата + doc_status/год (live-verified 2026-06-06, vault research/
-- EKB_Geoportal_WFS_Construction_Intel_Jun06).
--
-- ОТДЕЛЬНАЯ таблица (не ird_overlays м.132): ird_overlays — НСПД-ограничения участка (per-feature
-- ЗОУИТ/ПЗЗ/ОКН + reg_numb_border + category/subcategory), а тут документ-центричная модель
-- геопортала (doc_status / dmd_actual_year / project_name / full_name) из другого источника (WFS,
-- уже EPSG:4326). Смешивать схемы — натяжка; держим раздельно, analyze читает overlap отдельно.
--
-- Что отдаёт WFS-фича (DescribeFeatureType + live): key (стабильный id портала), full_name
-- (документ-описание), doc_full_name/doc_status/doc_status_name (статус утверждения),
-- dmd_actual_year (год актуальности), project_name, geoloc (геометрия 4326).
--
-- Зерно (grain): одна строка = одна WFS-фича (один документ планировки) в слое. Дедуп-ключ —
-- (project_type, source_key): source_key = портальный `key`; project_type 'ppt'|'pmt'.
-- re-harvest UPSERT-ит (latest wins): документы стабильны, обновление = свежий fetched_at.
--
-- ТЭП/очередность из PDF пояснительных записок (pdfplumber) — отдельный проход (#1085 follow-up);
-- колонки tep/staging добавятся ALTER-ом позже (тут только WFS-слой: геометрия + статус).
--
-- Deploy: auto-applied deploy.yml через _schema_migrations (ровно один раз по NN). Idempotent:
-- CREATE TABLE/INDEX IF NOT EXISTS + guarded DO для UNIQUE (прецедент м.125/132/133).
BEGIN;
-- ── 1. Таблица planning_projects ───────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS planning_projects (
id BIGSERIAL PRIMARY KEY,
project_type TEXT NOT NULL, -- 'ppt' (проект планировки) | 'pmt' (проект межевания)
source_key BIGINT NOT NULL, -- стабильный `key` фичи геопортала (дедуп внутри типа)
full_name TEXT, -- описание документа (ПАГЕ № / «Об утверждении ...»)
doc_full_name TEXT, -- doc_full_name WFS
doc_status TEXT, -- doc_status (код/строка статуса утверждения)
doc_status_name TEXT, -- читаемый статус ('действующий'/'утверждён'/...)
project_name TEXT, -- project_name WFS
dmd_actual_year INTEGER, -- год актуальности документа (dmd_actual_year)
geom geometry(Geometry, 4326) NOT NULL, -- охват документа (WFS geoloc, уже 4326)
raw_props JSONB, -- полный properties фичи (forward-compat / ТЭП-резолв)
fetched_at timestamptz NOT NULL DEFAULT now(), -- когда harvest снял (freshness)
CONSTRAINT planning_projects_type_chk CHECK (project_type IN ('ppt', 'pmt')),
CONSTRAINT planning_projects_source_key_chk CHECK (source_key > 0)
);
COMMENT ON TABLE planning_projects IS
'ППТ/ПМТ ЕКБ (#1085, future-supply GG-форсайт): утверждённые проекты планировки/межевания из '
'ЕКБ-геопортала WFS (portal_geo_dmd_prj_plan/_mej). 1 строка = 1 WFS-фича (документ). UPSERT '
'harvest-воркером по uq_planning_projects (project_type, source_key). analyze читает overlap '
'участка через ST_Intersects(geom). ТЭП/очередность из PDF — отдельный проход (follow-up).';
COMMENT ON COLUMN planning_projects.source_key IS 'Стабильный `key` фичи ЕКБ-геопортала — дедуп-ключ внутри project_type';
COMMENT ON COLUMN planning_projects.doc_status_name IS 'Читаемый статус утверждения документа планировки (действующий/утверждён/...)';
-- ── 2. Дедуп/UPSERT-ключ (project_type, source_key) ────────────────────────────
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint WHERE conname = 'uq_planning_projects'
) THEN
ALTER TABLE planning_projects
ADD CONSTRAINT uq_planning_projects
UNIQUE (project_type, source_key);
END IF;
END
$$;
-- ── 3. Индексы ─────────────────────────────────────────────────────────────────
-- Главный read-path: spatial overlap участка (analyze: ST_Intersects(parcel.geom, pp.geom)).
CREATE INDEX IF NOT EXISTS idx_planning_projects_geom
ON planning_projects USING GIST (geom);
-- Фильтр по типу проекта (выборка «все ППТ» / «все ПМТ»).
CREATE INDEX IF NOT EXISTS idx_planning_projects_type
ON planning_projects (project_type);
COMMIT;