# Коллаборация CFD Emulation ## Момент подключения - У пользователя нет текущей задачи и все лимиты заняты; - Пользователь не может продолжить работу над текущей задачей так как все лимиты заняты; - Текущий пользователь имеет право участвовать в коллаборации; - Пользователь имеет право работать в колонке; - Ответственный имеет право работать в режиме коллаборации; - Пользователь может участвовать в одной коллаборации; - Приоритет в выборе задачи согласно алгоритму вытягивания; - До конца задачи осталось топлива > 1(2?) итерации ответсвенного. ## Момент выхода из коллаборации - На каждой итерации проверяем не освободились ли wip-лимиты (запускаем режим проверки лимитов для текущих задач); - Если текущих задач нет и нет возможности взять новую, то продолжаем работу; - При смене колонки, 2 пользователь проверяет wip-лимиты и право находится в новой колонке; - Задача завершена / потрачено все топливо. ## Определяем кто может подключаться В первом релизе могут подключаться все выбранные пользователи; ручная настройка в следующем релизе вместе с возможностью выбора колонок/лейнов для пользователя. Сейчас достаточно будет делать проверку может ли пользователь участвовать в коллаборации, которая всегда возвращает `true`. ## Рассчет прожигания топлива Подключенный пользователь прожигает топливо задачи на 50% менее эффективно. То есть, когда работают 2 пользователя над задачей, то скорость прожигания топлива будет составлять 150%. ## Общий алгоритм - Проверяем wip-лимиты для своих задач, возможность взять новую: если лимиты свободны, то обычная логика, иначе: включается режим коллаборации; __Для режима коллабрации:__ - Сортируем карточки в работе (state 2) по алгоритму вытягивания (ближе к завершению); - Проверяем может ли текущий работник работать в коллаборации, есть ли право работать в текущей колонке, подключение к работе даст эффект (верхний лимит на скорость сжигания топлива) -- да ? подключаемся : пропускаем ход; - На каждой итерации проверяем условие выхода. ## Вопросы > Если задача почти завершена, то помочь завершить даже если лимиты для своих задач освободились? Например, если задача завершена на 75-80% > Кол-во одновременных коллабораций для пользователя 1 > Сколько пользователей может участвовать в коллаборации? По идее, не должно быть лимита на кол-во участников. Если объемную задачу можно распараллелить, то лучше создавать отдельные карточки (не будет штрафов на сжигание топлива). > Штрафы на сжигание топлива для 3+ участника Можно установить верхний лимит сжигания топлива по карточке (например, 300%) или уменьшаем эффективность сжигания для каждого нового участника. Т.о., с определенного момента нет смысла подключать нового участника (нужно лучше декомпозировать исходную объемную задачу). > (следующий релиз) Пользователь _А_ не может работать в режиме коллаборации, а пользователь _Б_ может. У пользователя _А_ в работе находится объемная карточка. Может ли пользователь _Б_ подключиться к работе? НЕТ? > Возможно следует немного поменять архитектуру `CardWipLimitAnalyser` Верхний уровень - координатор/главный менеджер инициализирует все классы-провайдеры на основе `analyseData, startDayColumnFill, config` отвечает только за переключение дней и итераций внутри дня При смене итерации или дня дергает cardPool и WorkerManager WorkerManager оперделяет кого и в какой послдеовательности вызывать `fillWorkers и sortWhoMoreFreely` Каждому Worker должны быть доступны инстансы всех менеджеров (провайдер в конструктор, который может вернуть нужный инстанс) Вся логика должна быть в Worker - сам проверяет лимиты, сам выбирает следующюю карточку, оставить ли работу над текущей, имеет ли право двигать, переходить ли в режим коллаборации в следующих релизах еще будет инициализация воркера по правам (куда может двигать/ может ли участвовать в коллаборации, ...) кмк, будет удобнее следить за логикой алгоритма, так как все решения будут в методе run/burnIteration для Worker'а