Часть работающей системы по автоматизации работы с заявками на кредит. Я вырезал интерфейсы, экшены из контроллеров, описание моделей. Оставил базовые классы.

Исходные данные: в общий список попадают заявки от пользователей с сайта и лидогенераторов, по несколько тысяч в день (модель Request).

Задача - автоматизировать рабочее место сотрудника (около 150-200 человек) для работы с заявками:

  • Возможность взять заявку в работу только одному человеку;
  • После обработки (обзвон из браузера с логированием) движение заявки по шагам (статусам модели Process);
  • Завершение работы по заявке, заявка пропадает из общего списка, сотрудник получает следующую;
  • Разные сотрудники могут работать с разными заявками (по конкретным критериям фильтрации модели Request).

Моё решение: разработать полу-автоматическую система распределения заявок.

Суть решения:

  • Пользователь приходит на рабочее место и нажимает кнопку "Начать работу";
  • Создается новая модель Work, которая является признаком активности сотрудника на сутки;
  • Управление работами пользователя осуществляется с помощью WorkManager;
  • Демон (консольный контроллер ExampleDistributorController) равномерно раздает заявки в работу активным пользователям;
  • Количество заявок, которые можно взять в работу - ограничено;
  • Заявки можно получить от демона, а можно взять вручную;
  • Для каждого пользователя и заявки создается модель-связка Process, которая закрепляет заявку за пользователем и является простым бизнес-процессом со статусами;
  • После завершения работы над заявкой заявка уходит из общего списка, процесс завершается, пользователь получает новую заявку;
  • Пользователь может взять вручную заявки с помощью контроллера ExampleRingingController;
  • Автоматическая раздача и ручное взятие из общего списка осуществляется с ExampleRequestDistributor (наследник базового класса, можно указать метод выборки пользователей и заявок).

А так же:

  • Защита от взятия одной заявки в работу двумя сотрудниками (mysql-mutex);
  • За ходом работы может следить начальник (смотреть активные работы Work, процессы Process, их статусы и количество);
  • Удобно расширить механизм на другие отделы/заявки: необходимые абстрактыные методы имеются в BaseRequestDistributor