Esempio n. 1
0
        private static string GetCity(double tonnageNeed, List <DeliveryPoint> mapDelivery, string provider)
        {
            int     ix      = 0;
            decimal MaxCost = 0;
            string  city    = "";

            /// подходящие варианты перевозчиков

            for (int i = 0; i < mapDelivery.Count; i++)
            {      //выбор дальней точки
                DeliveryPoint point = mapDelivery[i];
                if (ShefflerWB.RateList.FindAll(x => x.City == point.City).Count == 0)
                {
                    throw new Exception("В \"Rate\" отсутствует город " + point.City);
                }
                try
                {
                    decimal?MaxCostPoint = 0;
                    MaxCostPoint = (from rv in ShefflerWB.RateList
                                    where rv.City == point.City &&
                                    rv.Company == provider &&
                                    rv.Tonnage >= tonnageNeed
                                    select rv.PriceFirstPoint
                                    )?.Max();
                    if (MaxCostPoint != null)
                    {
                        if (MaxCost < MaxCostPoint)
                        {
                            MaxCost = (decimal)MaxCostPoint;
                            ix      = i;
                            city    = point.City;
                        }
                    }
                }
                catch
                {
                    throw new Exception("Не удалось найти точку.  Проверьте наличие в Id клиента {mapDelivery[i].IdCustomer} на Листе \"Route\"");
                }
            }
            return(city);
        }
Esempio n. 2
0
        /// <summary>
        /// Региональные перевозки
        /// </summary>
        /// <param name="rateVariants"></param>
        /// <returns></returns>
        public static List <TruckRate> GetTruckRate(double tonnageNeed, List <DeliveryPoint> mapDelivery)
        {
            List <TruckRate> rateVariants = new List <TruckRate>();
            int     ix      = 0;
            decimal MaxCost = 0;
            string  city    = "";

            /// подходящие варианты перевозчиков

            for (int i = 0; i < mapDelivery.Count; i++)
            {      //выбор дальней точки
                DeliveryPoint point = mapDelivery[i];
                if (ShefflerWB.RateList.FindAll(x => x.City == point.City).Count == 0)
                {
                    throw new Exception("В \"Rate\" отсутствует город " + point.City);
                }
                try
                {
                    decimal?MaxCostPoint = 0;
                    MaxCostPoint = (from rv in ShefflerWB.RateList
                                    where rv.City == point.City &&
                                    rv.Tonnage >= tonnageNeed
                                    select rv.PriceFirstPoint
                                    )?.Max();
                    if (MaxCostPoint != null)
                    {
                        if (MaxCost < MaxCostPoint)
                        {
                            MaxCost = (decimal)MaxCostPoint;
                            ix      = i;
                            city    = point.City;
                        }
                    }
                }
                catch
                {
                    throw new Exception("Не удалось найти точку.  Проверьте наличие в Id клиента {mapDelivery[i].IdCustomer} на Листе \"Route\"");
                }
            }
            rateVariants = ShefflerWB.RateList.FindAll(r =>
                                                       r.City == mapDelivery[ix].City &&
                                                       r.Tonnage >= tonnageNeed
                                                       ).ToList();

            if (rateVariants.Count > 0)
            {
                //По каждому варианту фирмы с дальним городом
                for (int rateIx = 0; rateIx < rateVariants.Count; rateIx++)
                {
                    bool      hasFirstpoint = false;
                    TruckRate variantRate   = rateVariants[rateIx];
                    variantRate.TotalDeliveryCost = 0;
                    city = GetCity(tonnageNeed, mapDelivery, variantRate.Company);
                    // считаем общую стоимость
                    for (int pointNumber = 0; pointNumber < mapDelivery.Count; pointNumber++)
                    {
                        if (mapDelivery[pointNumber].City == city && !hasFirstpoint)
                        {
                            TruckRate addPointRate =
                                ShefflerWB.RateList.Where(x => x.Company == variantRate.Company &&
                                                          x.Tonnage == variantRate.Tonnage &&
                                                          x.City == mapDelivery[pointNumber].City).First();

                            variantRate.TotalDeliveryCost += addPointRate.PriceFirstPoint; // rateVariants[rateIx].PriceFirstPoint;
                            hasFirstpoint = true;
                        }
                        else
                        {
                            //Ищем стоимость доп точки в другом городе для той же машины
                            TruckRate addPointRate =
                                ShefflerWB.RateList.Where(x => x.Company == variantRate.Company &&
                                                          x.Tonnage == variantRate.Tonnage &&
                                                          x.City == mapDelivery[pointNumber].City).First();
                            variantRate.TotalDeliveryCost += addPointRate.PriceAddPoint;
                        }
                    }
                    rateVariants[rateIx] = variantRate;
                }
                rateVariants = rateVariants.OrderBy(r => r.TotalDeliveryCost).ToList();
            }
            return(rateVariants);
        }