Перейти к основному содержимому

Что означает каждое состояние ячейки

Состояние ячейки в панели — это не просто показание датчика. Система складывает его из трёх вещей:

  1. что записано в карте — существует ли такая ячейка и не выведена ли она из работы;
  2. что отвечает шкаф прямо сейчас;
  3. что с этой ячейкой было раньше — открывали ли её только что, отвечал ли когда-нибудь её датчик.

Без третьего пункта «дверь открыта, потому что мы её только что открыли» и «дверь открыта, хотя никто её не открывал» выглядели бы одинаково.

Таблица состояний​

СостояниеЧто произошлоЧто делать
Закрытадатчик говорит: дверца на месте. Единственное состояние, в котором можно быть увереннымничего, всё в порядке
Открыта (ожидаемо)её открыли по команде меньше полутора минут назадподождать: клиент забирает или кладёт вещь
Открыта (без команды)дверца открыта, а команды не было🔴 тревога, см. дверь открылась без команды
Датчик не подтверждёнячейка показывает «открыто», и её датчик не отвечал ни разу за всё времяскорее всего датчика нет или оборван провод. Шкаф не даст её ни под возврат, ни под выдачу; лечится не ремонтом, а открытием и закрытием рукой у шкафа — см. ниже
Нет связишкаф не отвечает на опрос; в панели дверцы такого шкафа подписаны «Неизвестно»панель выдачу не запретит, но новый код до шкафа не доедет, а результат по старому приедет с опозданием. См. шкаф офлайн
Выведена из работытак пометил человек: «Ячейки» → дверца → «вывести из оборота»ничего: система её не предлагает и из-за неё не тревожится. ⛔ Здесь стояло «вернуть может только человек» — этого мало: сама она не вернётся, но и дежурный её не вернёт. Нужен администратор (право cells.edit; у роли operator его нет — packages/contracts/src/panel.ts), см. врезку ниже
Нет в картетакого номера в шкафу не заведеноесли ячейка физически есть — привязать её
Названия в панели могут отличаться

Смысл состояний зафиксирован в коде и покрыт тестами, а подписи на экране панели могут звучать иначе.

«Вывести из оборота» — кнопка появилась 4 сентября

⚠️ До этого дня состояние существовало, а способа его поставить из панели не было: только полным обрядом привязки на месте. Кнопка живёт в списке дверец на экране «Ячейки» и доступна администратору (право cells.edit) — ошибка в карте открывает клиенту чужую дверцу, и откатывать её некому.

🔴 Решение человека сильнее показаний датчика: выведенная дверца не открывается клиентом по коду, даже если датчик говорит, что всё в порядке — домен отказывает ей и в выдаче, и в приёме (packages/domain/src/cell-state.ts, ветка outOfService: canIssue: false, canAccept: false).

⛔ Здесь стояло «ни командой из панели» — без оговорки это неправда, и она вредна. Обычная кнопка «Открыть удалённо» по выведенной дверце действительно гаснет, а сервер такой запрос отклоняет («сначала верните её в оборот» — apps/api/src/panel/postamats.service.ts, openCell). Но мастер привязки выведенную дверцу открывать умеет и намеренно: черновая карта заводится именно выведенной, и запрет открывать её означал бы запрет самого обряда (там же, шаг обряда: заслон — право device.enroll, у дежурного его нет). Последствие прежней формулировки прямое: на недоделанном шкафу все заготовки выведены, человек читает «нельзя ничем» и не пробует мастер — то есть не делает единственное, что работает. Подробно — во врезке «На недоделанном шкафу это лекарство не сработает» ниже.

Почему «открыто» и «датчик не подтверждён» — разные строки​

Шкаф отвечает одинаково и на открытую дверцу, и на пустое гнездо. Различить их можно только по истории: если этот датчик хоть раз в жизни сказал «закрыто», значит он существует — и тогда сегодняшнее «открыто» действительно означает открытую дверцу.

Если же он не отвечал никогда, вероятнее всего его просто нет: провод не подключён, оборван или ячейка привязана к пустому гнезду. Такая ячейка не годится под приём вещи: система не сможет убедиться, что клиент закрыл дверцу.

⚠️ Здесь стояло только «под возврат давать нельзя». Этого мало: выдача с такой ячейки тоже не пройдёт. Код на неё сервер выпустит (про датчик он не спрашивает), а шкаф отклонит его прямо у клавиатуры с ответом «ячейка недоступна» — и человек с верным кодом уйдёт ни с чем (packages/domain/src/cell-state.ts, ветка sensor_unproven: canIssue: false). Сделано это ради того, чтобы один код не превращал шкаф в кирпич: разрешённая выдача заканчивалась бы экраном «дверца открыта — закройте её», который не погаснет никогда, потому что закрытие подтвердить нечем.

🔴 И хорошая новость: если замок на месте, это не ремонт, а одна минута у шкафа. Открыть дверцу из панели и дожать её рукой до щелчка — как только датчик один раз скажет «закрыто», он считается доказанным навсегда, и ячейка становится обычной рабочей. Годится любой, кто окажется у шкафа: объезд, техник, вы сами. ⚠️ Удалённо это не лечится: команды «закрыть» не существует, а без закрытия датчику нечего подтверждать. И наоборот — если после закрытия рукой «закрыто» так и не пришло, вот тогда это провод или замок, то есть ремонт.

На недоделанном шкафу это лекарство не сработает — и это самый частый случай

⛔ Здесь стояло только «годится любой, кто окажется у шкафа». Этого мало. Чаще всего датчик не доказан у заготовок мастера привязки, а их открыть из панели нельзя вовсе.

Черновая карта заводится выведенной из оборота — недоделанный шкаф не должен раздавать клиентам дверцы, за которыми неизвестно что (apps/panel/src/app/enroll/page.tsx, seedDraftMap). А по выведенной дверце кнопка «Открыть удалённо» гаснет (apps/panel/src/lib/cells/door-state.ts, deriveDoorView, ветка disabled: openable: false; подпись «Ячейка выведена из оборота» в apps/panel/src/app/cells/page.tsx), и сервер такой запрос отклоняет словами «сначала верните её в оборот» (apps/api/src/panel/postamats.service.ts, openCell).

Что делать вместо этого:

  • Открыть заготовку умеет только мастер привязки — ему выведенная дверца не мешает намеренно (postamats.service.ts, шаг обряда: право device.enroll). То есть недоказанный датчик у заготовки лечится не «сходить дожать», а доведением привязки до конца.
  • Вернуть дверцу в оборот дежурный не может. Это право cells.edit, у роли operator его нет (packages/contracts/src/panel.ts, таблица прав ролей). Нужен администратор.

🔴 Практический вывод: увидели у шкафа неактивную кнопку «Открыть удалённо» — панель не сломана. Либо доделайте привязку мастером, либо позовите администратора вернуть дверцу в оборот. Дожимать рукой имеет смысл только на дверце, которая в обороте.

Чего в этом списке нет​

«Свободна» и «занята» — это не про датчик. Свободна ячейка или занята, знает журнал системы: что в неё положили и забрали ли. Датчик отвечает только на вопрос «дверца закрыта или нет».

Из этого следует вещь, которая иногда удивляет: закрытая ячейка может быть и пустой, и полной, и шкаф разницы не видит. Если журнал и реальность разошлись (клиент забрал вещь, но система считает ячейку занятой), это разбирается по журналу и вручную, а не опросом шкафа.

Если человек ушёл, не закрыв дверцу​

Постамат переходит в состояние «дверь бросили открытой» и продолжает следить за датчиком. Как только дверцу закроют — сам или клиент, или проходящий мимо человек, или вы при объезде, — постамат возвращается в работу.

Раньше это было иначе, и это была настоящая поломка

До исправления в этом состоянии опрос датчика гасился, и событие «дверь закрыли» физически не могло прийти. На практике один невнимательный человек вечером выводил постамат из строя до приезда оператора. Если вам попадётся старая заметка или чужая инструкция, где сказано «после незакрытой дверцы нужен выезд» — она устарела.

Тревогу это всё равно поднимает: открытая ячейка на улице — повод посмотреть. Но выезд теперь нужен не всегда, см. дверь не закрыта.

Полторы минуты — откуда это число​

Столько система считает открытую дверцу нормальной после команды: человеку надо успеть забрать или положить вещь и закрыть дверцу. Если за это время дверца не закрылась, состояние становится тревожным — см. дверь не закрыта.

Число одно и то же и для экрана киоска, и для фонового опроса — специально, чтобы клиент не видел тревогу там, где он просто спокойно укладывает вещь.