refine scheme implementation

This commit is contained in:
2026-02-14 01:03:15 +03:00
parent 91ff1642dc
commit 59558784f6
5 changed files with 905 additions and 0 deletions

259
oms/t-shop/er-diagram.puml Normal file
View 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
View 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