Available only in PRO Edition

Автоматическое планирование

Эта функциональность доступна только в PRO редакции.

Расширение auto_scheduling в библиотеке позволяет Gantt автоматически организовывать задачи на основе их зависимостей.

Например, если две задачи связаны и вторая начинается после завершения первой, изменение даты начала первой задачи автоматически скорректирует дату начала второй. Эта функция упрощает планирование проекта, позволяя определять взаимосвязи задач без необходимости вручную устанавливать даты для каждой задачи.

Как использовать

Чтобы активировать автоматическое планирование, включите плагин auto_scheduling, используя метод gantt.plugins:

gantt.plugins({
    auto_scheduling: true
});

Затем установите свойство auto_scheduling в true:

gantt.config.auto_scheduling = true;

Related sample:  Auto Scheduling extension

Даже с включенным автоматическим планированием, вы можете вручную планировать отдельные задачи.

Прямое/обратное планирование

Стратегии планирования

Существует два способа планирования задач в проекте: прямое и обратное планирование. Эти стратегии зависят от определенных настроек конфигурации:

  • schedule_from_end - (логическое) определяет стратегию планирования
  • project_start - (Дата) устанавливает дату начала проекта; по умолчанию задачи начинаются с этой даты при прямом планировании (по умолчанию null)
  • project_end - (Дата) устанавливает дату окончания проекта; при обратном планировании задачи по умолчанию заканчиваются в это время (по умолчанию null)

Прямое планирование

По умолчанию задачи планируются вперед, что означает, что gantt.config.schedule_from_end установлено в false.

// используется прямое планирование задач
gantt.config.schedule_from_end = false;

В этом случае задачи планируются с даты начала или самой ранней даты задачи и планируются как можно раньше, если не применяются другие ограничения.

Вы можете дополнительно определить дату начала проекта, используя gantt.config.project_start:

gantt.config.project_start = new Date(2019, 2, 1);

Related sample:  Auto-Schedule From Project Start & Constraints

Обратное планирование

Альтернативно, задачи могут планироваться назад, начиная с даты окончания проекта. Чтобы включить это, установите gantt.config.schedule_from_end в true и укажите дату окончания проекта с помощью gantt.config.project_end:

gantt.config.schedule_from_end = true;
gantt.config.project_end = new Date(2019, 4, 1);

С этой настройкой задачи планируются как можно позже, причем последняя задача заканчивается на указанную дату окончания проекта.

Related sample:  Auto-Schedule From Project End (backward)

Временные ограничения для задач

Вы можете добавить специфические временные ограничения для задач в dhtmlxGantt.

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

Добавление ограничений в лайтбоксе

Вы можете определить ограничения задач, используя Constraint control в лайтбоксе задачи.

Встроенный выбор даты для ограничений

gantt.config.lightbox.sections = [
    { name:"description", height:38, map_to:"text", type:"textarea", focus:true},
    { name:"constraint", type:"constraint" },     { name:"time", type:"duration", map_to:"auto" }
];

Добавление ограничений с помощью встроенных редакторов

Ограничения также могут быть установлены, используя специфические колонки в гриде и встроенные редакторы.

Колонки ограничений

Используйте названия колонок constraint_type и constraint_date.

const constraintTypeEditor = {
    type: "select", map_to: "constraint_type", options: [
        { key: "asap", label: gantt.locale.labels.asap },
        { key: "alap", label: gantt.locale.labels.alap },
        { key: "snet", label: gantt.locale.labels.snet },
        // другие опции
    ]
};
 
const constraintDateEditor = {
    type: "date",
    map_to: "constraint_date",
    min: new Date(2019, 0, 1),
    max: new Date(2020, 0, 1)
};
 
gantt.config.columns = [
    { // предыдущая колонка},
    {
        name:"constraint_type", align:"center", width:100, template:function (task){
            return gantt.locale.labels[gantt.getConstraintType(task)];
        }, resize: true, editor: constraintTypeEditor
    },
    {
        name:"constraint_date", align:"center", width:120, template:function (task) {
        //логика шаблона
        },
        resize: true, editor: constraintDateEditor
    },
    { name: "add", width: 44 }
];

Related sample:  Auto-Schedule From Project Start & Constraints

Типы ограничений

Задачи могут иметь различные временные ограничения:

1. Как можно скорее - Независимые задачи начинаются с проекта или с указанной даты, если строгий режим отключен. Зависимые задачи начинаются после завершения предшественников.

2. Как можно позже - Независимые задачи заканчиваются с проектом. Зависимые задачи заканчиваются, когда начинаются последующие.

Другие ограничения применяются независимо от типа задачи:

3. Начать не раньше чем – Задача начинается в указанную дату или позже.

4. Начать не позже чем – Задача начинается в указанную дату или раньше.

5. Закончить не раньше чем – Задача заканчивается в указанную дату или позже.

6. Закончить не позже чем – Задача заканчивается в указанную дату или раньше.

7. Должна начаться в – Задача начинается в конкретную дату.

8. Должна закончиться в – Задача заканчивается в конкретную дату.

Независимые задачи - это те, у которых нет последователей или предшественников, то есть они не связаны с другими задачами или их родителями.

Установка временного лага и опережения между задачами

Временной лаг и опережение помогают определить более сложные взаимоотношения между задачами.

Лаг вводит задержку между связанными задачами. Опережение позволяет задачам перекрываться.

Примеры:

  • Задача начинается до завершения предшественника (например, Задача B начинается за день до окончания Задачи A).
  • Задача начинается после задержки после завершения предшественника (например, Задача B начинается через день после окончания Задачи A).

Лаг и опережение устанавливаются с помощью свойства link.lag:

  • Положительные значения указывают на лаг.
  • Отрицательные значения указывают на опережение.

По умолчанию лаг установлен на 0 для всех зависимостей.

Редактирование значений ссылок из интерфейса

Хотя Gantt не предоставляет встроенный интерфейс для редактирования лага или свойств ссылок, вы можете создать его вручную, используя связанный раздел в качестве руководства.

Related sample:   Edit-lag Popup

Отключение автоматического планирования для конкретных задач

Чтобы исключить задачу из автоматического планирования, установите её свойство auto_scheduling в false:

var task = gantt.getTask(id);
task.auto_scheduling = false;

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

gantt.attachEvent("onBeforeTaskAutoSchedule",function(task, start, link, predecessor){
    if(task.completed) {
        return false;
    }
    return true;
});

Планирование завершенных задач

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

Чтобы исключить завершенные задачи из критического пути и автоматического планирования, включите конфигурацию auto_scheduling_use_progress:

gantt.config.auto_scheduling_use_progress = true;
 
gantt.init("gantt_here");

Более подробная информация доступна на странице API.

Обзор API

Вот список полезных методов и свойств:

Активация

Чтобы включить автоматическое планирование, установите свойство auto_scheduling в true:

gantt.config.auto_scheduling = true;

Строгий режим

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

gantt.config.auto_scheduling_strict = true;

Обратите внимание, что для версий 6.1.0 - 7.1.3 эта настройка работает только при включенной auto_scheduling_compatibility.

Начальное автоматическое планирование

Свойство auto_scheduling_initial определяет, запускается ли автоматическое планирование при загрузке данных. Оно включено по умолчанию:

gantt.config.auto_scheduling_initial = true;

Наследование ограничения проекта

Свойство auto_scheduling_project_constraint обеспечивает наследование задачами без конкретного ограничения от их родительского проекта:

gantt.config.auto_scheduling_project_constraint = true;

Пересчет проекта

Чтобы пересчитать расписание всего проекта, используйте метод autoSchedule:

gantt.autoSchedule();

Если нужно пересчитать начиная с конкретной задачи, передайте ID задачи в метод:

gantt.autoSchedule(taskId);

Проверка, является ли задача незапланированной

Чтобы проверить, является ли задача незапланированной, используйте метод isUnscheduledTask с объектом задачи:

var isUnscheduled = gantt.isUnscheduledTask(task);

Поиск циклических ссылок

Чтобы определить циклические ссылки в диаграмме, используйте метод findCycles:

gantt.findCycles();

Проверка, является ли ссылка циклической

Чтобы проверить, является ли ссылка циклической, примените метод isCircularLink:

var isCircular = gantt.isCircularLink(link);

Получение связанных задач и ссылок

Чтобы узнать, какие задачи и ссылки связаны с конкретной задачей, вы можете использовать метод gantt.getConnectedGroup:

gantt.getConnectedGroup(18);
// => {links:["16", "17", "18"], tasks:[18, 17, 19, 20]}

Список событий

Вот перечень событий, которые вы можете использовать:

Вот как можно работать с этими событиями:

// Вызывается перед началом автоматического планирования
gantt.attachEvent("onBeforeAutoSchedule",function(taskId){
    // Добавьте вашу пользовательскую логику здесь
    return true;
});
 
// Вызывается после завершения автоматического планирования
gantt.attachEvent("onAfterAutoSchedule",function(taskId, updatedTasks){
    // Добавьте вашу пользовательскую логику здесь
});
 
// Вызывается перед перепланировкой конкретной задачи
gantt.attachEvent("onBeforeTaskAutoSchedule",function(task,start,link,predecessor){
    // Добавьте вашу пользовательскую логику здесь
    return true;
});
 
// Вызывается после перепланировки конкретной задачи
gantt.attachEvent("onAfterTaskAutoSchedule",function(task,start,link,predecessor){
    // Добавьте вашу пользовательскую логику здесь
});
 
// Вызывается, если обнаружена циклическая ссылка и автоматическое планирование не может продолжаться
gantt.attachEvent("onCircularLinkError",function(link, group){
    // Добавьте вашу пользовательскую логику здесь
});
 
// Вызывается, если циклические ссылки найдены во время автоматического планирования
gantt.attachEvent("onAutoScheduleCircularLink",function(groups){
    // Добавьте вашу пользовательскую логику здесь
});

Совместимость версий

Когда дата задачи изменяется — либо путем её перетаскивания мышью, либо изменением в лайтбоксе — задача автоматически получает один из двух типов ограничений: начать не раньше чем+%дата начала% или закончить не позже чем+%дата окончания%, в зависимости от используемого подхода к планированию.

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

Если необходимо, вы можете включить визуализацию ограничений, используя метод gantt.addTaskLayer.

Related sample:  Auto-Schedule From Project Start & Constraints

Это поведение отличается от того, как работало автоматическое планирование в версиях до v6.1, но соответствует логике, используемой в MS Project, что делает его стандартным подходом.

Если вы предпочитаете поведение автоматического планирования до версии 6.1 без ограничений, вы можете отключить их так:

gantt.config.auto_scheduling_compatibility = true;
К началу