diff --git a/PARR.DAL/TransformServices/EsppScheduleTransformService.cs b/PARR.DAL/TransformServices/EsppScheduleTransformService.cs index d5bd6061..0e98afa2 100644 --- a/PARR.DAL/TransformServices/EsppScheduleTransformService.cs +++ b/PARR.DAL/TransformServices/EsppScheduleTransformService.cs @@ -2,9 +2,6 @@ using PARR.DAL.Contracts; using PARR.DAL.DomainModels; using PARR.DAL.Services.Interfaces; -using System.ComponentModel; -using System.Net.Http.Headers; -using System.Runtime.CompilerServices; namespace PARR.DAL.TransformServices { @@ -13,6 +10,41 @@ namespace PARR.DAL.TransformServices private readonly IEsppSchTypeConfigService esppSchTypeConfigService; private readonly ILogger logger; + private readonly Dictionary monthDict = new Dictionary() + { + { "Январь", 1 }, + { "Февраль", 2 }, + { "Март", 3 }, + { "Апрель", 4 }, + { "Май", 5 }, + { "Июнь", 6 }, + { "Июль", 7 }, + { "Август", 8 }, + { "Сентябрь", 9 }, + { "Октябрь", 10 }, + { "Ноябрь", 11 }, + { "Декабрь", 12 } + }; + + private readonly Dictionary orderDict = new Dictionary() + { + { "Первый", 1 }, + { "Второй", 2 }, + { "Третий", 3 }, + { "Четвертый", 4 }, + { "Последний", 5 } + }; + + private readonly Dictionary dwDict = new Dictionary() + { + {"Понедельник", 1 }, + {"Вторник", 2 }, + {"Среда", 3 }, + {"Четверг", 4 }, + {"Пятница", 5 }, + {"Суббота", 6 }, + {"Воскресенье", 0 } + }; public EsppScheduleTransformService(IEsppSchTypeConfigService esppSchTypeConfigService, ILogger logger) { this.esppSchTypeConfigService = esppSchTypeConfigService; @@ -28,6 +60,14 @@ namespace PARR.DAL.TransformServices return lastRun; switch (esppSchedule.TypeSchedule.Id) { + case (int)EsppSchTypeScheduleEnum.Weekly: + return GetNextDateWeekly(esppSchedule.Values, lastRun); + case (int)EsppSchTypeScheduleEnum.Monthly: + return GetNextDateMonthly(esppSchedule.Values, lastRun); + case (int)EsppSchTypeScheduleEnum.Monthly2: + return GetNextDateMonthly2(esppSchedule.Values, lastRun); + case (int)EsppSchTypeScheduleEnum.Annually: + return GetNextDateAnnually(esppSchedule.Values, lastRun); case (int)EsppSchTypeScheduleEnum.Annually2: return GetNextDateAnnually2(esppSchedule.Values, lastRun); } @@ -73,67 +113,137 @@ namespace PARR.DAL.TransformServices return esppSchedule; } + private DateTimeOffset GetNextDateWeekly(List values, DateTimeOffset lastRun) + { + var dwNum = dwDict[values[0].Value.Value]; + + var calcDay = new DateTimeOffset(DateTimeOffset.UtcNow.Year, DateTimeOffset.UtcNow.Month, DateTimeOffset.UtcNow.Day, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset); + + if (((int)calcDay.DayOfWeek) != dwNum) + OffsetToDayOfWeek(dwNum, ref calcDay); + + //TODO: вот это повторяется от метода к методу + //Если итоговая дата указывает на прошлое, то повторяем расчёт и ухоим в рекурсию + if (calcDay < DateTimeOffset.UtcNow) + calcDay = calcDay.AddDays(7);//а вот тут что-то новенькое + + return calcDay; + } + + private DateTimeOffset GetNextDateMonthly(List values, DateTimeOffset lastRun) + { + int.TryParse(values[1].Value.Value, out int dayNum); + + var calcDay = new DateTimeOffset(DateTimeOffset.UtcNow.Year, DateTimeOffset.UtcNow.Month, dayNum, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset); + + //TODO: вот это повторяется от метода к методу + //Если итоговая дата указывает на прошлое, то повторяем расчёт и ухоим в рекурсию + if (calcDay < DateTimeOffset.UtcNow) + calcDay = calcDay.AddMonths(1);//и вот тут что-то новенькое + + return calcDay; + } + + private DateTimeOffset GetNextDateMonthly2(List values, DateTimeOffset lastRun) + { + var orderNum = orderDict[values[0].Value.Value]; + var dwNum = dwDict[values[1].Value.Value]; + + var calcDay = new DateTimeOffset(DateTimeOffset.UtcNow.Year, DateTimeOffset.UtcNow.Month, 1, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset); + + List daysList = FindAllDaysInMonth(dwNum, ref calcDay); + + if (orderNum == 5)//5-последний + calcDay = daysList.Last(); + else + calcDay = daysList[orderNum - 1]; + + //TODO: вот это повторяется от метода к методу + //Если итоговая дата указывает на прошлое, то повторяем расчёт и ухоим в рекурсию + if (calcDay < DateTimeOffset.UtcNow) + calcDay = GetNextDateAnnually2(values, calcDay); + + return calcDay; + } + private DateTimeOffset GetNextDateAnnually(List values, DateTimeOffset lastRun) + { + var monthNum = monthDict[values[0].Value.Value]; + int.TryParse(values[1].Value.Value, out int dayNum); + + var calcDay = new DateTimeOffset(lastRun.Year + 1, monthNum, dayNum, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset); + + //TODO: вот это повторяется от метода к методу + //Если итоговая дата указывает на прошлое, то повторяем расчёт и ухоим в рекурсию + if (calcDay < DateTimeOffset.UtcNow) + calcDay = GetNextDateAnnually(values, calcDay); + + return calcDay; + } + private DateTimeOffset GetNextDateAnnually2(List values, DateTimeOffset lastRun) { - var monthDict = new Dictionary(); - monthDict.Add("Января", 1); - monthDict.Add("Февраля", 2); - monthDict.Add("Марта", 3); - monthDict.Add("Апреля", 4); - monthDict.Add("Мая", 5); - monthDict.Add("Июня", 6); - monthDict.Add("Июля", 7); - monthDict.Add("Августа", 8); - monthDict.Add("Сентября", 9); - monthDict.Add("Октября", 10); - monthDict.Add("Ноября", 11); - monthDict.Add("Декабря", 12); + var monthADict = new Dictionary + { + { "Января", 1 }, + { "Февраля", 2 }, + { "Марта", 3 }, + { "Апреля", 4 }, + { "Мая", 5 }, + { "Июня", 6 }, + { "Июля", 7 }, + { "Августа", 8 }, + { "Сентября", 9 }, + { "Октября", 10 }, + { "Ноября", 11 }, + { "Декабря", 12 } + }; - var orderDict = new Dictionary(); - orderDict.Add("Первый", 1); - orderDict.Add("Второй", 2); - orderDict.Add("Третий", 3); - orderDict.Add("Четвертый", 4); - orderDict.Add("Последний", 5); - - var dwDict = new Dictionary(); - dwDict.Add("Понедельник", 1); - dwDict.Add("Вторник", 2); - dwDict.Add("Среда", 3); - dwDict.Add("Четверг", 4); - dwDict.Add("Пятница", 5); - dwDict.Add("Суббота", 6); - dwDict.Add("Воскресенье", 0); - - - var monthNum = monthDict[values[2].Value.Value]; + var monthNum = monthADict[values[2].Value.Value]; var orderNum = orderDict[values[0].Value.Value]; var dwNum = dwDict[values[1].Value.Value]; var calcDay = new DateTimeOffset(lastRun.Year + 1, monthNum, 1, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset); + List daysList = FindAllDaysInMonth(dwNum, ref calcDay); + + if (orderNum == 5)//5-последний + calcDay = daysList.Last(); + else + calcDay = daysList[orderNum]; + + //TODO: вот это повторяется от метода к методу + //Если итоговая дата указывает на прошлое, то повторяем расчёт и ухоим в рекурсию + if (calcDay < DateTimeOffset.UtcNow) + calcDay = GetNextDateAnnually2(values, calcDay); + + return calcDay; + } + + private List FindAllDaysInMonth(int dwNum, ref DateTimeOffset calcDay) + { if (((int)calcDay.DayOfWeek) != dwNum) - { - var daysOffset = dwNum - ((int)calcDay.DayOfWeek); - - if (daysOffset < 0) - daysOffset = 7 + daysOffset; - - calcDay = calcDay.AddDays(daysOffset); - } + OffsetToDayOfWeek(dwNum, ref calcDay); var daysList = new List(); + var monthNum = calcDay.Month; while (calcDay.Month == monthNum) { daysList.Add(calcDay); calcDay = calcDay.AddDays(7); } - if (orderNum == 5) - return daysList.Last(); - - return daysList[orderNum]; + return daysList; } + private DateTimeOffset OffsetToDayOfWeek(int dwNum, ref DateTimeOffset calcDay) + { + var daysOffset = dwNum - ((int)calcDay.DayOfWeek); + + if (daysOffset < 0) + daysOffset = 7 + daysOffset; + + calcDay = calcDay.AddDays(daysOffset); + return calcDay; + } } }