using MMDAL.DTO.Scheduling; namespace MMBLL.Scheduling.Engine { public class BatchGroup { public string RootBatchNumber { get; set; } = string.Empty; public List Items { get; set; } = new(); public int CombinedDurationMinutes { get; set; } public decimal TotalQuantity { get; set; } // 0=Reform 1=CarryForward public byte BatchContinuity { get; set; } public int WorkCenterId { get; set; } public int ProcessId { get; set; } // Merged EU representing the batch as a whole (used by the engine main loop) public ExecutionUnit ToMergedEU() { var first = Items[0]; return new ExecutionUnit { EuId = first.EuId, DemandType = first.DemandType, SourceDocumentId = first.SourceDocumentId, SourceDetailId = first.SourceDetailId, ItemId = first.ItemId, SkuId = first.SkuId, RoutingVersionDetailId = first.RoutingVersionDetailId, WorkCenterId = WorkCenterId, FixedMachineId = first.FixedMachineId, FixedPatternId = first.FixedPatternId, Quantity = TotalQuantity, DurationMinutes = CombinedDurationMinutes, ExecutionMode = first.ExecutionMode, IsInterruptible = first.IsInterruptible, MinimumRunMinutes = first.MinimumRunMinutes, MaxWaitMinutes = first.MaxWaitMinutes, BatchContinuity = BatchContinuity, IsMonitorOnly = first.IsMonitorOnly, PlanNature = first.PlanNature, EarliestStart = Items.Min(e => e.EarliestStart), ComputedEarliestStart = Items.Min(e => e.ComputedEarliestStart), Deadline = Items.Min(e => e.Deadline), PredecessorEuIds = Items.SelectMany(e => e.PredecessorEuIds).Distinct().ToList(), Priority = Items.Min(e => e.Priority), ProcessId = ProcessId, RootBatchNumber = RootBatchNumber, DurationSource = first.DurationSource, BatchItemCount = Items.Count, BatchedSourceDetailIds = Items.Select(e => e.SourceDetailId).ToList(), BatchedItemQtys = Items.Select(e => e.Quantity).ToList(), QuantityDecimalPlaces = first.QuantityDecimalPlaces, IsPatternRequired = first.IsPatternRequired, Splits=first.Splits }; } } }