Индикаторы коррозии
Индикаторы коррозии: сезонная история показаний и оценки скорости коррозии.
Возможности
- Плитки «Найдено» и по этапам («План», «Анализ», «После расчета», «Архивный»); нажатие на плитку этапа — отбор, повторное — снять.
- Поиск по номеру индикатора, месту установки, улице, номеру дома, источнику, участку эксплуатации, ответственному и примечанию; фильтры «Этап», «Сезон (год)», «Стержень», «Оценка», «Агрессивность сетевой воды», «С даты», «По дату».
- С карты журнал открывается для одной линии («индикаторы линии N») или узла («индикаторы у узла N»).
- «Новый индикатор», правка и удаление. Карточка: номер, этап, место установки, линия, узел, участок сети и эксплуатации, камеры, даты плана, установки и извлечения, пластины, результаты обработки, «Оценка коррозионного процесса».
- «История по отопительным сезонам» — все сезоны индикатора с датами, скоростью коррозии, оценкой и агрессивностью воды.
- «На карте» — место индикатора.
Как это работает
Где хранятся данные. Журнал общий с десктопом ТГИД. Индикатор — строка таблицы indikator_korrozii, сезоны — indikator_korrozii_po_godam. Справочники: этап (stateindicator), состояние стержня (stateinds: «Извлечение», «Провал стержня»), оценка процесса (corrosionprocessmarks: от «Незначительный» до «Аварийный»), агрессивность сетевой воды (netwateraggressivenesses: «Низкая», «Допустимая», «Высокая», «Аварийная»).
Что показывает карточка. Если у индикатора есть история сезонов, этап, стержень, даты, пластины, скорость коррозии, оценка, агрессивность воды и примечание берутся из последнего сезона. Последним считается сезон с самой поздней датой извлечения, а если её нет — установки или плана. Поэтому запланированный сезон без извлечения может оказаться ниже сезона, извлечённого позже даты этого плана.
Что правится в вебе. У индикатора без истории правятся все поля карточки. У индикатора с историей поля сезона (этап, стержень, даты, пластины, результаты обработки, оценка, вода, примечание) только для чтения, а окна правки сезонов в вебе нет — их ведут в десктопе. Номер, место установки, линия, узел и остальные поля самого индикатора правятся всегда.
Линия и узел. По номеру линии карточка показывает узлы линии и диаметр трубопровода. Адрес (улица и дом) в вебе не задаётся и по линии не подставляется. Точка на карте — точка индикатора, если её нет — узел, иначе середина линии.
Фильтры. «Сезон (год)» отбирает индикаторы, у которых сезон начинается ровно в выбранном году. «С даты» и «По дату» сравниваются с датой установки последнего сезона, а если её нет — с датой плана.
Сохранение. Новый индикатор нельзя сохранить пустым: нужно хотя бы одно поле. При правке отправляются только изменённые поля; если изменений нет, окно так и говорит.
Удаление удаляет строку индикатора вместе с его историей сезонов (строки indikator_korrozii_po_godam с этим id_i) одной транзакцией: если не удалось что-то одно, не удаляется ничего. Внешнего ключа между таблицами нет — сезоны удаляет сам сервер.
Что нужно для работы
- Смотреть журнал и карточки — любой вошедший.
- Создавать, править, удалять. Окно показывает кнопки, если одновременно есть право «Журналы», включена запись (
MUTATIONS_ENABLED=true) и роль не ниже «Редактор»; пользователю-роли PostgreSQL вместо роли нужно предметное право «Коррозия». Это та же проверка, что делает сервер при записи, поэтому кнопки видны только тем, у кого запись пройдёт.
Шаги
Откройте «Инструменты» и наберите в поиске «Индикаторы коррозии» — пункт выделен рамкой.

Нажмите пункт — откроется окно.

«Создать» открывает карточку нового индикатора. «Размещение и сеть»: номер индикатора, этап, место установки, линия и узел (узлы линии и диаметр подтянутся), признак трубопровода, теплоноситель, источник тепла, участок эксплуатации, сеть, начальник участка. «План и экспозиция»: даты планирования, установки и извлечения, состояние стержня, ответственный. «Сохранить» добавит запись в журнал, «Отмена» — выйти без сохранения.

Примеры
Копия Астаны. 379 индикаторов, у 353 есть история — всего 1297 сезонов, самое большее 13 у одного индикатора. Плитки: «После расчета» — 347, «План» — 32. Все индикаторы привязаны к линии и имеют точку, ни один не привязан к узлу. Оценки по сезонам: «Незначительный» — 562 сезона (средняя скорость 0,0111 мм/год), «Слабый» — 306 (0,0282), «Средний» — 100 (0,0446), «Сильный» — 217 (0,0795), «Аварийный» — 18 (0,1630), без оценки — 94. Сезонов по году установки — от 90 до 107 в год с 2011 по 2025, в 2023 году — 184.
Индикатор № 59 «139,140,141» на той же копии — 13 сезонов. Самая новая запись — план от 23.05.2023 с этапом «План», но извлечения у неё нет. Сезон, извлечённый 22.06.2023, оказывается позже, и карточка показывает его: «После расчета», скорость 0,0521737 мм/год, оценка «Сильный», вода «Допустимая».
Копия Алматы. Журнал пуст: «В текущей базе журнал пока не заполнен».
Если не получается
- «Заполните хотя бы одно поле индикатора» — при создании все поля пустые.
- «Изменений нет — сохранять нечего» — в карточке ничего не изменили.
- Поле сезона не правится — у индикатора есть история сезонов; правьте сезон в десктопе.
- Нет кнопок «Новый индикатор», правки и удаления — нет права «Журналы», роль ниже «Редактора» (у пользователя-роли PostgreSQL — нет права «Коррозия») или запись на сервере выключена.
- «Сервер не вернул идентификатор созданной записи» — индикатор, возможно, создан; обновите список и проверьте.
- Адрес в карточке пустой — веб адрес индикатора не заполняет.
- «Сезон (год)» показывает мало записей — фильтр берёт ровно выбранный год, а не его и более поздние.
Для администратора
- Запись:
MUTATIONS_ENABLED=true, роль «Редактор» или «Администратор»; приAUTH_BACKEND=pg— предметное право «Коррозия», окончательно права проверяет база (sql/pg_auth/03_grants.sql). Право «Журналы» сервер для этого журнала не проверяет, но без него окно не покажет кнопок. - Таблицы десктопные (
indikator_korrozii,indikator_korrozii_po_godamи справочники); веб их не создаёт. При удалении индикатора сервер удаляет и его сезоны изindikator_korrozii_po_godam(поid_i) в той же транзакции. - Создание, правка и удаление пишутся в
audit_log(INSERT,UPDATE,DELETE).
Для разработчика
- Чтение:
GET /api/corrosion-indicators(phase_id,rod_state_id,process_mark_id,water_aggressiveness_id,season_year,date_from,date_to,line_id,node_id,search;state_counts),GET /api/corrosion-indicators/lookups,GET /api/corrosion-indicators/geojson,GET /api/corrosion-indicators/{id}—routers/registries.py,database/corrosion_indicators.py(CORROSION_FROM— выбор последнего сезона). - Запись через общий CRUD:
POST /api/v1/create/indikator_korrozii,PUT /api/v1/update/indikator_korrozii/{id},DELETE /api/v1/delete/indikator_korrozii/{id}—routers/crud.py, права —auth.py(role_for_mutation,cap_for_mutation); сезоны при удалении —database/db.py(_DELETE_CHILDREN,delete_object). - Веб:
components/CorrosionIndicatorJournalDialog.vue,utils/registryEdit.ts(CORROSION_COLUMN_BY_KEY,CORROSION_SEASON_KEYS,corrosionEditableKey),utils/permissions.ts(canEditCorrosion). - Тесты: API —
tests/test_registries_router.py,tests/test_crud_router.py,tests/test_delete_object_children.py; веб —tests/utils/registryEdit.spec.ts.
