예제 #1
0
 void LoadDistrictsGeometry()
 {
     logger.Info("Загружаем районы...");
     districtsOverlay.Clear();
     ViewModel.LogisticanDistricts = ScheduleRestrictionRepository.GetDistrictsWithBorder(ViewModel.UoW);
     foreach (var district in ViewModel.LogisticanDistricts)
     {
         var poligon = new GMapPolygon(
             district.DistrictBorder.Coordinates.Select(p => new PointLatLng(p.X, p.Y)).ToList(),
             district.DistrictName
             );
         districtsOverlay.Polygons.Add(poligon);
     }
     logger.Info("Ок.");
 }
예제 #2
0
        public static DeliveryPriceNode Calculate(decimal?latitude, decimal?longitude, int?bottlesCount)
        {
            IList <District> districts;

            DeliveryPriceNode result = new DeliveryPriceNode();

            //Топливо
            using (var uow = UnitOfWorkFactory.CreateWithoutRoot("Расчет стоимости доставки")) {
                var fuel = FuelRepository.GetDefaultFuel(uow);
                if (fuel == null)
                {
                    result.ErrorMessage = string.Format("Топливо по умолчанию «АИ-92» не найдено в справочке.");
                    return(result);
                }
                fuelCost = (double)fuel.Cost;

                //Районы
                districts           = ScheduleRestrictionRepository.GetDistrictsWithBorder(uow);
                result.WageDistrict = deliveryPoint?.District?.WageDistrict?.Name ?? "Неизвестно";

                //Координаты
                if (!latitude.HasValue || !longitude.HasValue)
                {
                    result.ErrorMessage = string.Format("Не указаны координаты. Невозможно расчитать расстояние.");
                    return(result);
                }

                //Расчет растояния
                if (deliveryPoint == null)
                {
                    var gg    = GeographicGroupRepository.GeographicGroupByCoordinates((double)latitude.Value, (double)longitude.Value, districts);
                    var route = new List <PointOnEarth>(2);
                    if (gg != null && gg.BaseCoordinatesExist)
                    {
                        route.Add(new PointOnEarth((double)gg.BaseLatitude, (double)gg.BaseLongitude));
                    }
                    else if (gg == null)
                    {
                        //если не найдена часть города, то расстояние считается до его центра
                        route.Add(new PointOnEarth(Constants.CenterOfCityLatitude, Constants.CenterOfCityLongitude));
                    }
                    else
                    {
                        result.ErrorMessage = "В подобранной части города не указаны координаты базы";
                        return(result);
                    }
                    route.Add(new PointOnEarth(latitude.Value, longitude.Value));
                    var osrmResult = OsrmMain.GetRoute(route, false, GeometryOverview.False);
                    if (osrmResult == null)
                    {
                        result.ErrorMessage = "Ошибка на сервере расчета расстояний, невозможно расчитать расстояние.";
                        return(result);
                    }
                    if (osrmResult.Code != "Ok")
                    {
                        result.ErrorMessage = $"Сервер расчета расстояний вернул следующее сообщение: {osrmResult.StatusMessageRus}";
                        return(result);
                    }
                    distance = osrmResult.Routes[0].TotalDistance / 1000d;
                }
                else
                {
                    distance = (deliveryPoint.DistanceFromBaseMeters ?? 0) / 1000d;
                }
                result.Distance = distance.ToString("N1") + " км";

                result.Prices = Enumerable.Range(1, 100)
                                .Select(
                    x => new DeliveryPriceRow {
                    Amount = x,
                    Price  = PriceByDistance(x).ToString("C2")
                }
                    ).ToList();

                //Расчет цены
                var point    = new Point((double)latitude, (double)longitude);
                var district = districts.FirstOrDefault(x => x.DistrictBorder.Contains(point));
                result.DistrictName     = district?.DistrictName ?? string.Empty;
                result.GeographicGroups = district?.GeographicGroup != null ? district.GeographicGroup.Name : "Неизвестно";
                result.ByDistance       = district == null || district.PriceType == DistrictWaterPrice.ByDistance;
                result.WithPrice        = (district != null && district.PriceType != DistrictWaterPrice.ByDistance) ||
                                          (result.ByDistance && bottlesCount.HasValue);
                if (result.ByDistance)
                {
                    if (bottlesCount.HasValue)
                    {
                        result.Price = PriceByDistance(bottlesCount.Value).ToString("C2");
                    }
                }
                else if (district?.PriceType == DistrictWaterPrice.FixForDistrict)
                {
                    result.Price = district.WaterPrice.ToString("C2");
                }
                else if (district?.PriceType == DistrictWaterPrice.Standart)
                {
                    result.Price = "прайс";
                }
                result.MinBottles = district?.MinBottles.ToString();
                result.Schedule   = district != null && district.HaveRestrictions
                                        ? string.Join(", ", district.GetSchedulesString(true))
                                        : "любой день";
            }

            return(result);
        }