Beispiel #1
0
        public async Task <MatchDeliveryDemandResult> MatchDeliveryDemand(MatchDeliveryDemandRequest request)
        {
            var getDeliveryDemandsRequest = new GetDeliveryDemandsRequest
            {
                Status = "Pending"
            };
            var getDeliveryDemandsResult = await _transactionStore.GetDeliveryDemands(getDeliveryDemandsRequest);

            var deliveryDemands           = getDeliveryDemandsResult.DeliveryDemands;
            var matchDeliveryDemandResult = await _matchingService.MatchUserToDeliveryDemand(deliveryDemands, request);

            return(matchDeliveryDemandResult);
        }
        public async Task <MatchDeliveryDemandResult> MatchDeliveryDemand(MatchDeliveryDemandRequest matchDeliveryDemandRequest)
        {
            string             json    = JsonConvert.SerializeObject(matchDeliveryDemandRequest);
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "api/transactions/delivery-demands/match")
            {
                Content = new StringContent(json, Encoding.UTF8, "application/json")
            };

            HttpResponseMessage responseMessage = await _httpClient.SendAsync(request);

            await EnsureSuccessOrThrowAsync(responseMessage);

            string recievedJson = await responseMessage.Content.ReadAsStringAsync();

            var matchDeliveryDemandResult = JsonConvert.DeserializeObject <MatchDeliveryDemandResult>(recievedJson);

            return(matchDeliveryDemandResult);
        }
Beispiel #3
0
        private async void DeliveryInfoPanel_FindDeliveryDemandMatch_Click(object sender, EventArgs e)
        {
            var timeWindowStart = ToUnixTime(DeliveryInfoPanel_DatePicker.Value, DeliveryInfoPanel_TimePicker1.Value);
            var timeWindowEnd   = ToUnixTime(DeliveryInfoPanel_DatePicker.Value, DeliveryInfoPanel_TimePicker2.Value);
            var location        = new Location
            {
                Longitude = Convert.ToDouble(DeliveryInfoPanel_Longitude.Text),
                Latitude  = Convert.ToDouble(DeliveryInfoPanel_Latitude.Text)
            };
            var matchDeliveryDemandRequest = new MatchDeliveryDemandRequest
            {
                TimeWindowStart    = timeWindowStart,
                TimeWindowEnd      = timeWindowEnd,
                DelivererLocation  = location,
                TransportationType = transportationType[DeliveryInfoPanel_TransportationType.Text]
            };
            var matchDeliveryDemandResult = await client.MatchDeliveryDemand(matchDeliveryDemandRequest);

            matchedDeliveryDemand = matchDeliveryDemandResult.DeliveryDemand;
            ETA = matchDeliveryDemandResult.ETA;
            Navigate(DeliveryDemandMatchPanel);
        }
        public async Task <IActionResult> MatchDeliveryDemand([FromBody] MatchDeliveryDemandRequest request)
        {
            var matchDeliveryDemandResult = await _transactionService.MatchDeliveryDemand(request);

            return(Ok(matchDeliveryDemandResult));
        }
        public async Task <MatchDeliveryDemandResult> MatchUserToDeliveryDemand(List <DeliveryDemand> deliveryDemandsRaw, MatchDeliveryDemandRequest request)
        {
            var deliveryDemands = new List <DeliveryDemand>();

            // We filter out all active delivery demands that cannot fit in this time range (i.e mutually exclusive time windows)
            foreach (var deliveryDemand in deliveryDemandsRaw)
            {
                if (!(deliveryDemand.TimeWindowEnd < request.TimeWindowStart || request.TimeWindowEnd < deliveryDemand.TimeWindowStart))
                {
                    deliveryDemands.Add(deliveryDemand);
                }
            }

            //we get the estimated duration time that it would take for the deliverer to complete each delivery demand,
            //and make sure that the delivery demand's eta is compatible with both the deliverer and the donor's time windows
            var deliveryDemandsETA = new List <(double, DeliveryDemand)>();

            foreach (var deliveryDemand in deliveryDemands)
            {
                var eta = await _routingService.GetETA(request.DelivererLocation, deliveryDemand.PickupLocation, deliveryDemand.DestinationLocation, request.TransportationType);

                if (request.TimeWindowStart + eta < request.TimeWindowEnd &&
                    request.TimeWindowStart + eta > deliveryDemand.TimeWindowStart &&
                    request.TimeWindowStart + eta < deliveryDemand.TimeWindowEnd)
                {
                    deliveryDemandsETA.Add((eta, deliveryDemand));
                }
            }

            if (deliveryDemandsETA.Count == 0)
            {
                return(null);
            }


            //Sort the delivery demands from least to most time consuming to deliverer
            deliveryDemandsETA.Sort((x, y) => y.Item1.CompareTo(x.Item1));
            return(new MatchDeliveryDemandResult
            {
                DeliveryDemand = deliveryDemandsETA[0].Item2,
                ETA = deliveryDemandsETA[0].Item1
            });
        }