Загрузка данных


<?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>