From 3ebc077b27aa384a8adba51887e7c748772f196e Mon Sep 17 00:00:00 2001 From: Mikhail Kuznetsov Date: Wed, 21 Jun 2023 11:09:40 +1000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D1=80=D0=B0=D1=81=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=B0=D0=B2=D1=82?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../V1/Requests/Queries/JobGetByIpQuery.cs | 3 + PARR.API/Controllers/V1/JobController.cs | 89 +++++++++++-------- .../MappingProfiles/DomainToDomainProfile.cs | 13 +++ PARR.DAL/Extensions/GeneralExtesions.cs | 9 ++ .../Implementations/JobJournalService.cs | 9 +- 5 files changed, 86 insertions(+), 37 deletions(-) create mode 100644 PARR.API/MappingProfiles/DomainToDomainProfile.cs diff --git a/PARR.API/Contracts/V1/Requests/Queries/JobGetByIpQuery.cs b/PARR.API/Contracts/V1/Requests/Queries/JobGetByIpQuery.cs index 8326e9e4..8907f045 100644 --- a/PARR.API/Contracts/V1/Requests/Queries/JobGetByIpQuery.cs +++ b/PARR.API/Contracts/V1/Requests/Queries/JobGetByIpQuery.cs @@ -4,6 +4,9 @@ { public string? Ip { get; set; } public DateTimeOffset? Date { get; set; } + + public bool? IsFullResponse { get; set; } + ///// ///// Возвращает jobs которые ещё не выполнены ///// diff --git a/PARR.API/Controllers/V1/JobController.cs b/PARR.API/Controllers/V1/JobController.cs index 6ac762ab..861ccee4 100644 --- a/PARR.API/Controllers/V1/JobController.cs +++ b/PARR.API/Controllers/V1/JobController.cs @@ -75,6 +75,15 @@ namespace PARR.API.Controllers.V1 [HttpGet(ApiRoutes.Jobs.GetByIp)] public async Task GetByClientIP([FromQuery] JobGetByIpQuery requestQuery) { + var d1 = DateTimeOffset.Now; + var d2 = DateTimeOffset.Now.Date; + + if (d1.Date == d2) { } + + + + + var ip = requestQuery.Ip ?? clientService.GetClientIp()?.ToString(); if (string.IsNullOrEmpty(ip)) return BadRequest(new Response(false, new List { new ErrorModel { Message = "Client IP address is null." } })); @@ -83,6 +92,7 @@ namespace PARR.API.Controllers.V1 // С одним IP может быть несколько информационных систем, соответственного а таблице храниться несколько записей хостов с одинаковым IP var hosts = await hostService.Get().Where(h => h.IP == ip).ToListAsync(); + var hostJobsDict = new Dictionary>(); foreach (var host in hosts) { @@ -100,44 +110,42 @@ namespace PARR.API.Controllers.V1 } var jobsList = new List(); - var response = new Dictionary(); + var jobsToResponse = new List(); + foreach (var hostAndJobs in hostJobsDict) { - hostAndJobs.Value.ForEach(async item => + foreach (var item in hostAndJobs.Value) { if (!jobsList.Contains(item)) { jobsList.Add(item); - var plannedJobs = await GetListJobsAsync(item, hostAndJobs.Key, date); - - //todo:!!! эти списки склеивать в один, отсортировать по дате и перегнать в дикт - - //var baseTime = new DateTimeOffset(date.Year, date.Year, 01, 0, 0, 0, new TimeSpan(0)); - ////если более суток то идём в JobJournal и получаем дату последнегно запуска. Если нет то приравниваем к StartAt - //var freq = item.Frequency; - //if (true) - //{ - - //} - //var curTimeCreation = baseTime; - - //while(curTimeCreation <= curTimeCreation.EndOfDay()) - //{ - - // curTimeCreation=curTimeCreation.DateTime.AddMinutes(freq); - //} - - - - - - //kaskjdhaskjkjasklhd + jobsToResponse.AddRange(plannedJobs); } - }); + } } + jobsToResponse = jobsToResponse.OrderBy(t => t.StartAt).ToList(); + + if (!jobsToResponse.Any()) + return NoContent(); + + if (requestQuery.IsFullResponse == true) + { + var jobResponse = mapper.Map>(jobsToResponse); + return Ok(new Response>(jobResponse, true)); + } + + + //var responseDict = new Dictionary(); + //foreach () + //{ + + //} + + + // var jobListForResponse = new @@ -184,8 +192,10 @@ namespace PARR.API.Controllers.V1 // если в истории нет записей, то запускаем сегодня в стартЭт // берем квери дэйт и ем задаем время из Джобс СтартЭт var startDateTimeNext = new DateTimeOffset(queryDate.Year, queryDate.Month, queryDate.Day, job.StartAt.Hour, job.StartAt.Minute, job.StartAt.Second, new TimeSpan(0)); - //todo: - var jobToAdded = new Job { StartAt = startDateTimeNext }; + //todo: check + var jobToAdded = mapper.Map(job);//new Job { StartAt = startDateTimeNext }; + jobToAdded.StartAt = startDateTimeNext; + jobs.Add(jobToAdded); } else @@ -196,8 +206,9 @@ namespace PARR.API.Controllers.V1 // если берем прошлую последнюю операцию из журнала, и к ней прибавить фрекунси, то время следующего старта сдвинется на время выполнения прошлого задания // чтобы это избежать, берем квери дэйт и ем задаем время из Джобс СтартЭт var startDateTimeNext = new DateTimeOffset(queryDate.Year, queryDate.Month, queryDate.Day, job.StartAt.Hour, job.StartAt.Minute, job.StartAt.Second, new TimeSpan(0)); - //todo: - var jobToAdded = new Job { StartAt = startDateTimeNext }; + //todo: check + var jobToAdded = mapper.Map(job); + jobToAdded.StartAt = startDateTimeNext; jobs.Add(jobToAdded); } } @@ -214,8 +225,10 @@ namespace PARR.API.Controllers.V1 var min = startAtMinutes; while (min > 0) { - //TODO - var jobToAdded = new Job { StartAt = queryDate.StartOfDay().AddMinutes(min) }; + //var jobToAdded = new Job { StartAt = queryDate.StartOfDay().AddMinutes(min) }; + //todo: check + var jobToAdded = mapper.Map(job); + jobToAdded.StartAt = queryDate.StartOfDay().AddMinutes(min); jobs.Add(jobToAdded); min = min - job.Frequency; } @@ -223,8 +236,10 @@ namespace PARR.API.Controllers.V1 // прибавляем пока не наступят след сутки while (min <= allDayMinutes) { - //TODO - var jobToAdded = new Job { StartAt = queryDate.StartOfDay().AddMinutes(min) }; + //TODO: check + //var jobToAdded = new Job { StartAt = queryDate.StartOfDay().AddMinutes(min) }; + var jobToAdded = mapper.Map(job); + jobToAdded.StartAt = queryDate.StartOfDay().AddMinutes(min); jobs.Add(jobToAdded); min = min + job.Frequency; } @@ -237,7 +252,9 @@ namespace PARR.API.Controllers.V1 while (min <= allDayMinutes) { //TODO - var jobToAdded = new Job { StartAt = queryDate.StartOfDay().AddMinutes(min) }; + //var jobToAdded = new Job { StartAt = queryDate.StartOfDay().AddMinutes(min) }; + var jobToAdded = mapper.Map(job); + jobToAdded.StartAt = queryDate.StartOfDay().AddMinutes(min); jobs.Add(jobToAdded); min = min + job.Frequency; } diff --git a/PARR.API/MappingProfiles/DomainToDomainProfile.cs b/PARR.API/MappingProfiles/DomainToDomainProfile.cs new file mode 100644 index 00000000..699e379c --- /dev/null +++ b/PARR.API/MappingProfiles/DomainToDomainProfile.cs @@ -0,0 +1,13 @@ +using AutoMapper; +using PARR.DAL.Models; + +namespace PARR.API.MappingProfiles +{ + public class DomainToDomainProfile : Profile + { + public DomainToDomainProfile() + { + CreateMap(); + } + } +} diff --git a/PARR.DAL/Extensions/GeneralExtesions.cs b/PARR.DAL/Extensions/GeneralExtesions.cs index f9d106b6..f30e308e 100644 --- a/PARR.DAL/Extensions/GeneralExtesions.cs +++ b/PARR.DAL/Extensions/GeneralExtesions.cs @@ -26,5 +26,14 @@ namespace PARR.DAL.Extensions return null; } } + public static DateTimeOffset EndOfDay(this DateTimeOffset date) + { + return new DateTimeOffset(date.Year, date.Month, date.Day, 23, 59, 59, 999, new TimeSpan(0)); + } + + public static DateTimeOffset StartOfDay(this DateTimeOffset date) + { + return new DateTimeOffset(date.Year, date.Month, date.Day, 0, 0, 0, 0, new TimeSpan(0)); + } } } diff --git a/PARR.DAL/Services/Implementations/JobJournalService.cs b/PARR.DAL/Services/Implementations/JobJournalService.cs index e007f059..322caf24 100644 --- a/PARR.DAL/Services/Implementations/JobJournalService.cs +++ b/PARR.DAL/Services/Implementations/JobJournalService.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.DAL.Context; +using PARR.DAL.Extensions; using PARR.DAL.Models; using PARR.DAL.Services.Abstracts; using PARR.DAL.Services.Interfaces; @@ -23,11 +24,17 @@ namespace PARR.DAL.Services.Implementations public async Task GetLastAsync(Guid jobId, Guid hostId, DateTimeOffset date) { + var n=DateTimeOffset.UtcNow; var opers = await EntitySet - .Where(j => j.JobId == jobId && j.HostId == hostId && j.DateOper.DateTime.Date == date.DateTime.Date) + .Where(j => j.JobId == jobId && j.HostId == hostId && (j.DateOper.AddTicks(0-j.DateOper.UtcTicks) <= n))/*date.StartOfDay()*/// && j.DateOper < date.EndOfDay())) .OrderBy(t => t.DateOper) .LastOrDefaultAsync(); + //var opers = await EntitySet + // .Where(j => j.JobId == jobId && j.HostId == hostId && j.DateOper.DateTime.Date == date.DateTime.Date) + // .OrderBy(t => t.DateOper) + // .LastOrDefaultAsync(); + return opers; } }