複数の場所に立ち寄る旅行と旅程: 冒険の計画
グループ旅行は簡単なイベントではありません。そして一連のステージ、 数日間に渡る旅行、予約、アクティビティ さらに多くの目的地へ。で イベントをプレイする トラベルモジュールは、 自律集合体、 独自のライフサイクル、予算、管理ロジックを備えています。
この記事でわかること
- 旅行の集合体とそのライフサイクル
- ステージ、アクティビティ、宿泊施設、交通手段
- イベント予算とは別の旅行予算
- 提案のための外部 API との統合
- MapLibre GL を使用したインタラクティブな地図
- クイック共有用の QR コード
トラベルアグリゲート
Il 航海 そして中心となるコンセプト。それは単なるものではありません 「数日間続く出来事」: 独自のアイデンティティ、独自の状態を持っています。 およびそれを構成する子エンティティのセット。
public enum StatoViaggio {
DRAFT, // Bozza: in fase di pianificazione
PLANNED, // Pianificato: itinerario definito
CONFIRMED, // Confermato: partecipanti e prenotazioni ok
IN_PROGRESS, // In corso: il viaggio e iniziato
COMPLETED // Completato: viaggio terminato
}
TRANSIZIONI VALIDE:
DRAFT ──────► PLANNED ──────► CONFIRMED
│
▼
IN_PROGRESS ──► COMPLETED
Note:
- Da qualsiasi stato si può tornare a DRAFT (ripianificazione)
- COMPLETED e uno stato finale
- IN_PROGRESS si attiva automaticamente alla data di partenza
各状態遷移は自動アクションをトリガーできます。たとえば、 CONFIRMED に切り替えると、システムは i を使用して参加者に通知を送信します。 最終的な旅程の詳細。
トリップストップ: 旅程の要点
旅は 1 つ以上で構成されます トリップストップ。あらゆるステージ 独自の日付、アクティビティ、ロジスティックスを備えた目的地を表します。
@Entity
public class TappaViaggio {
private Long id;
private Long viaggioId;
private String nome; // "Roma - Centro Storico"
private Integer ordine; // Posizione nell'itinerario
private Destinazione destinazione; // Coordinate + citta + paese
private LocalDate dataArrivo;
private LocalDate dataPartenza;
private String note;
// Relazioni
private List<AttivitaViaggio> attivita;
private List<AlloggioViaggio> alloggi;
private List<TrasportoViaggio> trasporti;
}
座標付きの目的地
各ステージには、 行き先 座標を含む 地理的位置 (緯度と経度)、都市名、国名。 座標は、インタラクティブ マップ上にマーカーを配置するために使用されます。 ステージ間の距離と移動時間を計算します。
アクティビティ、宿泊施設、交通手段
各ステージには、全員をカバーする 3 種類のサブエンティティを含めることができます 旅行の物流面。
アクティビティ旅行
ステージ中に計画されているアクティビティ: ガイド付きツアー、小旅行、 ディナー、地元のイベント。各アクティビティには時間、推定所要時間が設定されています。 オプション料金と予約リンク。
宿泊旅行
宿泊施設に関する情報: 建物の名前、住所、 チェックインとチェックアウトの日付、予約番号、料金。 このシステムはステージごとに複数の宿泊施設をサポートしており、グループで参加する場合に便利です。 異なる構造に分かれています。
交通旅行旅行
飛行機、電車、バスなど、あるステージから別のステージへはどのように移動しますか? レンタカー。各交通手段には車両の種類と時間が含まれます 出発時刻と到着時刻、予約番号、料金。
VIAGGIO: "Weekend a Roma" (3 giorni, 6 partecipanti)
TAPPA 1: Roma Centro (Giorno 1-2)
├── Destinazione: Roma, Italia (41.9028, 12.4964)
├── Alloggio: Hotel Forum ★★★★
│ ├── Check-in: 14:00
│ └── Costo: 180 EUR/notte
├── Attivita:
│ ├── Colosseo e Foro Romano (09:00 - 12:00, 16 EUR/persona)
│ ├── Pranzo a Trastevere (12:30 - 14:00)
│ └── Musei Vaticani (15:00 - 18:00, 17 EUR/persona)
└── Trasporto IN: Volo FR1234 (Bari → Roma Fiumicino, 07:00)
TAPPA 2: Roma Nord (Giorno 3)
├── Destinazione: Roma, Italia (41.9109, 12.4818)
├── Attivita:
│ ├── Villa Borghese (09:00 - 11:00, gratuito)
│ └── Shopping Via del Corso (11:30 - 14:00)
└── Trasporto OUT: Treno FR9876 (Roma Termini → Bari, 16:00)
専用の旅行予算
旅行の予算 完全に別個の 予算から 関連するイベントの。これは、支出のダイナミクスが異なるためです。 旅行では、費用は数日間、カテゴリー、ステージに分散されます。
予算の分離
Le 旅費 独自のカテゴリ (輸送、 宿泊施設、ビザ、アクティビティなど)と独自の分割方法。あ 参加者は旅行の片行分のみに参加できるため、 その特定の段階の費用にのみ貢献します。
旅行のタスク: 旅行者のやるべきことリスト
すべての旅行には次のリストがあります タスクトラベル: やるべきこと 旅行前、旅行中、旅行後。航空券の予約、ビザの申請、 荷物をまとめ、ホテルを確認します。
タスクは特定の参加者に割り当てることができ、 期限、優先順位、ステータス (やるべきこと、進行中、完了したもの)。システム 期限が迫っているタスクの自動リマインダーを送信します。
外部 API: スマートな提案
最も興味深い機能の 1 つは、外部 API との統合です。 計画中に提案を提供するため。
提案用の統合 API
- 指名 (OpenStreetMap): ジオコーディングとリバース ジオコーディング。都市の名前を指定すると座標を返し、その逆も同様です。
- ウィキボヤージュ: 目的地の観光情報。ガイド、実践的なアドバイス、コミュニティからの関心事項。
- フォースクエア: 目的地近くのレストラン、バー、観光スポット、アクティビティの提案。
- トリップマップを開く: 説明、写真、評価を含む観光スポットのデータベース。
ユーザーが目的地を選択すると、システムは目的地を照会します。 API を並行して実行し、カテゴリ別に整理された結果を表示します。 何を見て、どこで食べて、どこで寝て、何をするか。
Frontend (Angular)
│
▼
Spring Boot API Gateway
│
├──► Nominatim API → Coordinate, indirizzi
├──► WikiVoyage API → Guide turistiche
├──► Foursquare API → Ristoranti, attrazioni
└──► OpenTripMap API → Punti di interesse
Risultati aggregati e cachati (TTL: 24h)
│
▼
Frontend: Card suggerimenti con "Aggiungi alla tappa"
MapLibre GL を使用したインタラクティブな地図
旅程は地図上で生き生きと表現されます。 マップリブレGL。 各ステージは番号付きマーカーとして表示され、他のステージとリンクされています。 動きを表す線で段階を表します。
ユーザーは地図を操作できます。マーカーをクリックすると、地図が表示されます。 ステージの詳細を確認し、マーカーをドラッグして旅程を並べ替えます。 ズームして近くの観光スポットを探索します。
地図の特徴
- 旅程上の各停留所の番号付きマーカー
- 連続するステージ間の接続線
- クリックするとステージの詳細がポップアップ表示されます
- 推奨される観光スポットのレイヤー
- ステージ間の距離を計算する
- 衛星ビューと道路地図
共有用QRコード
あらゆる旅が生み出すのは、 ユニークなQRコード これにより、次のことが可能になります 旅程をすぐに共有します。コードをスキャンすると、新しい 参加者は、すべての情報を含む旅行ページにアクセスします。 ステージ、日付、宿泊施設、アクティビティ、交通手段。
これは、会議中などのライブ状況で特に便利です。 組織的には、主催者がQRコードを投影し、参加者全員が参加します 簡単なスキャンで旅に参加できます。
出発日と帰国日
旅行には世界中の出発日と帰国日があり、旅行全体を区切ります。 期間。個々のステージの日付はこの範囲内に収まる必要があります。 システムは時間的コヒーレンスを自動的に検証します。 出発前に開始することも、帰国後に終了することもできます。
自動時間検証
- ステージは時間的に重複できません
- ステージの順序は時系列を尊重する必要があります
- トランスポートは連続したステージを接続する必要があります
- 宿泊施設のチェックインはステージへの到着と同時に行う必要があります
- IN_PROGRESS ステータスは出発日に有効になります。
重要なポイント
- Journey はライフサイクル内に 5 つの状態を持つ自律的な集合体です
- 各停留所でアクティビティ、宿泊施設、交通機関を手配します
- 旅行予算を個別に分けて正確な財務管理を実現
- インテリジェントな目的地提案のための 4 つの外部 API
- インタラクティブなルート表示用の MapLibre GL
- 参加者とすぐに共有できる QR コード
ソースコードは次の場所から入手できます。 GitHub。 実際の旅行モジュールを探索するには、次のサイトにアクセスしてください。 www.playtheevent.com.







