Часть работающей системы по автоматизации работы с заявками на кредит. Я вырезал интерфейсы, экшены из контроллеров, описание моделей. Оставил базовые классы.
Исходные данные: в общий список попадают заявки от пользователей с сайта и лидогенераторов, по несколько тысяч в день (модель Request).
Задача - автоматизировать рабочее место сотрудника (около 150-200 человек) для работы с заявками:
- Возможность взять заявку в работу только одному человеку;
- После обработки (обзвон из браузера с логированием) движение заявки по шагам (статусам модели Process);
- Завершение работы по заявке, заявка пропадает из общего списка, сотрудник получает следующую;
- Разные сотрудники могут работать с разными заявками (по конкретным критериям фильтрации модели Request).
Моё решение: разработать полу-автоматическую система распределения заявок.
Суть решения:
- Пользователь приходит на рабочее место и нажимает кнопку "Начать работу";
- Создается новая модель Work, которая является признаком активности сотрудника на сутки;
- Управление работами пользователя осуществляется с помощью WorkManager;
- Демон (консольный контроллер ExampleDistributorController) равномерно раздает заявки в работу активным пользователям;
- Количество заявок, которые можно взять в работу - ограничено;
- Заявки можно получить от демона, а можно взять вручную;
- Для каждого пользователя и заявки создается модель-связка Process, которая закрепляет заявку за пользователем и является простым бизнес-процессом со статусами;
- После завершения работы над заявкой заявка уходит из общего списка, процесс завершается, пользователь получает новую заявку;
- Пользователь может взять вручную заявки с помощью контроллера ExampleRingingController;
- Автоматическая раздача и ручное взятие из общего списка осуществляется с ExampleRequestDistributor (наследник базового класса, можно указать метод выборки пользователей и заявок).
А так же:
- Защита от взятия одной заявки в работу двумя сотрудниками (mysql-mutex);
- За ходом работы может следить начальник (смотреть активные работы Work, процессы Process, их статусы и количество);
- Удобно расширить механизм на другие отделы/заявки: необходимые абстрактыные методы имеются в BaseRequestDistributor