//! Browser preview structs embedded in `Plan.view_state`. //! //! These values are derived from the domain plan before transport. They let the //! frontend render route summaries and timelines without duplicating every //! scoring rule. use serde::{Deserialize, Serialize}; /// Chooses whether routing uses fast straight lines or real road-network data. #[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum RoutingMode { StraightLine, #[default] RoadNetwork, } /// Selects which timeline rail the browser shows. #[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum TimelineView { #[default] ByVehicle, ByDelivery, } /// UI-only state that travels with the plan between browser and backend. #[derive(Clone, Debug, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PlanViewState { #[serde(default)] pub timeline_view: TimelineView, pub selected_vehicle_id: Option, pub selected_delivery_id: Option, #[serde(default)] pub preview: Option, } /// Aggregate route and score preview for the full plan. #[derive(Clone, Debug, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PlanPreview { pub hard_score: i64, pub soft_score: i64, pub unassigned_delivery_ids: Vec, pub vehicles: Vec, pub deliveries: Vec, } /// Per-vehicle route summary used by cards, lists, and timelines. #[derive(Clone, Debug, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct VehiclePreview { pub vehicle_id: usize, pub vehicle_name: String, pub total_demand: i32, pub capacity_overage: i32, pub stop_count: usize, pub total_travel_seconds: i64, pub total_wait_seconds: i64, pub total_service_seconds: i64, pub total_late_seconds: i64, pub start_time: i64, pub end_time: i64, pub stops: Vec, } /// One delivery stop on a vehicle timeline. #[derive(Clone, Debug, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct VehiclePreviewStop { pub delivery_id: usize, pub label: String, pub kind: String, pub sequence: usize, pub demand: i32, pub min_start_time: i64, pub max_end_time: i64, pub arrival_time: i64, pub service_start_time: i64, pub departure_time: i64, pub travel_seconds_from_previous: i64, pub wait_seconds: i64, pub late_seconds: i64, } /// Per-delivery assignment summary used by data tables and timelines. #[derive(Clone, Debug, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct DeliveryPreview { pub delivery_id: usize, pub label: String, pub kind: String, pub demand: i32, pub min_start_time: i64, pub max_end_time: i64, pub service_duration: i64, pub assigned_vehicle_id: Option, pub assigned_vehicle_name: Option, pub sequence: Option, pub arrival_time: Option, pub service_start_time: Option, pub departure_time: Option, pub late_seconds: Option, }