public Drayage.Optimization.Model.Planning.Plan MapDomainToModelWithoutPlaceHolder(FRATIS.SFL.Domain.Planning.Plan plan) { var model = new Plan(); model.InjectFrom <DomainToModelValueInjection>(plan); foreach (var driverPlan in plan.DriverPlans) { var modelDriverPlan = model.DriverPlans.FirstOrDefault(f => f.Id == driverPlan.Id); if (modelDriverPlan == null) { continue; } var driver = driverPlan.Driver ?? _driverService.GetById(driverPlan.DriverId); var driverModel = new Drayage.Optimization.Model.Orders.Driver(); driverModel.InjectFrom <DomainToModelValueInjection>(driver); modelDriverPlan.Driver = driverModel.InjectFrom(driver) as Drayage.Optimization.Model.Orders.Driver; modelDriverPlan.RouteSegmentStatistics = new List <RouteSegmentStatistics>(); if (driverPlan.Driver.IsPlaceholderDriver) { continue; } modelDriverPlan.JobPlans = modelDriverPlan.JobPlans.OrderBy(f => f.SortOrder).ToList(); foreach (var jobPlan in driverPlan.JobPlans) { //var driverPlanJob = _planService.GetPlanDriverJobsById(jobPlan.Id); var modelJobPlan = modelDriverPlan.JobPlans.FirstOrDefault(f => f.Id == jobPlan.Id); modelJobPlan.Job = modelJobPlan.Job ?? new Drayage.Optimization.Model.Orders.Job(); MapDomainToModel(jobPlan.Job, modelJobPlan.Job, plan.PlanConfig.DueDate); } if (driverPlan.RouteSegmentMetrics == null) { driverPlan.RouteSegmentMetrics = new List <RouteSegmentMetric>(); } foreach (var x in driverPlan.RouteSegmentMetrics) { var rss = new RouteSegmentStatistics(); var endStop = ConvertRouteStop(x.EndStop); var startStop = ConvertRouteStop(x.StartStop); var statistics = new RouteStatistics(); var startTime = new TimeSpan(x.StartTime ?? 0); statistics.TotalCapacity = 0; statistics.TotalExecutionTime = new TimeSpan(x.TotalExecutionTime); statistics.TotalIdleTime = new TimeSpan(x.TotalIdleTime); statistics.TotalQueueTime = new TimeSpan(x.TotalQueueTime); statistics.TotalTravelDistance = x.TotalTravelDistance; statistics.TotalTravelTime = new TimeSpan(x.TotalTravelTime); rss.EndStop = endStop; rss.StartStop = startStop; rss.StartTime = startTime; rss.Statistics = statistics; rss.WhiffedTimeWindow = false; modelDriverPlan.RouteSegmentStatistics.Add(rss); } } return(model); }
public void MapModelToDomain(Plan planModel, Domain.Planning.Plan plan) { // create map so we have reference to same route stop var routeStopMap = new Dictionary <RouteStop, Domain.Orders.RouteStop>(); foreach (var driverPlanModel in planModel.DriverPlans) { PlanDriver planDriver = null; try { if (driverPlanModel.Id > 0) { planDriver = plan.DriverPlans.FirstOrDefault(f => f.Id == driverPlanModel.Id); } if (planDriver == null) { planDriver = new PlanDriver { DriverId = driverPlanModel.Driver.Id }; plan.DriverPlans.Add(planDriver); } } catch (Exception e) { Console.WriteLine(e); continue; } // RouteSegmentMetrics persistance disabled - transaction overhead exceeds realtime computation delay // Metrics planDriver.RouteSegmentMetrics.Clear(); int routeSegmentStatIndex = 0; foreach (var routeSegmentStatModel in driverPlanModel.RouteSegmentStatistics) { var startStop = GetOrCreateDomainRouteStop(routeStopMap, routeSegmentStatModel.StartStop); var endStop = GetOrCreateDomainRouteStop(routeStopMap, routeSegmentStatModel.EndStop); int?jobId = null; if (startStop.JobId.HasValue && startStop.JobId > 0) { jobId = startStop.JobId; } if (endStop.JobId.HasValue && endStop.JobId > 0) { jobId = endStop.JobId; // prefer the job id of the end stop } var routeSegmentMetric = new RouteSegmentMetric() { JobId = jobId, StartStopId = startStop.LocationId, EndStopId = endStop.LocationId, StartStop = startStop, EndStop = endStop, PlanDriver = planDriver, StartTime = routeSegmentStatModel.StartTime.Ticks, TotalExecutionTime = routeSegmentStatModel.Statistics.TotalExecutionTime.Ticks, TotalTravelDistance = routeSegmentStatModel.Statistics.TotalTravelDistance, TotalTravelTime = routeSegmentStatModel.Statistics.TotalTravelTime.Ticks, TotalIdleTime = routeSegmentStatModel.Statistics.TotalIdleTime.Ticks, TotalQueueTime = routeSegmentStatModel.Statistics.TotalQueueTime.Ticks, TruckState = (TruckState)routeSegmentStatModel.TruckState, SortOrder = routeSegmentStatIndex++, }; planDriver.RouteSegmentMetrics.Add(routeSegmentMetric); } // Update job plans int jobIndex = 0; foreach (var jobPlanModel in driverPlanModel.JobPlans) { var planDriverJob = planDriver.JobPlans.FirstOrDefault(jp => jp.JobId == jobPlanModel.Job.Id); if (planDriverJob == null) { planDriverJob = new PlanDriverJob() { JobId = jobPlanModel.Job.Id, SortOrder = jobIndex, DepartureTime = jobPlanModel.DepartureTime }; planDriver.JobPlans.Add(planDriverJob); } else { if (planDriverJob.SortOrder != jobIndex) { planDriverJob.SortOrder = jobIndex; } } jobIndex++; } // remove extra job plans var jobPlansToRemove = planDriver.JobPlans.Where(jp => driverPlanModel.JobPlans.All(f => f.Id != jp.Id)).ToList(); foreach (var jp in jobPlansToRemove) { planDriver.JobPlans.Remove(jp); } } foreach (var unassignedJob in planModel.UnassignedJobs) { var job = _jobService.GetById(unassignedJob.Id); plan.UnassignedJobs.Add(job); } }