Рабочие процессы¶
Шаблоны ¶
Информация о шаблоне¶
Шаблоны служат для определения последовательности шагов рабочего процесса. Из пользовательского интерфейса может быть инициировано создание рабочего процесса по шаблону с указанием даты начала (если не указано, будет использоваться текущая дата). От указанной даты на основании заданной последовательности и продолжительности отдельных шагов (элементов шаблона) выстраивается последовательность и вложенность задач, определяются плановые даты начала и окончания для каждой задачи.
| Поле | Имя | Описание | Обязательное |
|---|---|---|---|
| key | Ключ | Уникальный технический ключ для разработчика (не рекомендуется изменять после определения) | Да |
| name | Имя | Краткое название для пользователей (можно изменять после определения) | Да |
| description | Краткое описание | Краткое описание шаблона | |
| summary | Шаблон | Шаблон, по которому будет создаваться "корневая задача" | |
| created_by | Создано пользователем | Пользователь, создавший шаблон | Авто |
| created_at | Создан | Дата и время создания шаблона | Авто |
Задачи шаблона ¶
Элементы шаблона, по которым будут создаваться задачи при создании рабочего процесса. Задают последовательность, продолжительность и другую специфику задач рабочего процесса.
Для каждой задачи в шаблоне могут быть определены свои подзадачи (см поле "Редактировать: Подзадачи")
| Поле | Имя | Описание | Обязательное |
|---|---|---|---|
| prev | Следует за | Задача (элемент шаблона), за которой следует описываемая задача | |
| is_blocked_by_prev | Блокируется предыдущей задачей | Да (по умолчанию): Задача не может стартовать пока не закрыта предыдущая задачаНет: Задача может стартовать (по таймеру или в ручном режиме) не дожидаясь закрытия предыдущей | |
| summary | Описание | Шаблон для описания задачи, может использовать конструкции вида "ключ иерархии в фигурных скобках" ({region.shortname}, {region.description}, {macroregion.shortname} и т.д.) | Да |
| duration_days | Длительность (дн) | Длительность задачи в днях. Запланированная дата закрытия задачи и дата начала следующей задачи рассчитывается от даты начала прибавлением длительности. Если длительность не указана, дата окончания будет совпадать с датой начала. | |
| owners_groups | Владельцы (группы) | Список групп, которые будут иметь полные права на задачу (смогут открывать, закрывать и перезапускать задачу, менять описание, дату начала, окончания, длительность, ответственных и т.д.). Владельцы получают уведомления согласно подписке. Если использованы группы, являющиеся шаблонами (название содержит ключи уровней иерархии в фигурных скобках), то вместо задачи будет создаваться несколько задач - по задаче для каждого элемента иерархии из выбранного уровня (подробнее см в разделе шаблоны групп). | |
| assignees_groups | Исполнители (группы) | Список групп, которые будут назначены исполнителями (смогут закрывать задачу). Могут быть использованы группы, являющиеся шаблонами. | |
| auto_resolve_ on_due_date |
Закрывать автоматически по дате | Да: при наступлении даты окончания задача закроется автоматическиНет (по умолчанию): при наступлении даты окончания задача получит пометку "Просрочено" | |
| auto_resolve_ on_subtasks_resolution |
Закрывать автоматически при закрытии подзадач | Да (по умолчанию): при закрытии всех подзадач задача закроется автоматически Нет: после закрытия всех подзадач потребуется вручную закрыть задачу. |
Обратите внимание: "Владельцами" и "исполнителями" будут назначаться именно группы, а не пользователи, принадлежащие к этим группам
Подписки ¶
В контексте задач "подпиской" называется механизм для рассылки уведомлений на то или иное действие над задачей.
| Поле | Имя | Описание | Обязательное |
|---|---|---|---|
| action | Действие | Действие над задачей, к которому будет привязана рассылка | |
| notify_assignees | Уведомить исполнителей | Уведомлять всех пользователей, относящихся к группам, которые указаны в Исполнители (группы) | |
| notify_owners | Уведомить владельцев | Уведомить всех пользователь, относящихся к группам, которые указаны в Влалельцы группы | |
| subject_template | Шаблон темы письма | Django-шаблон темы письма. Допускается использование контекста вида {{obj.id}}, {{obj.summary}}, {{obj.get_status.label}}, где obj - задача | |
| html_message_template | Шаблон тела письма | Django-шаблон тела письма. Допускается использование контекста вида {{obj.id}}, {{obj.summary}}, {{obj.get_status.label}}, где obj - задача |
Сценарии ¶
Сценарий, который будет автоматически запускаться на то или иное действие над задачей.
| Поле | Имя | Описание | Обязательное |
|---|---|---|---|
| action | Действие | Действие над задачей, к которому будет привязан запуск скрипта | Да |
| script | Сценарий | Сценарий, который будет выполняться при совершении действия | Да |
| variant | Вариант | Вариант, с которым будет выполняться сценарий | |
| order | Поррядок | Порядок, в котором будут выполняться сценарии (если важен) |
Шаблоны (элементы) ¶
Элементы шаблона - отдельные шаги бизнес-процесса.
Этот раздел панели администратора носит технический характер, работу с шаблонами рекомендуется осуществлять через раздел Шаблоны
Создание рабочего процесс по шаблону¶
Может быть инициировано из пользовательского интерфейса с указанием названия (если не указано, будет использоваться название из шаблона) и даты (если не указано, будет использоваться "сегодняшняя дата") Для каждого элемента шаблона будут созданы соответствующие задачи (для элемента шаблона, где владельцы или исполнители - шаблоны групп, будет создано несколько задач). "Дата начала" и "дата окончания" для каждой задачи будет определяться автоматически по дате окончания предыдущей задачи и продолжительности текущей задачи, указанной в элементе шаблона.
Важно: Длительность и даты задач считаются в рабочих днях согласно календарю рабочих дней, если он настроен. Если календарь не указан — используются обычные календарные дни.
⚠️ КРИТИЧЕСКАЯ ОШИБКА: Если в системных настройках указан ключ меры для календаря рабочих дней, но сама мера отсутствует, то при создании рабочего процесса возникнет ошибка FAILURE в TaskResult. Перед созданием рабочих процессов необходимо либо: - Удалить системную переменную календаря рабочих дней (если календарь не нужен) - Запустить сценарий
fill_working_daysдля создания и заполнения календаря рабочих дней
Движение по рабочему процессу¶
Задачи рабочего процесса могут активироваться автоматически при наступлении "даты начала" или вручную владельцем задачи (если не заблокированы предыдущей задачей).
Задачи рабочего процесса могут закрываться автоматически при наступлении "даты окончания" или вручную владельцем задачи.
При закрытии задачи следующая задача не активируется автоматически, а лишь "разблокируется" для активации, если она была заблокирована.
"Даты начала" и "окончания задачи" могут быть изменены владельцем задачи.
Ручная активация, закрытие и переоткрытие задачи никак не влияют на дату начала и дату окончания задачи (это "плановые даты"), эти даты фиксируются в отдельных полях.
Задачи ¶
Задача может быть создана по шаблону рабочего процесса или вручную пользователем.
При создании по шаблону большая часть полей задачи наследуется от соответствующего элемента. Владелец может изменять эти поля.
Динамические поля, такие как "Дата начала" и "Дата окончания" определяются автоматически от контекста и запланированной продолжительности задачи.
| Поле | Имя | Описание | Обязательное |
|---|---|---|---|
| parent | Родительская задача | Родительская задача (если задача является подзадачей) | |
| prev | Предыдущая задача | Предыдущая задача | |
| is_blocked_by_prev | Блокируется предыдущей задачей | Да (по умолчанию): Задача не может стартовать пока не закрыта предыдущая задачаНет: Задача может стартовать (по таймеру или в ручном режиме) не дожидаясь закрытия предыдущей | |
| summary | Описание | Краткое описание (макс длина 200 символов) | Да |
| description | Краткое описание | Развёрнутое описание (комментарий к описанию без ограничений на длину) | |
| start_date | Дата начала | Запланированная дата активации задачи (не меняется при досрочной активации, может быть изменена владельцем) | |
| duration | Длительность (дн) | Запланированная продолжительность задачи (при создании по шаблону используется длительность из шаблона, при изменении "Даты начала" или "Даты окончания" динамически пересчитывается | Авто |
| end_date | Дата окончания | Запланированная дата закрытия задачи (не меняется при досрочном закрытии, может быть изменена владельцем) | |
| Статус | Статус задачи | Авто | |
| Подзадачи | Ссылка на подзадачи (задачи, для которых задача является "родительской"). Выводится в виде "{кол-во закрытых}/{общ. кол-во}" | Авто | |
| assignees_groups | Исполнители (группы) | Группы, назначенные исполнителями задачи (пользователи из этих групп могут закрывать задачу) | |
| assignees_users | Исполнители пользователи | Отдельные пользователи, назначенные исполнителями | |
| owners_groups | Исполнители (группы) | Группы, назначенные владельцами задачи (могут выполнять любые действия над заадачей) | |
| owners_users | Исполнители (пользователи) | Отдельные пользователи, назначенные владельцами | |
| auto_resolve_ on_due_date |
Закрывать автоматически по дате | Наследуется из элемента шаблона, может быть изменено владельцем | |
| auto_resolve_ on_subtasks_resolution |
Закрывать автоматически при закрытии подзадач | Наследуется из элемента шаблона, может быть изменено владельцем | |
| Открыто | Дата и время, когда задача была фактически открыта | Авто | |
| Открыл | Пользователь, который инициировал открытие задачи (batch_user для автоматического открытия) | Авто | |
| Подписки | Подписки, привязанные к задаче. Подробнее см раздел подписки шаблона рабочего процесса. Владелец может редактировать список. | ||
| Сценарии | Сценарии, привязанные к задаче. Подробнее см раздел сценарии шаблона рабочего процесса. Владелец может редактировать список. |
Статус задачи ¶
В ходе жизненного цикла задача проходит через несколько состояний, каждому из которых соответствует свой "статус".
Также у задачи есть отдельные флаги "Закрыто" и "Просрочено", который упрощает фильтрацию.
| Статус | Комментарий |
|---|---|
| Ожидает | Задача ещё не активирована |
| Обрабатывается | Задача активирована, но ещё не закрыта |
| Закрыто | Задача закрыта |
Комментарий для разработчика: см
planiqum.core.workflow.models.Issue.STATESиplaniqum.core.workflow.models.Issue.get_status
Просроченные задачи ¶
"Просрочено" не является статусом задачи это лишь "флаг", который показывает, что запланированная "Дата окончания" уже наступила, а задача ещё не была закрыта. Задача в любом статусе может иметь флаг "Просрочено":
- Ожидает, обрабатывается: задача ещё не завершена, но "Дата окончания" уже прошла
- Закрыто: задача была закрыта уже после "Даты окончания"
Действия над задачей ¶
Для задачи определены действия, выполнение которых переводит задачу из одного статуса в другой.
| Ключ | Название | Описание |
|---|---|---|
| ACTIVATE | Активация | Активация задачи. Может инициироваться пользователем или происходить автоматически при наступлении "Даты начала". |
| CLOSE | Закрытие | Закрытие задачи. Может инициироваться пользователем или происходить автоматически при наступлении "Даты окончания" (если установлен флаг Закрывать автоматически по дате) или закрытии всех подзадач (если установлен флаг Закрывать автоматически при закрытии подзадач. |
| DEACTIVATE | Деактивация | Возвращение задачи в неактивный режим. Может инициироваться пользователем. |
| REOPEN | Переоткрытие | Повторное открытие задачи. Может инициироваться пользователем. |
| OVERDUE | Превышение срока | Переход задачи в соответствующий статус. Происходит автоматически при превышении "Даты окончания". |
Сценарии ¶
В системе используется один объединённый сценарий, который автоматически выполняется каждую минуту (см. документацию для разработчика). Этот сценарий последовательно выполняет три шага:
- Создание рабочих процессов по расписанию — автоматически создаёт новые процессы по шаблонам, если наступила дата их запуска.
- Активация задач по дате начала — активирует задачи, у которых наступила дата начала, если они не заблокированы предыдущими задачами.
- Закрытие задач по дате окончания — закрывает задачи, у которых наступила дата окончания, либо помечает их как просроченные, если не установлен флаг автозакрытия.
Важно: Если при создании задачи указана дата начала, которая уже в прошлом, такая задача будет активирована автоматически сразу в процессе создания, без ожидания запуска сценария.
Техническая реализация: см. задачу
workflow_maintenance_taskв файлеsrc/planiqum/core/workflow/scripts/workflow_maintenance.pyи расписание вsrc/planiqum/core/celery.py.
Рабочие процессы: инструкция для администратора¶
Настройка шаблонов рабочих процессов¶
- Для сложных процессов используйте вложенность (parent) и последовательность (prev) задач.
- Для параллельных веток не связывайте задачи через prev — они будут выполняться одновременно.
- Длительность родительской задачи рассчитывается автоматически по критическому пути (максимум по веткам).
- При изменении длительности подзадачи пересчёт происходит автоматически.
Пример шаблона:
| Ключ | Имя | prev | parent | Длительность (дн) |
|---|---|---|---|---|
| root | Корень | |||
| a | Задача A | root | 2 | |
| b | Задача B | root | 3 | |
| b1 | Задача B1 | b | 5 | |
| c | Задача C | root | 1 |
- В этом примере root = max(a, b, c), b = b1.
- Если у задачи есть prev, она начнётся только после завершения предыдущей.
- Если у задачи есть parent, она будет подзадачей родителя.
Проверка структуры и отладка¶
- После создания шаблона проверьте структуру через визуализацию или таблицу.
- Для сложных процессов используйте тесты (см. документацию разработчика).
- При изменении длительности или добавлении подзадач убедитесь, что пересчёт происходит автоматически.
Типовые ошибки и их решение¶
- Если длительность не пересчитывается — проверьте корректность структуры шаблона (parent/prev).
- Если задачи не отображаются — проверьте права доступа и фильтры.
- Для сложных сценариев используйте smoke-тесты (см. документацию разработчика).
Рекомендации¶
- Используйте осмысленные ключи и имена для задач.
- Для типовых процессов создавайте шаблоны с примерами вложенности и последовательности.
- Проверяйте структуру шаблона перед запуском процессов.
Расчёт продолжительности (duration_days)¶
- Для расчёта продолжительности задачи (
duration_days) используется функцияcalculate_duration(start_date, due_date)изplaniqum.core.workflow.utils, которая учитывает рабочие дни, если они настроены в системе. - При изменении даты окончания (
due_date) или даты начала (start_date) у задачи, значениеduration_daysпересчитывается автоматически. - Если новая продолжительность задачи становится больше, чем у других подзадач одного родителя, это значение "всплывает" вверх по иерархии и становится определяющим для родителя и далее до корня.
- Если у родителя есть несколько подзадач, то в качестве
duration_daysродителя берётся максимальное значение из всех дочерних задач. - Если календарь рабочих дней не настроен — используется обычный календарь.
Расчёт даты окончания (due_date)¶
- Для расчёта даты окончания задачи (
due_date) используется функцияcalculate_due_date(start_date, duration_days)изplaniqum.core.workflow.utils, которая учитывает рабочие дни, если они настроены в системе. - Нельзя просто прибавлять
timedeltaк дате начала — используйте только функциюcalculate_due_date, чтобы корректно учитывать рабочие и выходные дни. - При изменении продолжительности (
duration_days) или даты начала (start_date) у задачи, значениеdue_dateпересчитывается автоматически с помощью этой функции. - Если календарь рабочих дней не настроен — используется обычный календарь.
Подробнее см. Календарь рабочих дней
Автоматическое создание рабочих процессов по расписанию¶
В системе Planiqum можно настроить автоматическое создание рабочих процессов по расписанию для любого шаблона. Для этого используется модель Расписание рабочего процесса (WorkflowSchedule), которая настраивается через панель администратора.
Сценарии использования¶
- Ежедневное создание процессов (например, запуск процесса каждый день)
- Еженедельное создание процессов (например, запуск процесса каждую неделю)
- Ежемесячное создание процессов (например, запуск процесса 1-го числа каждого месяца)
- Создание процессов заранее (например, создать процесс за 3 дня до даты начала)
- Ограничение по датам (например, создавать процессы только в течение определённого периода)
Как настроить расписание в панели администратора¶
- Перейдите в раздел Рабочие процессы > Расписания рабочих процессов.
- Нажмите Добавить расписание.
- Заполните поля:
- Шаблон — выберите шаблон рабочего процесса, для которого будет действовать расписание.
- Активно — отметьте, если расписание должно быть активно (иначе процессы создаваться не будут).
- Дата начала — укажите дату первого запуска (например, 2024-01-01).
- Дата окончания — (опционально) укажите дату, после которой процессы создаваться не будут.
- Периодичность — выберите, как часто создавать процесс:
- ежедневно
- еженедельно
- ежемесячно
- ежегодно
- Интервал — укажите интервал между запусками (например, 2 для «каждые 2 недели»).
- Создать за N дней до начала — (опционально) если нужно создать процесс заранее (например, за 3 дня до даты начала).
- Шаблон — (опционально) переопределяет шаблон описания процесса.
Пример 1: Ежедневное создание процесса¶
- Шаблон: «Согласование бюджета»
- Активно: Да
- Дата начала: 2024-01-01
- Периодичность: ежедневно
- Интервал: 1
Пример 2: Еженедельное создание процесса¶
- Шаблон: «Планирование продаж»
- Активно: Да
- Дата начала: 2024-01-01
- Периодичность: еженедельно
- Интервал: 1
Пример 3: Создание процесса за 3 дня до даты начала¶
- Шаблон: «Запуск рекламной кампании»
- Активно: Да
- Дата начала: 2024-02-01
- Периодичность: ежемесячно
- Интервал: 1
- Создать за N дней до начала: 3
Описание всех полей расписания¶
| Поле | Описание |
|---|---|
| Шаблон | Шаблон рабочего процесса, для которого действует расписание |
| Активно | Если не отмечено — процессы по этому расписанию не создаются |
| Дата начала | Дата первого запуска процесса |
| Дата окончания | (опционально) Дата, после которой процессы не создаются |
| Периодичность | Как часто создавать процесс (ежедневно, еженедельно, ежемесячно, ежегодно) |
| Интервал | Интервал между запусками (например, 2 — каждые 2 недели) |
| Создать за N дней до начала | (опционально) За сколько дней до даты начала создать процесс |
| Шаблон | (опционально) Переопределяет шаблон описания процесса |
Важные детали¶
- Можно создать несколько расписаний для одного шаблона.
- Если расписание не активно — процессы не будут создаваться.
- Все созданные процессы получают ссылку на объект расписания (видно в деталях процесса).
- Время суток для запуска процесса не задаётся — процессы создаются при срабатывании периодической задачи (обычно раз в минуту).
- Если требуется сложная логика — обратитесь к разработчику.
Подробнее о технологии¶
Для технических деталей, примеров кода и тестов см. документацию для разработчика.