Разработка системы управления задачами (Task Management)
Task Management — более узкий класс систем, чем Project Management. Фокус — не на планировании и диаграммах Ганта, а на потоке задач: создание, назначение, выполнение, контроль. Типичные сценарии заказной разработки: операционные команды с нестандартным воркфлоу, системы обработки заявок внутри компании, трекеры для производственных процессов, где задача привязана к физическому объекту (оборудование, договор, клиент).
Доменная модель
Минимально жизнеспособная модель задачи шире, чем кажется:
CREATE TABLE tasks (
id BIGSERIAL PRIMARY KEY,
title VARCHAR(500) NOT NULL,
description TEXT,
status VARCHAR(50) NOT NULL DEFAULT 'todo',
priority SMALLINT NOT NULL DEFAULT 2, -- 1=low, 2=medium, 3=high, 4=critical
assignee_id BIGINT REFERENCES users(id),
reporter_id BIGINT NOT NULL REFERENCES users(id),
team_id BIGINT REFERENCES teams(id),
due_date DATE,
completed_at TIMESTAMPTZ,
parent_id BIGINT REFERENCES tasks(id),
position INTEGER, -- порядок в списке/колонке
metadata JSONB DEFAULT '{}', -- кастомные поля
created_at TIMESTAMPTZ DEFAULT now()
);
Поле metadata (JSONB) решает проблему кастомных полей без изменения схемы. Разные типы задач имеют разные наборы полей: задача для отдела маркетинга содержит campaign_id и channel, задача для HR — position_id и candidate_name. Индексируем нужные поля через CREATE INDEX ON tasks ((metadata->>'campaign_id')).
Воркфлоу и статусы
Ключевое отличие заказной системы от Trello — настраиваемый воркфлоу с правилами переходов. Не просто перетащить карточку в любую колонку, а строгая state machine с guards:
- Задачу можно перевести в «На проверке» только если есть исполнитель
- «Закрыто» требует заполненного поля «Результат»
- Переход в «Отменено» доступен только менеджеру или автору
// XState конфигурация воркфлоу
const taskMachine = createMachine({
id: 'task',
initial: 'todo',
states: {
todo: { on: { START: 'in_progress', CANCEL: 'cancelled' } },
in_progress: { on: { REVIEW: 'in_review', BLOCK: 'blocked' } },
blocked: { on: { UNBLOCK: 'in_progress' } },
in_review: { on: { APPROVE: 'done', REJECT: 'in_progress' } },
done: { on: { REOPEN: 'todo' } },
cancelled: { type: 'final' },
},
});
Конфигурация воркфлоу хранится в базе данных — JSON-поле в таблице workflows. Администратор редактирует через визуальный редактор: добавляет статусы, задаёт переходы, назначает guards.
Представления: список, Kanban, таблица
Список задач — основное представление. Требования к производительности: виртуализированный скролл (TanStack Virtual) при > 100 задач, группировка по любому полю (исполнитель, статус, приоритет, тег), сортировка мультиполем.
Kanban: колонки = статусы текущего воркфлоу. Drag-and-drop через @dnd-kit/sortable. При перетаскивании между колонками — проверка разрешённого перехода на клиенте (до отправки запроса), чтобы пользователь сразу видел ошибку.
Таблица (spreadsheet-вид): каждая задача — строка, поля — колонки. Редактирование inline. Массовые операции: выбрать 20 задач, назначить исполнителя, изменить дедлайн. Реализуется через TanStack Table с поддержкой row selection и кастомных cell editors.
Массовые операции и автоматизация
Массовые операции — часто упускаемый функционал:
- Переназначение группы задач на другого исполнителя
- Массовое закрытие по фильтру (все задачи старше 30 дней в статусе «Отложено»)
- Копирование/перемещение задач между проектами или командами
Автоматизация (trigerred rules): «Если задача не взята в работу через 2 часа после назначения — напомнить исполнителю и уведомить менеджера». Реализация через scheduled jobs (Laravel Scheduler / cron), которые опрашивают задачи по условиям и выполняют действия. Правила автоматизации хранятся в БД, редактируются через UI — условие (trigger) + действие (action).
Уведомления и SLA-контроль
Для операционных систем критичен контроль SLA: задача должна быть взята в работу не позже чем через N часов от создания. Реализация:
// Larvel Job, запускается через очередь с delay
class CheckTaskSlaJob implements ShouldQueue
{
public function handle(): void
{
$overdueTask = Task::query()
->where('status', 'todo')
->where('created_at', '<', now()->subHours($this->slaHours))
->whereNull('assignee_id')
->get();
foreach ($overdueTask as $task) {
Notification::send($task->team->managers, new SlaBreachedNotification($task));
}
}
}
Эскалационная матрица: просрочка 1ч → email исполнителю, 4ч → email + Slack менеджеру, 8ч → уведомление руководителю отдела.
Сроки
- Проектирование воркфлоу и данных — 1–2 нед.
- Бэкенд (задачи, права, API) — 3–4 нед.
- Фронтенд (список + Kanban + таблица) — 3–4 нед.
- Уведомления, SLA, автоматизация — 2 нед.
- Тестирование и запуск — 1 нед.
Итого: 10–13 недель. Первая рабочая версия с базовым воркфлоу и двумя представлениями — через 6–7 недель.







