Газовая вертикаль точек подключения: - Миграция 181: gas_grs_capacity (ГРС с выходами; UNIQUE NULLS NOT DISTINCT на (grs_name_norm, output_name) — грабли #140). - gazprom_grs_loader: bs4-парсер инлайн HTML-таблицы «техническая возможность» ГТЕ (~316 ГРС; гео-блок → RUN-ON-PROD): header-driven маппинг колонок, rowspan forward-fill имени (допущение col-0 задокументировано), числа через общий parse_reserve_number, SAVEPOINT per-row, unknown-колонки → raw jsonb. - Celery sync_gas_grs_capacity + beat вт 05:00 MSK. - Endpoint connection-capacity: gas.city_grs (городские ГРС Свердловск/ Екатеринбург, агрегация по выходам) + gas.total_free_th_m3_h; graceful при отсутствии таблицы (schema-first окно). reserve_note у ПС ЕЭСК без опубликованного резерва: «Резерв — по запросу в АО «ЕЭСК» (город)». - Схемы GasGrsRow/GasCapacityBlock/reserve_note аддитивны; api-types +31/-0. - Фронт: блок «ГАЗ» в карточке резервов (по-ГРС «свободно X из Y тыс. м³/ч», бейджи резерв/исчерпана, расшивка, N выходов, суммарная строка) + серая reserve_note-строка в попапе ЦП. Числа через toFiniteNumber. 57 backend-тестов зелёные; deep-review ✅ APPROVE (2 minor-нота учтены).
75 lines
5.5 KiB
PL/PgSQL
75 lines
5.5 KiB
PL/PgSQL
-- 181_gas_grs_capacity.sql
|
||
-- Forgejo #2119 Phase B1 — газовая вертикаль «свободная мощность ГРС» для ПТИЦА §3.
|
||
--
|
||
-- Одна таблица gas_grs_capacity: свободная мощность ГРС (газораспределительная
|
||
-- станция) из раскрытия «Газпром трансгаз Екатеринбург» (ГТЕ):
|
||
-- https://ekaterinburg-tr.gazprom.ru/about/informatsiya-o-tekhnicheskoj-vozmo/
|
||
-- — инлайн HTML-таблица «Информация о технической возможности…».
|
||
--
|
||
-- Источник ГЕО-БЛОКИРУЕТ non-RU IP → загрузчик РАБОТАЕТ НА ПРОДЕ (Celery / manual
|
||
-- docker exec) — как rosseti-/vodokanal-лоадеры (180). Код не должен предполагать
|
||
-- локальный сетевой доступ.
|
||
--
|
||
-- У ГРС бывает несколько выходов («выход 1/2/3») — тогда одна ГРС = N строк с
|
||
-- разным output_name; output_name IS NULL = вся ГРС целиком (одна строка).
|
||
-- grs_name_norm — нормализованное имя для матча (lower, ё→е, пробелы/дефисы
|
||
-- схлопнуты; префиксы «ГРС»/«АРП» СОХРАНЯЮТСЯ, т.к. различают станции).
|
||
--
|
||
-- Refresh: weekly via tasks.connection_capacity_sync.sync_gas_grs_capacity.
|
||
-- Порядок применения: миграция ПЕРЕД деплоем кода (schema-first, sql.md).
|
||
|
||
BEGIN;
|
||
|
||
-- ── gas_grs_capacity ─────────────────────────────────────────────────────────
|
||
-- geom NULL до Фазы C (геокод ГРС). raw jsonb — сырые ячейки строки целиком
|
||
-- (неизвестные/будущие колонки таблицы ГТЕ не теряются, а падают в raw).
|
||
CREATE TABLE IF NOT EXISTS gas_grs_capacity (
|
||
id SERIAL PRIMARY KEY,
|
||
grs_name TEXT NOT NULL, -- исходное имя ГРС
|
||
grs_name_norm TEXT NOT NULL, -- нормализованное для матча
|
||
output_name TEXT, -- «выход 1/2/3»; NULL = вся ГРС
|
||
region TEXT, -- область (Свердловская и др.)
|
||
design_capacity_th_m3_h NUMERIC, -- проектная, тыс. м³/ч
|
||
current_load_th_m3_h NUMERIC, -- текущая загрузка, тыс. м³/ч
|
||
free_capacity_th_m3_h NUMERIC, -- свободная мощность, тыс. м³/ч
|
||
free_capacity_pct NUMERIC, -- свободная, %
|
||
upgrade_due TEXT, -- срок расшивки (как в источнике)
|
||
asof DATE, -- дата актуальности данных
|
||
geom GEOMETRY(POINT, 4326), -- NULL до Фазы C геокода
|
||
raw JSONB, -- сырая строка таблицы целиком
|
||
fetched_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||
|
||
-- NULLS NOT DISTINCT: output_name nullable (у ГРС без разбивки по выходам —
|
||
-- одна строка с output_name IS NULL). Без этого ON CONFLICT не матчит строку
|
||
-- с NULL-выходом → weekly-прогон плодит дубли (те же грабли, что #140 /
|
||
-- 180_connection_capacity.sql power_tp_rp_reserves).
|
||
UNIQUE NULLS NOT DISTINCT (grs_name_norm, output_name)
|
||
);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_gas_grs_capacity_name_norm
|
||
ON gas_grs_capacity (grs_name_norm);
|
||
|
||
CREATE INDEX IF NOT EXISTS gist_gas_grs_capacity_geom
|
||
ON gas_grs_capacity USING GIST (geom);
|
||
|
||
COMMENT ON TABLE gas_grs_capacity IS
|
||
'Свободная мощность ГРС (газораспределительных станций) из раскрытия «Газпром '
|
||
'трансгаз Екатеринбург». Один output_name на строку («выход 1/2/3»; NULL = вся '
|
||
'ГРС). geom NULL до Фазы C геокода. Refresh: weekly via '
|
||
'tasks.connection_capacity_sync.sync_gas_grs_capacity. Forgejo #2119 Phase B1.';
|
||
|
||
COMMENT ON COLUMN gas_grs_capacity.grs_name_norm IS
|
||
'Нормализованное имя ГРС для матча/дедупа (lower, ё→е, пробелы/дефисы схлопнуты; '
|
||
'префиксы «ГРС»/«АРП» СОХРАНЯЮТСЯ — различают станции).';
|
||
|
||
COMMENT ON COLUMN gas_grs_capacity.output_name IS
|
||
'Выход ГРС («выход 1/2/3»). NULL = вся ГРС целиком (нет разбивки по выходам).';
|
||
|
||
COMMENT ON COLUMN gas_grs_capacity.free_capacity_th_m3_h IS
|
||
'Свободная (резервная) мощность ГРС, тыс. м³/ч. Может быть 0 при полной загрузке.';
|
||
|
||
COMMENT ON COLUMN gas_grs_capacity.upgrade_due IS
|
||
'Срок расшивки (планового увеличения пропускной способности), как в источнике '
|
||
'(свободный текст: год / «после 2027» / пусто).';
|
||
|
||
COMMIT;
|