В планах Tele2 – активно работать над оптимизацией розницы: к августу этого года мы сократили 15% салонов, чтобы эффективнее распределять ресурсы и усилить технологичность ритейла компании. Несмотря на то, что продавцы на точках продаж формально не являются сотрудниками оператора, а работают на дилеров, Tele2 внедряет системы и программы, позволяющие франчайзи успешно управлять сотрудниками и рационализировать их труд.

Одна из таких программ – система WFM. Мы создали собственную систему под нужды нашего ритейла и внедрили функции, полезные как для точек Tele2, так и для других компаний, у которых есть розница.

WFM (Workforce management) – это набор инструментов для управления персоналом, позволяющий оценивать продуктивность работы, прогнозировать загрузку и потребность в персонале, планировать рабочее расписание сотрудников в зависимости от объема работы, квалификации персонала и целей продаж.

Что можно сделать в WFM?

Основная задача системы – помощь в управлении сотрудниками розницы: ведение учета активностей в одной смене, назначение и управление сменами, назначение необходимого количества сотрудников на смену во избежание недоработок или переработок, а также учет местонахождения сотрудников с помощью геолокации. Что еще можно делать с помощью WFM:

  • Запланировать смены работников на точке с указанием роли на смене (Например, Продавец, Администратор) и его активности на смене (Продажи, Инвентаризация, Консультирование и др.).

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

  • Использовать шаблоны смен при планировании вывода сотрудников на точку продаж.

  • Работать с открытыми сменами и привлекать на них сотрудников при помощи биржи смен.

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

  • Регистрировать начало и окончание смены на точке самостоятельно.

  • Проверять геолокацию сотрудника в течение рабочего времени.

  • Вести учет больничных и отпусков.

  • Отправлять уведомления сотрудникам и администраторам платформы.

  • Выгружать отчетность.

При этом разные уровни пользователей имеют разные функции в системе. Ниже продемонстрировали, какие возможности контроля и учета есть у каждой роли в WFM.

Возможности, привязанные к роли
Возможности, привязанные к роли

Как работает WFM?

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

Neo4j — графовая система управления базами данных с открытым исходным кодом, которая позволяет отразить всю организационную структуру и оперативно отдать необходимые данные тому или иному пользователю.

Для хранения данных мы используем три базы данных:

  • Реляционную БД – PostgreSQL.

  • Графовую БД - Neo4j.

  • Документоориентированную БД – MongoDB.

Большая часть данных хранится в PostgreSQL. MongoDB используется для хранения части данных по офисам продаж. Организационная структура хранится в двух базах данных – PostgreSQL и Neo4j. Это нам помогает разграничить данные согласно нашей организационной структуре. К примеру, Пользователь 1 заходит в систему WFM. Согласно данным по пользователю, определяем партнера дилера, к которым он относится: Партнер 1 – Дилер 1. Согласно организационной структуре, пользователю будут отображены данные, которые относятся только к Партнеру 1 и Дилеру 1. При этом сотрудники, которые относятся к другим партнерам, не будут видеть информацию, которую видит Пользователь 1.

Горизонтальный доступ данных
Горизонтальный доступ данных

Работа с Neo4j

Граф состоит из вершин, которые связаны между собой заданными ребрами (отношениями). В нашей WFM заведены следующие типы вершин.

  1. CompanyGroup – группа компаний

  2. Partner – партнер

  3. Dealer – дилер

  4. SaleOffice – офис продаж

  5. Department – департамент

  6. StaffUnitt – штатная единица

  7. Person – персона

Также были заведены следующие типы ребер (отношений между вершинами):

  1. Unit – объединяет, связь от CompanyGroup к Partner

  2. Operate – управляет, связь от Partner к Dealer

  3. Contain – содержит, связь от Partner к Department

  4. Manage – управляет, связь от Dealer к SaleOffice

  5. Staff – штат, связь от Department к StaffUnitt

  6. Lead – руководитель, связь от StaffUnitt к Partner

  7. Employee – сотрудник,  связь от StaffUnitt к Person

  8. Manager – менеджер, связь от Person к SaleOffice

Ниже – пример визуального представления графа:

Визуальное представление графа
Визуальное представление графа

Так как для работы с Neo4j необходимо строить запросы cypher, мы разработали библиотеку, которая позволяет преобразовывать C# в запросы cypher. Например, вот запрос по партнеру с идентификационным номером 1:

C#
{
        MainNodeEntityId = 1,
        MainNodeLabel ="Partner"
 }
Cypher
MATCH (n:Partner {EntityId:1}) RETURN n

Все данные структурировано лежат в базе данных графа. При помощи запросов мы можем узнать по одной точке (вершине) все связи других вершин, даже если они не связаны напрямую. Например, зная партнера, мы можем узнать список всех относящихся к нему офисов, несмотря на то, что все офисы напрямую связаны с дилером.

Графики работы

Для того чтобы спланировать выходы сотрудников в те или иные смены, нам нужно знать время работы салона. Раньше время с 9:00 до 19:00 прописывалось в текстовом формате, но для вывода в систему нужно было переделать график в более корректный для программы вид. В итоге мы создали сервис, преобразующий текст в структурированный шаблон офиса, который мы используем для просчета данных.

Сигнатуры графиков работы
Сигнатуры графиков работы

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

Прогнозирование

При помощи WFM-системы мы можем спрогнозировать рекомендованное количество сотрудников на смене. Первый шаг для выстраивания прогноза – это загрузка данных о продажах, обращениях, посещаемости торговых точек и сотрудниках за последние 92 дня. Система проанализирует поток клиентов, выявит тенденцию, предскажет загрузку продавцов на 2 недели вперед и предложит вывести такое количество сотрудников в смену, которое справится с наплывом покупателей.

Расчет рекомендованного количества сотрудников в смену
Расчет рекомендованного количества сотрудников в смену

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

Автопланирование

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

Данные, учитывающиеся при автопланировании
Данные, учитывающиеся при автопланировании

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

Красные блоки – это строгие ограничения, которые заданы на уровне кода. Так, например, «равномерное распределение нагрузки» являются константой. Это означает, что смены будут назначаться в первую очередь тем сотрудникам, у которых на месяц запланировано или отработано меньшее количество часов.

Белые блоки – это данные, которые попадают в систему заранее и оказывают большое влияние на планирование смен. Если в системе задано, что Иван Иванов в отпуске, он не будет учитываться при автопланировании. На смену также не могут выйти только стажеры. Если Петя Петров выводится на точку №3, он не будет учитываться при автопланировании на точки №1 или №2. Но, если администратор знает, что завтра в смену должен выйти, допустим, Никифор, администратор должен самостоятельно вбить сотрудника в систему и закрепить за сменой.

При автопланировании система учитывает все данные о сотрудниках, а задачи теории расписаний состоят в оптимальном распределении имеющихся ресурсов для выполнения требований за определённый промежуток времени. Для реализации функционала автопланирования за основу была взяла библиотека Google OR-Tools, которую мы доработали под наши нужды.

Google OR-Tools – это SDK с открытым исходным кодом для оптимизации, предназначенный для решения сложных задач маршрутизации транспортных средств, потоков, целочисленного и линейного программирования, а также программирования в ограничениях.

С помощью работы с Google OR-Tools мы можем получить график смен с условием соблюдений всех требований и ограничений. В доработанной системе мы можем выделить следующие термины:

  1. ModelBuilders – переменные целевой функции, значение которых необходимо подобрать.

  2. Rule – правила /ограничения, которым необходимо следовать при подборе значений. Приведем несколько примеров:

  • В один день на смены не должны выходить только стажеры.

  • У сотрудника не должно быть более 2 рабочих дней подряд.

  • Сумма нераспределенного рабочего времени смен должно стремиться к нулю.

  • Сотрудники должны выходить на позиции согласно своим должностям.

  • Время смены должно попадать в рамки рабочего времени точки.

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

  • Необходимо учитывать уже имеющиеся запланированные смены.

  • Один человек одномоментно может выйти только на одну смену.

using Tele2.Wfm.AutoPlanning.Abstractions;
using Tele2.Wfm.AutoPlanning.ModelParameters;
using Tele2.Wfm.AutoPlanning.Models;

namespace Tele2.Wfm.AutoPlanning.Rules;

/// <summary>
/// Ограничения сотрудников по <see cref="Employee.PersonId"/>.
/// </summary>
internal sealed class PersonRule : IPlanningModelRule
{
    /// <inheritdoc />
    public void Apply(PlanningModel model)
    {
        // Один `Employee` одновременно может работать только в одном офисе (учитываем `PersonId`).
        foreach (var dayModel in model.Months.SelectMany(e => e.Days))
        foreach (var employeeModelByPersonId in dayModel.Offices
            .SelectMany(e => e.Employees)
            .GroupBy(e => e.Employee.PersonId))
        {
            var vIsNotEmptyList = employeeModelByPersonId
                .Select(e => e.WorkTime.IsNotEmpty);

            model.CpModel.AddAtMostOne(vIsNotEmptyList);
        }
    }
}
  1. PlaningModel – модель хранения рассчитываемых переменных. Имеет несколько представлений, хранимых в иерархической структуре:

  • В разрезе месяца

  • Месяц-день-офис

  • Месяц-сотрудник

  • Месяц-день-офис-сотрудник-роль

  • Месяц-день-офис-сотрудник

  • Месяц-день

  • Месяц-день-сотрудник

namespace Tele2.Wfm.AutoPlanning.Models;

/// <summary>
/// Модель планирования в разрезе месяца.
/// </summary>
public sealed class MonthModel
{
    /// <summary>
    /// Дата начала месяца.
    /// </summary>
    public DateOnly MonthDate { get; init; }

    /// <summary>
    /// Список моделей планирования в разрезе месяц-день.
    /// </summary>
    public IReadOnlyList<MonthDayModel> Days { get; init; } = default!;

    /// <summary>
    /// Список моделей планирования в разрезе месяц-сотрудник.
    /// </summary>
    public IReadOnlyList<MonthEmployeeModel> Employees { get; init; } = default!;
}
  1. Minimize – стремление функции к минимальному значению. Применяется к основной функции, так и к некоторым правилам. Например, сразу применяем к правилу «Сумма нераспределенного рабочего времени смен должно стремиться к нулю».

…
var vFreeSpaceInMinutesList = new List<IntVar>();
…
var vFreeSpaceInMinutesSum = model.CpModel.NewIntVar(0, durationSum, string.Empty);
model.CpModel.Add(vFreeSpaceInMinutesSum == LinearExpr.Sum(vFreeSpaceInMinutesList));
…
model.Minimize.AddTerm(vFreeSpaceInMinutesSum, weight);
…
  1. Solve() – функция, которая подбирает значение переменных, при которых целевая функция имеет минимальное итоговое значение и выполняются все условия (правила/ограничения).

При запуске подбора графика выполняется следующий порядок действий:

  1. Добавляются переменные целевой функции.

  2. Вызывается функция Solve(), которая запускает процесс подбора значений переменных.

  3. Получаем один или несколько оптимальных вариантов решения целевой функции.

Биржа смен

Мы также запустили возможность для сотрудников выбирать смены самостоятельно. Биржа представляет собой список предложений по сменам, на которые сотрудник может откликнуться и выйти после подтверждения со стороны администратора.

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

Результаты

Подводя итоги, наша система WFM позволяет:

  • оптимизировать труд менеджеров;

  • выводить на смену необходимое количество продавцов с учетом прогнозирования потока клиентов;

  • автоматически планировать выход тех или иных сотрудников с учетом потребностей точки продажи и вводимых ограничений.

Итого за 16 секунд система способна спрогнозировать три варианта расписания 11 офисов продаж на последующие 2 недели. Сейчас около 33% смен в компании создаются автоматически, однако сейчас мы стремимся к тому, чтобы полностью автоматизировать процесс во всех салонах продаж по России.

Комментарии (0)