private void PutItem(ProgramItem programItem, List <ProgramItemSlot> slots)
        {
            if (!slots.Any())
            {
                NotScheduled.Add(programItem);
                return;
            }

            var conflicts = (from slot in slots
                             where slot.ProgramItem != null
                             select slot.ProgramItem).Distinct().ToList();

            if (conflicts.Any())
            {
                Conflicted.Add(programItem);
                foreach (var conflict in conflicts)
                {
                    Conflicted.Add(conflict);
                }
            }
            else
            {
                foreach (var slot in slots)
                {
                    slot.ProgramItem = programItem;
                }
            }
        }
        public ScheduleResult Build()
        {
            Rooms     = InitializeList <ScheduleRoom>(RoomField.GetOrderedValues()).ToList();
            TimeSlots = InitializeList <TimeSlot>(TimeSlotField.GetOrderedValues()).ToList();
            Slots     = InitializeSlots(TimeSlots, Rooms);

            var allItems = new List <ProgramItemPlaced>();

            foreach (var character in characters)
            {
                var programItem = ConvertToProgramItem(character);
                var slots       = SelectSlots(character);
                PutItem(programItem, slots);
                if (slots.Any())
                {
                    allItems.Add(new ProgramItemPlaced(programItem, slots));
                }
            }
            return(new ScheduleResult()
            {
                Conflicted = Conflicted.ToList(),
                NotScheduled = NotScheduled.ToList(),
                Rooms = Rooms,
                TimeSlots = TimeSlots,
                Slots = Slots.Select(row => row.Select(r => r.ProgramItem).ToList()).ToList(),
                AllItems = allItems,
            });
        }
Beispiel #3
0
        private List <ProgramItemSlot> SelectSlots(ProgramItem programItem, Character character)
        {
            var fields = character.GetFields();

            List <int> GetSlotIndexes(ProjectField field, IEnumerable <ScheduleItemAttribute> items)
            {
                var variantIds = fields
                                 .Single(f => f.Field.ProjectFieldId == field.ProjectFieldId)
                                 .GetDropdownValues()
                                 .Select(variant => variant.ProjectFieldDropdownValueId)
                                 .ToList();
                var indexes = (from item in items where variantIds.Contains(item.Id) select item.SeqId).ToList();

                if (indexes.Count < variantIds.Count) // Some variants not found, probably deleted
                {
                    NotScheduled.Add(programItem);
                }

                return(indexes);
            }

            var slots = from timeSeqId in GetSlotIndexes(TimeSlotField, TimeSlots)
                        from roomSeqId in GetSlotIndexes(RoomField, Rooms)
                        select Slots[timeSeqId][roomSeqId];

            return(slots.ToList());
        }