Beispiel #1
0
        public async Task <BookingRouteAM> CalculateBookingRoute(RouteAM route, CargoAM cargo, BasketAM requestBasket)
        {
            var rootAddress   = RouteService.GetRootAddress(route);
            var feedDistance  = RouteService.GetFeedDistance(route);
            var feedDuration  = RouteService.GetFeedDuration(route);
            var totalDistance = RouteService.GetTotalDistance(route);

            var billInfo = await BillService.GetBillInfo(rootAddress.ToCoordinate(), cargo.WeightCatalogItemId);

            // клонируем т.к. количество километров для каждого маршрута - индивидуально, а параметром передается общий объект
            var basket = requestBasket.Clone() as BasketAM;

            basket.KmValue = totalDistance;

            var bill = await BillService.CalculateBill(billInfo, basket);

            var title = $"{rootAddress.Locality} - {bill.TotalCost}₽";

            return(new BookingRouteAM
            {
                RootAddress = rootAddress,
                FeedDistance = feedDistance,
                FeedDuration = feedDuration,
                TotalDistance = totalDistance,
                Bill = bill,
                Title = title
            });
        }
 public Task <Cargo> CreateDomainCargo(CargoAM cargo)
 {
     return(DomainCargoService.Create(
                cargo.WeightCatalogItemId,
                cargo.KindCatalogItemId,
                cargo.BrandCatalogItemId,
                cargo.RegistrationNumber,
                cargo.Comment));
 }
        public async Task CreateDomainCargo()
        {
            var commonId = 1;

            var cargo = new CargoAM
            {
                WeightCatalogItemId = commonId++,
                KindCatalogItemId   = commonId++,
                BrandCatalogItemId  = commonId++,
                RegistrationNumber  = "к232уу777",
                Comment             = "Не работате пневма"
            };

            await Suite.CargoService.CreateDomainCargo(cargo);

            Suite.DomainCargoServiceMock
            .Verify(m => m.Create(
                        cargo.WeightCatalogItemId,
                        cargo.KindCatalogItemId,
                        cargo.BrandCatalogItemId,
                        cargo.RegistrationNumber,
                        cargo.Comment));
        }
Beispiel #4
0
        public async Task CalculateBookingRoute()
        {
            var commonId = 1;

            var rootAddress = new AddressAM
            {
                Locality  = "Ярославль",
                Latitude  = 11.1111,
                Longitude = 22.2222
            };

            var billInfo = new BillInfoAM
            {
                PriceId = commonId++,
                CommissionPercentage = 10,
                DegreeOfDifficulty   = 1
            };

            var basket = new BasketAM
            {
                KmValue             = 0,
                LoadingValue        = 1,
                LockedSteeringValue = 0,
                LockedWheelsValue   = 3,
                OverturnedValue     = 0,
                DitchValue          = 1
            };

            var cargo = new CargoAM
            {
                BrandCatalogItemId  = commonId++,
                KindCatalogItemId   = commonId++,
                RegistrationNumber  = "e111ey777",
                WeightCatalogItemId = commonId++
            };

            var route = new RouteAM
            {
                Legs =
                {
                    new RouteLegAM {
                        Kind = RouteLegKind.Feed, Distance = 3000, Duration = 1200
                    },
                    new RouteLegAM {
                        Kind = RouteLegKind.Transportation, Distance = 100000, Duration = 7200
                    },
                    new RouteLegAM {
                        Kind = RouteLegKind.WayBack, Distance = 103000, Duration = 8400
                    }
                }
            };

            var feedDistance  = route.Legs[0].Distance;
            var feedDuration  = route.Legs[0].Duration;
            var totalDistance = route.Legs.Select(l => l.Distance).Sum();

            var bill = new BillAM {
                TotalCost = 100
            };
            var title = $"{rootAddress.Locality} - {bill.TotalCost}₽";

            Suite.RouteServiceMock
            .Setup(m => m.GetRootAddress(route))
            .Returns(rootAddress);
            Suite.RouteServiceMock
            .Setup(m => m.GetFeedDistance(route))
            .Returns(feedDistance);
            Suite.RouteServiceMock
            .Setup(m => m.GetFeedDuration(route))
            .Returns(feedDuration);
            Suite.RouteServiceMock
            .Setup(m => m.GetTotalDistance(route))
            .Returns(totalDistance);

            Suite.BillServiceMock
            .Setup(m => m.GetBillInfo(
                       It.Is <Coordinate>(c => c.Latitude.Equals(rootAddress.Latitude) && c.Longitude.Equals(rootAddress.Longitude)),
                       cargo.WeightCatalogItemId))
            .ReturnsAsync(billInfo);
            Suite.BillServiceMock
            .Setup(m => m.CalculateBill(
                       billInfo,
                       It.Is <BasketAM>(b => (b != basket) && b.KmValue.Equals(totalDistance))))
            .ReturnsAsync(bill);

            var result = await Suite.BookingService.CalculateBookingRoute(route, cargo, basket);

            Assert.Equal(rootAddress, result.RootAddress);
            Assert.Equal(feedDistance, result.FeedDistance);
            Assert.Equal(feedDuration, result.FeedDuration);
            Assert.Equal(totalDistance, result.TotalDistance);
            Assert.Equal(bill, result.Bill);
            Assert.Equal(title, result.Title);
        }
Beispiel #5
0
        private async Task <ICollection <BookingRouteAM> > GetBookingRoutes(ICollection <RouteAM> possibleRoutes, CargoAM cargo, BasketAM basket)
        {
            var result = new List <BookingRouteAM>();

            var exceptions = new ConcurrentQueue <Exception>();

            await possibleRoutes.ParallelForEachAsync(
                async route =>
            {
                try
                {
                    var bookingRoute = await CalculateBookingRoute(route, cargo, basket);
                    result.Add(bookingRoute);
                }
                catch (Exception e)
                {
                    exceptions.Enqueue(e);
                }
            }
                );

            if (exceptions.Any())
            {
                throw new AggregateException(exceptions);
            }

            return(result);
        }