internal OrderQuantumDto ConvertOrderQuantum(OrderQuantum orderQuantum) { var orderQuantumDto = new OrderQuantumDto() { Id = orderQuantum.Id, Count = orderQuantum.Count, ItemsCountInOnePart = orderQuantum.ItemsCountInOnePart, OrderId = orderQuantum.OrderId, ProductionItem = orderQuantum.ProductionItem != null?ConvertProductionItem(orderQuantum.ProductionItem) : null, }; return(orderQuantumDto); }
internal OrderQuantum ConvertOrderQuantum(OrderQuantumDto orderQuantumDto) { var orderQuantum = new OrderQuantum() { Count = orderQuantumDto.Count, ItemsCountInOnePart = orderQuantumDto.ItemsCountInOnePart, }; if (orderQuantumDto.ProductionItem.Id != null) { orderQuantum.ProductionItemId = (int)orderQuantumDto.ProductionItem.Id; } return(orderQuantum); }
private void SortByLowestTime(OrderQuantum orderQuantum, Dictionary <string, TimeSpan> dictDecisiveRulesTimes) { var rule = dictDecisiveRulesTimes.OrderBy(d => d.Value).First().Key; Logger.Log($"Правило с наименьшим временем: {rule}", LogLevel.Trace); Logger.Log($"Сортировка групп по правилу {rule} начата.", LogLevel.Trace); switch (rule) { case "LUKR": Lukr.SortGroups(orderQuantum.ProductionItem); break; case "SPT": Spt.SortGroups(orderQuantum.ProductionItem); break; case "LPT": Spt.SortGroups(orderQuantum.ProductionItem); break; case "ReverseLukr": Lukr.SortGroups(orderQuantum.ProductionItem); break; default: break; } Logger.Log($"Сортировка групп по правилу {rule} закончена.", LogLevel.Trace); Logger.Log($"Определение суммарного времени обработки части партии изделия по лучшему правилу {rule} начато.", LogLevel.Trace); var groupsTiming = new GroupsTiming(_transports, _dbManager); var time = groupsTiming.CountProductionItemMachiningTime(orderQuantum, true); Logger.Log($"Определение суммарного времени обработки части партии изделия по лучшему правилу {rule} закончено. Получившееся время: {time}", LogLevel.Trace); }
private void WriteGroupsInfo(OrderQuantum orderQuantum, StreamWriter sw) { sw.WriteLine(";;Для каждой группы"); var groups = orderQuantum.ProductionItem.ProductionItemQuantumsGroups; for (int i = 0; i < groups.Count; i++) { sw.WriteLine($";;Группа {i + 1}"); sw.WriteLine(";;Цех;Начало;Длительность;Окончание;Средняя загруженность станков"); for (int j = 0; j < groups[i].WorkshopSequence.Count; j++) { sw.WriteLine($";;{_dbManager.GetWorkshop(groups[i].WorkshopSequence[j]).Name};{groups[i].WorkshopStartTimes[j]};{groups[i].WorkshopDurations[j]};{groups[i].WorkshopEndTimes[j]};"); } } sw.WriteLine(";;;Для деталей"); for (int i = 0; i < groups.Count; i++) { sw.WriteLine($";;;Группа;Группа {i + 1}"); for (int j = 0; j < groups[i].ProductionItemQuantums.Count; j++) { sw.WriteLine(";;;Деталь;Количество;Количество операций"); sw.WriteLine($";;;{groups[i].ProductionItemQuantums[j].Detail.Title};{groups[i].ProductionItemQuantums[j].Count};" + $"{groups[i].ProductionItemQuantums[j].Detail.Operations.Where(o => o.Type == OperationType.Machining).Count()};"); sw.WriteLine(";;;Цех;Станок;Начало;Длительность;Окончание"); var productionItemQuantum = groups[i].ProductionItemQuantums[j]; for (int k = 0; k < productionItemQuantum.MachiningDurations.Count; k++) { sw.WriteLine($";;;{_dbManager.getWorkshopByEquipmentId(productionItemQuantum.Detail.EquipmentsIdSequence[k]).Name};" + $"{productionItemQuantum.Detail.EquipmentsNameSequence[k]};{productionItemQuantum.StartTimes[k]};{productionItemQuantum.MachiningDurations[k]};{productionItemQuantum.EndTimes[k]}"); } } } }
internal OrderQuantumDto ConvertOrderQuantumForViewing(OrderQuantum orderQuantum) { var orderQuantumDto = new OrderQuantumDto() { Id = orderQuantum.Id, Count = orderQuantum.Count, ItemsCountInOnePart = orderQuantum.ItemsCountInOnePart, OrderId = orderQuantum.OrderId, ProductionItem = orderQuantum.ProductionItem != null?ConvertProductionItemForViewing(orderQuantum.ProductionItem) : null, AssemblingDurations = orderQuantum.AssemblingDurations.Select(a => a.Ticks).ToList(), AssemblingEndTimes = orderQuantum.AssemblingEndTimes.Select(a => a.Ticks).ToList(), AssemblingFullBatchTime = orderQuantum.AssemblingFullBatchTime.Ticks, AssemblingFullPartTime = orderQuantum.AssemblingFullPartTime.Ticks, AssemblingRemainingFromPartsTime = orderQuantum.AssemblingRemainingFromPartsTime.HasValue ? orderQuantum.AssemblingRemainingFromPartsTime.Value.Ticks : default(long), AssemblingStartTimes = orderQuantum.AssemblingStartTimes.Select(a => a.Ticks).ToList(), MachiningDurations = orderQuantum.MachiningDurations.Select(a => a.Ticks).ToList(), MachiningEndTimes = orderQuantum.MachiningEndTimes.Select(a => a.Ticks).ToList(), MachiningFullPartTime = orderQuantum.MachiningFullPartTime.Ticks, MachiningRemainingFromPartsTime = orderQuantum.MachiningRemainingFromPartsTime.Ticks, MachiningStartTimes = orderQuantum.MachiningStartTimes.Select(a => a.Ticks).ToList() }; return(orderQuantumDto); }
public TimeSpan CountProductionItemMachiningTime(OrderQuantum orderQuantum, bool isFinally) { Logger.Log($"Начат расчет времени части партии изделия: {orderQuantum.ProductionItem.Title}", LogLevel.Info); var groups = orderQuantum.ProductionItem.ProductionItemQuantumsGroups; var productionItemTime = new TimeSpan(0); CountTransport(groups); for (var i = 0; i < groups.Count; i++) { var currentGroup = groups[i]; CountTimesForGroup(currentGroup); if (i != 0) { TimeSpan maxDiff = new TimeSpan(0); for (var k = 0; k < currentGroup.WorkshopSequence.Count; k++) { for (var groupIndex = 1; groupIndex <= i; groupIndex++) { var prevGroup = groups[i - groupIndex]; if (prevGroup.WorkshopSequence.Contains(currentGroup.WorkshopSequence[k])) { var diff = prevGroup .WorkshopEndTimes[prevGroup.WorkshopSequence.IndexOf(currentGroup.WorkshopSequence[k])] - currentGroup.WorkshopStartTimes[k]; if (diff > maxDiff) { maxDiff = diff; } } } } for (var f = 0; f < groups[i].WorkshopSequence.Count; f++) { groups[i].WorkshopStartTimes[f] += maxDiff; groups[i].WorkshopEndTimes[f] += maxDiff; } } } long max = 0; foreach (var group in groups) { max = (Math.Max(max, group.WorkshopEndTimes.Max().Ticks + group.TransportOperations.Last().Duration.Ticks)); } productionItemTime = new TimeSpan(max); if (isFinally) { orderQuantum.MachiningFullPartTime = productionItemTime; } else { foreach (var group in groups) { group.WorkshopStartTimes.Clear(); group.WorkshopEndTimes.Clear(); group.TransportOperations.Clear(); } } Logger.Log($"Закончен расчет времени части партии изделия: {orderQuantum.ProductionItem.Title}. Суммарное время: {productionItemTime}.", LogLevel.Info); return(productionItemTime); }