@startuml !theme plain title Обработка корректировки заказа на WTIS participant "Kafka" as Kafka participant "Обработчик" as Handler participant "Сервис синхронизации" as Service participant "Сравнитель заказов" as Differ participant "Создатель заказов" as Creator participant "Резервирование" as Reserve participant "База данных" as DB == Получение корректировки == Kafka -> Handler: Сообщение корректировки Handler -> Service: Обработать корректировку == Поиск заказа == Service -> DB: Найти заказ по GUID alt Заказ не найден Service -> Creator: Создать новый заказ else Заказ существует Service -> Differ: Сравнить заказы OMS и WTIS == Анализ изменений == Differ -> Differ: Сравнить поля заказа note right: регион, ПВЗ, способ доставки,\nконтрагент, адрес, дата доставки Differ -> Differ: Сравнить товарные позиции note right: количество, цены, резерв Differ --> Service: Список изменений == Специальная обработка смены региона/ПВЗ == alt Смена региона или ПВЗ Service -> Reserve: Снять резерв со всех товаров note right: При смене региона/ПВЗ\nснимается весь резерв end == Применение изменений == Service -> Differ: Применить изменения к заказу Service -> Creator: Сохранить заказ == Обработка товаров == note over Service: **ДЕТАЛЬНАЯ СХЕМА:**\n"Обработка товарных позиций" Service -> Service: Определить операции с товарами note right: Товары для добавления,\nизменения, удаления alt Есть товары для добавления Service -> Creator: Добавить новые товары end alt Есть товары для изменения Service -> Service: Обновить существующие товары note right: **См. детальную схему:**\n- Изменение количества (split)\n- Изменение цен\n- Изменение резерва end alt Есть товары для удаления Service -> Reserve: Снять резерв Service -> Service: Удалить товары note right: **См. детальную схему:**\nУстановка статуса "Удален" end end == Резервирование товаров == note over Service: **ДЕТАЛЬНАЯ СХЕМА:**\n"Обработка товарных позиций"\n(блок "Резервирование") alt Есть товары для резервирования Service -> Reserve: Зарезервировать товары note right: Из массива reserve end alt Есть товары для снятия резерва Service -> Reserve: Снять резерв note right: Из массива unreserve end == Завершение == Service -> Service: Обновить сайтовый заказ Service -> Service: Отправить SMS клиенту Service -> Service: Экспортировать в OMS Service --> Handler: Результат обработки Handler --> Kafka: Подтверждение @enduml @startuml !theme plain title Обработка корректировки заказа на WTIS start :Получение сообщения корректировки из Kafka oms.order.sync; if (Заказ найден в БД?) then (нет) :Создать новый заказ; else (да) :Сравнить заказы OMS и WTIS по атрибутам; if (Смена региона или ПВЗ И есть товары для резерва?) then (да) :Снять резерв с товаров из массива reserve; else (нет) endif :Применить изменения к заказу; :Сохранить заказ в БД; :Определить операции с товарами; if (Есть товары для добавления?) then (да) :Добавить новые товары в заказ; else (нет) endif if (Есть товары для изменения?) then (да) :Обновить существующие товары; if (Есть товары с уменьшением количества в резерве?) then (да) :Создать копию товара с новым количеством; :Удалить избыточную часть; else (нет) endif else (нет) endif if (Есть товары для удаления?) then (да) :Снять резерв с товаров; :Установить статус "Удален"; :Удалить товары из заказа; else (нет) endif :Установить скидки, контакты, адреса; :Обновить дополнительные свойства заказа; if (Есть товары для резервирования И не сайтовый заказ?) then (да) :Зарезервировать товары из массива reserve; else (нет) endif if (Есть товары для снятия резерва И не отмена заказа?) then (да) :Снять резерв с товаров из массива unreserve; else (нет) endif :Обновить заказ во wtis_doc_zayavki; :Обновить заказ во wtis_doc_zayavki_site; if (Не сайтовый заказ И активный И подтвержденный?) then (да) :Отправить SMS клиенту с задержкой 10 минут; else (нет) endif :Экспортировать данные обратно в OMS; endif :Подтверждение обработки в Kafka; stop @enduml