/// <summary> /// Nöbetlerin tekrar tekrar yazılabilmesi için her çözüm sonrasında /// aktif sonuçlardaki mevcut kayıtlar silinip yerine yeni sonuçlar eklenir. /// Eczane Nöbet Çok Grup Data Model için /// </summary> /// <param name="data"></param> public void EczaneNobetCozAktifiGuncelle(AlanyaDataModelEski data) { var aktifSonuclar = _eczaneNobetSonucAktifService.GetSonuclar2(data.NobetUstGrupId); var guncellenecekSonuclar = aktifSonuclar.Where(x => data.NobetGruplar.Select(s => s.Id).Contains(x.NobetGrupId)); var yeniSonuclar = _eczaneNobetAlanyaOptimization.Solve(data); #region çözüm süresi var timeSpan = new TimeSpan(); if (yeniSonuclar.ResultModel.Count > 0) { timeSpan = yeniSonuclar.CozumSuresi; var amacFonksiyonu = yeniSonuclar.ObjectiveValue; } #endregion //gelen datadaki nöbet grup id aktif sonuçlarda varsa o nöbet gruba ait önceki sonuçları sil AktiftekiArtiklariSil(data.NobetUstGrupId); //yeni sonuçları ekle _eczaneNobetSonucAktifService.CokluEkle(yeniSonuclar.ResultModel); #region aynı gün nöbet tutan eczaneler için //çözülen grubun sonuçları aktifSonuclar = _eczaneNobetSonucAktifService.GetSonuclar2(data.NobetUstGrupId); //aynı aydaki diğer grupların sonuçları var ayniAydakiDigerGruplarinSonuclari = _eczaneNobetSonucService.GetSonuclar(data.BaslangicTarihi, data.BitisTarihi, data.NobetUstGrupId); var ayIcindekiTumSonuclar = aktifSonuclar.Union(ayniAydakiDigerGruplarinSonuclari).ToList(); var ayIcindeCozulenNobetGruplar = ayIcindekiTumSonuclar.Select(s => s.NobetGrupId).Distinct(); var ayIcindeAyniGunNobet = _nobetUstGrupKisitService.GetKisitPasifMi("ayIcindeAyniGunNobet", data.NobetUstGrupId); if (ayIcindeAyniGunNobet && ayIcindeCozulenNobetGruplar.Count() > 1) { var ayIcindeAyniGunNobetTutanEczaneler = new List <EczaneCiftGrup>(); ayIcindeAyniGunNobetTutanEczaneler = _eczaneNobetOrtakService.GetCiftGrupluEczaneler(ayIcindekiTumSonuclar, 2); var indisId = data.AyIcindeAyniGunNobetTutanEczaneler.Select(s => s.Id).LastOrDefault(); foreach (var item in ayIcindeAyniGunNobetTutanEczaneler) { data.AyIcindeAyniGunNobetTutanEczaneler .Add(new EczaneCiftGrup { Id = indisId + item.Id, EczaneId = item.EczaneId, BirlikteNobetTutmaSayisi = item.BirlikteNobetTutmaSayisi }); } //ay içinde grup olan eczane varsa bu sayı bitene iterasyon yapılıyor if (ayIcindeAyniGunNobetTutanEczaneler.Count > 0) { data.CozumItereasyon.IterasyonSayisi++; EczaneNobetCozAktifiGuncelle(data); } } #endregion }
private AlanyaDataModelEski EczaneNobetDataModel(EczaneNobetDataModelParametre eczaneNobetDataModelParametre) { #region parametreler var nobetUstGrupId = eczaneNobetDataModelParametre.NobetUstGrupId; var yilBaslangic = eczaneNobetDataModelParametre.YilBaslangic; var yilBitis = eczaneNobetDataModelParametre.YilBitis; var ayBaslangic = eczaneNobetDataModelParametre.AyBaslangic; var ayBitis = eczaneNobetDataModelParametre.AyBitis; var nobetGrupIdListe = eczaneNobetDataModelParametre.NobetGrupId.ToList(); var nobetGorevTipId = eczaneNobetDataModelParametre.NobetGorevTipId; #endregion var baslangicTarihi = new DateTime(yilBitis, ayBitis, 1); var bitisTarihi = baslangicTarihi.AddMonths(1); var nobetGruplar = _nobetGrupService.GetList(nobetGrupIdListe).OrderBy(s => s.Id).ToList(); var eczaneNobetMazeretNobettenDusenler = _eczaneNobetMazeretService.GetEczaneNobetMazeretSayilari(baslangicTarihi, bitisTarihi, nobetGrupIdListe); var eczaneNobetSonuclarAylik = _eczaneNobetSonucService.GetSonuclar(baslangicTarihi, bitisTarihi, nobetUstGrupId); var eczaneGrupEdges = _eczaneGrupService.GetEdges(nobetUstGrupId) .Where(e => (nobetGrupIdListe.Contains(e.FromNobetGrupId) || nobetGrupIdListe.Contains(e.ToNobetGrupId))) .Where(w => (eczaneNobetSonuclarAylik.Select(s => s.EczaneId).Distinct().Contains(w.From) || eczaneNobetSonuclarAylik.Select(s => s.EczaneId).Distinct().Contains(w.To))) .ToList(); //sonuclarda ilişkili eczaneler var eczaneGruplar = _eczaneGrupService.GetDetaylar(nobetUstGrupId) .Where(x => x.EczaneGrupTanimBitisTarihi == null //&& x.EczaneGrupTanimTipId == 2 //coğrafi yakınlık hariç && nobetGrupIdListe.Contains(x.NobetGrupId) && (eczaneGrupEdges.Select(s => s.From).Distinct().Contains(x.EczaneId) || eczaneGrupEdges.Select(s => s.To).Distinct().Contains(x.EczaneId)) ).ToList(); //fazladan gelen tanımlar var. burayı iyileştirmekte fayda var var eczaneGrupTanimlar = _eczaneGrupTanimService.GetAktifTanimList(eczaneGruplar.Select(x => x.EczaneGrupTanimId).ToList()); var eczaneGruplar2 = _eczaneGrupService.GetDetaylarByEczaneGrupTanimId(eczaneGrupTanimlar.Select(s => s.Id).ToList()); var eczaneGrupNobetSonuclar = eczaneNobetSonuclarAylik .Where(w => eczaneGruplar2.Select(s => s.EczaneId).Contains(w.EczaneId)).ToList(); var esGrupluEczaneler = _eczaneNobetGrupService.GetAktifEczaneGrupList(nobetGrupIdListe) .Where(x => !eczaneNobetMazeretNobettenDusenler.Select(s => s.EczaneId).Contains(x.EczaneId)) .Select(x => x.EczaneId).Distinct().ToList(); var eczaneNobetGruplar = _eczaneNobetGrupService.GetAktifEczaneGrupList(nobetGruplar.Select(w => w.Id).ToList()) .Where(s => !eczaneNobetMazeretNobettenDusenler.Select(f => f.EczaneId).Contains(s.EczaneId)).ToList(); #region aynı gün nöbet tutan eczaneler //nöbet yazılacak tarih aralığı(örn. Ocak ayının tüm günleri) //int cozumOncekiAyi = GetOncekiAy(periyot: 3, cozumAyi: ayBitis); //var cozumOncekiIkiAyi = GetOncekiAy(periyot: 2, cozumAyi: ayBitis); //var aktifSonuclar = _eczaneNobetSonucAktifService.GetSonuclarAylik(yilBitis, ayBitis, nobetUstGrupId); //var ayniAydakiDigerGruplarinSonuclari = _eczaneNobetSonucService.GetSonuclarAylik(yilBitis, ayBitis, nobetUstGrupId); //var ayIcindekiTumSonuclar = aktifSonuclar.Union(ayniAydakiDigerGruplarinSonuclari).ToList(); //var ayIcindeCozulenNobetGruplar = ayIcindekiTumSonuclar.Select(s => s.NobetGrupId).Distinct().ToList(); #region son iki ay //var sonIkiAyBakilacakGruplar = new List<int>(); //foreach (var item in ayIcindeCozulenNobetGruplar) //{ // sonIkiAyBakilacakGruplar.Add(item); //} ////şimdi çözülecek grup //foreach (var item in nobetGrupIdListe) //{ // sonIkiAyBakilacakGruplar.Add(item); //} //var sonIkiAyAyniGunNobetTutanEczaneler = new List<EczaneCiftGrup>(); //var gruplar = sonIkiAyBakilacakGruplar.Distinct().ToList(); //if (_nobetUstGrupKisitService.GetKisitPasifMi("sonIkiAydakiGrup", nobetUstGrupId) && sonIkiAyBakilacakGruplar.Count() > 1 && ayBitis > 1) //{ // var sonIkiAydakiSonuclar = _eczaneNobetSonucService.GetSonuclar(yilBitis, cozumOncekiAyi, ayBitis - 1, nobetUstGrupId) // .Where(x => gruplar.Contains(x.NobetGrupId)).ToList(); // sonIkiAyAyniGunNobetTutanEczaneler = _eczaneNobetOrtakService.GetCiftGrupluEczaneler(sonIkiAydakiSonuclar, 1); //} #endregion #region yillik kümülatif //var yilIcindeAyniGunNobetTutanEczaneler = new List<EczaneCiftGrup>(); //if (_nobetUstGrupKisitService.GetKisitPasifMi("yildaEncokUcKezGrup", nobetUstGrupId) && sonIkiAyBakilacakGruplar.Count() > 1 && ayBitis > 2) //{ // var yillikKumulatifSonuclar = _eczaneNobetSonucService.GetSonuclarYillikKumulatif(yilBitis, ayBitis - 1, nobetUstGrupId) // .Where(x => gruplar.Contains(x.NobetGrupId)).ToList(); // yilIcindeAyniGunNobetTutanEczaneler = _eczaneNobetOrtakService.GetCiftGrupluEczaneler(yillikKumulatifSonuclar, 3); //} #endregion //bu alan EczaneNobetCozAktifiGuncelle içinde kullanılıyor. var ayIcindeAyniGunNobetTutanEczaneler = new List <EczaneCiftGrup>(); #endregion var alanyaDataModel = new AlanyaDataModelEski() { Yil = yilBitis, Ay = ayBitis, LowerBound = 0, UpperBound = 1, NobetUstGrupId = nobetUstGrupId, NobetGruplar = nobetGruplar, EczaneNobetTarihAralik = _takvimService.GetEczaneNobetTarihAralik(baslangicTarihi, bitisTarihi, nobetGorevTipId, nobetGrupIdListe), //karar değişkeni EczaneKumulatifHedefler = _takvimService.GetEczaneKumulatifHedefler(yilBaslangic, yilBitis, ayBaslangic, ayBitis, nobetGrupIdListe, nobetGorevTipId), EczaneNobetMazeretListe = _eczaneNobetMazeretService.GetDetaylar(yilBitis, ayBitis, esGrupluEczaneler), EczaneGrupTanimlar = eczaneGrupTanimlar, TarihAraligi = _takvimService.GetTakvimNobetGruplar(baslangicTarihi, bitisTarihi, nobetGrupIdListe, nobetGorevTipId), EczaneGruplar = eczaneGruplar2, EczaneNobetIstekListe = _eczaneNobetIstekService.GetDetaylarByNobetGrupIdList(yilBitis, ayBitis, nobetGrupIdListe), NobetGrupGunKurallar = _nobetGrupGunKuralService.GetAktifList(nobetGrupIdListe), NobetGrupKurallar = _nobetGrupKuralService.GetDetaylar(nobetGrupIdListe), NobetGrupGorevTipler = _nobetGrupGorevTipService.GetList(nobetGorevTipId, nobetGrupIdListe), NobetGrupTalepler = _nobetGrupTalepService.GetDetaylar(nobetGrupIdListe, baslangicTarihi, bitisTarihi), EczaneNobetGruplar = eczaneNobetGruplar, NobetUstGrupKisitlar = _nobetUstGrupKisitService.GetDetaylar(nobetUstGrupId), EczaneGrupNobetSonuclar = eczaneGrupNobetSonuclar, EczaneNobetSonuclar = _eczaneNobetSonucService.GetSonuclar(nobetUstGrupId), AyIcindeAyniGunNobetTutanEczaneler = ayIcindeAyniGunNobetTutanEczaneler, YilIcindeAyniGunNobetTutanEczaneler = new List <EczaneCiftGrup>(), //yilIcindeAyniGunNobetTutanEczaneler, SonIkiAyAyniGunNobetTutanEczaneler = new List <EczaneCiftGrup>(), //sonIkiAyAyniGunNobetTutanEczaneler, EczaneNobetSonuclarSonIkiAy = new List <EczaneNobetSonucListe>(), //_eczaneNobetSonucService.GetSonuclar(yilBitis, cozumOncekiIkiAyi, ayBitis, nobetUstGrupId), EczaneNobetSonuclarOncekiAylar = new List <EczaneNobetSonucListe>() //_eczaneNobetSonucService.GetSonuclar(yilBitis, ayBaslangic, ayBitis, nobetUstGrupId) }; return(alanyaDataModel); }