예제 #1
0
        public IList <int> GetInfeasibleJobIds(IList <Job> jobs, Driver driver, DateTime?planDate)
        {
            var optimizationJobs = new List <Drayage.Optimization.Model.Orders.Job>();

            foreach (var job in jobs)
            {
                var optimizationJob = new Drayage.Optimization.Model.Orders.Job();
                _mapperService.MapDomainToModel(job, optimizationJob, planDate);
                optimizationJobs.Add(optimizationJob);
            }

            var optimizationDriver = new Drayage.Optimization.Model.Orders.Driver();

            _mapperService.MapDomainToModel(driver, optimizationDriver);

            var result = _planGenerator.GetInfeasibleJobIds(optimizationJobs, optimizationDriver);

            return(result);
        }
예제 #2
0
        public void MapDomainToModel(Job job, Drayage.Optimization.Model.Orders.Job optimizationJob, DateTime?planDate)
        {
            optimizationJob.InjectFrom <DomainToModelValueInjection>(job);

            var equipmentConfiguration = new EquipmentConfiguration();

            equipmentConfiguration.InjectFrom <DomainToModelValueInjection>(job);

            optimizationJob.EquipmentConfiguration = equipmentConfiguration;

            var modelRouteStops = optimizationJob.RouteStops.ToList();

            optimizationJob.RouteStops.Clear();

            if (job.RouteStops != null && optimizationJob.RouteStops != null)
            {
                job.RouteStops = job.RouteStops.OrderBy(p => p.SortOrder).ToList();


                int addDaysValue = 0;
                if (job.DueDate.HasValue && planDate.HasValue && job.DueDate.Value > planDate)
                {
                    addDaysValue = (int)job.DueDate.Value.Subtract(planDate.Value).TotalDays;
                    for (var x = 0; x < job.RouteStops.Count; x++)
                    {
                        if (addDaysValue >= 1)
                        {
                            //job.RouteStops[x].WindowStart =
                            //    job.RouteStops[x].WindowStart +

                            //    TimeSpan.FromDays(addDaysValue).Ticks;
                            //job.RouteStops[x].WindowEnd = job.RouteStops[x].WindowEnd +
                            //                                TimeSpan.FromDays(addDaysValue).Ticks;
                        }
                    }
                }

                var routeStopIndex = 0;
                foreach (var routeStop in job.RouteStops)
                {
                    var modelRouteStop = modelRouteStops.FirstOrDefault(f => f.Id == routeStop.Id);
                    if (modelRouteStop != null)
                    {
                        routeStop.SortOrder = routeStopIndex++;

                        if (routeStop.Location != null && routeStop.Location.WaitingTime.HasValue)
                        {
                            modelRouteStop.QueueTime = new TimeSpan(0, routeStop.Location.WaitingTime.Value, 0);
                        }

                        // fixed hotspot
                        if (routeStop.LocationId != null && routeStop.Location == null)
                        {
                            var location = _locationService.GetById((int)routeStop.LocationId);
                            routeStop.LocationId = location.Id;
                            routeStop.Location   = location;
                        }

                        if (routeStop.StopAction != null)
                        {
                            modelRouteStop.StopAction = StopActions.Actions.FirstOrDefault(p => p.ShortName == routeStop.StopAction.ShortName);
                        }

                        if (routeStop.StopDelay.HasValue)
                        {
                            modelRouteStop.ExecutionTime = new TimeSpan(0, Convert.ToInt32(routeStop.StopDelay.Value), 0);
                        }

                        var dueDateLocal = _dateTimeHelper.ConvertUtcToLocalTime(job.DueDate.Value);


                        modelRouteStop.WindowStart = new TimeSpan(routeStop.WindowStart);
                        modelRouteStop.WindowEnd   = new TimeSpan(routeStop.WindowEnd);

                        // map stop action
                        modelRouteStop.StopAction = MapDomainToModel(routeStop.StopAction);
                        // Remove Dynamic stops
                        if (routeStop.IsDynamicStop)
                        {
                            optimizationJob.RouteStops.Remove(modelRouteStop);
                        }

                        optimizationJob.RouteStops.Add(modelRouteStop);
                    }
                    else
                    {
                        var nullModelRouteStop = modelRouteStop;
                    }
                }
            }

            _routeSanitizer.PrepareJob(optimizationJob);
        }