Навчання / BPMN

Найпростіший лінійний алгоритм
код, що відповідає цій конструкції (javascript):
function run(text) {
    console.log('Операція "'+text+'"');
}

function end(text) {
    console.log('Алгоритм завершено операцією "'+text+'"');
}

run('Дія');
end('Фінал');
Розгалуження - Exclusive Gateway - 2 гілки
код, що відповідає цій конструкції (javascript):
function run(text) {
    console.log('Операція "'+text+'"');
}

function end(text) {
    console.log('Алгоритм завершено операцією "'+text+'"');
}

// variable "answer" was hardcoded here:
var answer = 'Відповідь А';

if (answer === 'Відповідь А') {
    run('Дія А');
    end('Фінал А');
} else if (answer === 'Відповідь Б') {
    run('Дія Б');
    end('Фінал Б');
}
Розгалуження - Exclusive Gateway - 3 гілки
код, що відповідає цій конструкції (javascript):
function run(text) {
    console.log('Операція "'+text+'"');
}

function end(text) {
    console.log('Алгоритм завершено операцією "'+text+'"');
}

// variable "answer" was hardcoded here:
var answer = 'Відповідь А';

if (answer === 'Відповідь А') {
    run('Дія А');
    end('Фінал А');
} else if (answer === 'Відповідь Б') {
    run('Дія Б');
    end('Фінал Б');
} else if (answer === 'Відповідь В') {
    run('Дія В');
    end('Фінал В');
}
Розгалуження - Exclusive Gateway - 3 гілки, 3-я "інакше"
код, що відповідає цій конструкції (javascript):
function run(text) {
    console.log('Операція "'+text+'"');
}

function end(text) {
    console.log('Алгоритм завершено операцією "'+text+'"');
}

// variable "answer" was hardcoded here:
var answer = 'Відповідь А';

if (answer === 'Відповідь А') {
    run('Дія А');
    end('Фінал А');
} else if (answer === 'Відповідь Б') {
    run('Дія Б');
    end('Фінал Б');
} else {
    run('Дія "Інакше"');
    end('Фінал "Інакше"');
}
Розгалуження - Exclusive Gateway - 2 гілки і сходження (приклад з ФОПом)
код, що відповідає цій конструкції (javascript):
function run(text) {
    console.log('Операція "'+text+'"');
}

function end(text) {
    console.log('Алгоритм завершено операцією "'+text+'"');
}

// variable "isVatPayer" was hardcoded here:
var isVatPayer = true;

if (isVatPayer === true) {
    run('Вказуємо, що ФОП є платником ПДВ.');
} else if (isVatPayer === false) {
    run('Вказуємо, що ФОП не є платником ПДВ.');
}

end('Генеруємо текст документа');
Паралельне виконання - Parallel Gateway - 3 гілки
код, що відповідає цій конструкції (javascript):
var tasks = {
    'англійське законодавство' : 3.2,
    'американське законодавство' : 5.4,
    'німецьке законодавство' : 1.5
};

function prepareAllResearches() {
    start = Date.now();
    for (const task in tasks) {
        prepareResearch(task);
    }
    console.log('Задачі роздані виконавцям.');
}

function prepareResearch(task) {
    console.log('Задача "'+task+'" розпочата.');
    var seconds = tasks[task];
    setTimeout(() => {
        console.log('Задача "'+task+'", виконана за '+seconds+' с.');
        tasks[task] = true;
        checkAllResearches();
    }, seconds * 1000);
}

function checkAllResearches() {
    for (const task in tasks) {
        if (tasks[task] !== true) {
            console.log('Ще не всі задачі завершені.');
            return false;
        }
    }
    
    var diff = Date.now() - start;
    diff = Math.round(diff / 1000 * 100) / 100;
    console.log('Всі задачі завершені за '+diff+' с.');
    end('Видача текста клієнту');
}

function end(text) {
    console.log('Алгоритм завершено операцією "'+text+'"');
}

var start;
prepareAllResearches();

/*
Очікуваний вивід в консолі. Майже одразу:
> Задача "англійське законодавство" розпочата.
> Задача "американське законодавство" розпочата.
> Задача "німецьке законодавство" розпочата.
> Задачі роздані виконавцям.

Через 1.5 секунди:
> Задача "німецьке законодавство", виконана за 1.5 с.
> Ще не всі задачі завершені.

Через 3.2 секунди:
> Задача "англійське законодавство", виконана за 3.2 с.
> Ще не всі задачі завершені.

Через 5.4 секунди:
> Задача "американське законодавство", виконана за 5.4 с.
> Всі задачі завершені за 5.41 с.
> Алгоритм завершено операцією "Видача текста клієнту"
*/
Розгалуження - Inclusive Gateway - 3 гілки і сходження (приклад з недоліками)
код, що відповідає цій конструкції (javascript):
var problems = {
    'зі строками' : 3.2,
    'з версткою' : 0,
    'з цінами' : 1.5
};

function fixAllProblems() {
    start = Date.now();
    for (const problem in problems) {
        if (problems[problem] > 0) {
            fixProblem(problem);
        }
    }
    console.log('Актуальні проблеми зі списку взяті в роботу.');
}

function fixProblem(problem) {
    console.log('Проблема "'+problem+'" взята в роботу.');
    var seconds = problems[problem];
    setTimeout(() => {
        console.log('Проблема "'+problem+'" вирішена за '+seconds+' с.');
        problems[problem] = 0;
        checkAllProblems();
    }, seconds * 1000);
}

function checkAllProblems() {
    for (const problem in problems) {
        if (problems[problem] !== 0) {
            console.log('Ще не всі проблеми вирішені.');
            return false;
        }
    }
    
    var diff = Date.now() - start;
    diff = Math.round(diff / 1000 * 100) / 100;
    console.log('Всі актуальні проблеми вирішені за '+diff+' с.');
    end('Документ готовий');
}

function end(text) {
    console.log('Алгоритм завершено операцією "'+text+'"');
}

var start;
fixAllProblems();

/*
Очікуваний вивід в консолі. Майже одразу:
> Проблема "зі строками" взята в роботу.
> Проблема "з цінами" взята в роботу.
> Актуальні проблеми зі списку взяті в роботу.

Через 1.5 секунди:
> Проблема "з цінами" вирішена за 1.5 с.
> Ще не всі проблеми вирішені.

Через 3.2 секунди:
> Проблема "зі строками" вирішена за 3.2 с.
> Всі актуальні проблеми вирішені за 3.21 с.
> Алгоритм завершено операцією "Документ готовий"
*/