From d7c81d4d5ad6b714bceff7c17eb2206d58d9a9ac Mon Sep 17 00:00:00 2001 From: Mikhail Kuznetsov Date: Wed, 18 Oct 2023 10:09:51 +1000 Subject: [PATCH 1/3] =?UTF-8?q?feat(dal):=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=B0=D1=82=D1=8B=20=D1=81=D0=BB=D0=B5=D0=B4=D1=83=D1=8E?= =?UTF-8?q?=D1=89=D0=B5=D0=B9=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BD=D0=B0=D1=80=D1=8F=D0=B4=D0=B0=20=D0=B8=20?= =?UTF-8?q?=D0=B7=D0=B0=D1=83=D0=BF=D1=81=D0=BA=D0=B0=20=D1=81=D0=BA=D1=80?= =?UTF-8?q?=D0=B8=D0=BF=D1=82=D0=BE=D0=B2=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20GetNextDateA?= =?UTF-8?q?nnually2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EsppScheduleTransformService.cs | 79 ++++++++++++++++++- 1 file changed, 77 insertions(+), 2 deletions(-) diff --git a/PARR.DAL/TransformServices/EsppScheduleTransformService.cs b/PARR.DAL/TransformServices/EsppScheduleTransformService.cs index 7c871a8f..d5bd6061 100644 --- a/PARR.DAL/TransformServices/EsppScheduleTransformService.cs +++ b/PARR.DAL/TransformServices/EsppScheduleTransformService.cs @@ -1,6 +1,10 @@ using Microsoft.Extensions.Logging; +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 { @@ -19,13 +23,21 @@ namespace PARR.DAL.TransformServices public DateTimeOffset GetNextDate(EsppScheduleDto esppSchedule, DateTimeOffset lastRun) { //todo: - - return lastRun; + //если больше текущего вернуть lastRun. Это и есть следующая дата + if (lastRun > DateTimeOffset.UtcNow) + return lastRun; + switch (esppSchedule.TypeSchedule.Id) + { + case (int)EsppSchTypeScheduleEnum.Annually2: + return GetNextDateAnnually2(esppSchedule.Values, lastRun); + } + return lastRun;//todo убрать lastrun должен возвращать реальный результат } public List GetNextSchedule(EsppScheduleDto esppSchedule, DateTimeOffset lastRun) { + // расписание на оставшееся на сегодня время. его так мало... var schedules = new List(); //todo: @@ -60,5 +72,68 @@ namespace PARR.DAL.TransformServices return esppSchedule; } + + 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 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 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); + + if (((int)calcDay.DayOfWeek) != dwNum) + { + var daysOffset = dwNum - ((int)calcDay.DayOfWeek); + + if (daysOffset < 0) + daysOffset = 7 + daysOffset; + + calcDay = calcDay.AddDays(daysOffset); + } + + var daysList = new List(); + while (calcDay.Month == monthNum) + { + daysList.Add(calcDay); + calcDay = calcDay.AddDays(7); + } + + if (orderNum == 5) + return daysList.Last(); + + return daysList[orderNum]; + } + } } From bf20156ad9572511a266c157c5f2173c6245792d Mon Sep 17 00:00:00 2001 From: Mikhail Kuznetsov Date: Thu, 19 Oct 2023 09:14:19 +1000 Subject: [PATCH 2/3] =?UTF-8?q?feat(dal):=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B4=D0=B0=D1=82=D1=8B=20=D1=81=D0=BB=D0=B5=D0=B4=D1=83?= =?UTF-8?q?=D1=8E=D1=89=D0=B5=D0=B9=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BD=D0=B0=D1=80=D1=8F=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=B8=20=D0=B7=D0=B0=D1=83=D0=BF=D1=81=D0=BA=D0=B0=20=D1=81?= =?UTF-8?q?=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D0=B2=20=D0=B0=D0=B2=D1=82?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?GetNextDateWeekly,=20GetNextDateMonthly,GetNextDateMonthly2,Get?= =?UTF-8?q?NextDateAnnually?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EsppScheduleTransformService.cs | 202 ++++++++++++++---- 1 file changed, 156 insertions(+), 46 deletions(-) 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; + } } } From 5561e91de8ff92de344a19e49d8ec3e224cfa948 Mon Sep 17 00:00:00 2001 From: Mikhail Kuznetsov Date: Mon, 23 Oct 2023 11:04:12 +1000 Subject: [PATCH 3/3] =?UTF-8?q?feat(dal):=20=D0=9C=D0=B5=D1=82=D0=BE=D0=B4?= =?UTF-8?q?=20GetNextDate=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=20=D0=BF=D0=BB=D0=B0=D0=BD=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D1=89=D0=B8=D0=BA=20=D0=90=D0=A1=D0=A3=20=D0=95=D0=A1?= =?UTF-8?q?=D0=9F=D0=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EsppScheduleTransformService.cs | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/PARR.DAL/TransformServices/EsppScheduleTransformService.cs b/PARR.DAL/TransformServices/EsppScheduleTransformService.cs index 0e98afa2..9d61788e 100644 --- a/PARR.DAL/TransformServices/EsppScheduleTransformService.cs +++ b/PARR.DAL/TransformServices/EsppScheduleTransformService.cs @@ -60,6 +60,8 @@ namespace PARR.DAL.TransformServices return lastRun; switch (esppSchedule.TypeSchedule.Id) { + case (int)EsppSchTypeScheduleEnum.Regularly: + return GetNextDateRegularly(esppSchedule.Values, lastRun); case (int)EsppSchTypeScheduleEnum.Weekly: return GetNextDateWeekly(esppSchedule.Values, lastRun); case (int)EsppSchTypeScheduleEnum.Monthly: @@ -113,6 +115,43 @@ namespace PARR.DAL.TransformServices return esppSchedule; } + private DateTimeOffset GetNextDateRegularly(List values, DateTimeOffset lastRun) + { + var regDict = new Dictionary + { + {"Каждые 1 часа",1}, + {"Каждые 2 часа",2}, + {"Каждые 3 часа", 3}, + {"Каждые 4 часа", 4}, + {"Каждые 6 часов", 6}, + {"Каждые 12 часов", 12}, + {"Ежедневно", 24}, + {"Каждые 72 часа", 72}, + {"Каждые 96 часов", 96}, + {"Каждые 2 недели", 336}, + {"Каждые 60 дней", 1440}, + {"Каждые 80 дней", 1920}, + {"Каждые 90 дней", 2160}, + {"Каждые полгода", 4380}, + {"Каждые 1,5 года", 13140}, + {"Каждые 3 года", 26280}, + + }; + + var regNum = regDict[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); + //TODO: вот это повторяется от метода к методу + //Если итоговая дата указывает на прошлое, то повторяем расчёт и ухоим в рекурсию + if (calcDay < DateTimeOffset.UtcNow) + { + calcDay = calcDay.AddHours(regNum); + calcDay = GetNextDateRegularly(values, calcDay); + } + + return calcDay; + } + private DateTimeOffset GetNextDateWeekly(List values, DateTimeOffset lastRun) { var dwNum = dwDict[values[0].Value.Value]; @@ -235,7 +274,7 @@ namespace PARR.DAL.TransformServices return daysList; } - private DateTimeOffset OffsetToDayOfWeek(int dwNum, ref DateTimeOffset calcDay) + private void OffsetToDayOfWeek(int dwNum, ref DateTimeOffset calcDay) { var daysOffset = dwNum - ((int)calcDay.DayOfWeek); @@ -243,7 +282,6 @@ namespace PARR.DAL.TransformServices daysOffset = 7 + daysOffset; calcDay = calcDay.AddDays(daysOffset); - return calcDay; } } }