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); }
/// <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); }