Example #1
0
        /// <summary>
        /// Submits job to the VRP service.
        /// </summary>
        /// <param name="request">Request describing job to be submitted.</param>
        /// <returns>Result of the job submitting.</returns>
        /// <exception cref="T:ESRI.ArcLogistics.Routing.RestException">error was
        /// returned by the REST API.</exception>
        /// <exception cref="T:ESRI.ArcLogistics.CommunicationException">failed
        /// to communicate with the REST VRP service.</exception>
        public GetVrpJobResultResponse SubmitJob(SubmitVrpJobRequest request)
        {
            Debug.Assert(request != null);

            var url   = UriHelper.Concat(_baseUrl, QUERY_OBJ_SUBMIT_JOB);
            var query = RestHelper.BuildQueryString(
                request,
                _context.KnownTypes,
                false);

            // log request
            Logger.Info(String.Format(MSG_SUBMIT_JOB, request.OperationType,
                                      request.OperationDate.ToString("d"),
                                      query));

            HttpRequestOptions opt = new HttpRequestOptions();

            opt.Method          = HttpMethod.Post;
            opt.UseGZipEncoding = true;
            opt.Timeout         = DEFAULT_REQ_TIMEOUT;

            return(_restService.SendRequest <GetVrpJobResultResponse>(
                       _context,
                       url,
                       query,
                       opt));
        }
Example #2
0
        protected override SubmitVrpJobRequest BuildRequest(
            SolveRequestData reqData)
        {
            SubmitVrpJobRequest req = base.BuildRequest(reqData);

            _AdjustRequestWithTargetSequence(req, _inputParams, _violations);

            _jobRequest = req;

            return(req);
        }
Example #3
0
        /// <summary>
        /// Adjusts VRP job request for cases when target sequence parameter is set.
        /// Does nothing if <paramref name="parameters"/> have no target sequence
        /// or order to be assigned is a violated one.
        /// </summary>
        /// <param name="request">Request to be adjusted.</param>
        /// <param name="parameters">Assign orders operation parameters to be
        /// used for adjusting the request.</param>
        /// <param name="violations">Collection of violations to be checked.</param>
        /// <exception cref="T:ESRI.ArcLogistics.Routing.RouteException">when
        /// <paramref name="request"/> does not contain order from
        /// <paramref name="parameters"/>.</exception>
        private void _AdjustRequestWithTargetSequence(
            SubmitVrpJobRequest request,
            AssignOrdersParams parameters,
            IEnumerable <Violation> violations)
        {
            Debug.Assert(request != null);
            Debug.Assert(parameters != null);
            Debug.Assert(violations != null);

            if (!parameters.TargetSequence.HasValue)
            {
                return;
            }

            Debug.Assert(parameters.OrdersToAssign.Count == 1); // must contain a single order
            Debug.Assert(parameters.TargetRoutes.Count == 1);   // must contain a single route

            var orderToAssign = parameters.OrdersToAssign.First();

            Debug.Assert(orderToAssign != null);

            if (violations.Any(v => v.AssociatedObject == orderToAssign))
            {
                return;
            }

            GPFeature targetFeature;

            if (!_FindTargetFeature(request.Orders, orderToAssign, out targetFeature))
            {
                throw new RouteException(Properties.Messages.Error_InternalRouteError);
            }

            // free place for new order position
            var targetSequence = parameters.TargetSequence.Value;

            Debug.Assert(targetSequence > 0);

            if (_HasSequence(request.Orders, targetSequence))
            {
                _ShiftSequence(request.Orders, targetSequence);
            }

            // set assignment attributes
            var targetRoute = parameters.TargetRoutes.First();

            Debug.Assert(targetRoute != null);

            targetFeature.Attributes.Set(NAAttribute.SEQUENCE, targetSequence);
            targetFeature.Attributes.Set(NAAttribute.ROUTE_NAME, targetRoute.Id.ToString());
            targetFeature.Attributes.Set(NAAttribute.ASSIGNMENT_RULE,
                                         (int)NAOrderAssignmentRule.esriNAOrderPreserveRouteAndRelativeSequence);
        }
        /// <summary>
        /// Checks if the VRP request is short enough to be services with the
        /// synchronous VRP service.
        /// </summary>
        /// <param name="request">The reference to the request object to be
        /// analyzed.</param>
        /// <returns>True if the request could be executed with a synchronous VRP
        /// service.</returns>
        public bool CanExecuteSyncronously(SubmitVrpJobRequest request)
        {
            Debug.Assert(request != null);
            Debug.Assert(request.Orders != null);
            Debug.Assert(request.Orders.Features != null);
            Debug.Assert(request.Routes != null);
            Debug.Assert(request.Routes.Features != null);

            if (request.Orders.Features.Length > _maxOrders ||
                request.Routes.Features.Length > _maxRoutes)
            {
                return(false);
            }

            return(true);
        }
Example #5
0
        /// <summary>
        /// Executes VRP job synchronously.
        /// </summary>
        /// <param name="request">The reference to the request object to be
        /// send to the server.</param>
        /// <returns>Result of the synchronous job execution.</returns>
        /// <exception cref="T:ESRI.ArcLogistics.Routing.RestException">error was
        /// returned by the REST API.</exception>
        /// <exception cref="T:ESRI.ArcLogistics.CommunicationException">failed
        /// to communicate with the REST VRP service.</exception>
        public SyncVrpResponse ExecuteJob(SubmitVrpJobRequest request)
        {
            Debug.Assert(request != null);
            Debug.Assert(_syncContext != null);

            var url   = UriHelper.Concat(_syncContext.Url, QUERY_OBJ_EXECUTE_TASK);
            var query = RestHelper.BuildQueryString(
                request,
                _syncContext.Context.KnownTypes,
                false);

            var options = new HttpRequestOptions()
            {
                Method          = HttpMethod.Post,
                UseGZipEncoding = true,
                Timeout         = EXEC_TASK_TIMEOUT,
            };

            return(_syncRestService.SendRequest <SyncVrpResponse>(
                       _syncContext.Context,
                       url,
                       query,
                       options));
        }
        protected override IList <RouteResult> ConvertResult(
            VrpResult vrpResult,
            SubmitVrpJobRequest request)
        {
            // convert current route results
            List <RouteResult> routeResults = new List <RouteResult>(
                base.ConvertResult(vrpResult, request));

            // add route results from previous solve for those routes that
            // were not used in the last solve
            List <RouteResult> prevRouteResults = new List <RouteResult>();

            foreach (RouteResult rr in _prevRouteResults)
            {
                if (!_ContainsRoute(routeResults, rr.Route))
                {
                    prevRouteResults.Add(rr);
                }
            }

            routeResults.AddRange(prevRouteResults);

            return(routeResults);
        }
 /// <summary>
 /// Does nothing but returns boolean constant passed to the constructor.
 /// </summary>
 /// <param name="request">The reference to the request object to be
 /// analyzed.</param>
 /// <returns>A value passed to the constructor.</returns>
 public bool CanExecuteSyncronously(SubmitVrpJobRequest request)
 {
     return(_executeSynchronously);
 }