Прийшов час осідлати справжнього Буцефала🏇🏻Приборкай норовливого коня разом з Newxel🏇🏻Умови на сайті
×Закрыть

Как R&D проект помог организовать посещение офиса во время карантина, соблюдая основные карантинные требования

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

Это история развития одного R&D-проекта, который помог специалистам компании ELEKS легко адаптироваться в период карантина и посещять офис при существующей необходимости, придерживаясь всех ограничений, установленных на уровне страны.

Вспомним докарантинное время: большинство IТ-компаний уже практиковали удаленную работу, но это не было на постоянной или продолжительной основе, так как терялся весь смысл «плюшек» (спортзал, массаж, развлекательно-игровые комнаты, йога и медитация, атмосфера стендапов и многое другое), которые являлись важным фактором для специалистов при выборе компании. Конечно, часть этого удалось виртуализировать и предоставить специалистам в качестве сервисов, чтобы как-то сгладить недостаток, но все же...

Мы стали обдумывать план, как выполнить все карантинные ограничения, учитывая возможность физического присутствия огранниченного колличества людей в офисе (сейчас это не более 10%) на своих рабочих местах. Запустили проект Back2Office, который должен был помочь его реализовать. Первую версию проекта сделали из «подручных» средств, чтобы минимизировать затраты и время на разработку. Поэтому Back2Office появился с использованием Jira Workflow, а организационные процессы выполнялись полуавтоматически.

Параллельно мы запустили создание специальной системы, которая автоматизирует весь цикл работы Back2Office. И в этот момент пригодился R&D-проект. Создан первоначально для других целей, он на 90% покрыл все требования для реализации Back2Office. А именно:

1. Бронировать рабочие места в офисе с указанием места и времени пребывания.

2. Учитывать карантинный лимит одновременного нахождения специалистов в помещении.

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

4. Визуализировать схему рабочих мест для просмотра в реальном времени.

5. Интеграция с пропускной системой компании.

В результате R&D-проект помог решить такие проблемы, как:

  • поиск необходимой комнаты в большом офисе, особенно, когда специалисты впервые его посещают;
  • управление свободными рабочими местами;
  • автоматизация процесса перемещения специалистов;
  • бронирование комнат для встреч, переговоров.

Если рассматривать технические аспекты, то решение построили на архитектуре монолита с использованием гибридного подхода облачных и внутрикорпоративных сервисов.

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

Для хранения и работы с нереляционными данными выбрали платформу MongoDB. Она помогла аккумулировать информацию о бронировании, координатах расположения рабочих мест на одной локации, что в свою очередь упростило разработку с использованием MongoDB API.

Серверную часть решения написали на Node.js с применением родного драйвера API и MongoClient для гибкой работы по созданию различных запросов и реализации CRUD операций с данными.

Далее нужно было определиться с инструментами авторизации. Так как компания используетAzure AD для большинства внутренних и внешних сервисов, выбор стал очевиден. Основной задачей было организовать поддержку единой точки входа (SSO), двухфакторную авторизацию (MFA) и всех политик использования безопасности работы данной системы.

Microsoft предлагает широкий спектр процессов авторизации, с которыми можно ознакомится здесь. Мы выбрали библиотеку msal.js. Она позволяет разрабатывать на разных платформах и гарантирует использование двухфакторной авторизации, что является критичным для безопасности. Для клиентской части использовали React. Подход выбрали Implicit flow, поскольку только он поддерживался в связке с React и msal.js.

Для использования Implicit flow необходимо всего лишь зарегистрироваться в Azure AppRegistration и включить опцию.

Но после осуществления данного подхода столкнулись с тем, что процесс авторизации оказался не столь безопасным, и вся информация о пользователе и его полученном bearer токене хранилась в локальном хранилище или сессии браузера.

Вот этот провайдер, который необходимо было взять в работу. У него один из параметров cacheLocation.

Поэтому мы решили использовать иной подход авторизации authorization code flow, который позволял бы проходить всю авторизацию на стороне сервера, то есть Node.js, и не сохранял при этом данные пользователя или ключи на стороне браузера. Новый подход не был до конца реализован в библиотеке msal.js и нам пришлось разработать собственный интерфейс.

Также хотелось бы подчеркнуть проблему бронирования митинг-комнат, которая заключалась не в конкретном бронировании, а в эффективности его использования. К примеру, намечается встреча и необходимо на определенное время забронировать комнату, но потом встречу по различным причинам переносят или она заканчивается раньше. При этом бронь остается в системе, комната простаивает, и никто не может ею воспользоваться. Мы придумали сценарий, чтобы автоматически освобождать комнаты. Данное решение разработали в качестве эксперимента, но оно может стать интересной идеей для других компаний, которым тоже необходимо эффективно управлять локациями для встреч.

В данной архитектуре использовали разные сервисы платформы MS Azure, что способствовалобыстрой разработке решения. Основная идея приложения — отслеживание в комнате любого движения в определенное время и проверка бронирования в календаре, что давало понять, занята ли локация. Для этого применили сенсор движения и микроконтроллер на базе ESP32, который поддерживает работу с Azure IoT SDK, позволяет нативно подключатся к Azure IoT Hub сервису по протоколу MQTT и передавать необходимую информацию о перемещениях.

// initialization
CONNECTTION_STRING = «HostName=XXX;DeviceId=YYY;SharedAccessKey=ZZZ»;
iot_hub_client_handle = IoTHubClient_LL_CreateFromConnectionString(CONNECTTION_STRING, MQTT_Protocol));
IoTHubClient_LL_SetMessageCallback(iot_hub_client_handle, OnMessageCallback, &receive_context);
// receive message (cloud-to-device)
static IOTHUBMESSAGE_DISPOSITION_RESULT OnMessageCallback(
IOTHUB_MESSAGE_HANDLE message, void* user_context)
{
...
IoTHubMessage_GetByteArray(message, (const unsigned char**)&buffer, &size);
...
}
// send message (device-to-cloud)
...
event_instance->messageHandle =
IoTHubMessage_CreateFromByteArray((const unsigned char*)buffer, size));
IoTHubClient_LL_SendEventAsync(
iot_hub_client_handle, event_instance->messageHandle, confirmation_callback, event_instance);
...

Для микроконтроллера разработали приложение, чтобы учитывать погрешности, например, если кто-то случайно зашел в комнату и вышел или, если в комнате есть окна, замечено движение в нем.

Дальше по процессу необходимо обработать полученную информацию и передать ее в веб-интерфейс. Для этого использовали Azure Functions, которые позволяют создавать триггеры и следить за появлением новых сообщений в Azure Event Hub, а также срабатывать только тогда, когда это необходимо.

def main(req: func.HttpRequest) -> func.HttpResponse:
room = req.params.get(’room’)
block_blob_service = BlockBlobService(account_name=’roomstatestorage’, account_key=’)
msg = block_blob_service.get_blob_to_text(’rooms’, room)
msg_to_json = json.loads(msg.content)[0]
time_utc = msg_to_json.get(’time_utc’)
datetime_object = datetime.strptime(time_utc[:-1], «%Y-%m-%d %H:%M»)
minutes_diff = (datetime.utcnow() - datetime_object).seconds/60
if minutes_diff > m_delay:
return func.HttpResponse(f’True’)
else:
return func.HttpResponse(f’False’)

Вся новая информация о движениях обрабатывалась и сохранялась в Blob для дальнейшего использования.

Веб-приложение отображало наличие свободных комнат, а также отправляло уведомления пользователям о том, что комната освободилась и ее можно использовать.

Данное решение упростило процесс пребывание специалистов в офисе ELEKS, позволило эффективно использовать комнаты встреч, а также автоматизировало ряд рабочих моментов, связанных с безопасной работой в компании. Сейчас решение проходит стадию тестирования и план по развертыванию на всю компанию.

LinkedIn

Похожие статьи

Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Бесполезная вещь. Проще всех по дефолту оставить дома, а в офис только в случае крайней необходимости, таких может наберется 3-4 человека из 100, и стоит ради них такие сложности городить? К тому же безопасность это больше не про офис а про дорогу к нему и обратно. Гораздо больше шансов чем-то заразиться в транспорте. Тревожный звоночек что в таких местах которые выдумывают способы как привязать гребца к стойлу, вообще не стоит работать

Перестал читать после

огранниченного колличества

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

Осталось, чтобы созданная бюрократами модель соответствовала модели распространения вируса.

То что известно по вирусу сейчас, внезапно, требует других решений: создать «грязную зону», в которой болеющие в нетяжёлых формах могут продолжать работать. В идеале — боксы на 4 человека максимум, пусть даже с легкосъёмными перегородками. Потому что болезни ОРВИ типа будут ещё долго шастать по миру, и разумеется они склонны к мутациям. А значит и противопоставить кроме коллективного иммунитета им будет нечего.

PS. Я бы сразу в грязную зону пошёл, сговорившись ещё с тремя интровертами. Да, когда я работаю, ни с кем не хочу разговаривать, особенно на рабочие темы — это дорого мне обходится.

Куча телодвижений ... но имеет ли вентиляция в комнате систему экстренной замены воздуха и проходят ли комнаты sanitizing между периодами оккупации. Если нет, то как всегда это пляски вокруг проблемы, но не ёё решение.

Боюсь, плохо понимаешь, что такое ELEKS и кто ими руководит. IMHO оттуда и без вируса стоит уносить ноги по причине наличия мозга. Пляски вокруг проблемы — это очень правильно сказано.

товарищи майоры руководят?

Также хотелось бы подчеркнуть проблему бронирования митинг-комнат, которая заключалась не в конкретном бронировании, а в эффективности его использования. К примеру, намечается встреча и необходимо на определенное время забронировать комнату, но потом встречу по различным причинам переносят или она заканчивается раньше. При этом бронь остается в системе, комната простаивает, и никто не может ею воспользоваться. Мы придумали сценарий, чтобы автоматически освобождать комнаты. Данное решение разработали в качестве эксперимента, но оно может стать интересной идеей для других компаний, которым тоже необходимо эффективно управлять локациями для встреч.

Автоматическое отслеживание движения внутри митинг комнаты может не работать как надо по очевидным причинам — люди опаздывают, люди вышли на обед и т.д.

en.wikipedia.org/wiki/Hoteling
Есть много коробочных и кастомых решений с самым разным уровнем maturity автоматизации процесса управления утилизацией рабочих мест и улучшения office expirience. Скажу лишь что на западе с этим работают уже не первый год и там куда более продвинутые решения используюти с учетом накопленнго фидбека и опыта использования в продакшине подобных решений.

Подписаться на комментарии