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 { internal class EsppScheduleTransformService : IEsppScheduleTransformService { private readonly IEsppSchTypeConfigService esppSchTypeConfigService; private readonly ILogger logger; public EsppScheduleTransformService(IEsppSchTypeConfigService esppSchTypeConfigService, ILogger logger) { this.esppSchTypeConfigService = esppSchTypeConfigService; this.logger = logger; } public DateTimeOffset GetNextDate(EsppScheduleDto esppSchedule, DateTimeOffset lastRun) { //todo: //если больше текущего вернуть 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: schedules.Add(lastRun); return schedules.OrderBy(t => t).ToList(); } public async Task GetNextDateAsync(Guid applicationInWorkId, DateTimeOffset lastRun) { return GetNextDate(await GetEsppSchedule(applicationInWorkId), lastRun); } public async Task> GetNextScheduleAsync(Guid applicationInWorkId, DateTimeOffset lastRun) { return GetNextSchedule(await GetEsppSchedule(applicationInWorkId), lastRun); } private async Task GetEsppSchedule(Guid applicationInWorkId) { var esppSchedule = await esppSchTypeConfigService.GetEsppScheduleDtoAsync(applicationInWorkId); if (esppSchedule == null) { logger.LogError($"Не найдено расписание в БД, applicationInWorkId: {applicationInWorkId}"); throw new Exception($"Не найдено расписание в БД, applicationInWorkId: {applicationInWorkId}"); } 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]; } } }