Exemple #1
0
        private void OnServerDateGotten_Handler(object sender, GameEventArgs e)
        {
#if UNITY_EDITOR
            TimerController.Instance.CreateNewMonoTimer(3, () =>
            {
                if (!UserDataControl.Instance.UserData)
                {
                    UserDataControl.Instance.UserData = new UserDataPresenter();
                    UserDataControl.Instance.UserData = new UserDataPresenter();
                }

                CurrentDate = TimeManager.LocalUrmobiServerDT;

                try
                {
                    NextDate = System.DateTime.Parse(UserDataControl.Instance.UserData.RewardsData.nextSurprizeDate);
                    UserDataControl.Instance.UserData.RewardsData.nextSurprizeDate = NextDate.ToString();
                }
                catch (System.Exception ex)
                {
                    Debug.LogWarning(ex, this);
                    var t = TimeManager.LocalUrmobiServerDT;
                    UserDataControl.Instance.UserData.RewardsData.nextSurprizeDate = new System.DateTime().ToString();
                    NextDate = System.DateTime.Parse(UserDataControl.Instance.UserData.RewardsData.nextSurprizeDate);
                }
                UpdateDate();
                TimeManager.TickEvent -= OnTimeTick;
                TimeManager.TickEvent += OnTimeTick;
                EventManager.Unsubscribe(Events.SaveData.NEW_DATA_APPLIED, OnNewDataApplied_Handler);
                EventManager.Unsubscribe(Events.DateTime.URMOBI_DATE_GOTTEN, OnServerDateGotten_Handler);
            });
#endif
        }
Exemple #2
0
        private void UpdateDays(bool init = false)
        {
            var t = TimeManager.LocalUrmobiServerDT;

            if (t >= NextDate.AddDays(1d))
            {
                CurrentDailyDay = 0;
                NextDailyDay    = 1;
                //SetupCurrentRewards();
                NextDate = new System.DateTime(t.Year, t.Month, t.Day, 0, 0, 0).AddDays(1);
                UserDataControl.Instance.UserData.RewardsData.nextDate = NextDate.ToString();
            }
            else if (t >= NextDate && t < NextDate.AddDays(1))
            {
                CurrentDailyDay = NextDailyDay;
                NextDailyDay    = NextDailyDay < daysCycle - 1 ? (byte)(CurrentDailyDay + 1) : (byte)0;
                //SetupCurrentRewards();
                NextDate = new System.DateTime(t.Year, t.Month, t.Day, 0, 0, 0).AddDays(1);
                UserDataControl.Instance.UserData.RewardsData.currentDailyDay = CurrentDailyDay;
                UserDataControl.Instance.UserData.RewardsData.nextDate        = NextDate.ToString();
                EventManager.Notify(this, new GameEventArgs(Events.Daily.NEX_DAY));
            }
            else if (t >= NextDate)
            {
                //SetupCurrentRewards();
            }

            if (init)
            {
                Inited?.Invoke();
            }
        }
Exemple #3
0
 public bool Consume()
 {
     if (AvailableToConsume)
     {
         reward.Consume();
         if (CurrentDate >= new System.DateTime(CurrentDate.Year, CurrentDate.Month, CurrentDate.Day, 6, 0, 0) && CurrentDate < new System.DateTime(CurrentDate.Year, CurrentDate.Month, CurrentDate.Day, 12, 0, 0))
         {
             NextDate = CurrentDate.AddHours(2);
         }
         else if (CurrentDate >= new System.DateTime(CurrentDate.Year, CurrentDate.Month, CurrentDate.Day, 12, 0, 0) && CurrentDate < new System.DateTime(CurrentDate.Year, CurrentDate.Month, CurrentDate.Day, 20, 0, 0))
         {
             NextDate = CurrentDate.AddHours(3);
         }
         else if (CurrentDate >= new System.DateTime(CurrentDate.Year, CurrentDate.Month, CurrentDate.Day, 20, 0, 0) && CurrentDate < new System.DateTime(CurrentDate.Year, CurrentDate.Month, CurrentDate.Day + 1, 6, 0, 0))
         {
             NextDate = CurrentDate.AddHours(6);
         }
         UserDataControl.Instance.UserData.RewardsData.nextSurprizeDate = NextDate.ToString();
         UserDataControl.Instance.SaveData();
         AvailableToConsume = false;
         Debug.Log($"Reward claimed {reward.reward}", this);
         UIControl.Instance.ShowInfoPopUp(new UIPopUp.PopupData($"You have gotten {reward.reward}!"));
         return(true);
     }
     else
     {
         Debug.Log("Consume failed", this);
         return(false);
     }
 }
Exemple #4
0
        private void OnNewDataApplied_Handler(object sender, GameEventArgs e)
        {
#if !UNITY_EDITOR
            if (!UserDataControl.Instance.UserData)
            {
                UserDataControl.Instance.UserData = new UserDataPresenter();
                UserDataControl.Instance.UserData = new UserDataPresenter();
            }

            CurrentDate = TimeManager.LocalUrmobiServerDT;

            if (UserDataControl.Instance.UserData.RewardsData.nextSurprizeDate != null && System.DateTime.Parse(UserDataControl.Instance.UserData.RewardsData.nextDate) != System.DateTime.MinValue)
            {
                NextDate = System.DateTime.Parse(UserDataControl.Instance.UserData.RewardsData.nextSurprizeDate);
                UserDataControl.Instance.UserData.RewardsData.nextSurprizeDate = NextDate.ToString();
            }
            else
            {
                var t = TimeManager.LocalUrmobiServerDT;
                UserDataControl.Instance.UserData.RewardsData.nextSurprizeDate = new System.DateTime().ToString();
                NextDate = System.DateTime.Parse(UserDataControl.Instance.UserData.RewardsData.nextSurprizeDate);
            }
            UpdateDate();
            TimeManager.TickEvent -= OnTimeTick;
            TimeManager.TickEvent += OnTimeTick;
            EventManager.Unsubscribe(Events.SaveData.NEW_DATA_APPLIED, OnNewDataApplied_Handler);
            EventManager.Unsubscribe(Events.DateTime.URMOBI_DATE_GOTTEN, OnServerDateGotten_Handler);
#endif
        }
Exemple #5
0
        public string GenerateXact()
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(Times.TimesCommon.Current.FormatDate(NextDate, FormatTypeEnum.FMT_WRITTEN));
            NextDate = NextDate.AddDays(SixGen.Value());
            if (TruthGen.Value())
            {
                sb.Append('=');
                sb.Append(Times.TimesCommon.Current.FormatDate(NextAuxDate, FormatTypeEnum.FMT_WRITTEN));
                NextAuxDate = NextAuxDate.AddDays(SixGen.Value());
            }
            sb.Append(' ');

            sb.Append(GenerateState());
            sb.Append(GenerateCode());
            sb.Append(GeneratePayee());
            if (TruthGen.Value())
            {
                sb.Append(GenerateNote());
            }
            sb.AppendLine();

            int  count          = ThreeGen.Value() * 2;
            bool hasMustBalance = false;

            for (int i = 0; i < count; i++)
            {
                if (GeneratePost(sb))
                {
                    hasMustBalance = true;
                }
            }
            if (hasMustBalance)
            {
                GeneratePost(sb, true);
            }

            sb.AppendLine();

            return(sb.ToString());
        }
Exemple #6
0
        private void OnServerDateGotten_Handler(object sender, GameEventArgs e)
        {
#if UNITY_EDITOR
            TimerController.Instance.CreateNewMonoTimer(3, () =>
            {
                if (!UserDataControl.Instance.UserData)
                {
                    UserDataControl.Instance.UserData = new UserDataPresenter();
                    UserDataControl.Instance.UserData = new UserDataPresenter();
                }

                CurrentDailyDay = UserDataControl.Instance.UserData.RewardsData.currentDailyDay;
                NextDailyDay    = CurrentDailyDay < daysCycle - 1 ? (byte)(CurrentDailyDay + 1) : (byte)0;
                //CurrentWheelDay = UserDataControl.Instance.UserData.RewardsData.currentWheelDay;
                //CurrentScratchDay = UserDataControl.Instance.UserData.RewardsData.currentScratchDay;
                //CurrentSlotDay = UserDataControl.Instance.UserData.RewardsData.currentSlotDay;
                //CurrentRewardMechanic = UserDataControl.Instance.UserData.RewardsData.currentRewardMechanic;

                try
                {
                    NextDate = System.DateTime.Parse(UserDataControl.Instance.UserData.RewardsData.nextDate);
                    UserDataControl.Instance.UserData.RewardsData.nextDate = NextDate.ToString();
                }
                catch (System.Exception ex)
                {
                    Debug.LogWarning(ex, this);
                    var t = TimeManager.LocalUrmobiServerDT;
                    Debug.Log($"Next day on init: {new System.DateTime(t.Year, t.Month, t.Day, 0, 0, 0).AddDays(1).ToString()}");
                    UserDataControl.Instance.UserData.RewardsData.nextDate = new System.DateTime(t.Year, t.Month, t.Day, 0, 0, 0).AddDays(1).ToString();
                    Debug.Log($"Used data next day: {UserDataControl.Instance.UserData.RewardsData.nextDate}");
                    NextDate = System.DateTime.Parse(UserDataControl.Instance.UserData.RewardsData.nextDate);
                }
                UpdateDays(true);
                TimeManager.TickEvent -= OnTimeTick;
                TimeManager.TickEvent += OnTimeTick;
                DataInited             = true;
            });
#endif
        }
        /// <summary>
        /// Restituisce le impostazioni del task periodico.
        /// </summary>
        /// <param name="next">Passare true per ottenere le impostazioni per il prossimo trigger</param>
        /// <returns>Restituisce sempre true. Se si passa next a true e non ci sono impostazioni successive, restituisce false.</returns>
        private async Task <bool> LoadWorkSetting(bool next = false)
        {
            if (!ExistsNextSetting())
            {
                return(false);
            }

            GetInterval(next, out uint interval);
            Interval = interval;

            Execute  = false;
            NextDate = DateTime.ParseExact(ApplicationData.Current.LocalSettings.Values[_taskName + ".NextDate"].ToString(), "dd-MM-yyyy, HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
            if (_executionMinutes >= NextDate)
            {
                Execute = true;
                await WorkLogger?.Debug(string.Format("Trigger eseguito. NextTrigger: {0}, Execution date: {1}", NextDate, _executionMinutes));

                int maxCount = 100;
                do
                {
                    if (!next && ExistsNextSetting(out uint nextInterval))
                    {
                        NextDate = NextDate.AddMinutes(nextInterval);
                    }
                    else
                    {
                        NextDate = NextDate.AddMinutes(Interval);
                    }
                    ApplicationData.Current.LocalSettings.Values[_taskName + ".NextDate"] = NextDate.ToString("dd-MM-yyyy, HH:mm:ss");
                    maxCount--;
                }while (NextDate < _executionMinutes && maxCount >= 0);

                Interval = (uint)Math.Round((NextDate - _executionMinutes).TotalMinutes, 0);
                await WorkLogger?.Debug(string.Format("Nuovo trigger: {0}, intervallo: {1} minuti", NextDate, Interval));
            }

            return(true);
        }
Exemple #8
0
        private void OnNewDataApplied_Handler(object sender, GameEventArgs e)
        {
#if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR
            Debug.Log("OnNewDataApplied_Handler");

            if (!UserDataControl.Instance.UserData)
            {
                UserDataControl.Instance.UserData = new UserDataPresenter();
                UserDataControl.Instance.UserData = new UserDataPresenter();
            }
            CurrentDailyDay = UserDataControl.Instance.UserData.RewardsData.currentDailyDay;
            NextDailyDay    = CurrentDailyDay < daysCycle - 1 ? (byte)(CurrentDailyDay + 1) : (byte)0;
            //CurrentWheelDay = UserDataControl.Instance.UserData.RewardsData.currentWheelDay;
            //CurrentScratchDay = UserDataControl.Instance.UserData.RewardsData.currentScratchDay;
            //CurrentSlotDay = UserDataControl.Instance.UserData.RewardsData.currentSlotDay;
            //CurrentRewardMechanic = UserDataControl.Instance.UserData.RewardsData.currentRewardMechanic;

            if (UserDataControl.Instance.UserData.RewardsData.nextDate != null && System.DateTime.Parse(UserDataControl.Instance.UserData.RewardsData.nextDate) != System.DateTime.MinValue)
            {
                Debug.Log("NEXT DATE DADA IS EMPTY!");
                NextDate = System.DateTime.Parse(UserDataControl.Instance.UserData.RewardsData.nextDate);
                UserDataControl.Instance.UserData.RewardsData.nextDate = NextDate.ToString();
            }
            else
            {
                var t = TimeManager.UrmobiServerDT;
                Debug.Log($"Next day on init: {new System.DateTime(t.Year, t.Month, t.Day, 0, 0, 0).AddDays(1).ToString()}");
                UserDataControl.Instance.UserData.RewardsData.nextDate = new System.DateTime(t.Year, t.Month, t.Day, 0, 0, 0).AddDays(1).ToString();
                Debug.Log($"Used data next day: {UserDataControl.Instance.UserData.RewardsData.nextDate}");
                NextDate = System.DateTime.Parse(UserDataControl.Instance.UserData.RewardsData.nextDate);
            }
            UpdateDays(true);
            TimeManager.TickEvent -= OnTimeTick;
            TimeManager.TickEvent += OnTimeTick;
            DataInited             = true;
#endif
        }
Exemple #9
0
        public void DateNext()
        {
            int b = 0;

            if (check1.IsChecked == false)
            {
                string   datebox1 = date.Text;
                string[] datearr  = datebox1.Split(new char[] { '.' });
                int      year1    = 0;
                int      mounth1  = 0;
                int      day1     = 0;
                for (int i = 0; i < datearr.Length; ++i)
                {
                    year1   = Convert.ToInt32(datearr[2]);
                    mounth1 = Convert.ToInt32(datearr[1]);
                    day1    = Convert.ToInt32(datearr[0]);
                }
                DateTime date1 = new DateTime(year1, mounth1, day1);

                string   datebox2 = sdate.Text;
                int      year2    = 0;
                int      mounth2  = 0;
                int      day2     = 0;
                string[] datearr2 = datebox2.Split(new char[] { '.' });
                for (int i = 0; i < datearr2.Length; ++i)
                {
                    year2   = Convert.ToInt32(datearr2[2]);
                    mounth2 = Convert.ToInt32(datearr2[1]);
                    day2    = Convert.ToInt32(datearr2[0]);
                }
                DateTime date2 = new DateTime(year2, mounth2, day2);


                IQueryable <HospitalInfo> qerty = from lable in db.HospitalInfo
                                                  where lable.Id_hospital == Convert.ToInt32(window.idUser)
                                                  select lable;
                string s = "";
                string n = "";
                foreach (HospitalInfo cust in qerty)
                {
                    s += cust.name_hospital;
                    n += cust.city_hospital;
                }

                NextDate nextDate = new NextDate
                {
                    next_number = Convert.ToInt32(nextnumber.Text), fio_doctor = s, soec_doctor = n, end_date = date1, id_fk_next = 1, star_date = date2
                };
                db.GetTable <NextDate>().InsertOnSubmit(nextDate);
                db.SubmitChanges();
            }
            else if (check1.IsChecked == true)
            {
                Table <NextDate> nextDates = db.GetTable <NextDate>();
                foreach (var id in nextDates)
                {
                    if (id.next_number == Convert.ToInt32(nextnumber.Text))
                    {
                        b = 1;
                        DateTime u = (DateTime)id.end_date;
                        u             = u.AddDays(1);
                        id.close_date = u;
                        db.SubmitChanges();
                    }
                }
                if (b == 0)
                {
                    IQueryable <HospitalInfo> qerty = from lable in db.HospitalInfo
                                                      where lable.Id_hospital == Convert.ToInt32(window.idUser)
                                                      select lable;
                    string s = "";
                    string n = "";
                    foreach (HospitalInfo cust in qerty)
                    {
                        s += cust.name_hospital;
                        n += cust.city_hospital;
                    }
                    NextDate nextDate = new NextDate
                    {
                        next_number = Convert.ToInt32(nextnumber.Text), fio_doctor = s, soec_doctor = n, id_fk_next = 1
                    };
                    db.GetTable <NextDate>().InsertOnSubmit(nextDate);
                    db.SubmitChanges();
                    Table <TicketList> t = db.GetTable <TicketList>();
                    DateTime           y = new DateTime();
                    foreach (var c in t)
                    {
                        y = (DateTime)c.End_date_disease;
                        y = y.AddDays(1);
                    }
                    Table <NextDate> next = db.GetTable <NextDate>();
                    foreach (var id in next)
                    {
                        if (id.next_number == Convert.ToInt32(nextnumber.Text))
                        {
                            id.close_date = y;
                            db.SubmitChanges();
                        }
                    }
                }
            }
        }
Exemple #10
0
 /// <summary>
 /// 计算当前时间过后,下一次执行定时器的时间
 /// </summary>
 /// <param name="nextDate">用来计算定时器触发时间的委托</param>
 /// <returns>下一次执行定时器的时间,
 /// 它等同向<paramref name="nextDate"/>传入<see cref="DateTimeOffset.Now"/>后的结果</returns>
 public static DateTimeOffset?NextAtNow(this NextDate nextDate)
 => nextDate(DateTimeOffset.Now);
Exemple #11
0
        /// <summary>
        /// Gets the first date after the specified date that is represented by the COSEMDate object
        /// </summary>
        /// <param name="date">The date to get from</param>
        /// <returns>The first valid date</returns>
        public DateTime?GetClosestFutureDate(DateTime date)
        {
            DateTime?FutureDate = null;

            if (IsSpecificDate)
            {
                // The date is a specific date so as long as it's in the future we can return the date
                FutureDate = new DateTime(m_Year, (int)m_Month, (int)m_DayOfMonth);

                if (FutureDate < date.Date)
                {
                    // The date is in the past so set it back to null
                    FutureDate = null;
                }
            }
            else
            {
                // Start out with the specified date and figure it out from there
                DateTime NextDate = date.Date;

                if (m_Year != YEAR_NOT_SPECIFIED)
                {
                    if (m_Year < NextDate.Year)
                    {
                        // No valid future date
                        return(null);
                    }
                    else
                    {
                        NextDate = NextDate.AddYears(m_Year - NextDate.Year);
                    }
                }

                if (m_Month != COSEMMonth.NotSpecified)
                {
                    if (m_Month == COSEMMonth.DaylightSavingsBegin)
                    {
                        // TODO: Figure out how to get the DST Month here
                    }
                    else if (m_Month == COSEMMonth.DaylightSavingsEnd)
                    {
                        // TODO: Figure out how to get the DST Month here
                    }
                    else
                    {
                        // Add one to the month until we reach the desired month so that the year will change as necessary
                        while (NextDate.Month != (int)m_Month)
                        {
                            NextDate = NextDate.AddMonths(1);
                        }
                    }
                }

                if (m_DayOfMonth != COSEMDayOfMonth.NotSpecified)
                {
                    if (m_DayOfMonth == COSEMDayOfMonth.LastDay || m_DayOfMonth == COSEMDayOfMonth.SecondToLastDay)
                    {
                        // Add one day until the next day causes the month to change
                        while (NextDate.Month == NextDate.AddDays(1).Month)
                        {
                            NextDate = NextDate.AddDays(1);
                        }

                        // For second to last day just subtract a day
                        if (m_DayOfMonth == COSEMDayOfMonth.SecondToLastDay)
                        {
                            NextDate = NextDate.AddDays(-1);
                        }
                    }
                    else
                    {
                        if ((int)m_DayOfMonth >= NextDate.Day && (int)m_DayOfMonth <= DateTime.DaysInMonth(NextDate.Year, NextDate.Month))
                        {
                            // We have a valid date in the current month
                            NextDate = NextDate.AddDays((int)m_DayOfMonth - NextDate.Day);
                        }
                        else if (m_Month == COSEMMonth.NotSpecified)
                        {
                            // The month is not specified and we have already passed the day in the current month so we should move on to the next month
                            NextDate = new DateTime(NextDate.Year, NextDate.Month, 1, 0, 0, 0, NextDate.Kind).AddMonths(1);

                            // Since the length of a month may vary lets just keep adding one day until it matches (if 29, 30 , or 31 is picked)
                            while (NextDate.Day != (int)m_DayOfMonth)
                            {
                                NextDate = NextDate.AddDays(1);
                            }
                        }
                        else if (m_Year == YEAR_NOT_SPECIFIED)
                        {
                            // In most cases we will need to add one year so let's go ahead and do that.
                            NextDate = new DateTime(NextDate.Year, NextDate.Month, 1, 0, 0, 0, NextDate.Kind).AddYears(1);

                            // The month is specified but the year is not. First we should check and see if the day of month is even valid at all for the month
                            // February is the only month that the number of days in the month can vary so lets check that first
                            if (m_Month == COSEMMonth.February)
                            {
                                if (m_DayOfMonth == COSEMDayOfMonth.Twentyninth)
                                {
                                    // Increase the year until there are 29 days in the month
                                    while (DateTime.DaysInMonth(NextDate.Year, 2) != 29)
                                    {
                                        NextDate = NextDate.AddYears(1);
                                    }

                                    // Set the day to the 29th. We should be at the first so add 28 days
                                    NextDate = NextDate.AddDays(28);
                                }
                                else if (m_DayOfMonth <= COSEMDayOfMonth.Twentyeighth)
                                {
                                    // We have already adjusted forward one year so just set the date
                                    NextDate = NextDate.AddDays((int)m_DayOfMonth - 1);
                                }
                                else
                                {
                                    // The date will never be valid for this month
                                    return(null);
                                }
                            }
                            else if ((int)m_DayOfMonth <= DateTime.DaysInMonth(NextDate.Year, NextDate.Month))
                            {
                                // We have already adjusted forward one year so just set the date
                                NextDate = NextDate.AddDays((int)m_DayOfMonth - 1);
                            }
                            else
                            {
                                // The date will never be valid for this month
                                return(null);
                            }
                        }
                    }
                }

                if (m_DayOfWeek != COSEMDayOfWeek.NotSpecified)
                {
                    if (m_DayOfMonth == COSEMDayOfMonth.NotSpecified)
                    {
                        // Since the date is not specified we should be able to adjust the date forward
                        int            DaysToAdjust     = 0;
                        COSEMDayOfWeek CurrentDayOfWeek = ConvertDateTimeDayOfWeekToCOSEMDayOfWeek(NextDate.DayOfWeek);

                        if (m_DayOfWeek >= CurrentDayOfWeek)
                        {
                            DaysToAdjust = (int)m_DayOfWeek - (int)CurrentDayOfWeek;
                        }
                        else
                        {
                            // We have to adjust through the end of the week and then to the correct day of the week
                            DaysToAdjust = (int)COSEMDayOfWeek.Sunday - (int)CurrentDayOfWeek + (int)m_DayOfWeek;
                        }

                        if (m_Year != YEAR_NOT_SPECIFIED && m_Year != NextDate.AddDays(DaysToAdjust).Year)
                        {
                            // If the adjustment causes the year to change but a specific year is specified then there are no future dates
                            return(null);
                        }
                        else if (m_Month != COSEMMonth.NotSpecified)
                        {
                        }
                    }
                }
            }

            return(FutureDate);
        }
        public void UpdateCalendar()
        {
            ApplicationDbContext        db           = new ApplicationDbContext();
            DateTime                    DateNow      = DateTime.Now; // take date now so it is locked in (in case near midnight)
            List <CalendarItem>         TimetableOld = db.CalendarItems.OrderBy(x => x.GymClassTime).ToList <CalendarItem>();
            List <CalendarItem>         TimetableNew = new List <CalendarItem>();
            List <StdGymClassTimetable> StdTimetable = db.StdGymClassTimetables.ToList <StdGymClassTimetable>();

            if (!StdTimetable.Any())
            {
                return;
            }
            if (!TimetableOld.Any())
            {
                // create a whole new list from -7 days to + 28 days. -7 to keep a record of class goers
                CreateTimetable(DateNow.AddDays(-7), (7 + 28));
            }
            else
            {
                // search from start of TimetableOld until you get to a date max 7 days before today
                int i = 0;
                while (i < TimetableOld.Count && TimetableOld[i].GymClassTime.Date < DateNow.AddDays(-7).Date)
                {
                    i++;                     // change to a lower number to test or positive
                }
                if (i >= TimetableOld.Count) // If not found (i.e. we are more than 28 days since last checked) then create a whole new list
                {
                    CreateTimetable(DateNow.AddDays(-7), (7 + 28));
                }

                if (i == 0)
                {
                    return;         // no change so no need to create a new timetable
                }
                // int startDatePositionInNewTimetable = i;  // not needed
                // If found create new list starting from that point to end of data
                while (i < TimetableOld.Count)
                {
                    TimetableNew.Add(TimetableOld[i]);
                    i++;
                }
                // and then add new days to max + 28 days
                // days to add would be 7 + 28 less days in new timetable (Last date in old timetable i-1 less date in start of new timetable)
                TimeSpan span     = TimetableOld[i - 1].GymClassTime.Subtract(TimetableNew[0].GymClassTime);
                int      days     = 7 + 28 - span.Days - 1;
                DateTime dateFrom = TimetableOld[i - 1].GymClassTime.AddDays(1); // might need to add (Date)? Or change date to a non nullable property
                CreateTimetable(dateFrom, days);
            }

            // create up to date calendar using std timetable as basis and old timetable as start
            void CreateTimetable(DateTime NextDate, int totalDays)
            {
                ///// DayOfWeek change
                DayOfWeek DayOfWeekOfFirstItem = NextDate.DayOfWeek; // Enum: Sunday 0, Monday 1 etc Saturday 6
                // Find first occurence of day of the week in the std timetable (or followng day if no classes on that day)
                // either loop through from start to find the index
                // add each item of the std timetable to the new timetable each day until + 28 days looping around the std timetable
                var StdTimetableArray = StdTimetable.OrderBy(a => a.Day).ThenBy(a => a.Hour).ToArray();
                int j = 0;

                while (StdTimetableArray[j].Day < DayOfWeekOfFirstItem)
                {
                    j++;
                }

                // int startPositionInStdTimetable = j; // not needed
                // now loop through all items in standard timetable to end (to Saturday) then loop back to start (Sunday) then on to day before start (j-1)
                DayOfWeek currentDayOfWeek = DayOfWeekOfFirstItem; // Sunday 0, Monday 1 etc Saturday 6

                for (int i = 0; i < totalDays; i++)                //loop through adding days to new timetable (35 days (7 + 28)) some of which may be taken from previous timetable
                {
                    // j is std timetable array item number. Need to loop back to start when end is reached
                    while (j < StdTimetableArray.Count() && StdTimetableArray[j].Day == currentDayOfWeek) //loop through each day's classes and add to new timetable
                    {
                        if (StdTimetableArray[j].Deleted == false)
                        {
                            int      Hour         = (int)StdTimetableArray[j].Hour;
                            int      Minute       = (int)StdTimetableArray[j].Minute;
                            TimeSpan ts           = new TimeSpan(Hour, Minute, 0);
                            DateTime GymClassTime = NextDate.Date + ts;

                            CalendarItem item = new CalendarItem
                            {
                                GymClassId   = StdTimetableArray[j].GymClassId,
                                Instructor   = StdTimetableArray[j].Instructor,
                                Duration     = StdTimetableArray[j].Duration,
                                Hall         = StdTimetableArray[j].Hall,
                                UserIds      = "",
                                GymClassTime = GymClassTime,
                                MaxPeople    = StdTimetableArray[j].MaxPeople
                            };

                            TimetableNew.Add(item);
                        }

                        j++;
                    }
                    currentDayOfWeek++;
                    if (currentDayOfWeek > DayOfWeek.Saturday)
                    {
                        currentDayOfWeek = 0;
                    }
                    NextDate = NextDate.AddDays(1);
                    // loop back to start of std timetable if end reached
                    if (j >= StdTimetableArray.Count())
                    {
                        j = 0;
                    }
                }
                // delete old calendar and save new
                db.Database.ExecuteSqlCommand("delete from CalendarItems");
                //db.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('CalendarItems', RESEED, 0)"); // reseed if wanted (set id to 0) - specific to MS SQL
                db.CalendarItems.AddRange(TimetableNew); // saves in random order, can't save in order.
                db.SaveChanges();
            }
        }
        static void Main(string[] args)
        {
            logger.Error("******************************************* Start *******************************************");
            logger.Error("Start Cost Variation Service at : " + DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt"));

            try
            {
                var resolver   = UnityConfig.GetConfiguredContainer();
                var _Utilities = resolver.Resolve <IUtilities>();

                ReportViewer CostVariationReport = new ReportViewer();
                CostVariationReport.ProcessingMode = ProcessingMode.Remote;
                CostVariationReport.ServerReport.ReportServerUrl         = new Uri(_Utilities.GetAppSetting("ReportServerUrl"));
                CostVariationReport.ServerReport.ReportPath              = _Utilities.GetAppSetting("CostVariationReportReportPath");
                CostVariationReport.ServerReport.ReportServerCredentials = new ReportServerCredentials(_Utilities.GetAppSetting("ReportServerUsername"), _Utilities.GetAppSetting("ReportServerPassword"), _Utilities.GetAppSetting("ReportServerDomain"));
                AssignReportParameters(CostVariationReport);
                string   mimeType;
                string   encoding;
                string   extension;
                string   format  = "EXCEL";
                string   devInfo = null;
                string[] streams;
                byte[]   result = null;
                Microsoft.Reporting.WebForms.Warning[] warnings;
                result = CostVariationReport.ServerReport.Render(format, devInfo, out mimeType, out encoding, out extension, out streams, out warnings);

                string path = ConfigurationManager.AppSettings["FilePath"].ToString();

                using (System.IO.FileStream writer = new FileStream(path, FileMode.Create))
                {
                    logger.Error("Report Created at : " + DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt"));
                    writer.Write(result, 0, result.Length);
                    logger.Error("Result written to the Report at : " + DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt"));
                    writer.Close();
                }

                int hours   = int.Parse(System.Configuration.ConfigurationManager.AppSettings["Hour"]);
                int minutes = int.Parse(System.Configuration.ConfigurationManager.AppSettings["minutes"]);

                DateTime CureentDate = DateTime.Now;
                DateTime tempDate    = CureentDate.AddMonths(1);
                DateTime NextDate    = new DateTime();
                if (CureentDate.Day == 1 && CureentDate.Hour < 7)
                {
                    NextDate = new DateTime(CureentDate.Year, CureentDate.Month, 1, hours, minutes, 0);
                }
                else
                {
                    NextDate = new DateTime(tempDate.Year, tempDate.Month, 1, hours, minutes, 0);
                }
                TimeSpan TimeDiff = NextDate.Subtract(DateTime.Now);
                string   schedule = string.Format("{0} day(s) {1} hour(s) {2} minute(s) {3} second(s)", TimeDiff.Days, TimeDiff.Hours, TimeDiff.Minutes, TimeDiff.Seconds);
                logger.Error("Cost Variation  Service scheduled to run after: " + schedule + "From" + " {0} " + " Next Date To Execute Is: " + NextDate.ToString("dd/MM/yyyy hh:mm:ss tt"));

                SendEmail();
                CostVariationReport.ServerReport.Refresh();

                logger.Error("******************************************* End *******************************************");
            }
            catch (Exception exp)
            {
                logger.Error("Exception Error : " + exp.Message);
            }
        }
Exemple #14
0
 /// <summary>
 /// 创建一个复杂的计时器,
 /// 它通过委托而不是固定的间隔确定触发时间
 /// </summary>
 /// <param name="nextDate">调用这个委托可以确定下次触发定时器的时间</param>
 /// <returns>新创建的计时器,它何时触发,是否重复取决于<paramref name="nextDate"/>的返回结果</returns>
 public static ITimer Timer(NextDate nextDate)
 => new TimerComplex(nextDate);