/// <summary> /// /// </summary> /// <returns></returns> public Data PrepearingData() { //Импортируем данные из эксель. NomenclaturesList = _dataService.Import <Nomenclature>(_filesSettings.NomenclatureFile).ToList(); MachinesList = _dataService.Import <Machine>(_filesSettings.MachinesFile).ToList(); TimesList = _dataService.Import <Time>(_filesSettings.TimesFile).ToList(); var batches = _dataService.Import <Batch>(_filesSettings.BatchesFile).ToList(); //Заполняем очередь партий, проставляем ссылки на нужные объекты при необходимости. batches.ForEach(b => b.Nomenclature = NomenclaturesList.Find(n => n.Id == b.NomenclatureId)); BatchesQueue = new Queue <Batch>(batches); TimesList.ForEach(t => t.Nomenclature = NomenclaturesList.Find(n => n.Id == t.Nomenclatureid)); foreach (var machine in MachinesList) { var times = TimesList.Where(tl => tl.MachineId == machine.Id); machine.TimeDictionary = times.ToDictionary(t => t.Nomenclatureid, o => o.OperationTime); } var data = new Data(MachinesList, BatchesQueue); Log.Information("Данные подготовлены."); //Возвращаем подготовленные данные. return(data); }
public List <ScheduleItem> MakeSchedule() { ScheduleCalculator calculator = new ScheduleCalculator(TimesList, MachineToolsList, PartiesList, NomenclaturesList); ProductionLine productionLine = new ProductionLine(); productionLine = calculator.MakeProductionLine(); Clock clock = new Clock(); do //начинаем перебор значений списка партий { int currentMachineId = -1; //номер текущего станка do //перебираем, пока не будут заняты все станки { int i = 0; //всегда берем только первую по очереди партию string material = ""; //ищем название материала по id, чтобы загрузить в станок for (int j = 0; j < NomenclaturesList.Count; j++) { //если материал в списке материалов найден if (NomenclaturesList.ElementAt(j).id == PartiesList.ElementAt(i).nomenclatureId) { //присваиваем переменной строковое значение material = NomenclaturesList.ElementAt(j).nomenclature; currentMachineId = -1;//номер текущего станка //пытаемся установить партию в линию currentMachineId = productionLine.insertMaterial(material); //установка прошла успешно if (currentMachineId >= 0) { ScheduleItem scheduleItem = new ScheduleItem(); scheduleItem.partiesId = i.ToString(); //Записываем id загруженной партии scheduleItem.startTime = clock.GetValue().ToString(); //Записываем время начала работы scheduleItem.machineToolsId = currentMachineId.ToString(); //Записываем Id станка scheduleItem.partiesId = PartiesList.ElementAt(i).id; //Записываем Id партии //Записываем название станка scheduleItem.machineTools = MachineToolsList.ElementAt(currentMachineId).name; //Записываем название материала scheduleItem.partiesName = NomenclaturesList.ElementAt(j).nomenclature; //Записываем время окончания scheduleItem.endTime = (Convert.ToInt32(clock.GetValue() + Convert.ToInt32(productionLine.GetWorkingTime().ElementAt(currentMachineId)))).ToString(); //i++;//переходим к следующей партии PartiesList.RemoveAt(i); //удаляем элемент из списка, он ушел в работу schedule.Add(scheduleItem); //Добавляем строку расписания break; } } } //if (material == "") return null; } while ((currentMachineId >= 0) && (PartiesList.Count > 0)); productionLine.workStep();//Запускаем рабочую линию clock.Step();//Отсчитываем единицу времени } while (PartiesList.Count > 0); return(schedule); }
public void AddWork(int partyId, string nomenclatureName, TimeSpan workTime) { PartyIdList.Add(partyId); NomenclaturesList.Add(nomenclatureName); GeneralWorkTime += workTime; WorkTimeList.Add(workTime); }