コード例 #1
0
ファイル: FileReader.cs プロジェクト: weedkiller/NINE
        private void ReadGPU016(string fileName)
        {
            var lines = GetFileContent(fileName);

            if (!lines.Any())
            {
                return;
            }


            foreach (var line in lines)
            {
                // Unterricht einlesen
                var words = line.Split(seperator);

                var r = new Restriktion
                {
                    Typ       = words[0].Replace("\"", ""),
                    ElementID = words[1].Replace("\"", ""),
                    Tag       = int.Parse(words[2]),
                    Stunde    = int.Parse(words[3]),
                    Level     = int.Parse(words[4])
                };

                if (r.Typ.Equals("R") && r.Level == -3)
                {
                    Context.Restriktionen.Add(r);
                }
            }

            // Alle Resriktionen durchgehen
            var orderedRestrictions = Context.Restriktionen.OrderBy(x => x.ElementID).ThenBy(x => x.Tag)
                                      .ThenBy(x => x.Stunde).ToList();


            foreach (var restriction in orderedRestrictions)
            {
                var room = ctx.Raeume.SingleOrDefault(r => r.RaumID.Equals(restriction.ElementID));

                if (room != null)
                {
                    // gleicher Tag und am hinteren Ende bisherigen Zeitraums und gleicher Raum und gleicher Dozent
                    var blockade = Context.Blockaden.SingleOrDefault(e =>
                                                                     e.Tag == restriction.Tag &&
                                                                     e.BisStunde + 1 == restriction.Stunde &&
                                                                     e.Raum.RaumID.Equals(restriction.ElementID));
                    if (blockade != null)
                    {
                        blockade.BisStunde++;
                    }
                    else
                    {
                        // nicht vorhanden, dann anderer Tag oder Lücke oder anderer Raum
                        blockade = new RaumBlockade
                        {
                            Raum      = room,
                            Tag       = restriction.Tag,
                            VonStunde = restriction.Stunde,
                            BisStunde = restriction.Stunde
                        };

                        Context.Blockaden.Add(blockade);
                    }
                }
            }
        }
コード例 #2
0
        public string ImportReservation(RaumBlockade b)
        {
            string msg;

            var db       = new TimeTableDbContext();
            var org      = db.Organisers.SingleOrDefault(o => o.Id == _orgId);
            var semester = db.Semesters.SingleOrDefault(s => s.Id == _semId);


            var name = $"Restriktionen Stundenplanung {semester.Name}";

            var reservation = db.Activities.OfType <Reservation>().FirstOrDefault(r => r.Organiser.Id == org.Id && r.Name.Equals(name));

            if (reservation == null)
            {
                reservation = new Reservation
                {
                    Name        = name,
                    ShortName   = $"SP {semester.Name}",
                    Description = "Importierte Restrektionen aus Stundenplanug",
                    UserId      = "",
                    Organiser   = org
                };

                db.Activities.Add(reservation);
            }

            // Datum anlegen für jeden Raum



            // Die Zeiten werden jetzt aus dem Kontext gelesen
            if (!_import.Stunden.ContainsKey(b.VonStunde))
            {
                _import.AddErrorMessage("Import", string.Format("Stunde {0} nicht definiert", b.VonStunde), false);
            }
            if (!_import.Stunden.ContainsKey(b.BisStunde))
            {
                _import.AddErrorMessage("Import", string.Format("Stunde {0} nicht definiert", b.BisStunde), false);
            }

            // Termin liegt an einem Tag, der nicht importiert werden soll
            if (!_import.Tage.ContainsKey(b.Tag))
            {
                _import.AddErrorMessage("Import", string.Format("Tag {0} nicht definiert", b.Tag), false);
            }

            if (!_import.Tage[b.Tag])
            {
                _import.AddErrorMessage("Import", string.Format("Tag {0} soll nicht importiert werden", b.Tag), false);
            }


            var occBegin = _import.Stunden[b.VonStunde].Start;
            var occEnd   = _import.Stunden[b.BisStunde].Ende;

            // den wahren zeitraum bestimmen
            // Hypothese: immer Vorlesungszeitraum des Semesters
            var semesterAnfang = semester.StartCourses;
            var semesterEnde   = semester.EndCourses;

            // abweichende Angaben? dann diese nehmen
            if (_firstDate.HasValue)
            {
                semesterAnfang = _firstDate.Value;
            }

            if (_lastDate.HasValue)
            {
                semesterEnde = _lastDate.Value;
            }

            // Tag der ersten Veranstaltung nach Vorlesungsbeginn ermitteln
            var semesterStartTag = (int)semesterAnfang.DayOfWeek;
            var day   = b.Tag;
            int nDays = day - semesterStartTag;

            if (nDays < 0)
            {
                nDays += 7;
            }

            DateTime occDate = semesterAnfang.AddDays(nDays);


            //Solange neue Termine anlegen bis das Enddatum des Semesters erreicht ist
            int numOcc = 0;

            while (occDate <= semesterEnde)
            {
                bool isVorlesung = true;
                foreach (var sd in semester.Dates)
                {
                    // Wenn der Termin in eine vorlesungsfreie Zeit fällt, dann nicht importieren
                    if (sd.From.Date <= occDate.Date &&
                        occDate.Date <= sd.To.Date &&
                        sd.HasCourses == false)
                    {
                        isVorlesung = false;
                    }
                }

                if (isVorlesung)
                {
                    var ocStart = new DateTime(occDate.Year, occDate.Month, occDate.Day, occBegin.Hour,
                                               occBegin.Minute, occBegin.Second);
                    var ocEnd = new DateTime(occDate.Year, occDate.Month, occDate.Day, occEnd.Hour,
                                             occEnd.Minute, occEnd.Second);

                    var occ = new ActivityDate
                    {
                        Begin      = ocStart,
                        End        = ocEnd,
                        Activity   = reservation,
                        Occurrence = null,
                    };

                    var room = InitRoom(db, b.Raum, org);
                    if (room != null)
                    {
                        occ.Rooms.Add(room);
                    }

                    db.ActivityDates.Add(occ);
                    numOcc++;
                }

                occDate = occDate.AddDays(7);
            }

            db.SaveChanges();

            msg = string.Format("Reservierung für Raum {0} mit Terminen importiert", b.Raum.Nummer);

            return(msg);
        }