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
Даже с включенным автоматическим планированием, вы можете вручную планировать отдельные задачи.
Существует два способа планирования задач в проекте: прямое и обратное планирование. Эти стратегии зависят от определенных настроек конфигурации:
По умолчанию задачи планируются вперед, что означает, что 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. Должна закончиться в – Задача заканчивается в конкретную дату.
Независимые задачи - это те, у которых нет последователей или предшественников, то есть они не связаны с другими задачами или их родителями.
Временной лаг и опережение помогают определить более сложные взаимоотношения между задачами.
Лаг вводит задержку между связанными задачами. Опережение позволяет задачам перекрываться.
Примеры:
Лаг и опережение устанавливаются с помощью свойства 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.
Вот список полезных методов и свойств:
Чтобы включить автоматическое планирование, установите свойство 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;
К началу