Сервіси

Модуль SEARCH: алгоритм маршрутів і POST_DRONE

Додаток A до рамкового ТЗ: блок-схема № 3.1.1 — основний і єдиний алгоритм пошуку для будь-якого перевезення, що потребує понад одного виду транспорту, розширена на шість видів транспорту без зміни структури графа.

Це специфікація алгоритму, а не працюючий сервіс: жодної бази points/lots, жодного API /search/routes і жодного Go-сервіса SEARCH у цьому демо немає. JSON Schema контракту POST_DRONE (schemas/post-drone.schema.json) і її перевірка (schemas/check_schema.py) — реальні, робочі файли цього репозиторію: 12 прикладів валідні, 37 із 37 мутацій відхилено. ci/check_contract_text.py — теж реальний файл, і тепер він виконується: каталог proto/ і grpc_tools на місці, прогін дає 24 перевірки узгодженості тексту ТЗ зі схемою й proto-контрактом, а self-test виявляє 10 із 10 мутацій. Цей прогін — крок job-а proto конвеєра contract.yml, тобто частина обов'язкової перевірки «Контракт proto модуля SEARCH».

Підсистеми модуля (S1–S8)

ID Назва Зміст
S1Простий пошук заявокПошук по одному розділу за фільтрами: країна, регіон, пункт, дата, тип транспорту, тип завантаження, маса, обʼєм
S2Фільтр «інші напрямки»Два незалежні списки пунктів відправлення / призначення
S3Пошук зворотних рейсівЗаявки, виставлені до пункту відправлення (ймовірний зворотний рейс)
S4Пошук мультимодального маршрутуОсновний алгоритм — блок-схема № 3.1.1; ланцюг заявок з 2–4 плечима по 6 видах транспорту
S5Fallback «компанії напрямку»Перелік компаній, які коли-небудь перевозили в цьому напрямку
S6Fallback «можливі сполучення»Перелік станцій/портів/аеропортів/точок дрона, між якими існує сполучення
S7РанжуванняСортування за критерієм «вартість» або «швидкість» + успадкований коефіцієнт переваги
S8Збереження запитуІсторія запитів, підписка, сповіщення про нові відповідні заявки

Шість видів транспорту в графі маршруту

Дрон — не плече графа, а пост-обробка вже знайденого маршруту: єдина реалізація замість чотирьох копій умови в кожній гілці.

Код Назва Роль у графі База пунктів
MМореМагістральне плече (гілка 1)порти (seaport)
FАвіаМагістральне плече — альтернатива морюаеропорти (airport)
TЖДФідерне плече 1-го рівнястанції (rail_station)
AАвтоФідерне плече 2-го рівня, «остання миля»міста (city)
DДронНе плече графа — пост-обробка останнього авто-плечамайданчики (drone_pad)
XМультимодальнийНе окреме плече — розділ із доступом до заявок усіх розділівусі типи пунктів

Ворота модуля POST_DRONE (рисунок 3.1.1-7)

Кожне «ні» — вихід із модуля: авто-плече лишається без змін, дрон-варіант не створюється і не замінює авто-варіант.

Ворота Перевірка Код причини Сценарій
1Плече останнє й вид — автоnot_last_auto_legT16
2Зона дозволена (немає no_permit)no_permitT17
3d ≤ range_km × drone_range_marginout_of_rangeT18
4weight_t × 1000 ≤ max_payload_kg, габарити, ADR, не живі твариниcargo_not_allowedT19
5Лот D знайдено або підставлено площадку в межах max_legs=4no_drone_lot / no_landing_pad / max_legs_exceeded / extra_leg_disabledT20, T22, T23
6Погода у вікні вильоту (не відмова — прапорець weather_risk)— (weather_risk)T21, T26
—Модуль вимкнено запитомdrone_disabledT24
—Перевищено бюджет модуляtimeoutT25

Ранжування: ваги критерію та штрафи за прапорці

Критерій wc wt wk wr wn
cost0.550.100.150.100.10
time0.100.550.100.100.15
balanced0.300.300.150.150.10
Прапорець Штраф Обґрунтування
weather_risk0.08Ризик погоди або невідома погода у дрон-плечі
no_permit0.10Плече без дозволу вимагає дій учасника
customs_missing0.06У плечі немає потрібного документа CMR/T1/TIR
estimated_price0.03Вартість не з лота, а з медіан link_stats

Кроки CI (обовʼязкові для злиття)

Контракт, правило гілки та валютно-мовні сценарії не потребують ні бази, ні застосунку — лише текст ТЗ, схему і фікстури.

Крок Команда Що падає
Контрактschemas/validate_schema.py, schemas/check_schema.pyневалідний приклад A.8.4.1, порушення програмної перевірки, непокрита мутація, непокритий код reason
Правило гілкиci/check_ruleset.pyперевірка з правила не відповідає job-у, gate не залежить від нового job-а, фільтр paths у тригері, сценарій не описаний у ТЗ
Числа в документаціїci/check_doc_counts.pyтвердження ТЗ про кількість обовʼязкових перевірок, діапазон правил R1–RN, кількість сценаріїв pull request чи назва групи сценаріїв відстали від фактичного складу правила гілки й конвеєрів
Валюти й мовиschemas/check_i18n.pyрізна базова валюта в A.5 і рамковому ТЗ, застарілий курс без позначки, непокрита мутація
Текст/схема/protoci/check_contract_text.py (U1–U5, N1–N5)розбіжність носія одиниці ваги або коду валюти між ТЗ, схемою і proto
Юніт і прийманнятести модуля + сценарії T1–T27розбіжність реалізації або поведінки з контрактом (модуль ще не реалізований)

Стан у цьому репозиторії: schemas/check_schema.py, schemas/check_i18n.py, ci/check_ruleset.py (R1–R11, 18 мутацій) і новий ci/check_doc_counts.py (D1–D8, 9 мутацій) проходять на 100% — перевірено в цій сесії, разом із самоперевіркою ci/check_doc_counts.py --self-test. ci/check_ruleset.py поки узгоджує лише конвеєр контракту й UI-сценаріїв — job proto, який мав би викликати ci/check_contract_text.py, ще не доданий.

Файли моделі