feat(dal): методы получения даты следующей генерации наряда и заупска скриптов автоматизации GetNextDateWeekly, GetNextDateMonthly,GetNextDateMonthly2,GetNextDateAnnually
This commit is contained in:
@@ -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<EsppScheduleTransformService> logger;
|
||||
|
||||
private readonly Dictionary<string, int> monthDict = new Dictionary<string, int>()
|
||||
{
|
||||
{ "Январь", 1 },
|
||||
{ "Февраль", 2 },
|
||||
{ "Март", 3 },
|
||||
{ "Апрель", 4 },
|
||||
{ "Май", 5 },
|
||||
{ "Июнь", 6 },
|
||||
{ "Июль", 7 },
|
||||
{ "Август", 8 },
|
||||
{ "Сентябрь", 9 },
|
||||
{ "Октябрь", 10 },
|
||||
{ "Ноябрь", 11 },
|
||||
{ "Декабрь", 12 }
|
||||
};
|
||||
|
||||
private readonly Dictionary<string, int> orderDict = new Dictionary<string, int>()
|
||||
{
|
||||
{ "Первый", 1 },
|
||||
{ "Второй", 2 },
|
||||
{ "Третий", 3 },
|
||||
{ "Четвертый", 4 },
|
||||
{ "Последний", 5 }
|
||||
};
|
||||
|
||||
private readonly Dictionary<string, int> dwDict = new Dictionary<string, int>()
|
||||
{
|
||||
{"Понедельник", 1 },
|
||||
{"Вторник", 2 },
|
||||
{"Среда", 3 },
|
||||
{"Четверг", 4 },
|
||||
{"Пятница", 5 },
|
||||
{"Суббота", 6 },
|
||||
{"Воскресенье", 0 }
|
||||
};
|
||||
public EsppScheduleTransformService(IEsppSchTypeConfigService esppSchTypeConfigService, ILogger<EsppScheduleTransformService> 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<EsppScheduleValDto> 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<EsppScheduleValDto> 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<EsppScheduleValDto> 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<DateTimeOffset> 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<EsppScheduleValDto> 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<EsppScheduleValDto> values, DateTimeOffset lastRun)
|
||||
{
|
||||
var monthDict = new Dictionary<string, int>();
|
||||
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<string, int>
|
||||
{
|
||||
{ "Января", 1 },
|
||||
{ "Февраля", 2 },
|
||||
{ "Марта", 3 },
|
||||
{ "Апреля", 4 },
|
||||
{ "Мая", 5 },
|
||||
{ "Июня", 6 },
|
||||
{ "Июля", 7 },
|
||||
{ "Августа", 8 },
|
||||
{ "Сентября", 9 },
|
||||
{ "Октября", 10 },
|
||||
{ "Ноября", 11 },
|
||||
{ "Декабря", 12 }
|
||||
};
|
||||
|
||||
var orderDict = new Dictionary<string, int>();
|
||||
orderDict.Add("Первый", 1);
|
||||
orderDict.Add("Второй", 2);
|
||||
orderDict.Add("Третий", 3);
|
||||
orderDict.Add("Четвертый", 4);
|
||||
orderDict.Add("Последний", 5);
|
||||
|
||||
var dwDict = new Dictionary<string, int>();
|
||||
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<DateTimeOffset> 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<DateTimeOffset> 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<DateTimeOffset>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user