From 225fe5a2ec0922a1072b2c973c5c3ddc2d6c9891 Mon Sep 17 00:00:00 2001 From: Light1YT Date: Thu, 2 Jul 2026 15:38:01 +0500 Subject: [PATCH 1/2] =?UTF-8?q?fix(site-finder):=20=D1=81=D0=B5=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BE=D1=82=D1=87=D1=91=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B0=D1=81=D0=BA=D1=80=D1=8B=D1=82=D1=8B=20(=C2=AB?= =?UTF-8?q?=D0=A1=D0=B2=D0=B5=D1=80=D0=BD=D1=83=D1=82=D1=8C=C2=BB=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BA=D1=82=D0=B0?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Запрос Anton: «пусть всё же всё будет изначально раскрыто». StageDetails default open (useState(true)) — полный отчёт виден сразу, тумблер остаётся для сворачивания. Leaflet-карты монтируются сразу (conditional-mount при open=true с первого рендера — серых тайлов нет, карта в §1/§3 уже верифицирована в раскрытом состоянии). --- data/sql/181_gas_grs_capacity.sql | 75 +++++++++++++++++++ .../site-finder/analysis/StageDetails.tsx | 4 +- 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 data/sql/181_gas_grs_capacity.sql diff --git a/data/sql/181_gas_grs_capacity.sql b/data/sql/181_gas_grs_capacity.sql new file mode 100644 index 00000000..ac40ac09 --- /dev/null +++ b/data/sql/181_gas_grs_capacity.sql @@ -0,0 +1,75 @@ +-- 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; diff --git a/frontend/src/components/site-finder/analysis/StageDetails.tsx b/frontend/src/components/site-finder/analysis/StageDetails.tsx index e31f6a60..277bcaf3 100644 --- a/frontend/src/components/site-finder/analysis/StageDetails.tsx +++ b/frontend/src/components/site-finder/analysis/StageDetails.tsx @@ -13,7 +13,9 @@ export function StageDetails({ openLabel = "Раскрыть всё", closeLabel = "Свернуть", }: StageDetailsProps) { - const [open, setOpen] = useState(false); + // Изначально РАСКРЫТО (запрос Anton 2026-07-02): полный отчёт виден сразу, + // «Свернуть» — для компактного просмотра. Leaflet-карты монтируются сразу. + const [open, setOpen] = useState(true); return ( <> -- 2.45.3 From 057b451a15ba959a926db5abd594bdb184b5326a Mon Sep 17 00:00:00 2001 From: Light1YT Date: Thu, 2 Jul 2026 15:39:33 +0500 Subject: [PATCH 2/2] =?UTF-8?q?chore:=20=D1=83=D0=B1=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B8=D0=B7=20=D0=B2=D0=B5=D1=82=D0=BA=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B0=D0=B9=D0=BD=D0=BE=20=D0=B7=D0=B0=D1=85?= =?UTF-8?q?=D0=B2=D0=B0=D1=87=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=20=D0=B3=D0=B0=D0=B7-=D0=B2=D0=B5=D1=82=D0=BA?= =?UTF-8?q?=D0=B8=20(181=5Fgas=5Fgrs=5Fcapacity.sql)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Файл принадлежит параллельной feat/gas-grs-capacity (недописан воркером); git rm --cached — файл остаётся на диске для воркера. --- data/sql/181_gas_grs_capacity.sql | 75 ------------------------------- 1 file changed, 75 deletions(-) delete mode 100644 data/sql/181_gas_grs_capacity.sql diff --git a/data/sql/181_gas_grs_capacity.sql b/data/sql/181_gas_grs_capacity.sql deleted file mode 100644 index ac40ac09..00000000 --- a/data/sql/181_gas_grs_capacity.sql +++ /dev/null @@ -1,75 +0,0 @@ --- 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; -- 2.45.3