public EczaneNobetSonucModel EczaneNobetCozSonuclaraEkle(KirikhanDataModel data) { var yeniSonuclar = _eczaneNobetKirikhanOptimization.Solve(data); _eczaneNobetSonucService.CokluEkle(yeniSonuclar.ResultModel); return(yeniSonuclar); }
/// <summary> /// Her çözüm sonrasında aktif sonuçlardaki mevcut kayıtlar silinip yerine yeni sonuçlar eklenir. /// </summary> /// <param name="data"></param> //[TransactionScopeAspect] public EczaneNobetSonucModel EczaneNobetCozAktifiGuncelle(KirikhanDataModel data) { var mevcutSonuclar = _eczaneNobetSonucAktifService.GetDetaylar2(data.NobetUstGrupId); var guncellenecekSonuclar = mevcutSonuclar .Where(x => data.NobetGruplar.Select(s => s.Id).Contains(x.NobetGrupId)) .Select(s => s.Id).ToArray(); var yeniSonuclar = _eczaneNobetKirikhanOptimization.Solve(data); //gelen datadaki nöbet grup id aktif sonuçlarda varsa o nöbet gruba ait önceki sonuçları sil _eczaneNobetSonucAktifService.CokluSil(guncellenecekSonuclar); AktiftekiArtiklariSil(data.NobetUstGrupId); //yeni sonuçları ekle _eczaneNobetSonucAktifService.CokluEkle(yeniSonuclar.ResultModel); return(yeniSonuclar); }
private KirikhanDataModel EczaneNobetDataModel(EczaneNobetDataModelParametre eczaneNobetDataModelParametre) { #region parametreler var nobetUstGrupId = eczaneNobetDataModelParametre.NobetUstGrupId; var nobetGrupIdListe = eczaneNobetDataModelParametre.NobetGrupId.ToList(); //var nobetGorevTipId = eczaneNobetDataModelParametre.NobetGorevTipId; var nobetUstGrupBaslangicTarihi = eczaneNobetDataModelParametre.NobetUstGrupBaslangicTarihi; var baslangicTarihi = eczaneNobetDataModelParametre.BaslangicTarihi; var bitisTarihi = eczaneNobetDataModelParametre.BitisTarihi; var nobetGrupGorevTipler = eczaneNobetDataModelParametre.NobetGrupGorevTipler; var nobetGorevTipler = eczaneNobetDataModelParametre.NobetGrupGorevTipler.Select(s => s.NobetGorevTipId).Distinct().ToList(); var yazBaslangic = new DateTime(baslangicTarihi.Year, 6, 1); var yazBitis = new DateTime(baslangicTarihi.Year, 9, 15); #endregion if (baslangicTarihi < nobetUstGrupBaslangicTarihi) { throw new Exception($"Nöbet başlangıç tarihi <strong>({baslangicTarihi.ToShortDateString()})</strong> üst grup başlama tarihinden <strong>({nobetUstGrupBaslangicTarihi.ToShortDateString()})</strong> küçük olamaz."); } var debugYapilacakEczaneler = _debugEczaneService.GetDetaylarAktifOlanlar(nobetUstGrupId); var nobetGruplar = _nobetGrupService.GetDetaylar(nobetGrupIdListe).OrderBy(s => s.Id).ToList(); //var nobetGrupGorevTipler = _nobetGrupGorevTipService.GetDetaylar(nobetGrupIdListe); //nobetGorevTipId, var eczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(nobetUstGrupId); var eczaneNobetMazeretNobettenDusenler = new List <EczaneNobetMazeretSayilari>(); var mazeret = _nobetUstGrupKisitService.GetKisitPasifMi("mazeret", nobetUstGrupId); if (mazeret) { eczaneNobetMazeretNobettenDusenler = _eczaneNobetMazeretService.GetEczaneNobetMazeretSayilari(baslangicTarihi, bitisTarihi, nobetGrupIdListe); } var eczaneNobetGruplarTumu = _eczaneNobetGrupService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi) .Where(w => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneNobetGrupId).Contains(w.Id) //&& w.EczaneAdi == "ÖZGÜR" ).ToList(); var nobetGorevTipId = 1; if (!nobetGorevTipler.Contains(nobetGorevTipId)) { nobetGorevTipId = 0; } var eczaneNobetGruplarGorevTip1 = eczaneNobetGruplarTumu .Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList(); nobetGorevTipId = 13; if (!nobetGorevTipler.Contains(nobetGorevTipId)) { nobetGorevTipId = 0; } var eczaneNobetGruplarGorevTip2 = eczaneNobetGruplarTumu .Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList(); var eczaneNobetSonuclarOncekiAylar = eczaneNobetSonuclar .Where(w => w.Tarih >= nobetUstGrupBaslangicTarihi && eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId) //görevtip: tümü //&& eczaneNobetGruplarGorevTip1.Select(s => s.Id).Contains(w.EczaneNobetGrupId) //görevtip: 1 ).ToList(); var eczaneNobetSonuclarCozulenGruplar = eczaneNobetSonuclar .Where(w => eczaneNobetGruplarTumu.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList(); var son3Ay = baslangicTarihi.AddMonths(-2); var eczaneNobetSonuclarSon3Ay = eczaneNobetSonuclarCozulenGruplar .Where(w => w.Tarih >= son3Ay).ToList(); var sonuclarKontrol = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclarCozulenGruplar); if (sonuclarKontrol.Count > 0) { throw new Exception("Kriterlere uygun <strong>daha önce yazılmış nöbetler</strong> bulunmaktadır. Lütfen kontrol ediniz!"); } var tarihAralik = _takvimService.GetTakvimNobetGruplar(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler); var tarihAralikTumu = _takvimService.GetTakvimNobetGruplar(nobetUstGrupBaslangicTarihi, bitisTarihi, nobetGrupGorevTipler); var yazDonemiTarihAraligiCts = tarihAralikTumu .Where(w => (w.Tarih >= yazBaslangic && w.Tarih >= baslangicTarihi && w.Tarih <= yazBitis) && w.NobetGunKuralId == 7 && w.NobetGorevTipId == 13 ).ToList(); //var haftaSonlari = tarihAralik.Where(w => w.NobetGunKuralId == 7).ToList(); var enSonNobetler = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplarTumu, eczaneNobetSonuclarCozulenGruplar); var enSonNobetlerSon3Ay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistik(eczaneNobetGruplarTumu, eczaneNobetSonuclarSon3Ay); var eczaneNobetGrupGunKuralIstatistikYatay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetler); var eczaneBazliGunKuralIstatistikYatay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetler); var eczaneNobetGrupGunKuralIstatistikYataySon3Ay = _eczaneNobetOrtakService.GetEczaneNobetGrupGunKuralIstatistikYatay(enSonNobetlerSon3Ay); //var bak = eczaneNobetGrupGunKuralIstatistikYatay.Where(w => w.NobetGorevTipId == 2).ToList(); var nobetBorcOdeme = _nobetUstGrupKisitService.GetDetay(39, nobetUstGrupId); if (nobetBorcOdeme.Id == 39) { var anahtarListe = eczaneNobetSonuclar .Where(w => w.Tarih < nobetUstGrupBaslangicTarihi && nobetGrupIdListe.Contains(w.NobetGrupId)).ToList(); var borcTakipEdilecekGunGruplar = new int[] { //1, //3, 4 }; var gunGruplar = tarihAralik .Where(w => borcTakipEdilecekGunGruplar.Contains(w.GunGrupId)) .Select(s => new { s.GunGrupId, s.GunGrupAdi }) .Distinct() .OrderBy(o => o.GunGrupId).ToList(); foreach (var gunGrup in gunGruplar) { var haftaIciAnahtarListeTumEczaneler = _takvimService.AnahtarListeyiBuGuneTasi(nobetGrupGorevTipler, eczaneNobetGruplarTumu, eczaneNobetGrupGunKuralIstatistikYatay, anahtarListe, gunGrup.GunGrupAdi); var nobetBorcEczaneler = (from s in eczaneNobetGrupGunKuralIstatistikYatay from b in haftaIciAnahtarListeTumEczaneler where s.EczaneNobetGrupId == b.EczaneNobetGrupId && s.NobetSayisiHaftaIci == b.NobetSayisi select new EczaneNobetAlacakVerecek { EczaneNobetGrupId = s.EczaneNobetGrupId, EczaneId = s.EczaneId, EczaneAdi = s.EczaneAdi, NobetGrupAdi = s.NobetGrupAdi, NobetGrupId = s.NobetGrupId, NobetSayisi = gunGrup.GunGrupId == 1 ? s.NobetSayisiPazar : gunGrup.GunGrupId == 4 ? s.NobetSayisiCumartesi : s.NobetSayisiHaftaIci, SonNobetTarihi = gunGrup.GunGrupId == 1 ? s.SonNobetTarihiPazar : gunGrup.GunGrupId == 4 ? s.SonNobetTarihiCumartesi : s.SonNobetTarihiHaftaIci, AnahtarTarih = b.Tarih, BorcluGunSayisi = gunGrup.GunGrupId == 1 ? ((int)(s.NobetSayisiPazar > 0 ? (s.SonNobetTarihiPazar - b.Tarih).TotalDays : (s.SonNobetTarihiPazar - b.Tarih).TotalDays - (s.SonNobetTarihiPazar - b.NobetUstGrupBaslamaTarihi).TotalDays)) : gunGrup.GunGrupId == 4 ? ((int)(s.NobetSayisiCumartesi > 0 ? (s.SonNobetTarihiCumartesi - b.Tarih).TotalDays : (s.SonNobetTarihiCumartesi - b.Tarih).TotalDays - (s.SonNobetTarihiCumartesi - b.NobetUstGrupBaslamaTarihi).TotalDays)) : ((int)(s.NobetSayisiHaftaIci > 0 ? (s.SonNobetTarihiHaftaIci - b.Tarih).TotalDays : (s.SonNobetTarihiHaftaIci - b.Tarih).TotalDays - (s.SonNobetTarihiHaftaIci - b.NobetUstGrupBaslamaTarihi).TotalDays)), GunGrupAdi = gunGrup.GunGrupAdi, GunGrupId = gunGrup.GunGrupId }).ToList(); foreach (var eczane in nobetBorcEczaneler) { if (gunGrup.GunGrupId == 1) { //eczaneNobetGrupGunKuralIstatistikYatay //.Where(w => w.EczaneNobetGrupId == eczane.EczaneNobetGrupId) //.FirstOrDefault().bo = (int)eczane.BorcluGunSayisi; } else if (gunGrup.GunGrupId == 3) { eczaneNobetGrupGunKuralIstatistikYatay .Where(w => w.EczaneNobetGrupId == eczane.EczaneNobetGrupId) .FirstOrDefault().BorcluNobetSayisiHaftaIci = (int)eczane.BorcluGunSayisi; } else if (gunGrup.GunGrupId == 4) { } } } } var grupluEczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, eczaneNobetSonuclar); var eczaneGrupEdges = _eczaneGrupService.GetEdges(nobetUstGrupId) .Where(e => (nobetGrupIdListe.Contains(e.FromNobetGrupId) || nobetGrupIdListe.Contains(e.ToNobetGrupId))) .Where(w => (grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.From) || grupluEczaneNobetSonuclar.Select(s => s.EczaneId).Distinct().Contains(w.To)) ).ToList(); //sonuçlarda ilişkili eczaneler var eczaneGruplar = _eczaneGrupService.GetDetaylarAktifGruplar(nobetUstGrupId) .Where(x => (eczaneGrupEdges.Select(s => s.From).Distinct().Contains(x.EczaneId) || eczaneGrupEdges.Select(s => s.To).Distinct().Contains(x.EczaneId)) || nobetGrupIdListe.Contains(x.NobetGrupId) ).ToList(); //fazladan gelen tanımlar var iyileştirmekte fayda var var eczaneGrupTanimlar = _eczaneGrupTanimService.GetDetaylarAktifTanimList(eczaneGruplar.Select(x => x.EczaneGrupTanimId).ToList()); var eczaneGruplar2 = _eczaneGrupService.GetDetaylarByEczaneGrupTanimId(eczaneGrupTanimlar.Select(s => s.Id).ToList()); var eczaneGrupNobetSonuclar = grupluEczaneNobetSonuclar .Where(w => eczaneGruplar2.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList(); //nöbet yazılacak tarih aralığı(örn. Ocak ayının tüm günleri) var eczaneKumulatifHedefler = new List <EczaneNobetIstatistik>(); var eczaneNobetIstatistikler = new List <EczaneNobetIstatistik>(); //2.görev tipi için sadece cumartesi olduğu için tüm günler tüm görev tiplerini almaya gerek yok. //var eczaneNobetTarihAralik = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTipler) // .Where(w => eczaneNobetGruplar.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList(); var nobetGrupGorevTipGunKurallar = _nobetGrupGorevTipGunKuralService.GetDetaylarAktifList(nobetGrupGorevTipler.Select(s => s.Id).ToList()); nobetGorevTipId = 1; var nobetGrupGorevTip1 = nobetGrupGorevTipler.Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList(); var eczaneNobetTarihAralik1 = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTip1) .Where(w => eczaneNobetGruplarGorevTip1.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList(); nobetGorevTipId = 13; var nobetGrupGorevTip2 = nobetGrupGorevTipler.Where(w => w.NobetGorevTipId == nobetGorevTipId).ToList(); var noberGunKurallar = nobetGrupGorevTipGunKurallar .Where(w => nobetGrupGorevTip2.Select(s => s.Id).Contains(w.NobetGrupGorevTipId)) .Select(s => s.NobetGunKuralId).ToList(); var eczaneNobetTarihAralik2 = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGrupGorevTip2, noberGunKurallar) .Where(w => eczaneNobetGruplarGorevTip2.Select(s => s.Id).Contains(w.EczaneNobetGrupId)).ToList(); if (YazDonemiMi(baslangicTarihi, yazBaslangic, yazBitis)) { eczaneNobetTarihAralik1 = eczaneNobetTarihAralik1.Where(w => !yazDonemiTarihAraligiCts.Select(s => s.TakvimId).Contains(w.TakvimId)).ToList(); //eczaneNobetTarihAralik2 = eczaneNobetTarihAralik1.Where(w => haftaSonlari.Select(s => s.TakvimId).Contains(w.TakvimId)).ToList(); } else { eczaneNobetTarihAralik2 = new List <EczaneNobetTarihAralik>(); } var eczaneNobetTarihAralik3 = new List <EczaneNobetTarihAralik>(); foreach (var nobetGrupGorevTip in nobetGrupGorevTip2) { eczaneNobetTarihAralik3 = eczaneNobetTarihAralik2.Where(w => w.NobetGrupGorevTipId == nobetGrupGorevTip.Id && w.Tarih >= nobetGrupGorevTip.BaslamaTarihi && (w.Tarih <= nobetGrupGorevTip.BitisTarihi || nobetGrupGorevTip.BitisTarihi == null) && yazDonemiTarihAraligiCts.Select(s => s.TakvimId).Contains(w.TakvimId) ).ToList(); } var eczaneNobetTarihAralikTumu = eczaneNobetTarihAralik1.Union(eczaneNobetTarihAralik3).ToList(); //var kd = eczaneNobetTarihAralikTumu.Where(w => w.EczaneAdi == "AHSEN").ToList(); var eczaneNobetTarihAralik = _eczaneNobetOrtakService.AmacFonksiyonuKatsayisiBelirle(eczaneNobetTarihAralikTumu, eczaneNobetGrupGunKuralIstatistikYatay); //var ikiliEczaneler = _ayniGunTutulanNobetService.GetDetaylar(nobetGrupIdListe); var eczaneNobetIstekler = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(baslangicTarihi, bitisTarihi, nobetGrupIdListe) .Where(w => eczaneNobetGruplarTumu.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList(); var eczaneNobetMazeretler = _eczaneNobetMazeretService.GetDetaylarByEczaneIdList(baslangicTarihi, bitisTarihi, eczaneNobetGruplarTumu.Select(s => s.EczaneId).Distinct().ToList()) .Where(w => w.MazeretId != 3) .ToList(); var takvimNobetGrupGunDegerIstatistikler = new List <TakvimNobetGrupGunDegerIstatistik>(); var takvimTumu = new List <TakvimNobetGrup>(); var cumartesiNobetGunKuralId = new List <int> { 7 }; foreach (var nobetGrupGorevTip in nobetGrupGorevTipler) { var takvimNobetGrupGunDegerIstatistiklerGorevTip = new List <TakvimNobetGrupGunDegerIstatistik>(); var takvimAra = new List <TakvimNobetGrup>(); if (nobetGrupGorevTip.NobetGorevTipId == 13) { var tarihlerYaz = tarihAralikTumu .Where(w => w.NobetGorevTipId == nobetGrupGorevTip.NobetGorevTipId && (w.Tarih >= yazBaslangic && w.Tarih <= yazBitis && w.NobetGunKuralId == 7) ) .Select(s => s.TakvimId).ToArray(); takvimNobetGrupGunDegerIstatistiklerGorevTip = _takvimService.GetTakvimNobetGrupGunDegerIstatistikler( nobetUstGrupBaslangicTarihi, bitisTarihi, nobetGrupGorevTip.Id, tarihlerYaz).ToList(); takvimAra = tarihAralik .Where(w => w.NobetGorevTipId == nobetGrupGorevTip.NobetGorevTipId && (w.Tarih >= yazBaslangic && w.Tarih <= yazBitis && w.NobetGunKuralId == 7) ).ToList(); } else { var tarihlerYaz = tarihAralikTumu .Where(w => w.NobetGorevTipId == nobetGrupGorevTip.NobetGorevTipId && !(w.Tarih >= yazBaslangic && w.Tarih <= yazBitis && w.NobetGunKuralId == 7) ) .Select(s => s.TakvimId).ToArray(); takvimNobetGrupGunDegerIstatistiklerGorevTip = _takvimService.GetTakvimNobetGrupGunDegerIstatistikler( nobetUstGrupBaslangicTarihi, bitisTarihi, nobetGrupGorevTip.Id, tarihlerYaz).ToList(); takvimAra = tarihAralik .Where(w => w.NobetGorevTipId == nobetGrupGorevTip.NobetGorevTipId && !(w.Tarih >= yazBaslangic && w.Tarih <= yazBitis && w.NobetGunKuralId == 7) ).ToList(); } takvimTumu.AddRange(takvimAra); takvimNobetGrupGunDegerIstatistikler.AddRange(takvimNobetGrupGunDegerIstatistiklerGorevTip); } //var eczaneNobetGrupAltGruplar = _eczaneNobetGrupAltGrupService.GetDetaylar(nobetUstGrupId); var nobetGrupKurallar = _nobetGrupKuralService.GetDetaylar(nobetGrupIdListe); var nobetUstGrupKisitlar = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrupId); var grupBazliKisitlar = _nobetGrupGorevTipKisitService.GetDetaylar(nobetUstGrupId); var dataModel = new KirikhanDataModel() { Yil = eczaneNobetDataModelParametre.YilBaslangic, Ay = eczaneNobetDataModelParametre.AyBitis, TimeLimit = eczaneNobetDataModelParametre.TimeLimit, CalismaSayisiLimit = eczaneNobetDataModelParametre.CalismaSayisi, LowerBound = 0, UpperBound = 1, BaslangicTarihi = baslangicTarihi, BitisTarihi = bitisTarihi, NobetUstGrupBaslangicTarihi = nobetUstGrupBaslangicTarihi, NobetUstGrupId = nobetUstGrupId, EczaneNobetTarihAralik = eczaneNobetTarihAralik, //karar değişkeni EczaneKumulatifHedefler = eczaneKumulatifHedefler, //.Where(w => w.EczaneId != 121).ToList(), EczaneNobetIstatistikler = eczaneNobetIstatistikler, EczaneNobetMazeretler = eczaneNobetMazeretler, EczaneGrupTanimlar = eczaneGrupTanimlar, TarihAraligi = takvimTumu,//tarihAralik, NobetGruplar = nobetGruplar, EczaneGruplar = eczaneGruplar2, EczaneNobetIstekler = eczaneNobetIstekler, NobetGrupGunKurallar = _nobetGrupGunKuralService.GetAktifList(nobetGrupIdListe), NobetGrupGorevTipGunKurallar = _nobetGrupGorevTipGunKuralService.GetDetaylarAktifList(nobetGrupGorevTipler.Select(s => s.Id).ToList()), NobetGrupKurallar = nobetGrupKurallar, NobetGrupGorevTipler = nobetGrupGorevTipler, NobetGrupTalepler = _nobetGrupTalepService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi), EczaneNobetGruplar = eczaneNobetGruplarTumu, Kisitlar = nobetUstGrupKisitlar, EczaneGrupNobetSonuclar = eczaneGrupNobetSonuclar, EczaneNobetSonuclar = eczaneNobetSonuclarCozulenGruplar, EczaneGrupNobetSonuclarTumu = eczaneNobetSonuclar, EczaneNobetGrupGunKuralIstatistikler = enSonNobetler, TakvimNobetGrupGunDegerIstatistikler = takvimNobetGrupGunDegerIstatistikler, EczaneNobetGrupGunKuralIstatistikYatay = eczaneNobetGrupGunKuralIstatistikYatay, EczaneBazliGunKuralIstatistikYatay = eczaneBazliGunKuralIstatistikYatay, EczaneNobetGrupGunKuralIstatistikYataySon3Ay = eczaneNobetGrupGunKuralIstatistikYataySon3Ay, NobetGrupGorevTipKisitlar = grupBazliKisitlar, DebugYapilacakEczaneler = debugYapilacakEczaneler }; //_eczaneNobetOrtakService.KurallariKontrolEtHaftaIciEnAzEnCok(nobetUstGrupId, eczaneNobetGrupGunKuralIstatistikYatay); _eczaneNobetOrtakService.KurallariKontrolEtMazeretIstek(nobetUstGrupId, eczaneNobetMazeretler, eczaneNobetIstekler); _eczaneNobetOrtakService.KurallariKontrolEtIstek(nobetUstGrupId, eczaneNobetIstekler, nobetGrupKurallar); return(dataModel); }