feat(all): ! Критические изменения логики работы всех сервисорв, База Данных имееет неокончательную версию. Template, Scheduler переведены на работу с Unit+Job+JobGroup вместо Host+ApplicationsInWork
This commit is contained in:
@@ -15,6 +15,7 @@ using PARR.Constants;
|
||||
using PARR.DAL.DomainModels;
|
||||
using PARR.DAL.Models;
|
||||
using PARR.DAL.Services.Interfaces;
|
||||
using PARR.DAL.Services.Interfaces.Unit;
|
||||
|
||||
namespace PARR.API.Controllers.V1
|
||||
{
|
||||
@@ -29,6 +30,7 @@ namespace PARR.API.Controllers.V1
|
||||
private readonly IMapper mapper;
|
||||
private readonly ITemplateService templateService;
|
||||
private readonly IClientService clientService;
|
||||
private readonly IUnitService unitService;
|
||||
private readonly ILogger<AgentHistoryController> logger;
|
||||
|
||||
public AgentHistoryController(
|
||||
@@ -38,6 +40,7 @@ namespace PARR.API.Controllers.V1
|
||||
IMapper mapper,
|
||||
ITemplateService templateService,
|
||||
IClientService clientService,
|
||||
IUnitService unitService,
|
||||
ILogger<AgentHistoryController> logger
|
||||
)
|
||||
{
|
||||
@@ -47,6 +50,7 @@ namespace PARR.API.Controllers.V1
|
||||
this.mapper = mapper;
|
||||
this.templateService = templateService;
|
||||
this.clientService = clientService;
|
||||
this.unitService = unitService;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
@@ -121,16 +125,22 @@ namespace PARR.API.Controllers.V1
|
||||
|
||||
|
||||
var clientIp = clientService.GetClientIp()?.ToString();
|
||||
var template = await templateService.Get().Include(t => t.Host).FirstOrDefaultAsync(t => t.Id == request.TemplateId);
|
||||
var template = await templateService.Get()
|
||||
.Include(t => t.Unit)
|
||||
.ThenInclude(t => t!.UnitValues)
|
||||
|
||||
.FirstOrDefaultAsync(t => t.Id == request.TemplateId);
|
||||
|
||||
if (template == null)
|
||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.TemplateId), Message = $"Не найден шаблон с Id: {request.TemplateId}" } }));
|
||||
|
||||
//проверять что этот этот шаблон привязан к этому серверу по ip
|
||||
if (template.Host?.IP != clientIp)
|
||||
var unit = await unitService.GetWithIncludes().AsNoTracking().FirstOrDefaultAsync(t => t.Id == template.UnitId);
|
||||
var unitIp = unit?.UnitValues.FirstOrDefault(t => t.Field!.AihitName == "IP_АДРЕС")!.Value!.Value;
|
||||
if (unitIp != clientIp)
|
||||
{
|
||||
logger.LogWarning($"Клиент с ip: {clientIp} пытается записать историю агента для templateId: {request.TemplateId}, " +
|
||||
$"но у шаблона ip: {template.Host?.IP}, доступ запрещен так как их ip не равны.");
|
||||
$"но у шаблона ip: {unitIp}, доступ запрещен так как их ip не равны.");
|
||||
return Forbid();
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ using PARR.API.Services.Interfaces;
|
||||
using PARR.Constants;
|
||||
using PARR.DAL.Contracts;
|
||||
using PARR.DAL.Services.Interfaces;
|
||||
using PARR.DAL.Services.Interfaces.Unit;
|
||||
using PARR.DAL.TransformServices;
|
||||
|
||||
namespace PARR.API.Controllers.V1
|
||||
@@ -22,18 +23,21 @@ namespace PARR.API.Controllers.V1
|
||||
{
|
||||
private readonly IClientService clientService;
|
||||
private readonly ITemplateService templateService;
|
||||
private readonly IUnitService unitService;
|
||||
private readonly IEsppScheduleTransformService esppScheduleTransformService;
|
||||
private readonly ILogger<AgentTaskController> logger;
|
||||
|
||||
public AgentTaskController(
|
||||
IClientService clientService,
|
||||
ITemplateService templateService,
|
||||
IUnitService unitService,
|
||||
IEsppScheduleTransformService esppScheduleTransformService,
|
||||
ILogger<AgentTaskController> logger
|
||||
)
|
||||
{
|
||||
this.clientService = clientService;
|
||||
this.templateService = templateService;
|
||||
this.unitService = unitService;
|
||||
this.esppScheduleTransformService = esppScheduleTransformService;
|
||||
this.logger = logger;
|
||||
}
|
||||
@@ -62,19 +66,21 @@ namespace PARR.API.Controllers.V1
|
||||
//Агент получает задания, если `IsAgent = true`, шаблон и расписания активны, и статус синхронизации шаблона и расписания `= Ok`, и `NextRun = сегодня`, так же если у ApplicationInWork есть расписание.
|
||||
|
||||
// С одним IP может быть несколько информационных систем, так что может быть несколько хостов
|
||||
var units = await unitService.GetWithIncludes().AsNoTracking().Where(t => t.UnitValues.Any(v => v.Field!.AihitName == "IP_АДРЕС" && v.Value!.Value == ip)).ToListAsync();
|
||||
var templates = await templateService.Get()
|
||||
.Include(t => t.RobotConfigurations)
|
||||
.Include(t => t.ApplicationsInWork)
|
||||
.ThenInclude(t => t!.EsppSchValues)
|
||||
.Include(t => t.Host)
|
||||
.Where(t => t.Host!.IP == ip
|
||||
&& t.ApplicationsInWork!.IsAgent == true
|
||||
.Include(t => t.Job)
|
||||
.ThenInclude(t=>t!.Group)
|
||||
.ThenInclude(t => t!.EsppSchValues)
|
||||
.Include(t => t.Unit)
|
||||
.Where(t => units.Any(u=>u.Id == t.UnitId)
|
||||
//&& t.ApplicationsInWork!.IsAgent == true//TODO Migration to job
|
||||
&& t.IsActiveTemplate == true
|
||||
&& t.IsActiveSchedule == true
|
||||
//&& t.ApplicationsInWork!.NextRun.DateTime.Date == date.Date.Date
|
||||
&& t.NextRun.DateTime.Date == date.Date.Date
|
||||
&& t.RobotConfigurations.All(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok)
|
||||
&& t.ApplicationsInWork.EsppSchValues.Any()
|
||||
&& t.Job!.Group!.EsppSchValues.Any()//.ApplicationsInWork.EsppSchValues.Any()
|
||||
).ToListAsync();
|
||||
|
||||
if (!templates.Any())
|
||||
@@ -88,26 +94,26 @@ namespace PARR.API.Controllers.V1
|
||||
foreach (var template in templates)
|
||||
{
|
||||
//var templateSchedule = await esppScheduleTransformService.GetNextScheduleAsync(template.ApplicationInWorkId, template.ApplicationsInWork!.LastRun ?? template.ApplicationsInWork!.NextRun);
|
||||
var templateSchedule = await esppScheduleTransformService.GetNextScheduleAsync(template.ApplicationInWorkId, template.NextRun);
|
||||
var templateSchedule = await esppScheduleTransformService.GetNextScheduleAsync(template.Job!.GroupId, template.NextRun);
|
||||
|
||||
if (!templateSchedule.Any())
|
||||
{
|
||||
logger.LogWarning($"Запросили раписание для агента по NextRun и вернулся пустой список! Такого не должно быть! " +
|
||||
$"ApplicationInWorkId: {template.ApplicationInWorkId}, latRun: {template.LastRun}, NextRun: {template.NextRun}, ip: {ip}, date: {date}");
|
||||
$"JobGroupId: {template.Job.GroupId}, latRun: {template.LastRun}, NextRun: {template.NextRun}, ip: {ip}, date: {date}");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(template.ApplicationsInWork.AgentName) && string.IsNullOrEmpty(template.ApplicationsInWork.AgentScript))
|
||||
if (string.IsNullOrEmpty(template.Job.Group!.AgentName) && string.IsNullOrEmpty(template.Job.Group!.AgentScript))
|
||||
{
|
||||
logger.LogWarning($"Запросили задание для агента с пустыми значениями AgentName && AgentScript. Такого не должно быть! " +
|
||||
$"ApplicationInWorkId: {template.ApplicationInWorkId}, AgentName: {template.ApplicationsInWork.AgentName}, AgentScript: {template.ApplicationsInWork.AgentScript} , ip: {ip}, date: {date}");
|
||||
$"JobGroupId: {template.Job.GroupId}, AgentName: {template.Job.Group.AgentName}, AgentScript: {template.Job.Group.AgentScript} , ip: {ip}, date: {date}");
|
||||
continue;
|
||||
}
|
||||
|
||||
templateSchedule.ForEach(item => response.Scheduled.Add(new AgentTaskMinScheduleResponse
|
||||
{
|
||||
Name = template.ApplicationsInWork!.AgentName ?? "",
|
||||
Script = template.ApplicationsInWork!.AgentScript ?? "",
|
||||
Name = template.Job.Group.AgentName ?? "",
|
||||
Script = template.Job.Group.AgentScript ?? "",
|
||||
StartAt = item,
|
||||
TemplateId = template.Id
|
||||
}));
|
||||
|
||||
@@ -62,53 +62,53 @@ namespace PARR.API.Controllers.V1
|
||||
/// Получить список заданий на выполнение работ(ApplicationInWork) постранично
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet(ApiRoutes.Job.GetAll)]
|
||||
public async Task<IActionResult> GetAll([FromQuery] PaginationQuery paginationQuery, [FromQuery] ApplicationInWorkQuery filter)
|
||||
{
|
||||
var paginationFilter = mapper.Map<PaginationFilter>(paginationQuery);
|
||||
//[HttpGet(ApiRoutes.Job.GetAll)]
|
||||
//public async Task<IActionResult> GetAll([FromQuery] PaginationQuery paginationQuery, [FromQuery] ApplicationInWorkQuery filter)
|
||||
//{
|
||||
// var paginationFilter = mapper.Map<PaginationFilter>(paginationQuery);
|
||||
|
||||
IQueryable<ApplicationsInWork> query = applicationsInWorkService.Get().Include(t => t.Application).ThenInclude(t => t!.ApplicationType);
|
||||
// IQueryable<ApplicationsInWork> query = applicationsInWorkService.Get().Include(t => t.Application).ThenInclude(t => t!.ApplicationType);
|
||||
|
||||
if (filter.IsLight != true)
|
||||
{
|
||||
query = query
|
||||
.Include(t => t.Work)
|
||||
//.Include(t => t.Templates) - большой запрос, делаем его отдельно
|
||||
.Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup)
|
||||
.Include(t => t.JobAutoControl);
|
||||
}
|
||||
// if (filter.IsLight != true)
|
||||
// {
|
||||
// query = query
|
||||
// .Include(t => t.Work)
|
||||
// //.Include(t => t.Templates) - большой запрос, делаем его отдельно
|
||||
// .Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup)
|
||||
// .Include(t => t.JobAutoControl);
|
||||
// }
|
||||
|
||||
query = query.OrderBy(t => t.ShortDescription).ThenBy(t => t.Application!.Name);
|
||||
// query = query.OrderBy(t => t.ShortDescription).ThenBy(t => t.Application!.Name);
|
||||
|
||||
if (!string.IsNullOrEmpty(filter.ShortDescription))
|
||||
query = query.Where(t => t.ShortDescription.ToLower().Contains(filter.ShortDescription.ToLower()));
|
||||
// if (!string.IsNullOrEmpty(filter.ShortDescription))
|
||||
// query = query.Where(t => t.ShortDescription.ToLower().Contains(filter.ShortDescription.ToLower()));
|
||||
|
||||
if (filter.WorkId.HasValue)
|
||||
query = query.Where(t => t.WorkId == filter.WorkId.Value);
|
||||
// if (filter.WorkId.HasValue)
|
||||
// query = query.Where(t => t.WorkId == filter.WorkId.Value);
|
||||
|
||||
var appInWorks = await applicationsInWorkService.GetPage(query, paginationFilter).ToListAsync();
|
||||
// var appInWorks = await applicationsInWorkService.GetPage(query, paginationFilter).ToListAsync();
|
||||
|
||||
if (!appInWorks.Any())
|
||||
return NoContent();
|
||||
// if (!appInWorks.Any())
|
||||
// return NoContent();
|
||||
|
||||
var response = mapper.Map<List<ApplicationInWorkResponse>>(appInWorks);
|
||||
// var response = mapper.Map<List<ApplicationInWorkResponse>>(appInWorks);//TODO Migration to job
|
||||
|
||||
if (filter.IsLight != true)
|
||||
{
|
||||
//Если запрос не легкий, загружаем кол-во шаблонов отдельно, это значительно ускоряет запрос
|
||||
foreach (var item in response)
|
||||
{
|
||||
item.TemplatesCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == item.Id);
|
||||
// if (filter.IsLight != true)
|
||||
// {
|
||||
// //Если запрос не легкий, загружаем кол-во шаблонов отдельно, это значительно ускоряет запрос
|
||||
// foreach (var item in response)
|
||||
// {
|
||||
// item.TemplatesCount = await templateService.Get().CountAsync(t => t.JobId == item.Id);
|
||||
|
||||
var statistics = await GetStatisticsAsync(item.Id);
|
||||
BindStatistics(item, statistics);
|
||||
}
|
||||
}
|
||||
// var statistics = await GetStatisticsAsync(item.Id);
|
||||
// BindStatistics(item, statistics);
|
||||
// }
|
||||
// }
|
||||
|
||||
var paginationResponse = new PagedResponse<ApplicationInWorkResponse>(response, true).GetPaginatedProps(paginationFilter, query);
|
||||
// var paginationResponse = new PagedResponse<ApplicationInWorkResponse>(response, true).GetPaginatedProps(paginationFilter, query);
|
||||
|
||||
return Ok(paginationResponse);
|
||||
}
|
||||
// return Ok(paginationResponse);
|
||||
//}
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -116,28 +116,28 @@ namespace PARR.API.Controllers.V1
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet(ApiRoutes.Job.Get)]
|
||||
public async Task<IActionResult> GetById([FromRoute] Guid id)
|
||||
{
|
||||
var applicationInWork = await applicationsInWorkService.Get()
|
||||
.Include(t => t.Application).ThenInclude(t => t!.ApplicationType)
|
||||
.Include(t => t.Work)
|
||||
//.Include(t => t.Templates)
|
||||
.Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup)
|
||||
.Include(t => t.JobAutoControl)
|
||||
.FirstOrDefaultAsync(t => t.Id == id);
|
||||
//[HttpGet(ApiRoutes.Job.Get)]
|
||||
//public async Task<IActionResult> GetById([FromRoute] Guid id)
|
||||
//{
|
||||
// var applicationInWork = await applicationsInWorkService.Get()
|
||||
// .Include(t => t.Application).ThenInclude(t => t!.ApplicationType)
|
||||
// .Include(t => t.Work)
|
||||
// //.Include(t => t.Templates)
|
||||
// .Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup)
|
||||
// .Include(t => t.JobAutoControl)
|
||||
// .FirstOrDefaultAsync(t => t.Id == id);
|
||||
|
||||
if (applicationInWork == null)
|
||||
return NotFound();
|
||||
// if (applicationInWork == null)
|
||||
// return NotFound();
|
||||
|
||||
var response = mapper.Map<ApplicationInWorkResponse>(applicationInWork);
|
||||
response.TemplatesCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == id);
|
||||
// var response = mapper.Map<ApplicationInWorkResponse>(applicationInWork);
|
||||
// response.TemplatesCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == id);
|
||||
|
||||
var statistics = await GetStatisticsAsync(response.Id);
|
||||
BindStatistics(response, statistics);
|
||||
// var statistics = await GetStatisticsAsync(response.Id);
|
||||
// BindStatistics(response, statistics);
|
||||
|
||||
return Ok(new Response<ApplicationInWorkResponse>(response, true));
|
||||
}
|
||||
// return Ok(new Response<ApplicationInWorkResponse>(response, true));
|
||||
//}
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -145,80 +145,80 @@ namespace PARR.API.Controllers.V1
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost(ApiRoutes.Job.Create)]
|
||||
public async Task<IActionResult> Create([FromBody] ApplicationInWorkRequest request)
|
||||
{
|
||||
var resultValidate = await validator.ValidateAsync(request);
|
||||
//[HttpPost(ApiRoutes.Job.Create)]
|
||||
//public async Task<IActionResult> Create([FromBody] ApplicationInWorkRequest request)
|
||||
//{
|
||||
// var resultValidate = await validator.ValidateAsync(request);
|
||||
|
||||
if (!resultValidate.IsValid)
|
||||
return BadRequest(new Response(resultValidate.Errors));
|
||||
// if (!resultValidate.IsValid)
|
||||
// return BadRequest(new Response(resultValidate.Errors));
|
||||
|
||||
//уникальная запись по полям ApplicationId, WorkId
|
||||
var existSameAiW = await applicationsInWorkService.GetAsync(request.ApplicationId, request.WorkId);
|
||||
if (existSameAiW != null)
|
||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Задание на выполнение работ с такими ПО и работой уже существует" } }));
|
||||
// //уникальная запись по полям ApplicationId, WorkId
|
||||
// var existSameAiW = await applicationsInWorkService.GetAsync(request.ApplicationId, request.WorkId);
|
||||
// if (existSameAiW != null)
|
||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Задание на выполнение работ с такими ПО и работой уже существует" } }));
|
||||
|
||||
var applicationInWork = new ApplicationsInWork
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
WorkId = request.WorkId,
|
||||
ApplicationId = request.ApplicationId,
|
||||
TemplateDuration = request.TemplateDuration,
|
||||
ShortDescription = request.ShortDescription.Trim(),
|
||||
FullDescription = request.FullDescription.Trim(),
|
||||
Solution = request.Solution.Trim(),
|
||||
//NextRun = request.NextRun,
|
||||
IsAutoDistributionEnabled = request.IsAutoDistributionEnabled,
|
||||
ReferenceDate = request.ReferenceDate,
|
||||
IsAgent = request.IsAgent,
|
||||
AgentName = request.AgentName?.Trim(),
|
||||
AgentTimeOutSec = request.AgentTimeOutSec,
|
||||
AgentScript = request.AgentScript?.Trim()
|
||||
};
|
||||
// var applicationInWork = new ApplicationsInWork
|
||||
// {
|
||||
// Id = Guid.NewGuid(),
|
||||
// WorkId = request.WorkId,
|
||||
// ApplicationId = request.ApplicationId,
|
||||
// TemplateDuration = request.TemplateDuration,
|
||||
// ShortDescription = request.ShortDescription.Trim(),
|
||||
// FullDescription = request.FullDescription.Trim(),
|
||||
// Solution = request.Solution.Trim(),
|
||||
// //NextRun = request.NextRun,
|
||||
// IsAutoDistributionEnabled = request.IsAutoDistributionEnabled,
|
||||
// ReferenceDate = request.ReferenceDate,
|
||||
// IsAgent = request.IsAgent,
|
||||
// AgentName = request.AgentName?.Trim(),
|
||||
// AgentTimeOutSec = request.AgentTimeOutSec,
|
||||
// AgentScript = request.AgentScript?.Trim()
|
||||
// };
|
||||
|
||||
//Добавляем настройки планировщика
|
||||
request.Schedule.ForEach(item =>
|
||||
{
|
||||
applicationInWork.EsppSchValues.Add(new EsppSchValue
|
||||
{
|
||||
ApplicationsInWorkId = applicationInWork.Id,
|
||||
TypeConfigId = item.TypeConfigId,
|
||||
TypeValueId = item.TypeValueId
|
||||
});
|
||||
});
|
||||
// //Добавляем настройки планировщика
|
||||
// request.Schedule.ForEach(item =>
|
||||
// {
|
||||
// applicationInWork.EsppSchValues.Add(new EsppSchValue
|
||||
// {
|
||||
// ApplicationsInWorkId = applicationInWork.Id,
|
||||
// TypeConfigId = item.TypeConfigId,
|
||||
// TypeValueId = item.TypeValueId
|
||||
// });
|
||||
// });
|
||||
|
||||
//Добавляем рабочие группы
|
||||
request.WorkGroups.ForEach(workGroupId =>
|
||||
{
|
||||
applicationInWork.WorkGroups.Add(new AppInWorkInWorkGroup
|
||||
{
|
||||
ApplicationsInWorkId = applicationInWork.Id,
|
||||
WorkGroupId = workGroupId
|
||||
});
|
||||
});
|
||||
// //Добавляем рабочие группы
|
||||
// request.WorkGroups.ForEach(workGroupId =>
|
||||
// {
|
||||
// applicationInWork.WorkGroups.Add(new AppInWorkInWorkGroup
|
||||
// {
|
||||
// ApplicationsInWorkId = applicationInWork.Id,
|
||||
// WorkGroupId = workGroupId
|
||||
// });
|
||||
// });
|
||||
|
||||
if (!await applicationsInWorkService.CreateAsync(applicationInWork) || !await applicationsInWorkService.CommitAsync())
|
||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при созании задания на выполнение работ" } }));
|
||||
// if (!await applicationsInWorkService.CreateAsync(applicationInWork) || !await applicationsInWorkService.CommitAsync())
|
||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при созании задания на выполнение работ" } }));
|
||||
|
||||
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил задание на выполнение работ: {applicationInWork.Id}, {applicationInWork.ShortDescription}, {applicationInWork.Solution}");
|
||||
// logger.LogInformation($"Пользователь {User.Identity?.Name} добавил задание на выполнение работ: {applicationInWork.Id}, {applicationInWork.ShortDescription}, {applicationInWork.Solution}");
|
||||
|
||||
|
||||
var createdApplicationInWork = await applicationsInWorkService.Get()
|
||||
.Include(t => t.Application).ThenInclude(t => t!.ApplicationType)
|
||||
.Include(t => t.Work)
|
||||
//.Include(t => t.Templates)
|
||||
.Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup)
|
||||
.Include(t => t.JobAutoControl)
|
||||
.FirstAsync(t => t.Id == applicationInWork.Id);
|
||||
// var createdApplicationInWork = await applicationsInWorkService.Get()
|
||||
// .Include(t => t.Application).ThenInclude(t => t!.ApplicationType)
|
||||
// .Include(t => t.Work)
|
||||
// //.Include(t => t.Templates)
|
||||
// .Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup)
|
||||
// .Include(t => t.JobAutoControl)
|
||||
// .FirstAsync(t => t.Id == applicationInWork.Id);
|
||||
|
||||
var locationUri = uriService.GetUri(ApiRoutes.Job.Get, ApiRoutes.Job.getParam, createdApplicationInWork.Id);
|
||||
// var locationUri = uriService.GetUri(ApiRoutes.Job.Get, ApiRoutes.Job.getParam, createdApplicationInWork.Id);
|
||||
|
||||
var response = mapper.Map<ApplicationInWorkResponse>(createdApplicationInWork);
|
||||
// так как мы только что создали AppInW, то у него нет шаблонов, смело ставим = 0 (ускоряем запрос)
|
||||
response.TemplatesCount = 0;
|
||||
// var response = mapper.Map<ApplicationInWorkResponse>(createdApplicationInWork);
|
||||
// // так как мы только что создали AppInW, то у него нет шаблонов, смело ставим = 0 (ускоряем запрос)
|
||||
// response.TemplatesCount = 0;
|
||||
|
||||
return Created(locationUri, new Response<ApplicationInWorkResponse>(response, true));
|
||||
}
|
||||
// return Created(locationUri, new Response<ApplicationInWorkResponse>(response, true));
|
||||
//}
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -227,114 +227,114 @@ namespace PARR.API.Controllers.V1
|
||||
/// <param name="id"></param>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPut(ApiRoutes.Job.Update)]
|
||||
public async Task<IActionResult> Update([FromRoute] Guid id, [FromBody] ApplicationInWorkRequest request)
|
||||
{
|
||||
var resultValidate = await validator.ValidateAsync(request);
|
||||
if (!resultValidate.IsValid)
|
||||
return BadRequest(new Response(resultValidate.Errors));
|
||||
//[HttpPut(ApiRoutes.Job.Update)]
|
||||
//public async Task<IActionResult> Update([FromRoute] Guid id, [FromBody] ApplicationInWorkRequest request)
|
||||
//{
|
||||
// var resultValidate = await validator.ValidateAsync(request);
|
||||
// if (!resultValidate.IsValid)
|
||||
// return BadRequest(new Response(resultValidate.Errors));
|
||||
|
||||
//уникальная запись по полям ApplicationId, WorkId у которой id!=[FromRoute]id
|
||||
var existSameAiW = await applicationsInWorkService.Get()
|
||||
.FirstOrDefaultAsync(t => t.Id != id && t.ApplicationId == request.ApplicationId && t.WorkId == request.WorkId);
|
||||
if (existSameAiW != null)
|
||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Задание на выполнение работ с такими ПО и работой уже существует" } }));
|
||||
// //уникальная запись по полям ApplicationId, WorkId у которой id!=[FromRoute]id
|
||||
// var existSameAiW = await applicationsInWorkService.Get()
|
||||
// .FirstOrDefaultAsync(t => t.Id != id && t.ApplicationId == request.ApplicationId && t.WorkId == request.WorkId);
|
||||
// if (existSameAiW != null)
|
||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Задание на выполнение работ с такими ПО и работой уже существует" } }));
|
||||
|
||||
var orig = await applicationsInWorkService.Get()
|
||||
.Include(t => t.WorkGroups)
|
||||
.Include(t => t.EsppSchValues)
|
||||
.FirstOrDefaultAsync(t => t.Id == id);
|
||||
// var orig = await applicationsInWorkService.Get()
|
||||
// .Include(t => t.WorkGroups)
|
||||
// .Include(t => t.EsppSchValues)
|
||||
// .FirstOrDefaultAsync(t => t.Id == id);
|
||||
|
||||
if (orig == null)
|
||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении задания на выполнение работ. Не найдено задание с Id: {id}" } }));
|
||||
// if (orig == null)
|
||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении задания на выполнение работ. Не найдено задание с Id: {id}" } }));
|
||||
|
||||
//Расписание было изменено, ниже добавим задание в очередь на обновление расписаний у связанных шаблонов
|
||||
var isScheduleChanged = IsScheduleChanged(orig, request);
|
||||
// //Расписание было изменено, ниже добавим задание в очередь на обновление расписаний у связанных шаблонов
|
||||
// var isScheduleChanged = IsScheduleChanged(orig, request);
|
||||
|
||||
orig.WorkId = request.WorkId;
|
||||
orig.ApplicationId = request.ApplicationId;
|
||||
orig.TemplateDuration = request.TemplateDuration;
|
||||
orig.ShortDescription = request.ShortDescription.Trim();
|
||||
orig.FullDescription = request.FullDescription.Trim();
|
||||
orig.Solution = request.Solution.Trim();
|
||||
//orig.NextRun = request.NextRun;
|
||||
orig.ReferenceDate = request.ReferenceDate;
|
||||
orig.IsAutoDistributionEnabled = request.IsAutoDistributionEnabled;
|
||||
orig.IsAgent = request.IsAgent;
|
||||
orig.AgentName = request.AgentName?.Trim();
|
||||
orig.AgentTimeOutSec = request.AgentTimeOutSec;
|
||||
orig.AgentScript = request.AgentScript?.Trim();
|
||||
orig.DateModified = DateTimeOffset.UtcNow;
|
||||
// orig.WorkId = request.WorkId;
|
||||
// orig.ApplicationId = request.ApplicationId;
|
||||
// orig.TemplateDuration = request.TemplateDuration;
|
||||
// orig.ShortDescription = request.ShortDescription.Trim();
|
||||
// orig.FullDescription = request.FullDescription.Trim();
|
||||
// orig.Solution = request.Solution.Trim();
|
||||
// //orig.NextRun = request.NextRun;
|
||||
// orig.ReferenceDate = request.ReferenceDate;
|
||||
// orig.IsAutoDistributionEnabled = request.IsAutoDistributionEnabled;
|
||||
// orig.IsAgent = request.IsAgent;
|
||||
// orig.AgentName = request.AgentName?.Trim();
|
||||
// orig.AgentTimeOutSec = request.AgentTimeOutSec;
|
||||
// orig.AgentScript = request.AgentScript?.Trim();
|
||||
// orig.DateModified = DateTimeOffset.UtcNow;
|
||||
|
||||
//обновляем планировщик
|
||||
orig.EsppSchValues.Clear();
|
||||
request.Schedule.ForEach(item =>
|
||||
{
|
||||
orig.EsppSchValues.Add(new EsppSchValue
|
||||
{
|
||||
ApplicationsInWorkId = orig.Id,
|
||||
TypeConfigId = item.TypeConfigId,
|
||||
TypeValueId = item.TypeValueId
|
||||
});
|
||||
});
|
||||
// //обновляем планировщик
|
||||
// orig.EsppSchValues.Clear();
|
||||
// request.Schedule.ForEach(item =>
|
||||
// {
|
||||
// orig.EsppSchValues.Add(new EsppSchValue
|
||||
// {
|
||||
// ApplicationsInWorkId = orig.Id,
|
||||
// TypeConfigId = item.TypeConfigId,
|
||||
// TypeValueId = item.TypeValueId
|
||||
// });
|
||||
// });
|
||||
|
||||
//Обновляем рабочие группы
|
||||
orig.WorkGroups.Clear();
|
||||
request.WorkGroups.ForEach(workGroupId =>
|
||||
{
|
||||
orig.WorkGroups.Add(new AppInWorkInWorkGroup
|
||||
{
|
||||
ApplicationsInWorkId = orig.Id,
|
||||
WorkGroupId = workGroupId
|
||||
});
|
||||
});
|
||||
// //Обновляем рабочие группы
|
||||
// orig.WorkGroups.Clear();
|
||||
// request.WorkGroups.ForEach(workGroupId =>
|
||||
// {
|
||||
// orig.WorkGroups.Add(new AppInWorkInWorkGroup
|
||||
// {
|
||||
// ApplicationsInWorkId = orig.Id,
|
||||
// WorkGroupId = workGroupId
|
||||
// });
|
||||
// });
|
||||
|
||||
|
||||
if (!await applicationsInWorkService.CommitAsync())
|
||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при изменении задания на выполнение работ." } }));
|
||||
// if (!await applicationsInWorkService.CommitAsync())
|
||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при изменении задания на выполнение работ." } }));
|
||||
|
||||
logger.LogInformation($"Пользователь {User.Identity?.Name} обновил задание на выполнение работ: {orig.Id}," +
|
||||
$" {orig.WorkId}, {orig.ApplicationId}, {orig.TemplateDuration}, {orig.ShortDescription}," +
|
||||
$" {orig.FullDescription}, {orig.Solution}, {nameof(orig.IsAutoDistributionEnabled)}: {orig.IsAutoDistributionEnabled}, {orig.IsAgent}, {orig.AgentName}, {orig.AgentTimeOutSec}, {orig.AgentScript}");
|
||||
// logger.LogInformation($"Пользователь {User.Identity?.Name} обновил задание на выполнение работ: {orig.Id}," +
|
||||
// $" {orig.WorkId}, {orig.ApplicationId}, {orig.TemplateDuration}, {orig.ShortDescription}," +
|
||||
// $" {orig.FullDescription}, {orig.Solution}, {nameof(orig.IsAutoDistributionEnabled)}: {orig.IsAutoDistributionEnabled}, {orig.IsAgent}, {orig.AgentName}, {orig.AgentTimeOutSec}, {orig.AgentScript}");
|
||||
|
||||
|
||||
if (isScheduleChanged)
|
||||
{
|
||||
//расписание было обновлено, отправим задание в очередь на перерасчет NextRun
|
||||
var requestToMq = new TemplateDistributorMq
|
||||
{
|
||||
ApplicationInWorkId = id
|
||||
};
|
||||
// if (isScheduleChanged)
|
||||
// {
|
||||
// //расписание было обновлено, отправим задание в очередь на перерасчет NextRun
|
||||
// var requestToMq = new TemplateDistributorMq
|
||||
// {
|
||||
// ApplicationInWorkId = id
|
||||
// };
|
||||
|
||||
var msg = JsonSerializer.Serialize(requestToMq);
|
||||
// var msg = JsonSerializer.Serialize(requestToMq);
|
||||
|
||||
logger.LogDebug($"Расписание в РР applicationInWorkId: {id} было изменено. Отправляем задание в очередь на перерасчет NextRun");
|
||||
// logger.LogDebug($"Расписание в РР applicationInWorkId: {id} было изменено. Отправляем задание в очередь на перерасчет NextRun");
|
||||
|
||||
var sendResult = mqService.Send(mqSettings.TemplateDistributor, new[] { msg });
|
||||
// var sendResult = mqService.Send(mqSettings.TemplateDistributor, new[] { msg });
|
||||
|
||||
if (sendResult.IsSuccess)
|
||||
logger.LogInformation($"Задание на перерасчет NextRun успешно отправлено в очередь MQ {mqSettings.TemplateDistributor.QueueName}");
|
||||
else
|
||||
logger.LogError($"Ошибка при отправке задания на перерасчет NextRun в очередь MQ {mqSettings.TemplateDistributor.QueueName}");
|
||||
}
|
||||
// if (sendResult.IsSuccess)
|
||||
// logger.LogInformation($"Задание на перерасчет NextRun успешно отправлено в очередь MQ {mqSettings.TemplateDistributor.QueueName}");
|
||||
// else
|
||||
// logger.LogError($"Ошибка при отправке задания на перерасчет NextRun в очередь MQ {mqSettings.TemplateDistributor.QueueName}");
|
||||
// }
|
||||
|
||||
var updatedApplicationInWork = await applicationsInWorkService.Get()
|
||||
.Include(t => t.Application).ThenInclude(t => t!.ApplicationType)
|
||||
.Include(t => t.Work)
|
||||
//.Include(t => t.Templates)
|
||||
.Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup)
|
||||
.Include(t => t.JobAutoControl)
|
||||
.FirstAsync(t => t.Id == orig.Id);
|
||||
// var updatedApplicationInWork = await applicationsInWorkService.Get()
|
||||
// .Include(t => t.Application).ThenInclude(t => t!.ApplicationType)
|
||||
// .Include(t => t.Work)
|
||||
// //.Include(t => t.Templates)
|
||||
// .Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup)
|
||||
// .Include(t => t.JobAutoControl)
|
||||
// .FirstAsync(t => t.Id == orig.Id);
|
||||
|
||||
var response = mapper.Map<ApplicationInWorkResponse>(updatedApplicationInWork);
|
||||
response.TemplatesCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == id);
|
||||
// var response = mapper.Map<ApplicationInWorkResponse>(updatedApplicationInWork);
|
||||
// response.TemplatesCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == id);
|
||||
|
||||
var statistics = await GetStatisticsAsync(response.Id);
|
||||
BindStatistics(response, statistics);
|
||||
// var statistics = await GetStatisticsAsync(response.Id);
|
||||
// BindStatistics(response, statistics);
|
||||
|
||||
return Ok(new Response<ApplicationInWorkResponse>(response, true));
|
||||
// return Ok(new Response<ApplicationInWorkResponse>(response, true));
|
||||
|
||||
}
|
||||
//}
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -342,38 +342,38 @@ namespace PARR.API.Controllers.V1
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpDelete(ApiRoutes.Job.Delete)]
|
||||
public async Task<IActionResult> Delete([FromRoute] Guid id)
|
||||
{
|
||||
var applicationsInWork = await applicationsInWorkService.Get()
|
||||
//.Include(t => t.Templates)
|
||||
.FirstOrDefaultAsync(t => t.Id == id);
|
||||
//[HttpDelete(ApiRoutes.Job.Delete)]
|
||||
//public async Task<IActionResult> Delete([FromRoute] Guid id)
|
||||
//{
|
||||
// var applicationsInWork = await applicationsInWorkService.Get()
|
||||
// //.Include(t => t.Templates)
|
||||
// .FirstOrDefaultAsync(t => t.Id == id);
|
||||
|
||||
if (applicationsInWork == null)
|
||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel {
|
||||
Message = $"Ошибка при удалении задания на выполнение работ. Не найдено задание на выполнение работ Id: {id}"
|
||||
} }));
|
||||
// if (applicationsInWork == null)
|
||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel {
|
||||
// Message = $"Ошибка при удалении задания на выполнение работ. Не найдено задание на выполнение работ Id: {id}"
|
||||
// } }));
|
||||
|
||||
var templateCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == id);
|
||||
// var templateCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == id);
|
||||
|
||||
//if (applicationsInWork.Templates.Any())
|
||||
if (templateCount > 0)
|
||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel {
|
||||
Message = $"Ошибка при удалении задания на выполнение работ. С данным заданием связаны шаблоны: {templateCount} шт."
|
||||
} }));
|
||||
// //if (applicationsInWork.Templates.Any())
|
||||
// if (templateCount > 0)
|
||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel {
|
||||
// Message = $"Ошибка при удалении задания на выполнение работ. С данным заданием связаны шаблоны: {templateCount} шт."
|
||||
// } }));
|
||||
|
||||
if (!applicationsInWorkService.Delete(applicationsInWork) || !await applicationsInWorkService.CommitAsync())
|
||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel {
|
||||
Message = $"Ошибка при удалении задания на выполнение работ"
|
||||
} }));
|
||||
// if (!applicationsInWorkService.Delete(applicationsInWork) || !await applicationsInWorkService.CommitAsync())
|
||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel {
|
||||
// Message = $"Ошибка при удалении задания на выполнение работ"
|
||||
// } }));
|
||||
|
||||
logger.LogInformation($"Пользователь {User.Identity?.Name} удалил задание на выполнение работ: {applicationsInWork.Id},{applicationsInWork.WorkId}," +
|
||||
$" {applicationsInWork.ApplicationId}, {applicationsInWork.TemplateDuration}, {applicationsInWork.ShortDescription}," +
|
||||
$" {applicationsInWork.FullDescription}, {applicationsInWork.Solution}, {nameof(applicationsInWork.IsAutoDistributionEnabled)}: {applicationsInWork.IsAutoDistributionEnabled}, {applicationsInWork.IsAgent}," +
|
||||
$" {applicationsInWork.AgentName}, {applicationsInWork.AgentTimeOutSec}, {applicationsInWork.AgentScript}");
|
||||
// logger.LogInformation($"Пользователь {User.Identity?.Name} удалил задание на выполнение работ: {applicationsInWork.Id},{applicationsInWork.WorkId}," +
|
||||
// $" {applicationsInWork.ApplicationId}, {applicationsInWork.TemplateDuration}, {applicationsInWork.ShortDescription}," +
|
||||
// $" {applicationsInWork.FullDescription}, {applicationsInWork.Solution}, {nameof(applicationsInWork.IsAutoDistributionEnabled)}: {applicationsInWork.IsAutoDistributionEnabled}, {applicationsInWork.IsAgent}," +
|
||||
// $" {applicationsInWork.AgentName}, {applicationsInWork.AgentTimeOutSec}, {applicationsInWork.AgentScript}");
|
||||
|
||||
return NoContent();
|
||||
}
|
||||
// return NoContent();
|
||||
//}
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -382,31 +382,31 @@ namespace PARR.API.Controllers.V1
|
||||
/// <param name="orig"></param>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
private bool IsScheduleChanged(ApplicationsInWork orig, ApplicationInWorkRequest request)
|
||||
{
|
||||
var isScheduleChanged = false;
|
||||
//private bool IsScheduleChanged(ApplicationsInWork orig, ApplicationInWorkRequest request)
|
||||
//{
|
||||
// var isScheduleChanged = false;
|
||||
|
||||
if (orig.ReferenceDate != request.ReferenceDate)
|
||||
isScheduleChanged = true;
|
||||
// if (orig.ReferenceDate != request.ReferenceDate)
|
||||
// isScheduleChanged = true;
|
||||
|
||||
if (request.Schedule.Count() != orig.EsppSchValues.Count())
|
||||
isScheduleChanged = true;
|
||||
// if (request.Schedule.Count() != orig.EsppSchValues.Count())
|
||||
// isScheduleChanged = true;
|
||||
|
||||
if (request.IsAutoDistributionEnabled != orig.IsAutoDistributionEnabled)
|
||||
isScheduleChanged = true;
|
||||
// if (request.IsAutoDistributionEnabled != orig.IsAutoDistributionEnabled)
|
||||
// isScheduleChanged = true;
|
||||
|
||||
request.Schedule.ForEach(requestSchedule =>
|
||||
{
|
||||
var schExist = orig.EsppSchValues.FirstOrDefault(t => t.ApplicationsInWorkId == orig.Id
|
||||
&& t.TypeValueId == requestSchedule.TypeValueId
|
||||
&& t.TypeConfigId == requestSchedule.TypeConfigId);
|
||||
// request.Schedule.ForEach(requestSchedule =>
|
||||
// {
|
||||
// var schExist = orig.EsppSchValues.FirstOrDefault(t => t.ApplicationsInWorkId == orig.Id
|
||||
// && t.TypeValueId == requestSchedule.TypeValueId
|
||||
// && t.TypeConfigId == requestSchedule.TypeConfigId);
|
||||
|
||||
if (schExist == null)
|
||||
isScheduleChanged = true;
|
||||
});
|
||||
// if (schExist == null)
|
||||
// isScheduleChanged = true;
|
||||
// });
|
||||
|
||||
return isScheduleChanged;
|
||||
}
|
||||
// return isScheduleChanged;
|
||||
//}
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -414,28 +414,28 @@ namespace PARR.API.Controllers.V1
|
||||
/// </summary>
|
||||
/// <param name="applicationInWorkId"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<AppInWorkStatModel> GetStatisticsAsync(Guid applicationInWorkId)
|
||||
{
|
||||
var statResult = await applicationsInWorkService.Get()
|
||||
.Include(t => t.Templates).ThenInclude(t => t.RobotConfigurations)
|
||||
.Where(x => x.Id == applicationInWorkId)
|
||||
.Select(t => new
|
||||
{
|
||||
TemplateActivated = t.Templates.Count(x => x.IsActiveTemplate),
|
||||
TemplateSynchronized = t.Templates.Count(x => x.RobotConfigurations.Any(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok && c.RobotCode == (int)RobotsEnum.TemplateOrder)),
|
||||
TemplateErrors = t.Templates.Count(x => x.RobotConfigurations.Any(c => c.RobotStatusCode == (int)RobotStatusEnum.Error && c.RobotCode == (int)RobotsEnum.TemplateOrder)),
|
||||
ScheduleActivated = t.Templates.Count(x => x.IsActiveSchedule),
|
||||
ScheduleSynchronized = t.Templates.Count(x => x.RobotConfigurations.Any(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok && c.RobotCode == (int)RobotsEnum.ScheduleOrder)),
|
||||
ScheduleErrors = t.Templates.Count(x => x.RobotConfigurations.Any(c => c.RobotStatusCode == (int)RobotStatusEnum.Error && c.RobotCode == (int)RobotsEnum.ScheduleOrder))
|
||||
//private async Task<AppInWorkStatModel> GetStatisticsAsync(Guid applicationInWorkId)
|
||||
//{
|
||||
// var statResult = await applicationsInWorkService.Get()
|
||||
// .Include(t => t.Templates).ThenInclude(t => t.RobotConfigurations)
|
||||
// .Where(x => x.Id == applicationInWorkId)
|
||||
// .Select(t => new
|
||||
// {
|
||||
// TemplateActivated = t.Templates.Count(x => x.IsActiveTemplate),
|
||||
// TemplateSynchronized = t.Templates.Count(x => x.RobotConfigurations.Any(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok && c.RobotCode == (int)RobotsEnum.TemplateOrder)),
|
||||
// TemplateErrors = t.Templates.Count(x => x.RobotConfigurations.Any(c => c.RobotStatusCode == (int)RobotStatusEnum.Error && c.RobotCode == (int)RobotsEnum.TemplateOrder)),
|
||||
// ScheduleActivated = t.Templates.Count(x => x.IsActiveSchedule),
|
||||
// ScheduleSynchronized = t.Templates.Count(x => x.RobotConfigurations.Any(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok && c.RobotCode == (int)RobotsEnum.ScheduleOrder)),
|
||||
// ScheduleErrors = t.Templates.Count(x => x.RobotConfigurations.Any(c => c.RobotStatusCode == (int)RobotStatusEnum.Error && c.RobotCode == (int)RobotsEnum.ScheduleOrder))
|
||||
|
||||
}).FirstOrDefaultAsync();
|
||||
// }).FirstOrDefaultAsync();
|
||||
|
||||
return new AppInWorkStatModel
|
||||
{
|
||||
ScheduleStatistics = new ScheduleStats { Activated = statResult?.ScheduleActivated ?? 0, Errors = statResult?.ScheduleErrors ?? 0, Synchronized = statResult?.ScheduleSynchronized ?? 0 },
|
||||
TemplateStatistics = new TemplateStats { Activated = statResult?.TemplateActivated ?? 0, Errors = statResult?.TemplateErrors ?? 0, Synchronized = statResult?.TemplateSynchronized ?? 0 }
|
||||
};
|
||||
}
|
||||
// return new AppInWorkStatModel
|
||||
// {
|
||||
// ScheduleStatistics = new ScheduleStats { Activated = statResult?.ScheduleActivated ?? 0, Errors = statResult?.ScheduleErrors ?? 0, Synchronized = statResult?.ScheduleSynchronized ?? 0 },
|
||||
// TemplateStatistics = new TemplateStats { Activated = statResult?.TemplateActivated ?? 0, Errors = statResult?.TemplateErrors ?? 0, Synchronized = statResult?.TemplateSynchronized ?? 0 }
|
||||
// };
|
||||
//}
|
||||
|
||||
|
||||
private void BindStatistics(ApplicationInWorkResponse applicationsInWork, AppInWorkStatModel statistics)
|
||||
|
||||
@@ -71,11 +71,11 @@ namespace PARR.API.Controllers.V1
|
||||
case RobotsEnum.TemplateOrder:
|
||||
// шаблоны
|
||||
query = query.Include(t => t.Template)
|
||||
.ThenInclude(t => t!.Host).ThenInclude(t => t!.ResponseArea)
|
||||
.ThenInclude(t => t!.Hosts).ThenInclude(t => t.WorkGroup).ThenInclude(t => t!.ResponseArea)
|
||||
.ThenInclude(t => t!.Unit)
|
||||
//.ThenInclude(t => t!.Hosts).ThenInclude(t => t.WorkGroup).ThenInclude(t => t!.ResponseArea)
|
||||
.Include(t => t.Template)
|
||||
.ThenInclude(a => a!.ApplicationsInWork)
|
||||
.ThenInclude(w => w!.Work)
|
||||
.ThenInclude(a => a!.Job)
|
||||
//.ThenInclude(w => w!.Work)
|
||||
.ThenInclude(t => t!.Tnk)
|
||||
.ThenInclude(s => s!.Subprocess)
|
||||
.ThenInclude(p => p!.Process);
|
||||
@@ -84,10 +84,12 @@ namespace PARR.API.Controllers.V1
|
||||
//расписание
|
||||
// тут не делаем AsSplitQuery, не может подтянуть все таблицы
|
||||
query = query.Include(t => t.Template)
|
||||
.ThenInclude(t => t!.Host).ThenInclude(t => t!.ResponseArea)
|
||||
.ThenInclude(t => t!.Hosts).ThenInclude(t => t.WorkGroup)
|
||||
.ThenInclude(t => t!.Unit)//.ThenInclude(t => t!.ResponseArea)
|
||||
//.ThenInclude(t => t!.Hosts).ThenInclude(t => t.WorkGroup)
|
||||
.Include(t => t.Template)
|
||||
.ThenInclude(t => t!.ApplicationsInWork)
|
||||
.ThenInclude(t => t!.Job)
|
||||
.ThenInclude(t => t!.Group)
|
||||
//.ThenInclude(t => t!.ApplicationsInWork)
|
||||
.ThenInclude(t => t!.EsppSchValues)
|
||||
.ThenInclude(t => t!.EsppSchTypeConfig)
|
||||
.ThenInclude(t => t!.EsppSchTypeSchedule);
|
||||
@@ -169,7 +171,7 @@ namespace PARR.API.Controllers.V1
|
||||
// передаем LastRun, если его нет, то NextRun
|
||||
//var nextRun = await esppScheduleTransformService.GetNextDateAsync(task.Template!.ApplicationInWorkId, task.Template.ApplicationsInWork!.LastRun ?? task.Template.ApplicationsInWork.NextRun);
|
||||
// всегда считаем по nextRun
|
||||
var nextRun = await esppScheduleTransformService.GetNextDateAsync(template.ApplicationInWorkId, template.NextRun);
|
||||
var nextRun = await esppScheduleTransformService.GetNextDateAsync(template.Job!.GroupId, template.NextRun);
|
||||
|
||||
if (nextRun != template.NextRun)
|
||||
{
|
||||
|
||||
@@ -9,6 +9,7 @@ using PARR.API.Controllers.V1.Base;
|
||||
using PARR.BLL.Services.Interfaces;
|
||||
using PARR.Constants;
|
||||
using PARR.DAL.Services.Interfaces;
|
||||
using PARR.DAL.Services.Interfaces.Unit;
|
||||
|
||||
namespace PARR.API.Controllers.V1.Statistics
|
||||
{
|
||||
@@ -19,11 +20,17 @@ namespace PARR.API.Controllers.V1.Statistics
|
||||
public class StatHostController : BaseApiController
|
||||
{
|
||||
private readonly IHostService hostService;
|
||||
private readonly IUnitService unitService;
|
||||
private readonly ICalendarService calendarService;
|
||||
|
||||
public StatHostController(IHostService hostService, ICalendarService calendarService)
|
||||
public StatHostController(
|
||||
IHostService hostService,
|
||||
IUnitService unitService,
|
||||
ICalendarService calendarService
|
||||
)
|
||||
{
|
||||
this.hostService = hostService;
|
||||
this.unitService = unitService;
|
||||
this.calendarService = calendarService;
|
||||
}
|
||||
|
||||
@@ -103,8 +110,8 @@ namespace PARR.API.Controllers.V1.Statistics
|
||||
|
||||
var response = new StatHostTemplateResponse
|
||||
{
|
||||
AllHosts = await hostService.Get().CountAsync(),
|
||||
HostsInTemplates = await hostService.Get().Include(t => t.Templates).CountAsync(t => t.Templates.Any())
|
||||
AllUnits = await unitService.Get().CountAsync(),
|
||||
HostsInTemplates = await unitService.Get().Include(t => t.Templates).CountAsync(t => t.Templates.Any())
|
||||
};
|
||||
|
||||
return Ok(new Response<StatHostTemplateResponse>(response, true));
|
||||
|
||||
@@ -40,88 +40,88 @@ namespace PARR.API.Controllers.V1.Statistics
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Статистика загрузки РР по всем ЗО
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet(ApiRoutes.StatResponseAreaWorkLoad.GetAll)]
|
||||
public async Task<IActionResult> GetAll([FromQuery] WorkloadBaseQuery requestQuery)
|
||||
{
|
||||
var response = await GetStatisticsAsync(requestQuery);
|
||||
///// <summary>
|
||||
///// Статистика загрузки РР по всем ЗО
|
||||
///// </summary>
|
||||
///// <returns></returns>
|
||||
//[HttpGet(ApiRoutes.StatResponseAreaWorkLoad.GetAll)]
|
||||
//public async Task<IActionResult> GetAll([FromQuery] WorkloadBaseQuery requestQuery)
|
||||
//{
|
||||
// var response = await GetStatisticsAsync(requestQuery);
|
||||
|
||||
return Ok(new Response<List<StatResponseAreaWorkLoadResponse>>(response, true));
|
||||
}
|
||||
// return Ok(new Response<List<StatResponseAreaWorkLoadResponse>>(response, true));
|
||||
//}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Статистика загрузки РР по списку ЗО
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost(ApiRoutes.StatResponseAreaWorkLoad.GetByResponseAreas)]
|
||||
public async Task<IActionResult> GetByResponseAreas([FromBody] StatResponseAreaWorkloadRequest request)
|
||||
{
|
||||
var response = await GetStatisticsAsync(request.Filter, request.ResponseAreas);
|
||||
///// <summary>
|
||||
///// Статистика загрузки РР по списку ЗО
|
||||
///// </summary>
|
||||
///// <returns></returns>
|
||||
//[HttpPost(ApiRoutes.StatResponseAreaWorkLoad.GetByResponseAreas)]
|
||||
//public async Task<IActionResult> GetByResponseAreas([FromBody] StatResponseAreaWorkloadRequest request)
|
||||
//{
|
||||
// var response = await GetStatisticsAsync(request.Filter, request.ResponseAreas);
|
||||
|
||||
return Ok(new Response<List<StatResponseAreaWorkLoadResponse>>(response, true));
|
||||
}
|
||||
// return Ok(new Response<List<StatResponseAreaWorkLoadResponse>>(response, true));
|
||||
//}
|
||||
|
||||
|
||||
private async Task<List<StatResponseAreaWorkLoadResponse>> GetStatisticsAsync(WorkloadBaseQuery requestQuery, List<int>? responseAreas = null)
|
||||
{
|
||||
var daysList = workLoadService.GetDatesForPeriod(requestQuery);
|
||||
//private async Task<List<StatResponseAreaWorkLoadResponse>> GetStatisticsAsync(WorkloadBaseQuery requestQuery, List<int>? responseAreas = null)
|
||||
//{
|
||||
// var daysList = workLoadService.GetDatesForPeriod(requestQuery);
|
||||
|
||||
IQueryable<DAL.Models.Template> query = templateService.Get()
|
||||
.Include(t => t.Host).ThenInclude(t => t.WorkGroup);
|
||||
// IQueryable<DAL.Models.Template> query = templateService.Get()
|
||||
// .Include(t => t.Host).ThenInclude(t => t.WorkGroup);
|
||||
|
||||
query = workLoadService.FilterTemplatesQuery(query, requestQuery);
|
||||
// query = workLoadService.FilterTemplatesQuery(query, requestQuery);
|
||||
|
||||
if (responseAreas != null && responseAreas.Count() > 0)
|
||||
query = query.Where(t => responseAreas.Any(x => x == t.Host.WorkGroup.ResponseAreaCode));
|
||||
// if (responseAreas != null && responseAreas.Count() > 0)
|
||||
// query = query.Where(t => responseAreas.Any(x => x == t.Host.WorkGroup.ResponseAreaCode));
|
||||
|
||||
//var groupedQuery = query.GroupBy(t => new { t.NextRun.DateTime.Date, t.Host!.WorkGroup!.ResponseAreaCode })
|
||||
var groupedQuery = query.GroupBy(t => new { t.NextRun.AddHours(requestQuery.TimeZoneOffsetHours).DateTime.Date, t.Host!.WorkGroup!.ResponseAreaCode })
|
||||
.Select(t => new
|
||||
{
|
||||
ResponseAreaCode = t.Key.ResponseAreaCode,
|
||||
Date = t.Key.Date,
|
||||
TemplateCount = t.Count()
|
||||
// //var groupedQuery = query.GroupBy(t => new { t.NextRun.DateTime.Date, t.Host!.WorkGroup!.ResponseAreaCode })
|
||||
// var groupedQuery = query.GroupBy(t => new { t.NextRun.AddHours(requestQuery.TimeZoneOffsetHours).DateTime.Date, t.Host!.WorkGroup!.ResponseAreaCode })
|
||||
// .Select(t => new
|
||||
// {
|
||||
// ResponseAreaCode = t.Key.ResponseAreaCode,
|
||||
// Date = t.Key.Date,
|
||||
// TemplateCount = t.Count()
|
||||
|
||||
});
|
||||
// });
|
||||
|
||||
var queryResult = await groupedQuery.ToListAsync();
|
||||
// var queryResult = await groupedQuery.ToListAsync();
|
||||
|
||||
var responseAreaQuery = responseAreaService.Get();
|
||||
// var responseAreaQuery = responseAreaService.Get();
|
||||
|
||||
if (responseAreas != null && responseAreas.Count() > 0)
|
||||
responseAreaQuery = responseAreaQuery.Where(t => responseAreas.Any(x => x == t.Code));
|
||||
// if (responseAreas != null && responseAreas.Count() > 0)
|
||||
// responseAreaQuery = responseAreaQuery.Where(t => responseAreas.Any(x => x == t.Code));
|
||||
|
||||
var allResponseArea = await responseAreaQuery.ToListAsync();
|
||||
// var allResponseArea = await responseAreaQuery.ToListAsync();
|
||||
|
||||
//if (!allResponseArea.Any())
|
||||
// return NoContent();
|
||||
// //if (!allResponseArea.Any())
|
||||
// // return NoContent();
|
||||
|
||||
var response = new List<StatResponseAreaWorkLoadResponse>();
|
||||
// var response = new List<StatResponseAreaWorkLoadResponse>();
|
||||
|
||||
allResponseArea.ForEach(respArea =>
|
||||
{
|
||||
var workLoads = daysList.Select(t => new StatWorkLoadDataResponse
|
||||
{
|
||||
Date = t,
|
||||
TemplateCount = queryResult.FirstOrDefault(x => x.ResponseAreaCode == respArea.Code && DateOnly.FromDateTime(x.Date) == t)?.TemplateCount ?? 0
|
||||
}).OrderBy(t => t.Date).ToList();
|
||||
// allResponseArea.ForEach(respArea =>
|
||||
// {
|
||||
// var workLoads = daysList.Select(t => new StatWorkLoadDataResponse
|
||||
// {
|
||||
// Date = t,
|
||||
// TemplateCount = queryResult.FirstOrDefault(x => x.ResponseAreaCode == respArea.Code && DateOnly.FromDateTime(x.Date) == t)?.TemplateCount ?? 0
|
||||
// }).OrderBy(t => t.Date).ToList();
|
||||
|
||||
response.Add(
|
||||
new StatResponseAreaWorkLoadResponse
|
||||
{
|
||||
ResponseArea = mapper.Map<ResponseAreaResponse>(respArea),
|
||||
WorkLoad = workLoads
|
||||
});
|
||||
});
|
||||
// response.Add(
|
||||
// new StatResponseAreaWorkLoadResponse
|
||||
// {
|
||||
// ResponseArea = mapper.Map<ResponseAreaResponse>(respArea),
|
||||
// WorkLoad = workLoads
|
||||
// });
|
||||
// });
|
||||
|
||||
response = response.OrderBy(t => t.ResponseArea.Code).ToList();
|
||||
// response = response.OrderBy(t => t.ResponseArea.Code).ToList();
|
||||
|
||||
return response;
|
||||
}
|
||||
// return response;
|
||||
//}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,66 +32,66 @@ namespace PARR.API.Controllers.V1.Statistics
|
||||
this.calendarService = calendarService;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Статистика по шаблонам
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet(ApiRoutes.StatTemplate.Get)]
|
||||
public async Task<IActionResult> Get()
|
||||
{
|
||||
var response = new StatTemplateResponse
|
||||
{
|
||||
ActivateScheduleCount = await templateService.Get().CountAsync(t => t.IsActiveSchedule),
|
||||
ActivateTemplateCount = await templateService.Get().CountAsync(t => t.IsActiveTemplate),
|
||||
TemplateAgentCount = await templateService.Get().Include(t => t.ApplicationsInWork).CountAsync(t => t.ApplicationsInWork!.IsAgent),
|
||||
TemplateCount = await templateService.Get().CountAsync(),
|
||||
SyncEsppScheduleCount = await templateService.Get().Include(t => t.RobotConfigurations).CountAsync(t => t.RobotConfigurations.Any(c => c.RobotCode == (int)RobotsEnum.ScheduleOrder && c.TaskStatusCode == (int)TaskStatusEnum.Ok)),
|
||||
SyncEsppTemplatesCount = await templateService.Get().Include(t => t.RobotConfigurations).CountAsync(t => t.RobotConfigurations.Any(c => c.RobotCode == (int)RobotsEnum.TemplateOrder && c.TaskStatusCode == (int)TaskStatusEnum.Ok))
|
||||
};
|
||||
///// <summary>
|
||||
///// Статистика по шаблонам
|
||||
///// </summary>
|
||||
///// <returns></returns>
|
||||
//[HttpGet(ApiRoutes.StatTemplate.Get)]
|
||||
//public async Task<IActionResult> Get()
|
||||
//{
|
||||
// var response = new StatTemplateResponse
|
||||
// {
|
||||
// ActivateScheduleCount = await templateService.Get().CountAsync(t => t.IsActiveSchedule),
|
||||
// ActivateTemplateCount = await templateService.Get().CountAsync(t => t.IsActiveTemplate),
|
||||
// TemplateAgentCount = await templateService.Get().Include(t => t.ApplicationsInWork).CountAsync(t => t.ApplicationsInWork!.IsAgent),
|
||||
// TemplateCount = await templateService.Get().CountAsync(),
|
||||
// SyncEsppScheduleCount = await templateService.Get().Include(t => t.RobotConfigurations).CountAsync(t => t.RobotConfigurations.Any(c => c.RobotCode == (int)RobotsEnum.ScheduleOrder && c.TaskStatusCode == (int)TaskStatusEnum.Ok)),
|
||||
// SyncEsppTemplatesCount = await templateService.Get().Include(t => t.RobotConfigurations).CountAsync(t => t.RobotConfigurations.Any(c => c.RobotCode == (int)RobotsEnum.TemplateOrder && c.TaskStatusCode == (int)TaskStatusEnum.Ok))
|
||||
// };
|
||||
|
||||
return Ok(new Response<StatTemplateResponse>(response, true));
|
||||
}
|
||||
// return Ok(new Response<StatTemplateResponse>(response, true));
|
||||
//}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Получить статистику созданных шаблонов (расписаний) в БД ПАРР
|
||||
/// </summary>
|
||||
/// <param name="timeZoneQuery"></param>
|
||||
/// <param name="startPeriodDays"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet(ApiRoutes.StatTemplate.GetForPeriod)]
|
||||
public async Task<IActionResult> GetForPeriod([FromQuery] TimeZoneOffsetClient timeZoneQuery, [FromQuery] int startPeriodDays = 3)
|
||||
{
|
||||
var endPeriod = calendarService.GetDateWithTimeZoneOffset(DateTimeOffset.UtcNow, timeZoneQuery.TimeZoneOffsetHours);
|
||||
var startPeriod = endPeriod.AddDays(-startPeriodDays);
|
||||
///// <summary>
|
||||
///// Получить статистику созданных шаблонов (расписаний) в БД ПАРР
|
||||
///// </summary>
|
||||
///// <param name="timeZoneQuery"></param>
|
||||
///// <param name="startPeriodDays"></param>
|
||||
///// <returns></returns>
|
||||
//[HttpGet(ApiRoutes.StatTemplate.GetForPeriod)]
|
||||
//public async Task<IActionResult> GetForPeriod([FromQuery] TimeZoneOffsetClient timeZoneQuery, [FromQuery] int startPeriodDays = 3)
|
||||
//{
|
||||
// var endPeriod = calendarService.GetDateWithTimeZoneOffset(DateTimeOffset.UtcNow, timeZoneQuery.TimeZoneOffsetHours);
|
||||
// var startPeriod = endPeriod.AddDays(-startPeriodDays);
|
||||
|
||||
var query = templateService.Get()
|
||||
.Where(t =>
|
||||
t.DateCreated.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date >= startPeriod.Date
|
||||
&& t.DateCreated.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date <= endPeriod.Date
|
||||
).GroupBy(t => t.DateCreated.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date)
|
||||
.Select(t => new
|
||||
{
|
||||
Date = t.Key,
|
||||
CreatedObjs = t.Count()
|
||||
});
|
||||
// var query = templateService.Get()
|
||||
// .Where(t =>
|
||||
// t.DateCreated.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date >= startPeriod.Date
|
||||
// && t.DateCreated.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date <= endPeriod.Date
|
||||
// ).GroupBy(t => t.DateCreated.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date)
|
||||
// .Select(t => new
|
||||
// {
|
||||
// Date = t.Key,
|
||||
// CreatedObjs = t.Count()
|
||||
// });
|
||||
|
||||
var result = await query.ToListAsync();
|
||||
// var result = await query.ToListAsync();
|
||||
|
||||
var daysList = calendarService.GetDatesForPeriod(startPeriod, endPeriod);
|
||||
// var daysList = calendarService.GetDatesForPeriod(startPeriod, endPeriod);
|
||||
|
||||
var response = new List<StatTemplatePeriodResponse>();
|
||||
// var response = new List<StatTemplatePeriodResponse>();
|
||||
|
||||
daysList.ForEach(date => response.Add(new StatTemplatePeriodResponse
|
||||
{
|
||||
Date = date,
|
||||
CreatedTemplatesCount = result.FirstOrDefault(t => DateOnly.FromDateTime(t.Date) == date)?.CreatedObjs ?? 0
|
||||
}));
|
||||
// daysList.ForEach(date => response.Add(new StatTemplatePeriodResponse
|
||||
// {
|
||||
// Date = date,
|
||||
// CreatedTemplatesCount = result.FirstOrDefault(t => DateOnly.FromDateTime(t.Date) == date)?.CreatedObjs ?? 0
|
||||
// }));
|
||||
|
||||
response = response.OrderBy(t => t.Date).ToList();
|
||||
// response = response.OrderBy(t => t.Date).ToList();
|
||||
|
||||
return Ok(new Response<List<StatTemplatePeriodResponse>>(response, true));
|
||||
}
|
||||
// return Ok(new Response<List<StatTemplatePeriodResponse>>(response, true));
|
||||
//}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -37,20 +37,20 @@ namespace PARR.API.Controllers.V1.Statistics
|
||||
/// <summary>
|
||||
/// Статистика распределения шаблонов по JobId (ApplicationInWorkId)
|
||||
/// </summary>
|
||||
/// <param name="applicationInWorkId"></param>
|
||||
/// <param name="JobId"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet(ApiRoutes.StatTemplateDistribution.Get)]
|
||||
public async Task<IActionResult> Get([FromRoute] Guid applicationInWorkId)
|
||||
public async Task<IActionResult> Get([FromRoute] Guid jobId)
|
||||
{
|
||||
// f87dbe9f-cabf-4108-9c93-12068d4b48a5
|
||||
|
||||
var query = templateService.Get()
|
||||
.Include(t => t.Host)
|
||||
.Where(t => t.ApplicationInWorkId == applicationInWorkId)
|
||||
.GroupBy(t => t.Host!.WorkGroupId)
|
||||
.Include(t => t.Unit)
|
||||
.Where(t => t.JobId == jobId)
|
||||
.GroupBy(t => t.Unit!.BaseFields!.WorkGroup)
|
||||
.Select(x => new
|
||||
{
|
||||
WorkGroupId = x.Key,
|
||||
WorkGroup = x.Key,
|
||||
CountTemplates = x.Count(),
|
||||
IsActivatedAllCount = x.Count(t => t.IsActiveTemplate && t.IsActiveSchedule),
|
||||
IsDeactivatedAllCount = x.Count(t => !t.IsActiveTemplate || !t.IsActiveSchedule || (!t.IsActiveTemplate && !t.IsActiveSchedule)),
|
||||
@@ -73,13 +73,13 @@ namespace PARR.API.Controllers.V1.Statistics
|
||||
|
||||
var workGroups = await workGroupService.Get()
|
||||
.Include(t => t.ResponseArea)
|
||||
.Where(t => statResult.Select(x => x.WorkGroupId).Any(w => w == t.Id))
|
||||
.Where(t => statResult.Select(x => x.WorkGroup).Any(w => w == t.Name))
|
||||
.ToListAsync();
|
||||
|
||||
|
||||
var response = statResult.Select(stat => new StatTemplateDistributorResponse
|
||||
{
|
||||
WorkGroup = mapper.Map<WorkGroupResponse>(workGroups.FirstOrDefault(x => x.Id == stat.WorkGroupId)),
|
||||
WorkGroup = mapper.Map<WorkGroupResponse>(workGroups.FirstOrDefault(x => x.Name == stat.WorkGroup)),//TODO Migration to job
|
||||
AllCount = stat.CountTemplates,
|
||||
IsActivatedAllCount = stat.IsActivatedAllCount,
|
||||
IsDeactivatedAllCount = stat.IsDeactivatedAllCount,
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace PARR.API.Controllers.V1.Statistics
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
/// <summary>
|
||||
/// Статистика загрузки регламентными работами рабочих групп по ЗО
|
||||
/// </summary>
|
||||
@@ -54,7 +54,7 @@ namespace PARR.API.Controllers.V1.Statistics
|
||||
return Ok(new Response<List<StatWorkGroupWorkLoadResponse>>(response, true));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Статистика загрузки РГ по списку РГ
|
||||
/// </summary>
|
||||
@@ -137,6 +137,6 @@ namespace PARR.API.Controllers.V1.Statistics
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,132 +40,132 @@ namespace PARR.API.Controllers.V1.Statistics
|
||||
this.workGroupService = workGroupService;
|
||||
}
|
||||
|
||||
|
||||
///// <summary>
|
||||
///// Статистика загрузки регламентными работами по Видам работ(ApplicationInWorks)
|
||||
///// </summary>
|
||||
///// <param name="workGroupId"></param>
|
||||
///// <param name="requestQuery"></param>
|
||||
///// <returns></returns>
|
||||
//[HttpGet(ApiRoutes.StatWorkWorkLoad.Get)]
|
||||
//public async Task<IActionResult> Get([FromRoute] Guid workGroupId, [FromQuery] WorkloadBaseQuery requestQuery)
|
||||
//{
|
||||
// var response = await GetStatisticsAsync(workGroupId, requestQuery);
|
||||
|
||||
/// <summary>
|
||||
/// Статистика загрузки регламентными работами по Видам работ(ApplicationInWorks)
|
||||
/// </summary>
|
||||
/// <param name="workGroupId"></param>
|
||||
/// <param name="requestQuery"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet(ApiRoutes.StatWorkWorkLoad.Get)]
|
||||
public async Task<IActionResult> Get([FromRoute] Guid workGroupId, [FromQuery] WorkloadBaseQuery requestQuery)
|
||||
{
|
||||
var response = await GetStatisticsAsync(workGroupId, requestQuery);
|
||||
|
||||
return Ok(new Response<List<StatWorkWorkLoadResponse>>(response, true));
|
||||
}
|
||||
// return Ok(new Response<List<StatWorkWorkLoadResponse>>(response, true));
|
||||
//}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Статистика загрузки РР по списку РР
|
||||
/// </summary>
|
||||
/// <param name="requestBody"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost(ApiRoutes.StatWorkWorkLoad.GetByApplicationInWork)]
|
||||
public async Task<IActionResult> GetByApplicationInWork([FromBody] StatWorkWorkLoadRequest requestBody)
|
||||
{
|
||||
var response = await GetStatisticsAsync(null, requestBody.Filter, requestBody.JobsRequests);
|
||||
///// <summary>
|
||||
///// Статистика загрузки РР по списку РР
|
||||
///// </summary>
|
||||
///// <param name="requestBody"></param>
|
||||
///// <returns></returns>
|
||||
//[HttpPost(ApiRoutes.StatWorkWorkLoad.GetByApplicationInWork)]
|
||||
//public async Task<IActionResult> GetByApplicationInWork([FromBody] StatWorkWorkLoadRequest requestBody)
|
||||
//{
|
||||
// var response = await GetStatisticsAsync(null, requestBody.Filter, requestBody.JobsRequests);
|
||||
|
||||
return Ok(new Response<List<StatWorkWorkLoadResponse>>(response, true));
|
||||
}
|
||||
// return Ok(new Response<List<StatWorkWorkLoadResponse>>(response, true));
|
||||
//}
|
||||
|
||||
|
||||
private async Task<List<StatWorkWorkLoadResponse>> GetStatisticsAsync(Guid? workGroupId, WorkloadBaseQuery requestQuery, List<StatWorkWorkLoadJobRequest>? jobsRequests = null)
|
||||
{
|
||||
//защита от дурака, чтоб не выгрузить всю БД
|
||||
if (workGroupId == null && (jobsRequests == null || jobsRequests.Count() == 0))
|
||||
{
|
||||
logger.LogWarning($"Пытались выполнить запрос получения статситики с нулевыми параметрами {nameof(workGroupId)}, {nameof(jobsRequests)}. Controller {nameof(StatWorkWorkLoadController)}");
|
||||
return new List<StatWorkWorkLoadResponse>();
|
||||
}
|
||||
//private async Task<List<StatWorkWorkLoadResponse>> GetStatisticsAsync(Guid? workGroupId, WorkloadBaseQuery requestQuery, List<StatWorkWorkLoadJobRequest>? jobsRequests = null)
|
||||
//{
|
||||
// //защита от дурака, чтоб не выгрузить всю БД
|
||||
// if (workGroupId == null && (jobsRequests == null || jobsRequests.Count() == 0))
|
||||
// {
|
||||
// logger.LogWarning($"Пытались выполнить запрос получения статситики с нулевыми параметрами {nameof(workGroupId)}, {nameof(jobsRequests)}. Controller {nameof(StatWorkWorkLoadController)}");
|
||||
// return new List<StatWorkWorkLoadResponse>();
|
||||
// }
|
||||
|
||||
|
||||
var daysList = workLoadService.GetDatesForPeriod(requestQuery);
|
||||
// var daysList = workLoadService.GetDatesForPeriod(requestQuery);
|
||||
|
||||
IQueryable<DAL.Models.Template> query = templateService.Get()
|
||||
.Include(t => t.Host);
|
||||
// IQueryable<DAL.Models.Template> query = templateService.Get()
|
||||
// .Include(t => t.Host);
|
||||
|
||||
query = workLoadService.FilterTemplatesQuery(query, requestQuery);
|
||||
// query = workLoadService.FilterTemplatesQuery(query, requestQuery);
|
||||
|
||||
if (workGroupId.HasValue)
|
||||
query = query.Where(t => t.Host!.WorkGroupId == workGroupId.Value);
|
||||
// if (workGroupId.HasValue)
|
||||
// query = query.Where(t => t.Host!.WorkGroupId == workGroupId.Value);
|
||||
|
||||
if (jobsRequests != null && jobsRequests.Count() > 0)
|
||||
//query = query.Where(t => jobsRequests.Any(x => x.JobId == t.ApplicationInWorkId && x.WorkGroupId == t.Host!.WorkGroupId.Value)); /*&& x.WorkGroupId == t.Host!.WorkGroupId.Value*/
|
||||
query = query.Where(t => jobsRequests.Select(t => t.JobId).Any(x => x == t.ApplicationInWorkId) && jobsRequests.Select(t => t.WorkGroupId).Any(x => x == t.Host!.WorkGroupId.Value));
|
||||
// if (jobsRequests != null && jobsRequests.Count() > 0)
|
||||
// //query = query.Where(t => jobsRequests.Any(x => x.JobId == t.ApplicationInWorkId && x.WorkGroupId == t.Host!.WorkGroupId.Value)); /*&& x.WorkGroupId == t.Host!.WorkGroupId.Value*/
|
||||
// query = query.Where(t => jobsRequests.Select(t => t.JobId).Any(x => x == t.ApplicationInWorkId) && jobsRequests.Select(t => t.WorkGroupId).Any(x => x == t.Host!.WorkGroupId.Value));
|
||||
|
||||
//var groupedQuery = query.GroupBy(t => new { t.NextRun.DateTime.Date, t.ApplicationInWorkId, t.Host.WorkGroupId })
|
||||
var groupedQuery = query.GroupBy(t => new { t.NextRun.AddHours(requestQuery.TimeZoneOffsetHours).DateTime.Date, t.ApplicationInWorkId, t.Host.WorkGroupId })
|
||||
.Select(t => new
|
||||
{
|
||||
ApplicationInWorkId = t.Key.ApplicationInWorkId,
|
||||
WorkGroupId = t.Key.WorkGroupId,
|
||||
Date = t.Key.Date,
|
||||
TemplateCount = t.Count()
|
||||
});
|
||||
// //var groupedQuery = query.GroupBy(t => new { t.NextRun.DateTime.Date, t.ApplicationInWorkId, t.Host.WorkGroupId })
|
||||
// var groupedQuery = query.GroupBy(t => new { t.NextRun.AddHours(requestQuery.TimeZoneOffsetHours).DateTime.Date, t.ApplicationInWorkId, t.Host.WorkGroupId })
|
||||
// .Select(t => new
|
||||
// {
|
||||
// ApplicationInWorkId = t.Key.ApplicationInWorkId,
|
||||
// WorkGroupId = t.Key.WorkGroupId,
|
||||
// Date = t.Key.Date,
|
||||
// TemplateCount = t.Count()
|
||||
// });
|
||||
|
||||
var queryResult = await groupedQuery.ToListAsync();
|
||||
// var queryResult = await groupedQuery.ToListAsync();
|
||||
|
||||
|
||||
// получаем только работы по которым есть шаблоны (активированные/деакт) и за любой период
|
||||
IQueryable<DAL.Models.Template> appInWorksQuery = templateService.Get()
|
||||
.Include(t => t.Host)
|
||||
.Include(t => t.ApplicationsInWork).ThenInclude(t => t.Application).ThenInclude(t => t.ApplicationType);
|
||||
// // получаем только работы по которым есть шаблоны (активированные/деакт) и за любой период
|
||||
// IQueryable<DAL.Models.Template> appInWorksQuery = templateService.Get()
|
||||
// .Include(t => t.Host)
|
||||
// .Include(t => t.ApplicationsInWork).ThenInclude(t => t.Application).ThenInclude(t => t.ApplicationType);
|
||||
|
||||
IQueryable<WorkGroup> workGroupsQuery = workGroupService.Get()
|
||||
.Include(t => t.ResponseArea);
|
||||
// IQueryable<WorkGroup> workGroupsQuery = workGroupService.Get()
|
||||
// .Include(t => t.ResponseArea);
|
||||
|
||||
|
||||
if (workGroupId.HasValue)
|
||||
{
|
||||
appInWorksQuery = appInWorksQuery.Where(t => t.Host.WorkGroupId == workGroupId);
|
||||
workGroupsQuery = workGroupsQuery.Where(t => t.Id == workGroupId.Value);
|
||||
}
|
||||
// if (workGroupId.HasValue)
|
||||
// {
|
||||
// appInWorksQuery = appInWorksQuery.Where(t => t.Host.WorkGroupId == workGroupId);
|
||||
// workGroupsQuery = workGroupsQuery.Where(t => t.Id == workGroupId.Value);
|
||||
// }
|
||||
|
||||
if (jobsRequests != null && jobsRequests.Count() > 0)
|
||||
{
|
||||
//appInWorksQuery = appInWorksQuery.Where(t => jobsRequests.Any(x => x.JobId == t.ApplicationInWorkId));
|
||||
appInWorksQuery = appInWorksQuery.Where(t => jobsRequests.Select(j => j.JobId).Any(x => x == t.ApplicationInWorkId));
|
||||
workGroupsQuery = workGroupsQuery.Where(t => jobsRequests.Select(w => w.WorkGroupId).Any(x => x == t.Id));
|
||||
}
|
||||
// if (jobsRequests != null && jobsRequests.Count() > 0)
|
||||
// {
|
||||
// //appInWorksQuery = appInWorksQuery.Where(t => jobsRequests.Any(x => x.JobId == t.ApplicationInWorkId));
|
||||
// appInWorksQuery = appInWorksQuery.Where(t => jobsRequests.Select(j => j.JobId).Any(x => x == t.ApplicationInWorkId));
|
||||
// workGroupsQuery = workGroupsQuery.Where(t => jobsRequests.Select(w => w.WorkGroupId).Any(x => x == t.Id));
|
||||
// }
|
||||
|
||||
|
||||
var appInWorks = await appInWorksQuery.Select(t => t.ApplicationsInWork)
|
||||
.Distinct()
|
||||
.ToListAsync();
|
||||
// var appInWorks = await appInWorksQuery.Select(t => t.ApplicationsInWork)
|
||||
// .Distinct()
|
||||
// .ToListAsync();
|
||||
|
||||
var workGroups = await workGroupsQuery.Distinct().ToListAsync();
|
||||
// var workGroups = await workGroupsQuery.Distinct().ToListAsync();
|
||||
|
||||
|
||||
var response = new List<StatWorkWorkLoadResponse>();
|
||||
// var response = new List<StatWorkWorkLoadResponse>();
|
||||
|
||||
appInWorks.ForEach(appInWork =>
|
||||
{
|
||||
workGroups.ForEach(workGroup =>
|
||||
{
|
||||
var workLoads = daysList.Select(t => new StatWorkLoadDataResponse
|
||||
{
|
||||
Date = t,
|
||||
TemplateCount = queryResult.FirstOrDefault(x => x.ApplicationInWorkId == appInWork.Id && DateOnly.FromDateTime(x.Date) == t && x.WorkGroupId == workGroup.Id)?.TemplateCount ?? 0
|
||||
}).OrderBy(t => t.Date).ToList();
|
||||
// appInWorks.ForEach(appInWork =>
|
||||
// {
|
||||
// workGroups.ForEach(workGroup =>
|
||||
// {
|
||||
// var workLoads = daysList.Select(t => new StatWorkLoadDataResponse
|
||||
// {
|
||||
// Date = t,
|
||||
// TemplateCount = queryResult.FirstOrDefault(x => x.ApplicationInWorkId == appInWork.Id && DateOnly.FromDateTime(x.Date) == t && x.WorkGroupId == workGroup.Id)?.TemplateCount ?? 0
|
||||
// }).OrderBy(t => t.Date).ToList();
|
||||
|
||||
response.Add(new StatWorkWorkLoadResponse
|
||||
{
|
||||
Job = mapper.Map<ApplicationInWorkBaseResponse>(appInWork),
|
||||
WorkGroup = mapper.Map<WorkGroupResponse>(workGroup),
|
||||
WorkLoad = workLoads
|
||||
});
|
||||
});
|
||||
});
|
||||
// response.Add(new StatWorkWorkLoadResponse
|
||||
// {
|
||||
// Job = mapper.Map<ApplicationInWorkBaseResponse>(appInWork),
|
||||
// WorkGroup = mapper.Map<WorkGroupResponse>(workGroup),
|
||||
// WorkLoad = workLoads
|
||||
// });
|
||||
// });
|
||||
// });
|
||||
|
||||
// убираем не нужные значения так как запрос в SQL (query) был с несколькими Any
|
||||
if (jobsRequests != null && jobsRequests.Count() > 0)
|
||||
response = response.Where(t => jobsRequests.Any(x => x.WorkGroupId == t.WorkGroup.Id && x.JobId == t.Job.Id)).ToList();
|
||||
// // убираем не нужные значения так как запрос в SQL (query) был с несколькими Any
|
||||
// if (jobsRequests != null && jobsRequests.Count() > 0)
|
||||
// response = response.Where(t => jobsRequests.Any(x => x.WorkGroupId == t.WorkGroup.Id && x.JobId == t.Job.Id)).ToList();
|
||||
|
||||
response = response.OrderBy(t => t.Job.ShortDescription).ThenBy(t => t.Job.Application?.Name).ThenBy(t => t.WorkGroup.Name).ToList();
|
||||
// response = response.OrderBy(t => t.Job.ShortDescription).ThenBy(t => t.Job.Application?.Name).ThenBy(t => t.WorkGroup.Name).ToList();
|
||||
|
||||
return response;
|
||||
}
|
||||
// return response;
|
||||
//}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ namespace PARR.API.Controllers.V1
|
||||
query = query.Where(t => EF.Functions.Like(t.Name.ToLower(), SqlHelpers.RegexToLike(filter.Mask)));
|
||||
|
||||
if (filter.AppInWorkId.HasValue)
|
||||
query = query.Where(t => t.ApplicationInWorkId == filter.AppInWorkId.Value);
|
||||
query = query.Where(t => t.JobId == filter.AppInWorkId.Value);//TODO Migration to job
|
||||
|
||||
var templates = await templateService.GetPage(query, paginationFilter).ToListAsync();
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace PARR.API.Controllers.V1
|
||||
private readonly IUnitService unitService;
|
||||
private readonly IFieldFilterService fieldFilterService;
|
||||
private readonly IJobService jobService;
|
||||
private readonly IJobDetailsService jobDetailsService;
|
||||
private readonly IJobUnitFilterService jobUnitFilterService;
|
||||
|
||||
public TestController(
|
||||
IClientService clientService,
|
||||
@@ -33,7 +33,7 @@ namespace PARR.API.Controllers.V1
|
||||
IUnitService unitService,
|
||||
IFieldFilterService fieldFilterService,
|
||||
IJobService jobService,
|
||||
IJobDetailsService jobDetailsService
|
||||
IJobUnitFilterService jobUnitFilterService
|
||||
)
|
||||
{
|
||||
this.clientService = clientService;
|
||||
@@ -43,7 +43,7 @@ namespace PARR.API.Controllers.V1
|
||||
this.unitService = unitService;
|
||||
this.fieldFilterService = fieldFilterService;
|
||||
this.jobService = jobService;
|
||||
this.jobDetailsService = jobDetailsService;
|
||||
this.jobUnitFilterService = jobUnitFilterService;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user