2023-10-05 16:56:02 +10:00
|
|
|
|
using AutoMapper;
|
|
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
|
using PARR.API.Contracts.V1;
|
|
|
|
|
|
using PARR.API.Contracts.V1.Responses;
|
|
|
|
|
|
using PARR.API.Contracts.V1.Responses.Base;
|
|
|
|
|
|
using PARR.API.Controllers.V1.Base;
|
|
|
|
|
|
using PARR.DAL.Contracts;
|
|
|
|
|
|
using PARR.DAL.Models;
|
|
|
|
|
|
using PARR.DAL.Services.Interfaces;
|
2023-10-17 10:53:02 +10:00
|
|
|
|
using PARR.DAL.TransformServices;
|
2023-10-05 16:56:02 +10:00
|
|
|
|
|
|
|
|
|
|
namespace PARR.API.Controllers.V1
|
|
|
|
|
|
{
|
|
|
|
|
|
public class RobotTaskController : BaseApiController
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly IMapper mapper;
|
|
|
|
|
|
private readonly SettingsFromDb settingsFromDb;
|
|
|
|
|
|
private readonly IRobotConfigurationService robotConfigurationService;
|
2023-10-17 10:53:02 +10:00
|
|
|
|
private readonly IEsppScheduleTransformService esppScheduleTransformService;
|
2023-10-05 16:56:02 +10:00
|
|
|
|
|
|
|
|
|
|
public RobotTaskController(
|
|
|
|
|
|
IMapper mapper,
|
|
|
|
|
|
SettingsFromDb settingsFromDb,
|
2023-10-17 10:53:02 +10:00
|
|
|
|
IRobotConfigurationService robotConfigurationService,
|
|
|
|
|
|
IEsppScheduleTransformService esppScheduleTransformService
|
2023-10-05 16:56:02 +10:00
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.mapper = mapper;
|
|
|
|
|
|
this.settingsFromDb = settingsFromDb;
|
|
|
|
|
|
this.robotConfigurationService = robotConfigurationService;
|
2023-10-17 10:53:02 +10:00
|
|
|
|
this.esppScheduleTransformService = esppScheduleTransformService;
|
2023-10-05 16:56:02 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Получить задание для робота по коду робота и по статусу задания
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="robotCode"></param>
|
|
|
|
|
|
/// <param name="taskStatusCode"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[HttpGet(ApiRoutes.RobotTask.GetByRobotAndStatusTask)]
|
|
|
|
|
|
public async Task<IActionResult> GetByRobotAndStatusTask([FromRoute] RobotsEnum robotCode, [FromRoute] TaskStatusEnum taskStatusCode)
|
|
|
|
|
|
{
|
|
|
|
|
|
//Ищем все задания с превышенным кол-вом попыток и с просроченным временем и ставим им статус ошибки
|
|
|
|
|
|
await robotConfigurationService.FindUnfulfilledTaskAndSetRobotErrorStatusAsync(settingsFromDb.RobotAttemptsNumber, settingsFromDb.RobotWaitTime);
|
|
|
|
|
|
|
2023-10-11 15:28:37 +10:00
|
|
|
|
|
2023-10-05 16:56:02 +10:00
|
|
|
|
var query = robotConfigurationService.Get()
|
2023-10-11 11:10:35 +10:00
|
|
|
|
.Where(t => t.RobotCode == (int)robotCode && t.TaskStatusCode == (int)taskStatusCode);
|
2023-10-05 16:56:02 +10:00
|
|
|
|
|
2023-10-11 15:28:37 +10:00
|
|
|
|
//var query = robotConfigurationService.Get();
|
|
|
|
|
|
|
2023-10-05 16:56:02 +10:00
|
|
|
|
switch (robotCode)
|
|
|
|
|
|
{
|
|
|
|
|
|
case RobotsEnum.TemplateOrder:
|
2023-10-11 15:28:37 +10:00
|
|
|
|
// шаблоны
|
2023-10-05 16:56:02 +10:00
|
|
|
|
query = query.Include(t => t.Template)
|
|
|
|
|
|
.ThenInclude(t => t!.Host).ThenInclude(t => t!.ResponseArea)
|
|
|
|
|
|
.Include(t => t.Template)
|
|
|
|
|
|
.ThenInclude(a => a!.ApplicationsInWork)
|
|
|
|
|
|
.ThenInclude(w => w!.Work)
|
|
|
|
|
|
.ThenInclude(t => t!.Tnk)
|
|
|
|
|
|
.ThenInclude(s => s!.Subprocess)
|
2023-10-11 11:10:35 +10:00
|
|
|
|
.ThenInclude(p => p!.Process)
|
|
|
|
|
|
.AsSplitQuery();
|
2023-10-05 16:56:02 +10:00
|
|
|
|
break;
|
|
|
|
|
|
case RobotsEnum.ScheduleOrder:
|
2023-10-11 15:28:37 +10:00
|
|
|
|
//расписание
|
2023-10-11 11:10:35 +10:00
|
|
|
|
// тут не делаем AsSplitQuery, не может подтянуть все таблицы
|
2023-10-10 16:58:05 +10:00
|
|
|
|
query = query.Include(t => t.Template)
|
2023-10-11 11:10:35 +10:00
|
|
|
|
.ThenInclude(t => t!.Host).ThenInclude(t => t!.ResponseArea)
|
|
|
|
|
|
.Include(t => t.Template)
|
|
|
|
|
|
.ThenInclude(t => t!.ApplicationsInWork)
|
|
|
|
|
|
.ThenInclude(t => t!.EsppSchValues)
|
|
|
|
|
|
.ThenInclude(t => t!.EsppSchTypeConfig)
|
2023-10-11 15:28:37 +10:00
|
|
|
|
.ThenInclude(t => t!.EsppSchTypeSchedule);
|
|
|
|
|
|
|
|
|
|
|
|
//выбираем только записи с созданными шаблонами (у которых статус 30), а только потом у них ищем расписания
|
|
|
|
|
|
// сначала находим шаблоны со статусом 30
|
|
|
|
|
|
var createdTemplates = robotConfigurationService.Get()
|
|
|
|
|
|
.Where(t => t.RobotCode == (int)RobotsEnum.TemplateOrder && t.TaskStatusCode == (int)TaskStatusEnum.Ok)
|
|
|
|
|
|
.Select(t => t.TemplateId);
|
|
|
|
|
|
//находим задания с расписанием по списку шаблонов createdTemplates
|
|
|
|
|
|
query = query.Where(t => t.RobotCode == (int)RobotsEnum.ScheduleOrder && createdTemplates.Contains(t.TemplateId));
|
2023-10-05 16:56:02 +10:00
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
RobotConfiguration? task = null;
|
|
|
|
|
|
|
2023-10-11 15:28:37 +10:00
|
|
|
|
//ищем задание в ожидании, если нашли, выбираем его
|
2023-10-05 16:56:02 +10:00
|
|
|
|
task = await query.FirstOrDefaultAsync(t => t.RobotStatusCode == (int)RobotStatusEnum.Wait);
|
|
|
|
|
|
|
|
|
|
|
|
if (task == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
//ищем задания в работе, которые можно перезапустить
|
2023-10-09 16:11:27 +10:00
|
|
|
|
//Поиск по `RobotStatusCode` = 22.
|
2023-10-05 16:56:02 +10:00
|
|
|
|
//Далее проверяется `LastStatusUpdated`, что время последнего смены статуса не превышает допустимого(берется из настроек, поле `RobotWaitTime`)
|
|
|
|
|
|
//и что текущая попытка не больше разрешенной(берется из настроек, поле `RobotAttemptsNumber`) - если это так, берется эта запись.
|
|
|
|
|
|
|
|
|
|
|
|
var endDate = DateTimeOffset.UtcNow.Add(-settingsFromDb.RobotWaitTime);
|
2023-10-11 11:10:35 +10:00
|
|
|
|
task = await query
|
|
|
|
|
|
.FirstOrDefaultAsync(t =>
|
2023-10-05 16:56:02 +10:00
|
|
|
|
t.RobotStatusCode == (int)RobotStatusEnum.InProgress
|
|
|
|
|
|
&& t.AttemptsNumber < settingsFromDb.RobotAttemptsNumber
|
2023-10-06 11:38:33 +10:00
|
|
|
|
&& t.LastRobotStatusUpdated < endDate
|
2023-10-05 16:56:02 +10:00
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (task == null)
|
|
|
|
|
|
return NotFound();
|
|
|
|
|
|
|
|
|
|
|
|
switch (robotCode)
|
|
|
|
|
|
{
|
|
|
|
|
|
case RobotsEnum.TemplateOrder:
|
|
|
|
|
|
//RobotTaskTemplateResponse
|
|
|
|
|
|
return Ok(new Response<RobotTaskTemplateResponse>(mapper.Map<RobotTaskTemplateResponse>(task), true));
|
|
|
|
|
|
case RobotsEnum.ScheduleOrder:
|
2023-10-17 10:53:02 +10:00
|
|
|
|
// если был запрос на расписание, проверяем у него nextRun, lastRun, обновляем их
|
|
|
|
|
|
await UpdateLastNextRunDate(task);
|
|
|
|
|
|
|
2023-10-05 16:56:02 +10:00
|
|
|
|
//RobotTaskScheduleResponse
|
|
|
|
|
|
return Ok(new Response<RobotTaskScheduleResponse>(mapper.Map<RobotTaskScheduleResponse>(task), true));
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return BadRequest();
|
|
|
|
|
|
}
|
2023-10-17 10:53:02 +10:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private async Task UpdateLastNextRunDate(RobotConfiguration task)
|
|
|
|
|
|
{
|
|
|
|
|
|
var appInWorks = task.Template!.ApplicationsInWork!;
|
|
|
|
|
|
|
|
|
|
|
|
// передаем LastRun, если его нет, то NextRun
|
|
|
|
|
|
var nextRun = await esppScheduleTransformService.GetNextDateAsync(task.Template!.ApplicationInWorkId, task.Template.ApplicationsInWork!.LastRun ?? task.Template.ApplicationsInWork.NextRun);
|
|
|
|
|
|
|
2023-10-17 16:59:53 +10:00
|
|
|
|
if (appInWorks.LastRun != null)
|
|
|
|
|
|
appInWorks.LastRun = appInWorks.NextRun;
|
|
|
|
|
|
|
2023-10-17 10:53:02 +10:00
|
|
|
|
appInWorks.NextRun = nextRun;
|
|
|
|
|
|
|
|
|
|
|
|
await robotConfigurationService.CommitAsync();
|
|
|
|
|
|
}
|
2023-10-05 16:56:02 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|