Available only in PRO Edition

Критический путь

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

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

Задача становится критической, когда у нее отсутствует резерв времени, то есть любое ее задержание напрямую влияет на дату завершения проекта. Для подробного объяснения того, как рассчитывается критический путь, ознакомьтесь с разделом Логика критического пути. Резерв времени относится к количеству времени, на которое можно отложить задачу, не влияя на другие задачи или конечную дату проекта.

Чтобы начать использовать эту функцию, убедитесь, что она включена через метод gantt.plugins.

Для отображения критического пути на диаграмме Ганта установите свойство gantt.config.highlight_critical_path в значение true:

Настройка диаграммы Ганта для отображения критического пути

<!DOCTYPE html>
<html>
<head>
   <script src="codebase/dhtmlxgantt.js"></script>   
   <link href="codebase/dhtmlxgantt.css" rel="stylesheet">   
</head>
<body>
    gantt.plugins({         critical_path: true     });     gantt.config.highlight_critical_path = true;
    //ваш код будет здесь
</body>
</html>

Related sample:  Critical path

Как только это свойство активировано, dhtmlxGantt автоматически будет отслеживать статусы задач и обновлять критический путь соответствующим образом. Критическим задачам и связям будут назначены CSS-классы 'critical_task' и 'critical_link' соответственно.

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

Логика критического пути

Задача определяется как критическая при выполнении следующих условий:

1. Задача имеет самую позднюю дату окончания на гриде.

2. Задача связана с другой критической задачей без задержки между ними.

Задержка определяется параметром gantt.config.duration_unit. Например, если duration_unit установлено в 'day' и продолжительность между задачами составляет несколько часов, Gantt применяет следующие правила округления:

  • Если продолжительность составляет 12 часов или более, округляется в меньшую сторону.
  • Если продолжительность менее 12 часов, округляется в большую сторону.

Параметр задержки в объекте связи позволяет корректировать продолжительность между задачами. Например, установка lag в 1 делает задачу критической, когда разрыв между задачами составляет 1.

Вот примеры с различными значениями link.lag:

  • link.lag равно 0
const tasks = {
    "data": [
        ...
    ],
    "links": [
        ...
        { "id": 3, "source": 3, "target": 4, "lag": 0, "type": "0" },
 
    ]
}

  • link.lag равно 1
const tasks = {
    "data": [
        ...
    ],
    "links": [
        ...
        { "id": 3, "source": 3, "target": 4, "lag": 1, "type": "0" }, 
 
    ]
}

  • link.lag равно -1
const tasks = {
    "data": [
        ...
    ],
    "links": [
        ...
        { "id": 3, "source": 3, "target": 4, "lag": -1, "type": "0" },
 
    ]
}

3. Параметр gantt.config.project_end определен, и даты задачи превышают дату gantt.config.project_end.

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

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

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

gantt.config.highlight_critical_path = true; gantt.init("gantt_here");
gantt.parse(tasks);
 
gantt.isCriticalTask(gantt.getTask("task3"));// ->'true'

Related sample:  Critical path

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

Чтобы проверить, является ли связь критической (соединяющей две критические задачи), используйте метод gantt.isCriticalLink:

gantt.isCriticalLink(gantt.getLink("link1"));

Related sample:  Critical path

Получение свободного и общего резерва времени

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

Этот показатель применим к задачам типа 'task' и 'milestone'. Для расчета свободного резерва времени используйте метод gantt.getFreeSlack, который принимает объект задачи в качестве аргумента:

var task = gantt.getTask(7);
gantt.getFreeSlack(task);

Related sample:  Show Slack time

Общий резерв времени — это временной буфер, который позволяет расширить или переместить задачу без задержки завершения проекта.

Общий резерв времени применим ко всем типам задач, включая проекты. Используйте метод gantt.getTotalSlack, чтобы его получить:

var task = gantt.getTask(7);
gantt.getTotalSlack(task);

Related sample:  Show Slack time

Slack

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

По умолчанию диаграмма Ганта применяет стандартное поведение для критического пути, включая автоматический пересчет и стиль по умолчанию.

Чтобы переключить видимость критического пути, используйте следующий подход:

var isEnabled = false
function updateCriticalPath(){
    isEnabled = !isEnabled;
 
    gantt.config.highlight_critical_path = isEnabled;
 
    gantt.render();
}

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

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

gantt.templates.task_class = function(start, end, task){
    if(gantt.isCriticalTask(task))
        return "critical_task";
      return "";
};
 
gantt.templates.link_class = function(link){
    if(gantt.isCriticalLink(link))
        return "critical_link";
      return "";
};
 
var data = {
    tasks: [
        { id: 1, text: "Office itinerancy", open:true, type:"project" },
        { id: 2, text: "Office facing", start_date: "21-07-2020", 
            duration: "20", parent: "1" },
        { id: 3, text: "Furniture installation", start_date: "21-07-2020", 
            duration: "5", parent: "1" },
        { id: 4, text: "The employee relocation", start_date: "28-07-2020", 
            duration: "15", parent: "1" },
        { id: 5, text: "Interior office", start_date: "28-07-2020", 
            duration: "15", parent: "1" }
    ],
    links: [
        { id: "1", source: "2", target: "3", type: "0" },
        { id: "2", source: "3", target: "4", type: "0" },
        { id: "3", source: "4", target: "5", type: "0" }
    ]
};
gantt.init("gantt_here");
 
gantt.parse(data);


Вы также можете вручную выделять задачи и связи:

  • Возврат "gantt_critical_task" в шаблоне task_class выделяет задачу как критическую.
  • Возврат "gantt_critical_link" в шаблоне link_class выделяет связь как критическую.

Связанный пример: Настройка критического пути для каждого проекта

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

Задержки и опережения между задачами на критическом пути можно настроить. Подробности доступны здесь.

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

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

Чтобы изменить это поведение, включите настройку gantt.config.auto_scheduling_use_progress:

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

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

Дополнительные детали доступны на странице API.

К началу