Автодействия
При смене статуса проекта или за N дней до его даты система сама ставит задачу, добавляет пакет задач из шаблона, шлёт уведомление или пишет в чат проекта. Правила настраиваются без программиста (ТЗ «Шаблоны, этапы и Гант…», раздел 8).
Реализовано: этап 6 — миграция
0191(automation_rules,automation_runs,project_status_history.automation_processed_at,tasks.automation_rule_id, начальный набор правил — выключен), модульinternal/modules/automations, служебная задачаtasks.Service.CreateSystemTask, системное сообщениеchats.Service.PostProjectSystemMessage, пакет задачprojecttemplates.Service.ApplyTasksPackage.
Правило
| Часть | Варианты |
|---|---|
Когда (trigger_kind) | project_created; status_entered + trigger_status (один раз за жизнь проекта, repeat_each_entry — при каждом входе); date_offset + anchor (mount, event_start, event_end) + offset_days — для проектов «Подтверждён» и «В работе» |
Для каких проектов (conditions) | Дивизионы, типы мероприятий, шаблоны (проект создан по шаблону), источники заявки; внутри списка — ИЛИ, между списками — И |
Что сделать (actions, до 10, по порядку) | create_task — название и описание с подстановками, исполнитель (manager, role, user, division_head; нет такого — менеджер проекта), срок (from_trigger + дни или anchor + дни; в прошлом — сегодня), часы, чек-лист, этап по названию; add_template_tasks — этапы, задачи и вехи шаблона (этапы с тем же названием переиспользуются); notify — менеджеру, руководителю дивизиона, ролям команды, сотрудникам; chat_message — системное сообщение в чат проекта |
Подстановки: {проект}, {клиент}, {дата мероприятия}, {монтаж}, {менеджер}, {причина} (причина проигрыша). Действий, меняющих статус проекта, нет — так исключены циклы.
Как выполняется
- Смена статуса и создание проекта попадают в
project_status_history(триггер базы, см. продажи) — значит, ловятся любые пути, включая автоматические переходы по задачам. - Обработчик в процессе API (
APP_AUTOMATIONS_ENABLED, по умолчанию включён) каждые 5 секунд берёт необработанные строки старше 5 секунд (проект по шаблону успевает наполниться), подбирает включённые правила, проверяет условия и ставит запуски вautomation_runsс ключом от повторов (created,status:<статус>[:<строка истории>],date:<дата якоря>).FOR UPDATE SKIP LOCKEDпозволяет держать несколько копий API. - Правила по датам проверяются раз в день после 8:00 по часовому поясу компании с догоном двух пропущенных дней; новое или включённое правило проверяется в ближайший проход.
- Запуск выполняет действия по порядку; ошибка останавливает запуск (сделанное раньше остаётся в результате), автор правила (у начальных правил — тот, кто их включил) получает
automation.failedне чаще раза в день по правилу. Задача, для которой не нашлось исполнителя даже среди запасных (нет менеджера), — тоже ошибка запуска, а не тихий пропуск.
Правила «от монтажа» у проекта без даты монтажа считают от начала мероприятия — и при отборе проектов, и в сроке задачи. 5. Выполненный запуск пишет в историю проекта событие project.automation_executed («Автодействие «…» поставило задачу «…» (Петров)»), рассылает живые обновления задач и плана проекта. Задачи помечены automation_rule_id — «Создано автоматически»; в шаблон и копию проекта они не переносятся.
Настройка
/automations — CRUD (не указано is_active — правило создаётся выключенным), PATCH /automations/:id/active, POST /automations/:id/dry-run {project_id} и POST /automations/dry-run {project_id, rule} для несохранённого правила (что сделало бы правило, ничего не создавая; учитываются условия, для правил по датам — статус проекта и наличие даты), GET /automations/runs — журнал. Право — capability automations_manage: администратор и генеральный директор.
Начальный набор
Миграция кладёт пять выключенных правил: «Подтверждён: подписать договор», «Подтверждён: заказать транспорт» (за 7 дней до монтажа), «За 3 дня до монтажа: проверить оборудование», «После мероприятия: фотоотчёт и документы», «Проигран: сообщить руководителю продаж». Стартовая задача менеджеру при создании проекта пока остаётся прежней (настройка APP_AUTO_CREATE_PROJECT_KICKOFF_TASK); перенести её в правило «Проект создан» можно, выключив флаг.