internal void MovePatients() //flyttar från kön till iva framtills iva är fullt (5) { bool movePatients = true; while (movePatients) { Thread.Sleep(500); //håller räkningen på antalet som flyttat till iva och/eller sanotorium int movedToIva = 0; int movedToSanotorium = 0; using (var context = new KrankenhausSjukhusetDbContext()) { var mostILL = (from m in context.Patients where m.StatusID.Equals(1) || m.StatusID.Equals(2) orderby m.IllnessLevel descending, m.Age descending select m).ToList(); //most ill = sjukast i kön och sanotorium int ivaCount = context.Patients.Where(p => p.StatusID == 3).Count(); //antal personer i iva int ivaSpotsLeft = 5 - ivaCount; //flyttar till iva om det finns platser kvar i iva och patienter i kön eller sanotorium for (int i = 0; i < ivaSpotsLeft && i < mostILL.Count(); i++) { mostILL[i].StatusID = 3; movedToIva++; } var queue = (from p in context.Patients where p.StatusID.Equals(1) orderby p.IllnessLevel descending, p.Age select p).ToList(); int sanCount = context.Patients.Where(p => p.StatusID == 2).Count(); //10 är maximalkapaciteten för sanotoriumet int sanSpotsLeft = 10 - sanCount; for (int i = 0; i < sanSpotsLeft && queue.Count > i; i++) { queue[i].StatusID = 2; movedToSanotorium++; } //skickar ut statistik till eventinvokermetoden var stats = new MoveStatisticsEventargs(movedToIva, movedToSanotorium); MovedEventSender(stats); //kollar hur många patienter som finns kvar i sanotoriumet och kön int queueAndSanCount = context.Patients.Where(p => p.StatusID == 1 || p.StatusID == 2).Count(); if (queueAndSanCount == 0) { movePatients = false; //kör inte loopen igen om det inte finns några kvar att flytta } context.SaveChanges(); } } }
internal virtual void MovedEventSender(MoveStatisticsEventargs args) { MovedEvent?.Invoke(this, args); }