Ejemplo n.º 1
0
        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);
        }