Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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]}");
                    }
                }
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }