// Создание коллекции батальонов выбранных для погрузки public List <BuildnUnit> CreateCollectBatt()//List<string> nameOfBatt) { List <BuildnUnit> collBatt4Load = new List <BuildnUnit>(); MillitaryDbContext context = new MillitaryDbContext(); int ii = 0; foreach (string batt in nameOfBatt) { var foundBat = from dumb in context.Battalions where dumb.Name == batt select dumb; Battalion battalion = foundBat.First(); List <EquipInBatt> collEquip = new List <EquipInBatt>(); //List<EquipInBatt> collEquipSpec = new List<EquipInBatt>(); //List<EquipInBatt> collEquipUsual = new List<EquipInBatt>(); int rgb = 1; foreach (EquipmentBattalion eq2bat in context.EquipmentBattalions) { if (eq2bat.BattalionId == battalion.BattalionId) { //Задаем новый цвет Color newColor = new Color(); newColor = DefineColor(rgb++); EquipInBatt equip = new EquipInBatt(eq2bat.Equipments.Name, newColor, eq2bat.Equipments.Lenght, eq2bat.Equipments.Mass, eq2bat.Count, eq2bat.Equipments.TypeEquip); //Отделяем специальную технику от обычной //if (eq2bat.Equipments.TypeEquip) collEquipUsual.Add(equip); //else collEquipSpec.Add(equip); collEquip.Add(equip); } } BuildnUnit newUnit = new BuildnUnit(++ii, battalion.Name, battalion.Brigade.Name, battalion.Officer, battalion.Serjant, battalion.Soldat, battalion.Civilian, collEquip); //collEquipSpec, collEquipUsual); collBatt4Load.Add(newUnit); } return(collBatt4Load); }
//Расчет в потребности подвижного состава для подразделения public List <VoinEshelon> CalcBatt4Load(List <BuildnUnit> CollBatt, int flagUnistallScep) { List <VoinEshelon> CollEshelon = new List <VoinEshelon>(); int freePlaceWagon = lenghtPlatform; double needKupe, needPlackart, needWag4Person; bool flagType = false, flagPers = true; //Перебор батальонов предназначеных на погрузку foreach (BuildnUnit oneBatt in CollBatt) { bool flagVesh = true; flagPers = true; while (flagVesh) { //Ввод дополнительных переменных int ii = 1, maxLenEq, LenEq = 0, indMaxLenEq; //Создание новых коллекций ВВТ и вагонов List <EquipInVesh> listEqs = new List <EquipInVesh>(); List <WagonInVesh> listWags = new List <WagonInVesh>(); //Потребность в вагонах для личного состава needKupe = Math.Ceiling((double)(oneBatt.numOficer + oneBatt.numGP) / sizeKupe); needPlackart = Math.Ceiling((double)(oneBatt.numSerjant + oneBatt.numSoldat) / sizePlatcart); needWag4Person = needKupe + needPlackart + Convert.ToInt32(haveKitchen); //Заполнение эшелонов техникой while (oneBatt.listEquip.Count != 0) { if (ii == 57) { flagPers = false; break; } WagonInVesh wagon = new WagonInVesh() { numWagon = ii++, typeWagon = 1 }; if (wagon.numWagon > 10 && freePlaceWagon == lenghtPlatform && needWag4Person != 0 && flagPers) // && Закончились вагоны с людьми ) { if (needKupe != 0) { wagon.typeWagon = 2; needKupe--; needWag4Person--; } else if (needPlackart != 0) { wagon.typeWagon = 3; needPlackart--; needWag4Person--; } else { wagon.typeWagon = 4; needWag4Person--; } listWags.Add(wagon); continue; } //Опредляем тип техники, с которой будем работать if (oneBatt.listEquip.Where(x => x.typeEq == false && x.lengthEq <= freePlaceWagon).Count() != 0) { flagType = false; } else if (oneBatt.listEquip.Where(x => x.typeEq == true && x.lengthEq <= freePlaceWagon).Count() != 0) { flagType = true; } //Ищем технику по флагу с максимальной длиной maxLenEq = oneBatt.listEquip.Where(x => x.typeEq == flagType && x.lengthEq <= freePlaceWagon).Max(y => y.lengthEq); indMaxLenEq = oneBatt.listEquip.FindIndex(x => x.lengthEq == maxLenEq && x.typeEq == flagType); //Заполняем структуру техники EquipInVesh equip = new EquipInVesh() { codeEq = oneBatt.listEquip[indMaxLenEq].codeEq, color = oneBatt.listEquip[indMaxLenEq].color, lenFromBegPl = lenghtPlatform - freePlaceWagon, lengthEq = oneBatt.listEquip[indMaxLenEq].lengthEq, numWagon = wagon.numWagon }; //Вычисляем остаток длины на платформе freePlaceWagon = freePlaceWagon - oneBatt.listEquip[indMaxLenEq].lengthEq - buferLenght; //Удаление поставленной техники if (oneBatt.listEquip[indMaxLenEq].numEq == 1) { oneBatt.listEquip.RemoveAt(indMaxLenEq); } else { EquipInBatt dump = oneBatt.listEquip[indMaxLenEq]; dump.numEq--; oneBatt.listEquip[indMaxLenEq] = dump; } //Добавляем технику и вагон в список listEqs.Add(equip); listWags.Add(wagon); //Определям возможность установки техники на данный отрезок maxLenEq = oneBatt.listEquip.Find(x => x.lengthEq <= freePlaceWagon).lengthEq; if (maxLenEq != 0) { indMaxLenEq = oneBatt.listEquip.FindIndex(x => x.lengthEq == maxLenEq); equip = new EquipInVesh() { codeEq = oneBatt.listEquip[indMaxLenEq].codeEq, color = oneBatt.listEquip[indMaxLenEq].color, lenFromBegPl = lenghtPlatform - freePlaceWagon, lengthEq = oneBatt.listEquip[indMaxLenEq].lengthEq, numWagon = wagon.numWagon }; freePlaceWagon = freePlaceWagon - oneBatt.listEquip[indMaxLenEq].lengthEq - buferLenght; //Удаление поставленной техники if (oneBatt.listEquip[indMaxLenEq].numEq == 1) { oneBatt.listEquip.RemoveAt(indMaxLenEq); } else { EquipInBatt dump = oneBatt.listEquip[indMaxLenEq]; dump.numEq--; oneBatt.listEquip[indMaxLenEq] = dump; } listEqs.Add(equip); } //Определяем возможность установки на сцеп if (freePlaceWagon >= 2000 && oneBatt.listEquip.Where(x => x.typeEq == true).Count() != 0 && flagUnistallScep != 1) { flagType = true; if (flagUnistallScep == 2) { LenEq = oneBatt.listEquip.Where(x => x.typeEq == flagType).Max(y => y.lengthEq); } else if (flagUnistallScep == 3) { LenEq = oneBatt.listEquip.Where(x => x.typeEq == flagType).Min(y => y.lengthEq); } indMaxLenEq = oneBatt.listEquip.FindIndex(x => x.lengthEq == LenEq && x.typeEq == flagType); //Определяем свободное место на платформе на следующем вагоне freePlaceWagon = lenghtPlatform - buferLenght - (oneBatt.listEquip[indMaxLenEq].lengthEq - 2000 - lenghtScep); //Определяем возможность установки на следующий вагон (целесообразность использования сцепа) if (oneBatt.listEquip.Where(x => x.lengthEq >= freePlaceWagon).Count() != 0) { freePlaceWagon = lenghtPlatform; continue; } equip = new EquipInVesh() { codeEq = oneBatt.listEquip[indMaxLenEq].codeEq, color = oneBatt.listEquip[indMaxLenEq].color, lenFromBegPl = lenghtPlatform - 2000, lengthEq = oneBatt.listEquip[indMaxLenEq].lengthEq, numWagon = wagon.numWagon }; //Удаление поставленной техники if (oneBatt.listEquip[indMaxLenEq].numEq == 1 && oneBatt.listEquip.Count == 1) { freePlaceWagon = lenghtPlatform; continue; } else if (oneBatt.listEquip[indMaxLenEq].numEq == 1) { oneBatt.listEquip.RemoveAt(indMaxLenEq); } else { EquipInBatt dump = oneBatt.listEquip[indMaxLenEq]; dump.numEq--; oneBatt.listEquip[indMaxLenEq] = dump; } listEqs.Add(equip); } else { freePlaceWagon = lenghtPlatform; } } if (oneBatt.listEquip.Count == 0) { flagVesh = false; } VoinEshelon vEshelon = new VoinEshelon() { nameVeSh = oneBatt.nameUnit, numWagon = --ii, massVeSh = 500, listEquips = listEqs, listWagons = listWags }; CollEshelon.Add(vEshelon); } } return(CollEshelon); }