refine scheme implementation
This commit is contained in:
259
oms/t-shop/er-diagram.puml
Normal file
259
oms/t-shop/er-diagram.puml
Normal file
@@ -0,0 +1,259 @@
|
||||
@startuml
|
||||
hide circle
|
||||
skinparam linetype ortho
|
||||
left to right direction
|
||||
|
||||
entity "order" as order {
|
||||
id : bigint <<PK>> <<NN>> autoincrement
|
||||
// Идентификатор записи
|
||||
--
|
||||
t_shop_order_id : bigint <<NN>>
|
||||
// Идентификатор заказа в T-Shop
|
||||
|
||||
created_at : timestamptz <<NN>>
|
||||
// Дата и время оформления заказа в формате ISO 8601 UTC
|
||||
|
||||
delivery_total : numeric(10,2)
|
||||
// Стоимость доставки
|
||||
|
||||
expiry_date : timestamptz
|
||||
// Дата отмены заказа при бездействии (ISO 8601 UTC)
|
||||
|
||||
items_total : numeric(10,2)
|
||||
// Платеж покупателя
|
||||
|
||||
comment : varchar(256)
|
||||
// Комментарий к заказу
|
||||
|
||||
status : enum('CANCELLED','PROCESSING','DELIVERY','PICKUP','DELIVERED') <<NN>>
|
||||
// Статус заказа
|
||||
|
||||
substatus : enum('STARTED','READY_TO_SHIP','SHOP_FAILED','USER_CHANGED_MIND')
|
||||
// Этап обработки заказа
|
||||
|
||||
updated_at : timestamptz <<NN>>
|
||||
// Дата и время последнего обновления заказа в формате ISO 8601 с указанием смещения относительно UTC.
|
||||
}
|
||||
|
||||
entity "sync_log" as sync_log {
|
||||
id : bigint <<PK>> <<NN>> autoincrement
|
||||
// Идентификатор записи
|
||||
--
|
||||
last_synced_updated_at : timestamptz <<NN>>
|
||||
// Время последней синхронизации
|
||||
|
||||
retry_policy_attempts : smallint
|
||||
// Количество попыток retry policy
|
||||
|
||||
last_error : json
|
||||
// JSON запроса и ответа при котором произошла ошибка
|
||||
|
||||
current_page_token : varchar(100)
|
||||
// Идентификатор следующей страницы результатов
|
||||
|
||||
status : enum('success','error') <<NN>>
|
||||
// Статус синхронизации (success, error)
|
||||
}
|
||||
|
||||
entity "order_status_history" as order_status_history {
|
||||
id : bigint <<PK>> <<NN>> autoincrement
|
||||
// Идентификатор записи
|
||||
--
|
||||
order_id : bigint <<NN>>
|
||||
// Идентификатор заказа
|
||||
|
||||
status : enum('CANCELLED','PROCESSING','DELIVERY','PICKUP','DELIVERED') <<NN>>
|
||||
// Статус заказа
|
||||
|
||||
substatus : enum('STARTED','READY_TO_SHIP','SHOP_FAILED','USER_CHANGED_MIND')
|
||||
// Этап обработки заказа
|
||||
|
||||
created_at : timestamptz <<NN>>
|
||||
// Время создания записи
|
||||
}
|
||||
|
||||
entity "outlet" as outlet {
|
||||
id : bigint <<PK>> <<NN>> autoincrement
|
||||
// Идентификатор записи
|
||||
--
|
||||
outlet_code : uuid
|
||||
// Идентификатор пункта самовывоза
|
||||
|
||||
outlet_name : varchar(100)
|
||||
// Наименование пункта самовывоза
|
||||
===
|
||||
// В последствии добавим и другие атрибуты если нужно будет синкать ПВЗ. На данный момент этот функционал в фидах
|
||||
}
|
||||
|
||||
entity "order_buyer" as buyer {
|
||||
id : bigint <<PK>> <<NN>> autoincrement
|
||||
// Идентификатор записи
|
||||
--
|
||||
t_shop_order_id : bigint
|
||||
// Идентификатор заказа тиньков
|
||||
|
||||
phone : varchar(20) <<NN>>
|
||||
// Номер телефона покупателя
|
||||
|
||||
email : varchar(255) <<NN>>
|
||||
// Почта для отправки чека
|
||||
|
||||
first_name : varchar(100) <<NN>>
|
||||
// Имя покупателя
|
||||
|
||||
last_name : varchar(100) <<NN>>
|
||||
// Фамилия покупателя
|
||||
}
|
||||
|
||||
entity "order_delivery" as delivery {
|
||||
id : bigint <<PK>> <<NN>> autoincrement
|
||||
// Идентификатор записи
|
||||
--
|
||||
t_shop_order_id : bigint
|
||||
// Идентификатор заказа тиньков
|
||||
|
||||
lift_price : numeric(10,2)
|
||||
// Стоимость подъема на этаж (руб)
|
||||
|
||||
lift_type : order_lift_type
|
||||
// Тип подъема: NOT_NEEDED, MANUAL, ELEVATOR, CARGO_ELEVATOR, FREE, UNKNOWN
|
||||
|
||||
outlet_code : varchar(100)
|
||||
// Идентификатор пункта самовывоза магазина
|
||||
|
||||
outlet_storage_limit_date : timestamptz
|
||||
// Дата хранения в пункте выдачи (только для статуса PICKUP)
|
||||
|
||||
service_name : varchar(255)
|
||||
// Наименование службы доставки
|
||||
|
||||
type : order_delivery_type
|
||||
// Способ доставки: DELIVERY, PICKUP, UNKNOWN
|
||||
|
||||
real_delivery_date : timestamptz
|
||||
// Фактическая дата доставки (ISO 8601 UTC)
|
||||
}
|
||||
|
||||
entity "order_delivery_address" as address {
|
||||
id : bigint <<PK>> <<NN>> autoincrement
|
||||
// Идентификатор записи
|
||||
--
|
||||
t_shop_order_id : bigint
|
||||
// Идентификатор заказа тиньков
|
||||
|
||||
full_address : text <<NN>>
|
||||
// Полный адрес доставки (очень полный, до уровня квартиры если есть)
|
||||
|
||||
apartment : varchar(20)
|
||||
// Квартира или офис
|
||||
|
||||
block : varchar(20)
|
||||
// Корпус или строение
|
||||
|
||||
city : varchar(100) <<NN>>
|
||||
// Город или населенный пункт
|
||||
|
||||
country : varchar(100) <<NN>>
|
||||
// Страна
|
||||
|
||||
district : varchar(100)
|
||||
// Район
|
||||
|
||||
entrance : varchar(10)
|
||||
// Подъезд
|
||||
|
||||
entryphone : varchar(20)
|
||||
// Код домофона
|
||||
|
||||
postcode : varchar(20)
|
||||
// Почтовый индекс (для почтовой доставки)
|
||||
|
||||
floor : varchar(5)
|
||||
// Этаж
|
||||
|
||||
house : varchar(10)
|
||||
// Дом или владение
|
||||
|
||||
phone : varchar(20) <<NN>>
|
||||
// Телефон получателя заказа
|
||||
|
||||
street : varchar(255)
|
||||
// Улица
|
||||
|
||||
recipient : varchar(255) <<NN>>
|
||||
// ФИО получателя заказа
|
||||
|
||||
latitude : double precision <<NN>>
|
||||
// Широта адреса доставки
|
||||
|
||||
longitude : double precision <<NN>>
|
||||
// Долгота адреса доставки
|
||||
}
|
||||
|
||||
entity "order_item" as item {
|
||||
id : bigint <<PK>> <<NN>> autoincrement
|
||||
// Идентификатор записи
|
||||
--
|
||||
t_shop_item_id : bigint <<NN>>
|
||||
// Идентификатор товара в заказе (позволяет идентифицировать товар в заказе)
|
||||
|
||||
order_id : bigint <<NN>>
|
||||
// Ссылка на заказ
|
||||
|
||||
count : integer <<NN>>
|
||||
// Количество единиц товара
|
||||
|
||||
product_id : varchar(255) <<NN>>
|
||||
// SKU (наш внутренний)
|
||||
|
||||
offer_name : varchar(500)
|
||||
// Название товара
|
||||
|
||||
price : numeric(10,2) <<NN>>
|
||||
// Цена товара в рублях
|
||||
}
|
||||
|
||||
' === СВЯЗИ ===
|
||||
order ||--|| buyer : "1:1\n(обязательно)"
|
||||
order ||--o| delivery : "1:1\n(необязательно)"
|
||||
delivery ||--|| address : "1:1\n(необязательно)"
|
||||
order ||--|{ item : "1:many\n(обязательно)"
|
||||
outlet ||--o{ delivery : "1:many\n(необязательно)"
|
||||
order ||--o{ order_status_history : "1:many\n(обязательно)"
|
||||
|
||||
note left of order
|
||||
<u><b>order_status_type</b></u>
|
||||
<b>Статус</b> <b>Описание</b>
|
||||
CANCELLED Отменен
|
||||
PROCESSING В обработке
|
||||
DELIVERY В службе доставки
|
||||
PICKUP В пункте самовывоза
|
||||
DELIVERED Получен покупателем
|
||||
===
|
||||
<u><b>order_substatus_type</b></u>
|
||||
<b>Этап</b> <b>Статус</b> <b>Описание</b>
|
||||
STARTED (статус-> PROCESSING Заказ подтвержден, можно обрабатывать
|
||||
READY_TO_SHIP (статус-> PROCESSING Заказ собран, готов к отправке
|
||||
SHOP_FAILED (статус-> CANCELLED Магазин не может выполнить
|
||||
USER_CHANGED_MIND (статус-> CANCELLED Покупатель отменил
|
||||
endnote
|
||||
|
||||
note top of delivery
|
||||
<u><b>order_lift_type</b></u>
|
||||
<b>Тип Описание</b>
|
||||
NOT_NEEDED Не требуется
|
||||
MANUAL Ручной
|
||||
ELEVATOR Лифт
|
||||
CARGO_ELEVATOR Грузовой лифт
|
||||
FREE Любой (при бесплатном подъеме)
|
||||
UNKNOWN Неизвестный тип
|
||||
===
|
||||
<u><b>order_delivery_type</b></u>
|
||||
<b>Тип Описание</b>
|
||||
DELIVERY Курьерская доставка
|
||||
PICKUP Самовывоз
|
||||
UNKNOWN Неизвестный тип
|
||||
endnote
|
||||
|
||||
|
||||
@enduml
|
||||
68
oms/t-shop/get-order.puml
Normal file
68
oms/t-shop/get-order.puml
Normal file
@@ -0,0 +1,68 @@
|
||||
@startuml
|
||||
title Flow: Получение и обработка заказов с маркетплейса
|
||||
|
||||
actor "Покупатель" as Customer
|
||||
participant "T-Shop\n(Маркетплейс)" as TShop
|
||||
participant "T-Shop-ADP\n(Адаптер)" as Adapter
|
||||
database "T-Shop-ADP-DB\n(sync_state, orders)" as DB
|
||||
participant "Superset" as Superset
|
||||
actor "Менеджер ВИ" as Admin
|
||||
|
||||
== Покупатель оформляет заказ ==
|
||||
|
||||
Customer -> TShop: Оформление заказа
|
||||
note right of TShop: Статус заказа:\nstatus = "PROCESSING"\nsubstatus = "STARTED"
|
||||
TShop --> Customer:
|
||||
|
||||
== Периодическая синхронизация заказов (Дельта по updatedAt) ==
|
||||
|
||||
loop Каждые 15 минут
|
||||
|
||||
Adapter -> DB: Чтение состояния синхронизации\n(sync_log.last_synced_updated_at)
|
||||
DB --> Adapter: last_synced_updated_at
|
||||
|
||||
Adapter -> TShop: **GET /orders?updatedAtFrom=last_synced_updated_at-5min&updatedAtTo=now()-2min&limit=50**
|
||||
|
||||
TShop --> Adapter: Ответ с пагинацией\norders[...], nextPageToken="abc123"
|
||||
|
||||
loop Пока есть nextPageToken
|
||||
|
||||
Adapter -> DB: **UPSERT заказов в БД**
|
||||
note right of Adapter: Insert новых\nUpdate существующих (по updatedAt)
|
||||
DB --> Adapter:
|
||||
|
||||
Adapter -> TShop: Следующий запрос с pageToken
|
||||
TShop --> Adapter: Следующая порция заказов
|
||||
end
|
||||
|
||||
Adapter -> DB: Обновить sync_log\nlast_synced_updated_at = updatedAtTo
|
||||
DB --> Adapter:
|
||||
|
||||
end
|
||||
|
||||
== Обновление Superset ==
|
||||
Superset -> DB: Автообновление дашборда\n(через прямое подключение)
|
||||
DB --> Superset: Актуальные данные
|
||||
|
||||
== Работа менеджера (Оформление заказов) ==
|
||||
|
||||
Admin -> Superset: Открытие дашборда
|
||||
Superset -> DB: Запрос данных
|
||||
DB --> Superset:
|
||||
Superset --> Admin: Отображение заказов
|
||||
|
||||
Admin -> Admin: Ручное оформление заказа\nв АРМ системе
|
||||
|
||||
== Работа менеджера (Обновление статуса заказа) ==
|
||||
|
||||
Admin -> Adapter: Обновление статуса заказа в T-Shop через Postman
|
||||
Adapter -> Adapter: Подстановка кредов + обработка параметров входящих
|
||||
Adapter --> TShop: Отправка запроса
|
||||
|
||||
== Работа менеджера (Отправка кода получения заказа) ==
|
||||
|
||||
Admin -> Adapter: Отправка кода получения в T-Shop через Postman
|
||||
Adapter -> Adapter: Подстановка кредов + обработка параметров входящих
|
||||
Adapter --> TShop: Отправка запроса
|
||||
|
||||
@enduml
|
||||
Reference in New Issue
Block a user