Проектное управление: бизнес-логика¶
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 факт".
Жизненный цикл¶
- Пользователь нажимает "Создать базовый план" в toolbar
- Вводит название плана в модалке
GanttBasePlanModalComponent - Frontend собирает текущие даты всех задач из Bryntum и отправляет их в теле запроса
POST /api/gantt/add-base-plan({ projectId, name, tasks: [{taskId, start, end}] }) - Backend создаёт запись
ProjectBasePlanи сохраняет снимки дат вProjectBasePlanTask - В toolbar обновляется combobox "Базовый план"
- При выборе baseline —
toggleBasePlan()сохраняетbasePlanIdв настройках и перезагружает проект; выбранный baseline отображается Bryntum в виде дополнительных полос рядом с фактическими барами
Таблицы¶
ProjectBasePlan-- метаданные плана:Id,ProjectId,Name,Date(datetime)ProjectBasePlanTask-- снимок дат:ProjectBasePlanId,TaskId,Start,End(составной PK)
5. Запуск в реализацию¶
Механизм перевода запланированных задач из подкатегории планирования в реальные подкатегории.
Процесс¶
- Пользователь нажимает "Запуск в реализацию" в toolbar
- Backend (
GanttService.MoveProjectTasks): - Получает список задач из планирования
- Перемещает задачи в целевую подкатегорию реализации
- Вызывает
ProjectDal.UpdatePlan - Задачи становятся доступны в обычных гридах категории
Ключевая сущность¶
ProjectTasksPlanningSubcat -- связь проекта с подкатегорией планирования. Поле ProjectTasksSubcatId определяет, где живут задачи проекта до запуска в реализацию.
6. Ресурсное планирование¶
Для задач проекта ведётся учёт ресурсов: план и факт трудозатрат.
TaskResourcePlanService-- сервис для получения плановых и фактических записейGanttTaskPlanEntryDto-- плановая запись (исполнитель, часы)GanttTaskFactEntryDto-- фактическая запись
В Bryntum данные ресурсов отображаются через resources и assignments в IGanttProjectData.
7. Производственный календарь¶
Bryntum интегрирован с производственным календарём 1Форма:
CalendarServiceзагружает нерабочие дни (праздники) за диапазон ±5 лет- Нерабочие дни добавляются в
calendarManagerStoreBryntum - Фича
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).
Механизм¶
- При первом изменении данных в текущей сессии создаётся версия с именем
"Сессия {дд.MM.гггг ЧЧ:мм}". - Все последующие изменения в той же сессии привязываются к этой версии (
versionId). - Данные версий (
versionsData) и changelog (changelogsData) сохраняются вместе с проектом и восстанавливаются при загрузке. - 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-структура плана и ссылка на план соответственно. Используются движком ПУ при сериализации/десериализации |