- Add travel-svc microservice (Amadeus, TravelPayouts, 2GIS, OpenRouteService) - Add travel orchestrator with parallel collectors (events, POI, hotels, flights) - Add 2GIS road routing with transport cost calculation (car/bus/taxi) - Add TravelMap (2GIS MapGL) and TravelWidgets components - Add useTravelChat hook for streaming travel agent responses - Add finance heatmap providers refactor - Add SearXNG settings, API proxy routes, Docker compose updates - Update Dockerfiles, config, types, and all UI pages for consistency Made-with: Cursor
88 lines
4.6 KiB
Markdown
88 lines
4.6 KiB
Markdown
# Недоделки — начать отсюда
|
||
|
||
## Последнее изменение (01.03.2026)
|
||
|
||
### СДЕЛАНО: Маршруты по дорогам + стоимость проезда
|
||
|
||
#### Что сделано:
|
||
|
||
**1. `backend/internal/travel/twogis.go` — 2GIS Routing API клиент:**
|
||
- Метод `GetRoute(ctx, points, transport)` — POST `routing.api.2gis.com/routing/7.0.0/global`
|
||
- Поддержка transport: `driving`, `taxi`, `walking`, `bicycle`
|
||
- Парсинг WKT LINESTRING из `outcoming_path.geometry[].selection`
|
||
- Сборка `RouteDirection` с geometry, distance, duration, steps
|
||
|
||
**2. `backend/internal/travel/service.go` — переключение на 2GIS:**
|
||
- `GetRoute()` сначала пробует 2GIS Routing, fallback на OpenRouteService
|
||
- `mapProfileToTwoGISTransport()` — маппинг профилей
|
||
|
||
**3. `backend/internal/agent/travel_data_client.go` — обновлённый клиент:**
|
||
- `GetRoute(ctx, points, transport)` — полный `RouteDirectionResult` с geometry
|
||
- `GetRouteSegments()` — маршруты между каждой парой точек
|
||
- Новые типы: `RouteDirectionResult`, `RouteGeometryResult`, `RouteStepResult`, `RouteSegmentResult`
|
||
|
||
**4. `backend/internal/agent/travel_orchestrator.go` — дорожные маршруты:**
|
||
- `emitTravelWidgets()` вызывает `buildRoadRoute()` вместо прямых линий
|
||
- `buildTransportSegments()` — маршруты между каждой парой точек
|
||
- `calculateTransportCosts()` — расчёт стоимости (машина ~8₽/км, автобус ~2.5₽/км, такси ~100₽+18₽/км)
|
||
- `routeDirection` и `segments` передаются в виджеты `travel_map` и `travel_itinerary`
|
||
|
||
**5. Фронтенд — отображение дорожных маршрутов:**
|
||
- `types.ts` — новые типы `RouteSegment`, `TransportCostOption`, расширены `TravelMapWidgetParams` и `TravelItineraryWidgetParams`
|
||
- `useTravelChat.ts` — извлечение `routeDirection` и `segments` из виджетов, новые state
|
||
- `travel/page.tsx` — передача `routeDirection` в `TravelMap`
|
||
- `TravelWidgets.tsx` — `TransportSegmentCard` между элементами маршрута с иконками машина/автобус/такси и ценами
|
||
|
||
---
|
||
|
||
### СДЕЛАНО ранее: Переработка POI коллектора — 2GIS как основной источник
|
||
|
||
(см. предыдущую версию CONTINUE.md)
|
||
|
||
---
|
||
|
||
## Осталось сделать
|
||
|
||
### Высокий приоритет
|
||
|
||
1. **Цены отелей из SearXNG** — LLM не всегда извлекает цены (0 RUB/night). Нужно:
|
||
- Добавить fallback: если цена 0, попробовать парсить из snippet
|
||
- Файл: `backend/internal/agent/travel_hotels_collector.go`
|
||
|
||
2. **Авиабилеты для маршрутов** — "Золотое кольцо" не имеет IATA кода. Нужно:
|
||
- Если destination не IATA, искать билеты до первого конкретного города в маршруте
|
||
- Файл: `backend/internal/agent/travel_flights_collector.go`
|
||
|
||
### Средний приоритет
|
||
|
||
3. **Drag & drop в ItineraryWidget** — перетаскивание элементов между днями
|
||
4. **Кеш SearXNG результатов** — Redis кеш на 10-30 минут
|
||
5. **Сохранение draft в БД** — персистентность TripDraft через trip_drafts таблицу
|
||
|
||
### Низкий приоритет
|
||
|
||
6. **Экспорт маршрута** — PDF/Markdown
|
||
7. **Real-time обновления** — WebSocket для тредов
|
||
|
||
---
|
||
|
||
## Контекст
|
||
|
||
### Архитектура travel pipeline:
|
||
|
||
```
|
||
User -> /travel page -> streamTravelAgent() -> api-gateway -> chat-svc -> agent-svc
|
||
-> RunTravelOrchestrator:
|
||
1. Planner Agent (LLM) -> TripBrief
|
||
2. Geocode destinations -> travel-svc -> 2GIS Geocoder API
|
||
3. Parallel collectors:
|
||
- Events: SearXNG -> Crawl4AI -> LLM extraction -> geocode (2GIS)
|
||
- POI: 2GIS Places API (primary) -> LLM enrichment -> SearXNG fallback
|
||
- Hotels: SearXNG -> Crawl4AI -> LLM extraction -> geocode (2GIS)
|
||
- Transport: TravelPayouts API
|
||
4. Itinerary Builder (LLM) -> ItineraryDay[]
|
||
5. Road routing: 2GIS Routing API -> RouteDirection (дорожная геометрия)
|
||
6. Transport costs: calculateTransportCosts() -> машина/автобус/такси
|
||
7. Widget emission -> NDJSON stream -> frontend (карта 2GIS MapGL)
|
||
```
|