public EczaneNobetSonucModel ModelCoz(EczaneNobetModelCoz eczaneNobetModelCoz) { //var nobetGruplarTumu = _nobetGrupService.GetListByNobetUstGrupId(eczaneNobetModelCoz.NobetUstGrupId); var nobetGruplar = eczaneNobetModelCoz.NobetGrupId.ToList(); var nobetGruplarSirali = new List <NobetGruplarCozumSirali>(); var sonuclar = new EczaneNobetSonucModel(); var baslangicTarihi = eczaneNobetModelCoz.BaslangicTarihi; var bitisTarihi = eczaneNobetModelCoz.BitisTarihi; var indis = 0; foreach (var nobetGrupId in nobetGruplar) { nobetGruplarSirali.Add(new NobetGruplarCozumSirali { NobetGrupId = nobetGrupId, SiraId = indis }); indis++; } if (nobetGruplar.Count > 0) { var sonuclarKontrol = _eczaneNobetSonucService.GetDetaylarByNobetGrupGorevTipIdList(baslangicTarihi, bitisTarihi, eczaneNobetModelCoz.NobetGrupGorevTipler.Select(s => s.Id).ToArray()); if (sonuclarKontrol.Count > 0) { throw new Exception("Kriterlere uygun <strong>daha önce yazılmış nöbetler</strong> bulunmaktadır. Lütfen kontrol ediniz!"); } #region başka gruplarla ilişkisi olan gruplar var eczaneGruplar = _eczaneGrupService.GetDetaylarAktifGruplar(eczaneNobetModelCoz.NobetUstGrupId) .Where(d => nobetGruplar.Contains(d.NobetGrupId)).ToList(); //Birbiri ile ilişkili grupların gruplanması var nobetGruplarBagDurumu = _eczaneGrupService.EsGrupluEczanelerinGruplariniBelirleTumu(eczaneGruplar, nobetGruplar); var tumNobetGruplar = from g in nobetGruplarSirali let e = nobetGruplarBagDurumu.SingleOrDefault(x => x.NobetGrupId == g.NobetGrupId) ?? new NobetBagGrup() orderby e.Id, g.SiraId select new NobetGrupBagGrup { BagId = e.Id, NobetGrupId = g.NobetGrupId }; #endregion var nobetGrupBaglar = tumNobetGruplar.Select(s => s.BagId).Distinct().ToList(); #region Karar kuralları var model = new EczaneNobetDataModelParametre { AyBitis = eczaneNobetModelCoz.AyBitis, NobetGorevTipId = eczaneNobetModelCoz.NobetGorevTipId, NobetGrupGorevTipler = eczaneNobetModelCoz.NobetGrupGorevTipler, NobetGrupId = eczaneNobetModelCoz.NobetGrupId, NobetUstGrupId = eczaneNobetModelCoz.NobetUstGrupId, NobetUstGrupBaslangicTarihi = eczaneNobetModelCoz.NobetUstGrupBaslangicTarihi, BuAyVeSonrasi = eczaneNobetModelCoz.BuAyVeSonrasi, BaslangicTarihi = eczaneNobetModelCoz.BaslangicTarihi, BitisTarihi = eczaneNobetModelCoz.BitisTarihi, TimeLimit = eczaneNobetModelCoz.TimeLimit, CalismaSayisi = eczaneNobetModelCoz.CalismaSayisi }; var aylar = _takvimService.GetAylar() .Where(w => w.Id >= model.AyBitis) .OrderBy(o => o.Id).ToList(); var ayIndis = 0; var nobetGrupGorevTiplerTumu = model.NobetGrupGorevTipler.Where(w => model.NobetGrupId.Contains(w.NobetGrupId)).ToList(); //Sadece Sıralı Nöbet Yaz var sadeceSiraliNobetYazilacakGruplar = _nobetGrupGorevTipKisitService.GetDetaylar(63, nobetGrupGorevTiplerTumu.Select(s => s.Id).ToList()); var nobetGrupGorevTiplerSiradanYazilacaklar = new List <NobetGrupGorevTipDetay>(); var eczaneNobetGruplarSiradanYazilacakGruplar = _eczaneNobetGrupService.GetDetaylarByNobetGrupGorevTipler(sadeceSiraliNobetYazilacakGruplar.Select(s => s.NobetGrupGorevTipId).ToList()); //algoritma ile nöbet yazılacak gruplar if (sadeceSiraliNobetYazilacakGruplar.Count > 0) { sonuclar.ResultModel = new List <EczaneNobetCozum>(); model.NobetGrupGorevTipler = nobetGrupGorevTiplerTumu .Where(w => !sadeceSiraliNobetYazilacakGruplar.Select(s => s.NobetGrupGorevTipId).Contains(w.Id)).ToList(); nobetGrupGorevTiplerSiradanYazilacaklar = nobetGrupGorevTiplerTumu .Where(w => sadeceSiraliNobetYazilacakGruplar.Select(s => s.NobetGrupGorevTipId).Contains(w.Id)).ToList(); #region planlanan nöbetler - sıralı nöbet yazma (gün grubu bazında) foreach (var nobetGrupGorevTiplerSiradanYazilacak in nobetGrupGorevTiplerSiradanYazilacaklar) { var siraliSonuclar = _takvimService.SiraliNobetYazGrupBazindaEczaneNobetSonuclar(nobetGrupGorevTiplerSiradanYazilacak, eczaneNobetGruplarSiradanYazilacakGruplar, baslangicTarihi, bitisTarihi); sonuclar.ResultModel.AddRange(siraliSonuclar); } if (model.NobetGrupGorevTipler.Count == 0) { sonuclar.CozumSuresi = new TimeSpan(); return(sonuclar); } #endregion } if (eczaneNobetModelCoz.BuAyVeSonrasi && eczaneNobetModelCoz.CozumTercih == 0 && eczaneNobetModelCoz.SonrakiAylarRasgele) {//seçilen ay ve sonrası, gruplar öncelikli - sonraki aylarda gruplar rasgele sıralı foreach (var ay in aylar) { if (eczaneNobetModelCoz.AyBitis == ay.Id) {//ilk ay arayüzdeki sıra foreach (var item in nobetGrupBaglar) { var nobetGrupIdListe = tumNobetGruplar .Where(x => x.BagId == item) .Select(s => s.NobetGrupId); foreach (var nobetGrupId in nobetGrupIdListe) { var tarihBas = model.BaslangicTarihi; var tarihBit = model.BitisTarihi; var aydakiGunSayisi = DateTime.DaysInMonth(tarihBit.Year, ay.Id); var baslangicGunu = 1; if (ayIndis == 1) { baslangicGunu = tarihBas.Day; } model.BaslangicTarihi = new DateTime(tarihBas.Year, ay.Id, baslangicGunu); model.BitisTarihi = new DateTime(tarihBit.Year, ay.Id, aydakiGunSayisi); model.NobetGrupId = new int[] { nobetGrupId }; var data = EczaneNobetDataModel(model); //return EczaneNobetCozSonuclaraEkle(data); var sonuc = EczaneNobetCozSonuclaraEkle(data); sonuclar.ObjectiveValue += sonuc.ObjectiveValue; sonuclar.KararDegikeniSayisi += sonuc.KararDegikeniSayisi; sonuclar.KisitSayisi += sonuc.KisitSayisi; sonuclar.CozumSuresi += sonuc.CozumSuresi; sonuclar.CalismaSayisi += sonuc.CalismaSayisi; sonuclar.IterasyonSayisi += sonuc.IterasyonSayisi; } } } else { foreach (var item in nobetGrupBaglar) { var r = new Random(); var nobetGrupIdListe = tumNobetGruplar .Where(x => x.BagId == item) .Select(s => s.NobetGrupId) .OrderBy(x => r.NextDouble()); foreach (var nobetGrupId in nobetGrupIdListe) { var tarihBas = model.BaslangicTarihi; var tarihBit = model.BitisTarihi; var aydakiGunSayisi = DateTime.DaysInMonth(tarihBit.Year, ay.Id); var baslangicGunu = 1; if (ayIndis == 1) { baslangicGunu = tarihBas.Day; } model.BaslangicTarihi = new DateTime(tarihBas.Year, ay.Id, baslangicGunu); model.BitisTarihi = new DateTime(tarihBit.Year, ay.Id, aydakiGunSayisi); model.NobetGrupId = new int[] { nobetGrupId }; var data = EczaneNobetDataModel(model); var sonuc = EczaneNobetCozSonuclaraEkle(data); sonuclar.ObjectiveValue += sonuc.ObjectiveValue; sonuclar.KararDegikeniSayisi += sonuc.KararDegikeniSayisi; sonuclar.KisitSayisi += sonuc.KisitSayisi; sonuclar.CozumSuresi += sonuc.CozumSuresi; sonuclar.CalismaSayisi += sonuc.CalismaSayisi; sonuclar.IterasyonSayisi += sonuc.IterasyonSayisi; } } } } return(sonuclar); } else if (eczaneNobetModelCoz.BuAyVeSonrasi && eczaneNobetModelCoz.CozumTercih == 0) {//seçilen ay ve sonrası, gruplar öncelikli foreach (var ay in aylar) { ayIndis++; if (tumNobetGruplar.Count() == 1) { model.AyBitis = ay.Id; var data = EczaneNobetDataModel(model); return(EczaneNobetCozSonuclaraEkle(data)); } else { foreach (var item in nobetGrupBaglar) { var nobetGrupIdListe = tumNobetGruplar .Where(x => x.BagId == item) .Select(s => s.NobetGrupId); foreach (var nobetGrupId in nobetGrupIdListe) { var tarihBas = model.BaslangicTarihi; var tarihBit = model.BitisTarihi; var aydakiGunSayisi = DateTime.DaysInMonth(tarihBit.Year, ay.Id); var baslangicGunu = 1; if (ayIndis == 1) { baslangicGunu = tarihBas.Day; } model.BaslangicTarihi = new DateTime(tarihBas.Year, ay.Id, baslangicGunu); model.BitisTarihi = new DateTime(tarihBit.Year, ay.Id, aydakiGunSayisi); model.NobetGrupId = new int[] { nobetGrupId }; var data = EczaneNobetDataModel(model); var sonuc = EczaneNobetCozSonuclaraEkle(data); sonuclar.ObjectiveValue += sonuc.ObjectiveValue; sonuclar.KararDegikeniSayisi += sonuc.KararDegikeniSayisi; sonuclar.KisitSayisi += sonuc.KisitSayisi; sonuclar.CozumSuresi += sonuc.CozumSuresi; sonuclar.CalismaSayisi += sonuc.CalismaSayisi; sonuclar.IterasyonSayisi += sonuc.IterasyonSayisi; } } } } return(sonuclar); } else if (eczaneNobetModelCoz.BuAyVeSonrasi && eczaneNobetModelCoz.CozumTercih == 1) {//seçilen ay ve sonrası, gruplar önceliksiz foreach (var ay in aylar) { ayIndis++; foreach (var item in nobetGrupBaglar) { var nobetGrupIdListe = tumNobetGruplar .Where(x => x.BagId == item) .Select(s => s.NobetGrupId) .ToArray(); var tarihBas = model.BaslangicTarihi; var tarihBit = model.BitisTarihi; var aydakiGunSayisi = DateTime.DaysInMonth(tarihBit.Year, ay.Id); var baslangicGunu = 1; if (ayIndis == 1) { baslangicGunu = tarihBas.Day; } model.BaslangicTarihi = new DateTime(tarihBas.Year, ay.Id, baslangicGunu); model.BitisTarihi = new DateTime(tarihBit.Year, ay.Id, aydakiGunSayisi); model.NobetGrupId = nobetGrupIdListe; var data = EczaneNobetDataModel(model); var sonuc = EczaneNobetCozSonuclaraEkle(data); sonuclar.ObjectiveValue += sonuc.ObjectiveValue; sonuclar.KararDegikeniSayisi += sonuc.KararDegikeniSayisi; sonuclar.KisitSayisi += sonuc.KisitSayisi; sonuclar.CozumSuresi += sonuc.CozumSuresi; sonuclar.CalismaSayisi += sonuc.CalismaSayisi; sonuclar.IterasyonSayisi += sonuc.IterasyonSayisi; } } return(sonuclar); } else if (eczaneNobetModelCoz.CozumTercih == 0) {//ay, gruplar öncelikli if (tumNobetGruplar.Count() == 1) { var data = EczaneNobetDataModel(model); return(EczaneNobetCozAktifiGuncelle(data)); } else { foreach (var item in nobetGrupBaglar) { var nobetGrupIdListe = tumNobetGruplar .Where(x => x.BagId == item) .Select(s => s.NobetGrupId) .ToArray(); foreach (var nobetGrupId in nobetGrupIdListe) { model.NobetGrupId = new int[] { nobetGrupId }; var data = EczaneNobetDataModel(model); var sonuc = EczaneNobetCozSonuclaraEkle(data); sonuclar.ObjectiveValue += sonuc.ObjectiveValue; sonuclar.KararDegikeniSayisi += sonuc.KararDegikeniSayisi; sonuclar.KisitSayisi += sonuc.KisitSayisi; sonuclar.CozumSuresi += sonuc.CozumSuresi; sonuclar.CalismaSayisi += sonuc.CalismaSayisi; sonuclar.IterasyonSayisi += sonuc.IterasyonSayisi; } } return(sonuclar); } } else if (eczaneNobetModelCoz.CozumTercih == 1) {//ay, gruplar önceliksiz foreach (var item in nobetGrupBaglar) { var nobetGrupIdListe = tumNobetGruplar .Where(x => x.BagId == item) .Select(s => s.NobetGrupId) .ToArray(); model.NobetGrupId = nobetGrupIdListe; var data = EczaneNobetDataModel(model); //return EczaneNobetCozAktifiGuncelle(data); //sonuclar = EczaneNobetCozAktifiGuncelle(data); var sonuc = EczaneNobetCozSonuclaraEkle(data); sonuclar.ObjectiveValue += sonuc.ObjectiveValue; sonuclar.KararDegikeniSayisi += sonuc.KararDegikeniSayisi; sonuclar.KisitSayisi += sonuc.KisitSayisi; sonuclar.CozumSuresi += sonuc.CozumSuresi; sonuclar.CalismaSayisi += sonuc.CalismaSayisi; sonuclar.IterasyonSayisi += sonuc.IterasyonSayisi; } return(sonuclar); } else {//diğer throw new Exception("Nöbet yazdırma kriter seçimi hatalıdır. Lütfen kontrol ediniz."); } #endregion } return(sonuclar); }