Example #1
0
        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);
        }
Example #2
0
        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);
            }
        }