private List <List <double> > ProtocniDinamickiRaspored(RaspodeliProtocnoModel parametri) { var lab = db.LabVezba.Find(parametri.LabVezbaId); int kapacitet = parametri.Kapacitet; DateTime pocetak = parametri.Pocetak; DateTime kraj = parametri.Kraj; int trajanje = parametri.Trajanje; int slot = parametri.Slot; List <double> listaSurvivalRate = SurvivalRate(StudentiUSlotu(VremeZadrzavanja(lab.Tag, lab.Naziv, parametri.Redosled), slot)); List <List <double> > sli = new List <List <double> >(); List <List <double> > slipom = new List <List <double> >(); int brojSlotova = (int)((kraj - pocetak).TotalMinutes - trajanje) / slot + 1; DateTime vremepom = pocetak; int indeks_slota_termina = 0; while (vremepom != parametri.IzabraniTermin) { DateTime d = vremepom.AddMinutes(slot); vremepom = d; indeks_slota_termina++; } double k; for (int i = 0; i < brojSlotova; i++) { List <double> pom = new List <double>(); if (i == indeks_slota_termina) { kapacitet = parametri.NoviKapacitet; } if (i == 0) { for (int j = 0; j < listaSurvivalRate.Count(); j++) { pom.Add(Math.Round(kapacitet * listaSurvivalRate[j])); } sli.Add(pom); } else { double sum = 0.00; for (int j = 1; j < (i + 1); j++) { if (j >= sli[i - j].Count()) { sum += 0; } else { sum += sli[i - j][j]; } } k = Convert.ToDouble(kapacitet) - sum; if (k <= 0) { k = 0; } for (int l = 0; l < listaSurvivalRate.Count(); l++) { pom.Add(Math.Round(k * listaSurvivalRate[l])); } sli.Add(pom); } } for (int t = indeks_slota_termina; t < sli.Count(); t++) { slipom.Add(sli[t]); } return(slipom); }
public IActionResult SmanjenKapacitet([FromBody] RaspodeliProtocnoModel parametri) { //parametri.LabVezbaId = 1; //parametri.Redosled = 1; //parametri.Ucionica = "565asd"; //parametri.Trajanje = 30; //parametri.Kapacitet = 2; //parametri.Slot = 5; //parametri.Kraj = new DateTime(2020, 11, 11, 23, 0, 0); // DateTime pocetakSpec = DateTime.Now; int?index = 0; var specificna = db.LabSpecificna.FirstOrDefault(x => x.Id == parametri.LabVezbaSpecificnaId); parametri.IzabraniTermin = specificna.VremeOd.Value; DateTime pocetakSpec = parametri.IzabraniTermin; if (specificna != null) { parametri.Redosled = specificna.Redosled.Value; //parametri.Pocetak = specificna.VremeOd.Value; var spec = db.LabSpecificna.Where(x => x.IdLabVezbe == parametri.LabVezbaId && x.Redosled == parametri.Redosled && x.VremeOd >= parametri.IzabraniTermin) .Include(x => x.Raspored) .ThenInclude(x => x.StudentNavigation); if (spec.Count() > 0) { var spec1 = spec.FirstOrDefault(); var ras = spec1.Raspored.FirstOrDefault(); index = ras.StudentNavigation.Indeks; parametri.Redosled = spec1.Redosled.Value; parametri.Ucionica = ras.Ucionica; foreach (var s in spec) { db.Raspored.RemoveRange(s.Raspored); } } else { return(BadRequest()); } db.LabSpecificna.RemoveRange(spec); // db.SaveChanges(); } else { return(BadRequest()); } //POKUPI STUDENTE KOJI NISU USLI NA DANASNJU VEZBU var query = db.Student.AsQueryable(); query = query.Where(s => s.LabVezbaStudent.Any(x => x.LabVezbaId == specificna.IdLabVezbe) && s.Indeks >= index); query = query.OrderBy(x => x.Indeks); var list = query.ToList(); var res = ProtocniDinamickiRaspored(parametri).Select(x => x.First()).ToList(); var skip = 0; var i = 0; foreach (var num in res) { specificna = new LabSpecificna { IdLabVezbe = parametri.LabVezbaId, Redosled = parametri.Redosled, //razmisli VremeOd = pocetakSpec.AddMinutes(i * parametri.Slot) }; db.LabSpecificna.Add(specificna); var studentiUSlot = list.Skip(skip).Take((int)num); skip += (int)num; foreach (var student in studentiUSlot) { var raspored = new Raspored { StudentNavigation = student, Ucionica = parametri.Ucionica, LabVezbaNavigation = specificna }; db.Raspored.Add(raspored); raspored.Izmenjen = true; //notifier.Send(student.Username, $"Obaveštenje o lab vežbama. Došlo je do izmene za {specificna.IdLabVezbeNavigation.Naziv} - {specificna.Redosled} termin {specificna.VremeOd}"); } i++; } //db.SaveChanges(); return(Ok()); }
public List <List <double> > ProtocniRaspored([FromBody] RaspodeliProtocnoModel parametri) { var lab = db.LabVezba.Find(parametri.LabVezbaId); int kapacitet = parametri.Kapacitet; DateTime pocetak = parametri.Pocetak; DateTime kraj = parametri.Kraj; int trajanje = parametri.Trajanje; int slot = parametri.Slot; List <double> listaSurvivalRate = SurvivalRate(StudentiUSlotu(VremeZadrzavanja(lab.Tag, lab.Naziv, parametri.Redosled), slot)); List <List <double> > sli = new List <List <double> >(); int brojSlotova = (int)((kraj - pocetak).TotalMinutes - trajanje) / slot + 1; double k; for (int i = 0; i < brojSlotova; i++) { List <double> pom = new List <double>(); if (i == 0) { for (int j = 0; j < listaSurvivalRate.Count(); j++) { pom.Add(Math.Round(kapacitet * listaSurvivalRate[j])); } sli.Add(pom); } else { double sum = 0.00; for (int j = 1; j < i + 1; j++) { if (j >= sli[i - j].Count()) { sum += 0; } else { sum += sli[i - j][j]; } } k = Convert.ToDouble(kapacitet) - sum; if (k <= 0) { k = 0; } for (int l = 0; l < listaSurvivalRate.Count(); l++) { pom.Add(Math.Round(k * listaSurvivalRate[l])); } sli.Add(pom); } } return(sli); }
public IActionResult Test([FromBody] RaspodeliProtocnoModel parametri) { var res = ProtocniRaspored(parametri).Select(x => x.First()).ToList(); //TODO: POKUPI STUDENTE var query = db.Student.AsQueryable(); query = query.Where(s => s.LabVezbaStudent.Any(x => x.LabVezbaId == parametri.LabVezbaId)); query = query.OrderBy(x => x.Indeks); var list = query.ToList(); //TODO: ZA SVAKOG DODAJ RASPORED var spec = db.LabSpecificna.Where(x => x.IdLabVezbe == parametri.LabVezbaId && x.Redosled == parametri.Redosled); db.LabSpecificna.RemoveRange(spec); db.SaveChanges(); var skip = 0; var i = 0; foreach (var num in res) { var specificna = new LabSpecificna { IdLabVezbe = parametri.LabVezbaId, Redosled = parametri.Redosled, //razmisli VremeOd = parametri.Pocetak.AddMinutes(i * parametri.Slot) }; i++; if (num == 0) { continue; } var studentiUSlot = list.Skip(skip).Take((int)num); skip += (int)num; if (!studentiUSlot.Any()) { break; } foreach (var student in studentiUSlot) { if (student.Indeks >= parametri.minIndeks) { var raspored = db.Raspored.FirstOrDefault(x => x.Student == student.Id && x.LabVezba == specificna.Id); if (raspored == null) { raspored = new Raspored { StudentNavigation = student, Ucionica = parametri.Ucionica, LabVezbaNavigation = specificna }; db.Raspored.Add(raspored); } raspored.Izmenjen = true; //notifier.Send(student.Username, $"Obaveštenje o lab vežbama. Došlo je do izmene za {specificna.IdLabVezbeNavigation.Naziv} - {specificna.Redosled} termin {specificna.VremeOd}"); } } } db.SaveChanges(); return(Ok()); }