FuelBuddyでは、フランチャイズアプリケーションのコアエンジニアを務めました。これはフランチャイズ事業者が地域拠点、在庫、配送フリートを管理するために使うアプリです。
作ったもの
- リアルタイムのトラック追跡: フリートの現在地をポーリング間隔で表示するインタラクティブなGoogle Mapsモジュールを構築し、事業者にトラックの動きと配車状況への継続的な可視性をもたらしました。
- GraphQL APIとキャッシュ: urqlを通じてHasura GraphQLエンジンを使うデータAPIを構築し、正規化されたクライアント側キャッシュと、期限切れ時の自動トークン更新を実装しました。
- ワークフローの簡素化: 在庫照合やドライバー割り当てを含む複数ステップの運用タスクを、運用ミスを減らす簡素化されたインターフェースへと再設計しました。
なぜ意味があったか
フリート追跡により配車ロジスティクスの予測が立てやすくなり、トラックのアイドル時間が減りました。割り当てと在庫のワークフローを簡素化したことで、フランチャイズ拠点全体で運用ミスが減りました。
ここでの「リアルタイム」の実際の意味
トラック地図はGraphQLサブスクリプションではなくポーリング間隔で更新されます。同じクライアントがアプリの他の場所ではサブスクリプション用に配線されている(graphql-wsは設定済みで注文ステータスの更新には使われていますが、この地図には使われていません)にもかかわらずです。これは見落としではなく、意図的なサーバーコストのトレードオフです。サブスクリプションはクライアントが開いている限りサーバー上に永続的な接続を保持しますが、各ディスパッチャーのシフトを通じて何時間も開かれたままの地図画面は、一度きりの注文ステータス更新よりもはるかに重く、長時間続く接続の負荷になります。ポーリングはその接続を開いたままにすることを避け、代わりに定期的なリクエスト/レスポンスのサイクルに置き換えます。
割り当てと在庫の詳細
ドライバー割り当ては、単一の「割り当て」アクションだけでなく、単体、一括、再割り当て、割り当て解除のフローをカバーしています。在庫追跡は特に燃料ボーザー(タンカートラック)の在庫残高を追跡するもので、専用の在庫残高クエリとログテーブルを備えた、汎用の部品在庫ではない実際の運用データモデルです。
データモデルと規模
- urqlの正規化キャッシュに加え、401/期限切れトークンのレスポンスで自動的に更新されるFirebaseトークンの認証層があり、セッションの期限切れがディスパッチャーの作業を中断させません。
- Playwrightはログインと注文管理をエンドツーエンドでカバーしています。これはアプリの他のすべての画面が依存している2つのフローです。
Stack
Vue 3、Vite、Pinia、Hasuraに対するurql、Firebase認証、Google Maps、テストにPlaywright。