Загрузка данных
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
targetNamespace="http://bpmn.io/schema/bpmn">
<bpmn:process id="Process_AddRecipe" name="Добавление нового рецепта" isExecutable="true">
<!-- Стартовое событие -->
<bpmn:startEvent id="StartEvent" name="Автор хочет добавить рецепт"/>
<!-- Задача: Авторизация -->
<bpmn:userTask id="Task_Auth" name="Авторизация в системе"/>
<bpmn:sequenceFlow id="Flow1" sourceRef="StartEvent" targetRef="Task_Auth"/>
<!-- Шлюз: Проверка авторизации -->
<bpmn:exclusiveGateway id="Gateway_CheckAuth" name="Авторизован?"/>
<bpmn:sequenceFlow id="Flow2" sourceRef="Task_Auth" targetRef="Gateway_CheckAuth"/>
<!-- Ветка: Не авторизован -->
<bpmn:sequenceFlow id="Flow_NoAuth" sourceRef="Gateway_CheckAuth" targetRef="Task_Register">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">false</bpmn:conditionExpression>
</bpmn:userTask>
<!-- Задача: Регистрация -->
<bpmn:userTask id="Task_Register" name="Регистрация нового автора"/>
<bpmn:sequenceFlow id="Flow_AfterReg" sourceRef="Task_Register" targetRef="Gateway_CheckAuth"/>
<!-- Ветка: Авторизован -->
<bpmn:sequenceFlow id="Flow_Auth" sourceRef="Gateway_CheckAuth" targetRef="Task_FillForm"/>
<!-- Задача: Заполнение формы рецепта -->
<bpmn:userTask id="Task_FillForm" name="Заполнение информации о рецепте">
<bpmn:potentialOwner>
<bpmn:resourceAssignmentExpression>
<bpmn:formalExpression>Автор</bpmn:formalExpression>
</bpmn:resourceAssignmentExpression>
</bpmn:potentialOwner>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow3" sourceRef="Task_FillForm" targetRef="Task_AddIngredients"/>
<!-- Задача: Добавление ингредиентов -->
<bpmn:userTask id="Task_AddIngredients" name="Добавление ингредиентов (кол-во, единицы)"/>
<bpmn:sequenceFlow id="Flow4" sourceRef="Task_AddIngredients" targetRef="Task_SelectCategory"/>
<!-- Задача: Выбор категории -->
<bpmn:userTask id="Task_SelectCategory" name="Выбор категории блюда"/>
<bpmn:sequenceFlow id="Flow5" sourceRef="Task_SelectCategory" targetRef="Gateway_Validate"/>
<!-- Шлюз: Валидация данных -->
<bpmn:exclusiveGateway id="Gateway_Validate" name="Данные корректны?"/>
<bpmn:sequenceFlow id="Flow6" sourceRef="Task_SelectCategory" targetRef="Gateway_Validate"/>
<!-- Ветка: Данные не корректны -->
<bpmn:sequenceFlow id="Flow_Invalid" sourceRef="Gateway_Validate" targetRef="Task_FillForm">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">false</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<!-- Сервисная задача: Сохранение в БД -->
<bpmn:serviceTask id="Task_SaveDB" name="Сохранение рецепта в базу данных"/>
<bpmn:sequenceFlow id="Flow_Valid" sourceRef="Gateway_Validate" targetRef="Task_SaveDB">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">true</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<!-- Сообщение: Уведомление -->
<bpmn:intermediateThrowEvent id="Event_Notify" name="Уведомление об успешной публикации"/>
<bpmn:sequenceFlow id="Flow7" sourceRef="Task_SaveDB" targetRef="Event_Notify"/>
<!-- Конечное событие -->
<bpmn:endEvent id="EndEvent" name="Рецепт опубликован"/>
<bpmn:sequenceFlow id="Flow8" sourceRef="Event_Notify" targetRef="EndEvent"/>
</bpmn:process>
</bpmn:definitions>
====
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
targetNamespace="http://bpmn.io/schema/bpmn">
<bpmn:process id="Process_ShoppingList" name="Формирование списка покупок" isExecutable="true">
<!-- Стартовое событие -->
<bpmn:startEvent id="StartEvent" name="Пользователь выбирает блюда"/>
<!-- Задача: Выбор рецептов -->
<bpmn:userTask id="Task_SelectRecipes" name="Выбор рецептов для приготовления">
<bpmn:potentialOwner>
<bpmn:resourceAssignmentExpression>
<bpmn:formalExpression>Пользователь</bpmn:formalExpression>
</bpmn:resourceAssignmentExpression>
</bpmn:potentialOwner>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow1" sourceRef="StartEvent" targetRef="Task_SelectRecipes"/>
<!-- Задача: Указание порций -->
<bpmn:userTask id="Task_Portions" name="Указание количества порций"/>
<bpmn:sequenceFlow id="Flow2" sourceRef="Task_SelectRecipes" targetRef="Task_Portions"/>
<!-- Сервисная задача: Сбор ингредиентов из БД -->
<bpmn:serviceTask id="Task_CollectIngredients" name="Сбор всех ингредиентов из выбранных рецептов"/>
<bpmn:sequenceFlow id="Flow3" sourceRef="Task_Portions" targetRef="Task_CollectIngredients"/>
<!-- Бизнес-правило: Расчет количества -->
<bpmn:businessRuleTask id="Task_Calculate" name="Расчет количества с учетом порций"/>
<bpmn:sequenceFlow id="Flow4" sourceRef="Task_CollectIngredients" targetRef="Task_Calculate"/>
<!-- Задача: Группировка одинаковых ингредиентов -->
<bpmn:scriptTask id="Task_Group" name="Группировка одинаковых ингредиентов и суммирование">
<bpmn:script>SUM(quantity) GROUP BY ingredient_id</bpmn:script>
</bpmn:scriptTask>
<bpmn:sequenceFlow id="Flow5" sourceRef="Task_Calculate" targetRef="Task_Group"/>
<!-- Шлюз: Есть ли ингредиенты дома? -->
<bpmn:exclusiveGateway id="Gateway_Have" name="Пользователь отмечает уже купленное?"/>
<bpmn:sequenceFlow id="Flow6" sourceRef="Task_Group" targetRef="Gateway_Have"/>
<!-- Ветка: Да, отмечает -->
<bpmn:sequenceFlow id="Flow_Have" sourceRef="Gateway_Have" targetRef="Task_MarkExisting">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">true</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<!-- Задача: Отметка имеющихся ингредиентов -->
<bpmn:userTask id="Task_MarkExisting" name="Отметка ингредиентов, которые уже есть дома"/>
<bpmn:sequenceFlow id="Flow_AfterMark" sourceRef="Task_MarkExisting" targetRef="Task_Subtract"/>
<!-- Сервисная задача: Вычитание -->
<bpmn:serviceTask id="Task_Subtract" name="Вычитание имеющихся ингредиентов из списка"/>
<bpmn:sequenceFlow id="Flow_AfterSubtract" sourceRef="Task_Subtract" targetRef="Task_Sort"/>
<!-- Ветка: Нет, сразу к сортировке -->
<bpmn:sequenceFlow id="Flow_NoHave" sourceRef="Gateway_Have" targetRef="Task_Sort">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">false</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<!-- Задача: Сортировка по категориям -->
<bpmn:serviceTask id="Task_Sort" name="Сортировка (овощи, мясо, бакалея, молочка)"/>
<bpmn:sequenceFlow id="Flow7" sourceRef="Task_Sort" targetRef="Task_Format"/>
<!-- Задача: Форматирование в удобный вид -->
<bpmn:userTask id="Task_Format" name="Форматирование списка для печати"/>
<bpmn:sequenceFlow id="Flow8" sourceRef="Task_Format" targetRef="Event_Display"/>
<!-- Сообщение: Отображение результата -->
<bpmn:intermediateThrowEvent id="Event_Display" name="Отображение готового списка покупок"/>
<bpmn:sequenceFlow id="Flow9" sourceRef="Event_Display" targetRef="EndEvent"/>
<!-- Конечное событие -->
<bpmn:endEvent id="EndEvent" name="Список сформирован"/>
<!-- Параллельные подпроцессы (расчет калорийности параллельно) -->
<bpmn:subProcess id="SubProcess_Calories" name="Расчет калорийности">
<bpmn:sequenceFlow id="Flow_Calories" sourceRef="Task_Calculate" targetRef="Task_CalcCalories"/>
<bpmn:serviceTask id="Task_CalcCalories" name="Умножение калорий на количество"/>
<bpmn:sequenceFlow id="Flow_AfterCalc" sourceRef="Task_CalcCalories" targetRef="Event_DisplayCal"/>
<bpmn:intermediateThrowEvent id="Event_DisplayCal" name="Добавление калорий в итоговый список"/>
</bpmn:subProcess>
<bpmn:sequenceFlow id="Flow_ToSubProcess" sourceRef="Task_Calculate" targetRef="SubProcess_Calories"/>
</bpmn:process>
</bpmn:definitions>