Перейти к содержанию

Проектное управление: бизнес-логика

1. Концепция проектного управления

В 1Форма проект -- это задача в категории с включённым флагом IsForProjects. Задачи проекта создаются в специальной подкатегории планирования и визуализируются на диаграмме Ганта (Bryntum Gantt).

Базовые термины

Термин Определение
Проект Иерархия проектных задач, визуализируемая Гантом, с поддержкой связей по срокам
Проектная задача Задача в проектной категории, поддерживающая особенности проектного интерфейса (связи, ресурсы)
Непроектная задача Задача в иерархии проекта, но не в проектной категории — не получает все возможности проектного UI
Подпроект (групповая задача) Проект внутри главного проекта; ведёт себя как обычная проектная задача, пока нет дочерних — затем становится групповой
Веха Задача нулевой длительности (дата начала = дата окончания). Знаменует важное состояние проекта
Декомпозиция Иерархия проектных задач (дерево). Один проект может иметь несколько декомпозиций (по работам, целям, мероприятиям). Задачи разных декомпозиций связываются между собой
Ресурс проекта Кадровый потенциал, бюджет, материально-техническая база. В 1Форме — исполнители-пользователи
Критический путь Последовательность задач, определяющая дату начала или окончания проекта
Критическая задача Задача, которую нужно завершить по плану, иначе сдвинется завершение проекта. Последовательность критических задач = критический путь
Временная категория Категория для проектных задач на этапе планирования. Обычно — «Проектные задачи» в системном разделе. При запуске проекта в реализацию задачи переносятся в проектные категории

Стадии работы с проектом

Работа разделена на две стадии:

Стадия Что происходит
Планирование Все проектные задачи создаются во временной категории; доступны только подготовительной группе. Операции: декомпозиция работ, назначение исполнителей, плановые трудозатраты, связи между задачами. Маршруты/проверки/смарт-автоматизации обычно во временной категории не настраиваются
Реализация Задачи переносятся из временной категории в назначенные им проектные категории с настроенными маршрутами, проверками, автоматизациями

Сохранение изменений в Ганте

Не считаются изменением данных и не активируют кнопку сохранения:

  • Изменение масштаба временной шкалы.
  • Настройка состава и порядка колонок.
  • Перемещение разделителя между таблицей и диаграммой.
  • Скрытие части таблицы или диаграммы.
  • Переключение между проектами.
  • Раскрытие и скрытие ветвей.
  • Фоновые обновления данных, не инициированные пользователем.

Признак несохранённых изменений включается только при фактическом изменении данных: перемещение задач, изменение сроков, зависимостей или настроек проекта.

Два контекста использования Ганта

Контекст Компонент Откуда данные Сценарий
Проект (manage panel) GanttComponent GET /api/Gantt?projectId= ⚠️ закомментирован в контроллере Полное управление проектом: редактирование, сохранение, базовые планы, запуск в реализацию
Подкатегория SubcategoryGanttComponent getGanttSubcategoryData({ subcategoryId }) Просмотр задач подкатегории на Ганте с inline-редактированием

2. Типы планирования

Enum ProjectPlanningTypes:

Значение Код Поведение
Auto 0 Bryntum автоматически каскадирует даты при изменении зависимостей
Manual 1 Даты задач устанавливаются вручную, зависимости только визуальные

Тип планирования выбирается в toolbar Ганта проекта через комбобокс.

3. Зависимости задач

Зависимости хранятся в таблице Task2TaskLink.

Типы зависимостей

Тип Код Описание
FinishToStart 2 Стандартная: задача B начинается после завершения A
StartToStart 0 Обе задачи начинаются одновременно
FinishToFinish 3 Обе задачи завершаются одновременно
StartToFinish 1 Задача B завершается при начале A

Каждая зависимость может иметь lag (задержка в днях, может быть отрицательной).

4. Базовые планы (Baselines)

Базовый план -- снимок текущих дат задач проекта на определённый момент. Используется для сравнения "план vs факт".

Жизненный цикл

  1. Пользователь нажимает "Создать базовый план" в toolbar
  2. Вводит название плана в модалке GanttBasePlanModalComponent
  3. Frontend собирает текущие даты всех задач из Bryntum и отправляет их в теле запроса POST /api/gantt/add-base-plan ({ projectId, name, tasks: [{taskId, start, end}] })
  4. Backend создаёт запись ProjectBasePlan и сохраняет снимки дат в ProjectBasePlanTask
  5. В toolbar обновляется combobox "Базовый план"
  6. При выборе baseline — toggleBasePlan() сохраняет basePlanId в настройках и перезагружает проект; выбранный baseline отображается Bryntum в виде дополнительных полос рядом с фактическими барами

Таблицы

  • ProjectBasePlan -- метаданные плана: Id, ProjectId, Name, Date (datetime)
  • ProjectBasePlanTask -- снимок дат: ProjectBasePlanId, TaskId, Start, End (составной PK)

5. Запуск в реализацию

Механизм перевода запланированных задач из подкатегории планирования в реальные подкатегории.

Процесс

  1. Пользователь нажимает "Запуск в реализацию" в toolbar
  2. Backend (GanttService.MoveProjectTasks):
  3. Получает список задач из планирования
  4. Перемещает задачи в целевую подкатегорию реализации
  5. Вызывает ProjectDal.UpdatePlan
  6. Задачи становятся доступны в обычных гридах категории

Ключевая сущность

ProjectTasksPlanningSubcat -- связь проекта с подкатегорией планирования. Поле ProjectTasksSubcatId определяет, где живут задачи проекта до запуска в реализацию.

6. Ресурсное планирование

Для задач проекта ведётся учёт ресурсов: план и факт трудозатрат.

  • TaskResourcePlanService -- сервис для получения плановых и фактических записей
  • GanttTaskPlanEntryDto -- плановая запись (исполнитель, часы)
  • GanttTaskFactEntryDto -- фактическая запись

В Bryntum данные ресурсов отображаются через resources и assignments в IGanttProjectData.

7. Производственный календарь

Bryntum интегрирован с производственным календарём 1Форма:

  • CalendarService загружает нерабочие дни (праздники) за диапазон ±5 лет
  • Нерабочие дни добавляются в calendarManagerStore Bryntum
  • Фича nonWorkingTime визуально выделяет нерабочие дни на timeline
  • При автоматическом планировании нерабочие дни учитываются в расчёте длительности

8. Toolbar проекта

Toolbar Ганта проекта содержит:

Элемент Назначение
Критический путь (toggle) Подсветка задач на критическом пути
Завершённые (toggle) Показать/скрыть закрытые задачи
Тип планирования (combo) Auto / Manual
Базовый план (combo) Выбор baseline для сравнения
Zoom +/- Масштабирование timeline
Запуск в реализацию Перенос задач из планирования
Сохранить Сохранение всех изменений

9. Визуальная стилизация задач

CSS-классы применяются к барам задач в зависимости от состояния:

Класс Условие
is-performing Задача в работе
is-rejected Задача отклонена
is-closed Задача закрыта
is-overdue Просрочена (endDate < now и не закрыта)
is-new Новая задача
is-project Задача-проект (суммарная)
is-planned Запланированная задача

10. Inline-редактирование (гант подкатегории)

SubcategoryGanttComponent поддерживает редактирование прямо в Ганте:

Поле Механизм Условие
Исполнители Combo с поиском по API Право редактирования
Состояние (шаг) Combo со списком доступных шагов Прямое выполнение шага из Ганта
Название Текстовый редактор canChangeTaskText и задача не закрыта
Даты Drag & resize баров Стандартное поведение Bryntum
Процент выполнения Drag внутри бара Стандартное поведение Bryntum

Представление категории «Гант»

Слева — табличная часть со списком задач (дата начала, срок), справа — диаграмма Ганта. Текущая дата отображается красной чертой. Просроченные задачи в табличной части — красным шрифтом; приоритет обозначается так же, как в табличном представлении категории.

В категорийном Ганте (в отличие от проектного) флаги начала и окончания проекта не отображаются — это непроектный сценарий.

Связи между задачами: четыре типа — Конец-начало, Начало-начало, Конец-конец, Начало-конец. При наведении на связь показывается тип; при удалении пересчёт зависимостей выполняется по оставшимся связям.

Колонки трудозатрат

В табличной части доступны 4 дополнительные колонки:

Колонка Что показывает
Сумм. план ресурсов (ч.) Плановые трудозатраты по самой задаче
Сумм. факт ресурсов (ч.) Фактические трудозатраты по самой задаче
Всего план ресурсов (ч.) Суммарные плановые с учётом вложенных задач
Всего факт ресурсов (ч.) Суммарные фактические с учётом вложенных задач

Значения отображаются с двумя знаками после запятой (форматируется на стороне UI). Для родительских задач «Всего…» считается по дочерним элементам в текущем дереве; если показ закрытых задач выключен — их трудозатраты не учитываются.

Цвет задач

В меню панели инструментов — пункт «Отобразить цвет задач» (по умолчанию выключен). При включении полосы окрашиваются в цвет аватара задачи, как в проектном Ганте. Выбор сохраняется индивидуально для пользователя в каждой категории.

Экспорт

  • Excel — экспорт видимых данных через библиотеку write-excel-file.
  • PDF — формирует документ с структурой таблицы и временной шкалой; доступен также из вкладки «Подзадачи» в карточке задачи (МТФ). Требует настройки сервиса экспорта (см. раздел 13, тулбар проектного Ганта).

Гант подзадач (из карточки задачи)

Открывается из меню тулбара задачи: «Подзадачи» → «Диаграмма Ганта». Если категория проектная — кнопка Проект ведёт в проектный Гант; для непроектных категорий открывается Гант подзадач — отдельный режим визуализации только подчинённых и связанных задач.

Слева — табличная часть, справа — диаграмма Ганта. По умолчанию отображаются только активные задачи; опция «Показывать завершённые» открывает терминальные.

Колонки

Основные колонки (по умолчанию): Наименование задачи, Начало, Конец, Статус, Исполнитель, % завершения. Дополнительные: Номер строки, СДР, Длительность, Календарных дней, Сумм. план/факт ресурсов (с подзадачами), Всего план/факт ресурсов (без подзадач).

Колонка Особенности
Начало Если у задачи нет даты начала — подставляется дата создания
Конец При отсутствии срока для завершённой задачи показывается дата завершения. Изменение пересчитывает Длительность и Календарные дни
Статус В режиме редактирования показывает доступные переходы маршрута. Рядом — цветная точка статуса (загружается из кэша)
% завершения Круговая диаграмма. Для конечных подзадач: 100% при завершении / пусто при незавершённости. Для родительских — авторасчёт по статусу дочерних
Сумм. план/факт ресурсов Накопительный итог по задаче и всем её подзадачам
Всего план/факт ресурсов Только сама задача, без учёта подзадач

Двойной клик по ячейке открывает её в режиме редактирования (при наличии прав). Кнопка «Создать» добавляет новую подзадачу.

Drag-and-drop

Управлять можно как из табличной части, так и с диаграммы: - Перетаскивание строк меняет порядок и иерархию (вложенность). - Растягивание полосы на таймлайне меняет сроки.

Контекстное меню задачи

Действие Описание
Открыть задачу В модальном окне
Создать задачу Строкой выше / ниже
Создать подзадачу Строкой выше / ниже от текущей
Изменить вложенность Сделать подзадачей выбранной / Поднять над задачей (сделать родительской)
Изменить порядок В начало / выше на строку / ниже / в конец

Контекстное меню колонки

«Колонки» (управление составом отображаемых столбцов), «Спрятать колонку» (временное скрытие — для «Наименование задачи» недоступно).

Опция «Отобразить цвет задач»

Меню тулбара → «Отобразить цвет задач» (по умолчанию выключена). При включении полосы задач окрашиваются в цвет аватара задачи — как в проектном Ганте. Выбор сохраняется per-пользователь и per-категория.

Для задач, созданных до 2.267, цвет статуса может не отображаться (поле цвета было пустым). Для получения актуальных цветов нужно нажать «Импортировать» в тулбаре.

Сохранение персональных настроек

Гант подзадач запоминает (per-пользователь): - видимость, порядок и ширину колонок; - состояние фильтра «Показывать завершённые»; - положение разделителя между таблицей и диаграммой.

Экспорт Excel и PDF

  • Excel — кнопка «Экспорт в xlsx»: выгружает текущее отображение со стилем и шириной колонок.
  • PDF — кнопка «Экспорт в PDF»: открывается диалог выбора колонок, ориентации страницы и других параметров. Требует настройки сервиса PDF Export.

После завершения PDF открывается в новой вкладке или скачивается (зависит от настроек браузера).

11. Версионирование изменений (v2.268+)

Задачи:

Начиная с v2.268, Гант проекта автоматически сохраняет версии изменений (Bryntum versions feature).

Механизм

  1. При первом изменении данных в текущей сессии создаётся версия с именем "Сессия {дд.MM.гггг ЧЧ:мм}".
  2. Все последующие изменения в той же сессии привязываются к этой версии (versionId).
  3. Данные версий (versionsData) и changelog (changelogsData) сохраняются вместе с проектом и восстанавливаются при загрузке.
  4. UI: VersionGrid в панели проекта отображает историю изменений с возможностью просмотра и отката.

Изменения в поведении

  • Убран @HostListener('window:beforeunload') — автосохранение при изменениях, не при закрытии вкладки.
  • ngOnDestroy больше не вызывает save() — только очистка состояния UI.

12. Импорт данных из реальных задач (v2.268+)

Задачи: ,

Гант проекта поддерживает синхронизацию данных из реальных задач (запущенных в реализацию).

Синхронизация

Функция applyRealTaskDataToRecord(record, taskData) обновляет запись Ганта из данных реальной задачи: - Название (name) из description - Подкатегория (subcategory) — id и name - Даты (startDate, endDate) из taskStartTime/taskEndTime - Исполнители (performers) с аватарами - Состояние (taskState, taskClosed, isRejected)

Вызывается при привязке задачи из колонки Task1fColumn (выбор реальной задачи по ID) и при массовом импорте.

Отклонённые задачи = inactive (v2.268)

Утилита applyRejectedStateToGanttTask (project-gantt.utils.ts): - Если задача отклонена (isRejected = true): percentDone = 0, inactive = true - Если не отклонена: inactive = false

Применяется: 1. При привязке к реальной задаче (inline) 2. При маппинге данных проекта (mapProjectData) 3. При рекурсивном обходе дерева задач после маппинга (для листовых задач)

Визуальный эффект: inactive-задачи на Ганте отображаются серым цветом (стандартное поведение Bryntum) и не участвуют в расчёте критического пути.

13. Пользовательский интерфейс проектного управления

Вход в проектный интерфейс

Проектные задачи по умолчанию отображаются как обычные задачи. Чтобы перейти в проектный интерфейс, нажмите кнопку Проект в тулбаре навигации любой задачи, относящейся к проекту.

Если в категории настроен сквозной ДП, ссылающийся на ДП-таблицу проекта (ProjectReferenceTableExtParamId), в тулбаре карточки задачи появляется дополнительная кнопка Проектный Гант. Доступ определяется двухуровнево: сначала — права на задачу проекта, затем — на ДП-таблицу. При наличии прав только на ДП-таблицу Гант открывается в режиме просмотра (read-only) или редактирования в зависимости от уровня прав. Прямая ссылка: /spa/noframe/project-readonly/{ID}?new=2.

В режиме только для чтения недоступные для изменения поля отображаются заблокированными; пользователь может просматривать структуру, сроки и связи, но не сохранять изменения.

Структура интерфейса

Интерфейс состоит из двух областей: - Левая панель — табличный список задач с настраиваемыми колонками. - Правая панель — диаграмма Ганта с временной шкалой.

Ширину областей регулирует перетаскиваемый разделитель. При работе с проектом система запоминает порядок, видимость и ширину колонок, масштаб Ганта и положение разделителя.

Колонки табличной части

Основные колонки (отображаются по умолчанию):

Колонка Описание
Наименование задачи Название задачи. Нельзя скрыть
Дата начала Дата начала работ. При изменении автоматически сдвигается дата окончания
Дата окончания Планируемая дата завершения. При изменении пересчитывается длительность
Длительность Длительность в часах. При изменении пересчитывается дата окончания
Календарных дней Продолжительность в сутках (24 ч = 1 день). Только для чтения
% завершения Процент выполнения в виде круговой диаграммы. Завершённые задачи — 100%, отклонённые — принудительно 0%
Категория Категория проектных задач. Определяет список доступных исполнителей
# Задача Ссылка на связанную задачу в системе. При изменении номера данные из реальной задачи подтягиваются немедленно
Трудозатраты Объём работы в часах для выбранного ресурса
Назначенные ресурсы Ресурсы из справочника с указанием процента загрузки
Исполнители Первым — ответственный, затем остальные по алфавиту
Веха Признак вехи проекта
Ручное планирование При включении даты не обновляются автоматически при изменении проекта
Предшествующие Задачи-предшественники. Определяют связи на Ганте
Последующие Задачи-последователи. Определяют связи на Ганте

Дополнительные колонки (скрыты по умолчанию): Номер строки, СДР, Маркеры (в т.ч. признак «Задача просрочена»), Статус, Календарь, Дата ограничения, Тип ограничения, Крайний срок, Раннее начало/окончание, Позднее начало/окончание, Общий временной резерв, Примечание и др.

По правой кнопке мыши на заголовке колонки открывается контекстное меню: фильтрация (текст, дата, длительность), выбор видимых колонок, сортировка по возрастанию/убыванию, скрытие колонки.

Диаграмма Ганта

Начало полосы задачи — дата начала, конец — срок выполнения. Рабочие дни и часы отображаются белым, нерабочие (выходные, праздники) — серым по производственному календарю. Масштаб от часов до лет; настраивается кнопками на панели или колесом мыши.

При изменении сроков на Ганте (растягивание или перетаскивание полосы) данные в табличной части обновляются в реальном времени. Объединение задач в группу — перетаскиванием строк.

Подсказка при наведении на полосу: название, дата начала, дата окончания, длительность в днях, процент выполнения.

Цветовое обозначение: активные задачи — в цвете, завершённые — зелёные, отклонённые — серые. В таблице: активные — чёрный текст, завершённые и отклонённые — серый (отклонённые также зачёркнуты).

Панель инструментов

Действие Описание
Создать задачу Добавляет задачу ниже выбранной или в конец. Максимум 10 000 задач
Создать подзадачу Активно только при одной выбранной задаче
Отменить / Повторить Undo/Redo последнего действия
Повысить / Понизить уровень Изменяет иерархическую вложенность задачи
Отправить в реальные задачи Создаёт или обновляет связанные задачи в системе по данным плана
Импортировать Подтягивает данные из реальных задач в план (все или только проектные)
Критический путь Подсвечивает задачи с максимальным влиянием на итоговый срок проекта
Базовый план Управление базовыми планами (до 4 слотов)
Ресурсы Просмотр утилизации ресурсов по виртуальному плану
Масштаб +/− / Авто Масштабирование временной шкалы
Навигация ← → Переход к предыдущему/следующему интервалу на шкале
Поиск Поиск задачи в проекте по названию
Фильтр Скрыть завершённые или производственные задачи
Создать версию Создание новой версии проекта
Выбор версии Переключение между версиями из выпадающего списка
Настройки проекта Открывает окно параметров проекта
История изменений Просмотр истории правок с возможностью отката
Импорт .mpp Загрузка проекта из Microsoft Project (требует настройки сервиса ganttImportMppUrl)
Экспорт Экспорт табличной части в Excel или PDF (PDF требует настройки сервиса ganttExportPdfUrl)

Контекстное меню задачи

По правой кнопке мыши на задаче: Изменить, Копировать/Вырезать/Вставить, Фильтр, Добавить (задачу выше/ниже/веху/подзадачу/последующую/предшествующую задачу), Преобразовать в веху, Изменить уровень (повысить/понизить), Удалить, Цвет.

Базовые планы

До 4 слотов базовых планов (Базовый план 1–4). Базовый план фиксирует даты всех задач на момент создания, не меняя состав задач.

  • Установить базовый план — записывает текущие даты в выбранный слот.
  • Показать базовый план — включает отображение слота на Ганте рядом с текущими задачами (серым цветом, неактивно).
  • Показать сроки из задач — отображает даты связанных реальных задач для сравнения план/факт. Несовместимо с одновременным показом базовых планов.

Состояние планов сохраняется при операциях Импортировать и Отправить в реальные задачи.

Отличие от версии: базовый план сохраняет только даты при неизменном составе; версия сохраняет отдельный набор задач со своими базовыми планами.

Версии проекта

Версия — зафиксированное состояние проекта на определённый момент. Первая версия создаётся при создании проекта; дополнительные — кнопкой в тулбаре.

При создании новой версии доступны режимы: - Дублировать проект — копирует задачи из текущей открытой версии. - Новый проект — пустая версия, или с импортом только проектных задач, или с импортом всех задач (проектных и производственных).

Одна версия помечается как Основная; при активации флага у новой версии он автоматически снимается с предыдущей.

Настройки проекта

Параметр Описание
Имя / Автор Название и автор проекта
Дата начала / окончания Временные рамки. Дата окончания по умолчанию заполняется автоматически
Задачи не ранее начала проекта Сдвигает задачи так, чтобы ни одна не начиналась раньше даты начала
Ручной режим установки срока Разрешает изменять дату окончания вручную
Календарь Производственный (8 ч/день) или Полные дни и праздники (24 ч/сутки)
Основная версия Флаг основной версии (только одна активная)
Цвет задач Нет / Маркеры (ручной выбор из палитры) / Цвет задачи (автоматически)
Статус Черновик / Активное / Архив
Подпись Подписан / Не подписан

Временные рамки отображаются вертикальными синими чертами на Ганте. Между датой начала и окончания должен быть минимум один день. Выбор календаря рекомендуется делать при создании проекта — смена в процессе работы пересчитывает даты задач.

История изменений

При первом изменении в сессии создаётся запись с датой и временем; все правки той же сессии группируются в неё. Просмотр истории — кнопка в тулбаре. По правой кнопке мыши на записи истории доступно контекстное меню (просмотр, откат).

Синхронизация план ↔ реальные задачи

Данные между виртуальным планом и реальными задачами не синхронизируются автоматически — для переноса изменений используются явные операции:

Операция Направление Что обновляется
Отправить в реальные задачи план → задача Название, даты, исполнители, заказчик
Импортировать задача → план Название, даты начала/окончания, исполнители, статус, категория

Выборочная синхронизация: если в таблице отмечены задачи чекбоксами, операция применяется только к ним. При отметке задачи верхнего уровня автоматически выделяется всё дерево.

Исключение: при изменении значения в колонке «# Задача» данные связанной реальной задачи подтягиваются немедленно без дополнительных действий.

При ошибках синхронизации система показывает окно с описанием проблемы и кликабельным номером задачи.

При несинхронизированных изменениях в обоих направлениях — сначала отправьте актуальное направление, чтобы не перезаписать правки обратной операцией.

CustomSettings — глобальные ключи

Ключ Тип Назначение
NoValidateFixLengthPlan bool Если true — позволяет изменить плановые трудозатраты, даже если фактические списания превышают плановые. По умолчанию плановые «фиксируются» при превышении факта
GantSettings JSON Настройки старого виджета «Диаграмма Ганта» (актуально для версий 2.256–2.261). Начиная с v2.262 проектное управление перенесено на новый интерфейс — ключ устаревает
ProjectTableJSONExtParamID / ProjectReferenceTableExtParamId int ID ДП, в которых хранится JSON-структура плана и ссылка на план соответственно. Используются движком ПУ при сериализации/десериализации