Замок
Перед каждым краном на линии стоит клапан. Он закрыт, пока учётная система магазина не разрешит налив. Без разрешения кран не нальёт ни капли.
BRWR запирает краны пивного магазина. Клапан открывается, когда учётная система разрешила налив, и закрывается сам на заказанном объёме. Каждый миллилитр посчитан, пролив виден сразу.
Журнал
BRWR для пивных магазинов и сетей: клапаны и контроллеры на линиях кранов и сервер на компьютере магазина, который связан с 1С.
Перед каждым краном на линии стоит клапан. Он закрыт, пока учётная система магазина не разрешит налив. Без разрешения кран не нальёт ни капли.
Контроллер считает объём по расходомеру и закрывает клапан на заказанном объёме. Если струя остановилась или вышло время, клапан тоже закроется.
Поток при закрытом клапане не останется незамеченным. Это протечка или налив в обход системы, и он попадает в журнал с краном и временем.
Контроллеры стоят на одной линии RS-485 до компьютера магазина. На нём работает сервер BRWR: дашборд, стойка кранов с наливами вживую, журнал и HTTP API для 1С.
Для продавца почти ничего не меняется: он пробивает продажу и наливает. Разница в том, что кран без продажи не откроется.
Продавец пробивает сорт и объём, как обычную продажу.
Учётная система проверяет срок годности кеги и остаток. Если всё в порядке, она даёт BRWR разрешение на налив.
Клапан на линии крана открывается, продавец наливает как обычно.
На заказанном объёме контроллер закрывает клапан, а 1С получает итог налива в миллилитрах.
Срок годности кеги проверяется на каждом наливе. Просроченную кегу 1С наливать не даст.
Каждый налив записан с объёмом по расходомеру и привязан к своей продаже в 1С. Налить больше, чем пробито, не выйдет: клапан закроется.
Протечка и налив в обход системы видны в журнале с краном и временем, а не в недостаче в конце месяца.
1С говорит с сервером BRWR в магазине по HTTP: JSON в обе стороны, токен магазина в заголовке Authorization. Полное описание в формате OpenAPI отдаёт сам сервер.
GET/api/tapsКраны магазина и что с каждым сейчас.POST/api/poursРазрешить налив: кран, объём и номер налива.GET/api/pours/{job_id}?wait=30Дождаться итога: сколько налито и чем налив кончился.POST/api/pours/{job_id}/abortЗакрыть кран сейчас, если покупатель передумал.GET/api/events?after=0События: наливы, протечки, пропажа связи с контроллером.Номер налива job_id придумывает 1С. Запрос с тем же номером не нальёт второй раз, так что после обрыва связи его можно просто повторить.
События читаются с последнего номера, который 1С уже видела: так она узнаёт о протечках и о кране, с которым пропала связь.
POST /api/pours
Authorization: Bearer <токен магазина>
Content-Type: application/json
{
"job_id": "3f2c8a1e-5b7d-4e0a-9c61-0d4b2e7f8a90",
"tap": "4",
"ml": 500
}GET /api/pours/3f2c8a1e-5b7d-4e0a-9c61-0d4b2e7f8a90?wait=30
{
"job_id": "3f2c8a1e-5b7d-4e0a-9c61-0d4b2e7f8a90",
"tap": "4",
"state": "done",
"ml_target": 500,
"ml_poured": 498,
...
}Напишите, сколько у вас магазинов и кранов и какая у вас 1С. Расскажем, что понадобится, и покажем систему в работе.