Как я вернул визуальность из забвения: indicator-strip в боевых условиях

Верни indicator-strip: как я вернул управление подвесками из забвения
Проект scada-coating — система для управления конвейерным производством с подвесками. Звучит просто, но стоит один раз потерять видимость того, где находятся 36 позиций обработки, и система становится чёрным ящиком. Именно это и произошло во время миграции на новую архитектуру (feature/variant-a-migration): когда переписывали вкладку Линия, забыли про горизонтальную полоску с позициями — indicator-strip. Без неё оператор не видит, какие ванны заняты, какие в аварии и где вообще находится автооператор.
Задача была простая на словах, но коварная на деле: вернуть indicator-strip, добавить управление позициями по клику и гарантировать, что Control Panel (панель управления автооператором) появляется только там, где нужна обратная связь — то есть только на вкладке Линия.
Первым делом я разбирался, что случилось. Оказалось, что во время рефакторинга функция renderIndicatorStrip() вообще не вызывалась в init(). Классический случай: переделали главный цикл инициализации и забыли добавить одну строку. Добавил вызов — полоска появилась на месте. Но это была только половина дела.
Дальше потребовалось переписать selectPosition() — функцию обработки клика по позиции. Раньше она просто подсвечивала ячейку на схеме, теперь должна открывать панель управления этой конкретной позицией. Логика прояснилась через пару итераций: клик на ячейку в indicator-strip или на саму ванну в схеме должен открыть одну и ту же панель с управлением. Для этого пришлось добавить closePositionControl() — чтобы корректно закрывать панель при переключении между вкладками или нажатии Escape.
Нюанс был в том, что Control Panel для автооператора (движение, захват, выбор цели) должен быть видимым только на Линии. На вкладках Процесс и Оборудование он должен исчезать. Это не просто UX-удобство — это требование безопасности и логики: обратная связь от АО имеет смысл только там, где оператор видит саму линию.
После этого я понял, что система управления подвесками вообще требует большего внимания. На основе анализа кодовой базы выяснилось, что подвески имеют пять состояний: RegisteredInSystem (пустая, серая), Processing (синяя), ProcessingDelayed (жёлтая пульсация), ProcessingFinished (зелёная), ProcessingInterrupted (красная). И это не просто цвета — каждое состояние требует разных доступных действий. На схеме есть хранилище пустых подвесок (IsSuspenderStorage), хранилище снаряженных (IsLoadingStorage) и позиция загрузки-выгрузки (IsTransferPosition).
Интересный момент: стандарт ISA-101 для производственного оборудования рекомендует именно такую цветовую кодировку состояний — это не выдумка, а индустриальный стандарт. SCADA-системы по всему миру используют одни и те же цвета для одних и тех же состояний. Это помогает операторам, переходящим между разными системами, ориентироваться без переучивания.
После того как я вернул indicator-strip с поддержкой управления позициями, система стала намного понятнее оператору. Теперь видна полная картина: 36 позиций, каждая с чётким статусом, треугольники показывают, где находится автооператор, а клик открывает панель управления выбранной позицией. Это простое решение, но оно меняет всё — от ощущения контроля до скорости работы оператора.
Дальше передо мной встала задача проработать полный цикл управления подвесками: dropdown-меню для вызова свободной подвески, список всех подвесок с фильтрацией по состоянию, контекстное меню для быстрых действий. Но это уже другая история.
😄 Забыть вернуть indicator-strip — это как забыть приборную панель в машине, но заметить только когда закончилось топливо на трассе.
Метаданные
- Session ID:
- grouped_scada-coating_20260207_2324
- Branch:
- feature/variant-a-migration
- Dev Joke
- Мигрировать с Docker — всё равно что менять колёса на ходу. На самолёте.
Часть потока:
Разработка: scada-coating