2026-04-14 16:27:27 +10:00
using PARR.Core.Common.Interfaces ;
2026-07-03 11:36:12 +10:00
using PARR.Core.Repositories.Interfaces.JobGroupRepositories ;
2026-07-28 16:34:04 +10:00
using PARR.Core.Repositories.Interfaces.JobRepositories ;
2026-06-04 14:14:10 +10:00
using PARR.Domain.Entities.Base.History ;
2026-07-28 16:34:04 +10:00
using PARR.Domain.Entities.JobEntities ;
2026-04-14 12:01:49 +10:00
using PARR.Domain.Enums ;
2023-10-19 15:59:57 +10:00
using PARR.EsppApi ;
2023-11-28 15:33:59 +10:00
using PARR.EsppApi.Constants ;
2023-10-20 09:24:27 +10:00
using PARR.EsppApi.Models.Query ;
2026-06-11 15:09:46 +10:00
using PARR.TemplateMatcher.Services.Implementations ;
using PARR.TemplateMatcher.Services.Interfaces ;
2025-12-25 12:07:53 +10:00
using PARR.Test.NextRun ;
2026-06-11 15:09:46 +10:00
using System.Diagnostics ;
2023-10-19 15:59:57 +10:00
namespace PARR.Test
{
public class Worker : BackgroundService
{
private readonly ILogger < Worker > _logger ;
private readonly IEsppApiService esppApiService ;
2023-11-30 09:11:07 +10:00
private readonly IIntervalService intervalService ;
2026-03-05 10:19:54 +10:00
//private readonly ICalendarService calendarService;
2024-07-01 11:32:19 +10:00
private readonly IServiceProvider serviceProvider ;
2023-10-19 15:59:57 +10:00
2024-02-28 15:40:24 +10:00
public Worker (
ILogger < Worker > logger ,
IEsppApiService esppApiService ,
2024-06-28 16:42:53 +10:00
IIntervalService intervalService ,
2026-03-05 10:19:54 +10:00
//ICalendarService calendarService,
2024-07-01 11:32:19 +10:00
IServiceProvider serviceProvider
2024-02-28 15:40:24 +10:00
)
2023-10-19 15:59:57 +10:00
{
_logger = logger ;
this . esppApiService = esppApiService ;
2023-11-30 09:11:07 +10:00
this . intervalService = intervalService ;
2026-03-05 10:19:54 +10:00
//this.calendarService = calendarService;
2024-07-01 11:32:19 +10:00
this . serviceProvider = serviceProvider ;
2023-10-19 15:59:57 +10:00
}
protected override async Task ExecuteAsync ( CancellationToken stoppingToken )
{
2026-01-28 14:40:40 +10:00
//var aaa = DateTimeOffset.UtcNow;
//var bbb = aaa.ToOffset(new TimeSpan(3, 0, 0));
2025-12-25 12:07:53 +10:00
2026-07-03 11:59:46 +10:00
await TemplateMatcherTest ( ) ;
2025-12-25 12:07:53 +10:00
2026-06-04 14:14:10 +10:00
//await NextRunTest();
2025-12-25 12:07:53 +10:00
2024-02-15 13:47:34 +10:00
#region test
2025-08-26 12:24:57 +10:00
//using (var scope = serviceProvider.CreateScope())
//{
// var templateService = scope.ServiceProvider.GetService<ITemplateService>();
// var shortcodesService = scope.ServiceProvider.GetService<IShortcodesService>();
// var robotConfigurationService = scope.ServiceProvider.GetService<IRobotConfigurationService>();
// var ts = await templateService.Get().Include(t => t.Job).Where(t => t.ScheduleEsppId != null && t.Name.Contains("ЭИТИ-ПТК-ПАРР") && !t.Name.Contains("!!!")).ToListAsync();
// if (!ts.Any())
// return;
2025-08-12 11:50:29 +10:00
2025-06-18 09:58:23 +10:00
2025-08-26 12:24:57 +10:00
// var jobIds = ts.Select(t => t.JobId).Distinct();
// foreach (var template in ts)
// {
// var isExistSameKeyValueTemplate = await templateService.Get().AsNoTracking().AnyAsync(t => t.JobId == template.JobId && t.UnitId == template.UnitId && t.Name != template.Name);
2024-02-15 13:47:34 +10:00
2025-08-26 12:24:57 +10:00
// var templateName = await shortcodesService.ApplyShortcodesAsync(template.Job.TemplateNameMask, template.UnitId, template.JobId);
2025-08-12 11:50:29 +10:00
2025-08-26 12:24:57 +10:00
// if (isExistSameKeyValueTemplate)
// {
// template.IsActiveTemplate = false;
// template.IsActiveSchedule = false;
// template.Name = string.Concat("!!!", templateName.ToUpper());
// template.DateModified = DateTimeOffset.UtcNow;
// if (!(await templateService.CommitAsync(template)))
// _logger.LogInformation($"Н е удалось сохнаить изменения {template.ToString()}");
// continue;
// }
2025-08-12 11:50:29 +10:00
2025-08-26 12:24:57 +10:00
// var oldName = template.Name;
// var rt = await robotConfigurationService.Get().FirstOrDefaultAsync(t => t.TemplateId == template.Id);
// if (rt != null)
// {
// template.IsActiveTemplate = true;
// template.IsActiveSchedule = false;
// template.Name = templateName.ToUpper();
// template.DateModified = DateTimeOffset.UtcNow;
// robotConfigurationService.ChangeTaskStatus(DAL.Contracts.TaskStatusEnum.Updating, ref rt);
// //_logger.LogInformation(templateName);
// }
// if (!(await templateService.CommitAsync(template)))
// _logger.LogInformation($"Н е удалось сохранить изменения {template.ToString()}");
// }
// _logger.LogInformation($"Опа опа опа...");
//}
2024-02-15 13:47:34 +10:00
#endregion
2025-05-27 11:32:05 +10:00
#region unit
//using (var scope = serviceProvider.CreateScope())
//{
// var service = scope.ServiceProvider.GetService<IUnitService>();
// var unit = await service.Get().Include(t => t.Parents).Include(t => t.Childs).FirstOrDefaultAsync(t => t.Id == Guid.Parse("0f89e2ec-0e4d-4de6-b990-c55e8308accf"));
// var parent = unit?.Parents;
//}
#endregion
2024-06-28 16:42:53 +10:00
#region Calendar
2024-02-15 13:47:34 +10:00
2024-07-01 11:32:19 +10:00
//var testCalendar = new BLL.Services.Implementations.Test(calendarService);
2024-06-28 16:42:53 +10:00
2024-07-01 11:32:19 +10:00
//testCalendar.Ttt() ;
//using (var scope = serviceProvider.CreateScope())
//{
// var weekendDayService = scope.ServiceProvider.GetService<IWeekendDayService>();
// var workDays = calendarService.GetWorkDatesForPeriod(new DateOnly(2024, 07, 01), TimeSpan.Parse("30:00:00:00"), weekendDayService!.GetWeekends);
//}
2024-07-01 12:09:01 +10:00
//IDistributionPeriodService
//using (var scope = serviceProvider.CreateScope())
//{
2024-07-02 10:52:15 +10:00
// var service = scope.ServiceProvider.GetService<ICalendarService>();
// var weekEndService = scope.ServiceProvider.GetService<IWeekendDayService>();
2024-07-01 12:09:01 +10:00
2024-07-01 16:56:59 +10:00
2024-07-02 10:52:15 +10:00
// var aa = service!.GetWorkDatesForPeriod(new DateOnly(2024, 07, 01), DistributionPeriodTypeEnum.Year, "1", weekEndService!.GetWeekends);
2024-07-01 16:56:59 +10:00
2024-07-02 10:52:15 +10:00
// //var aaa = await service!.Get().ToListAsync();
2024-07-01 16:56:59 +10:00
2024-07-02 10:52:15 +10:00
// //foreach (var aaaItem in aaa)
// //{
2024-07-01 16:56:59 +10:00
2024-07-02 10:52:15 +10:00
// // var bbbb = aaaItem.AddDate;
// // var now = DateTimeOffset.UtcNow;
// // var newwww = now.AddMicroseconds(bbbb.);
// //}
2024-07-01 16:56:59 +10:00
2024-07-01 12:09:01 +10:00
//}
2024-06-28 16:42:53 +10:00
#endregion
2024-02-15 13:47:34 +10:00
2026-06-04 14:14:10 +10:00
}
2026-06-26 12:23:07 +10:00
#region SimpleSyncTest
2026-06-11 15:09:46 +10:00
2026-06-26 12:23:07 +10:00
private async Task SimpleSyncTest ( )
2026-06-11 15:09:46 +10:00
{
await using var scope = serviceProvider . CreateAsyncScope ( ) ;
2026-06-26 12:23:07 +10:00
var synchronizers = scope . ServiceProvider . GetRequiredService < IEnumerable < ITemplateSynchronizer > > ( ) ;
var simpleSync = synchronizers . FirstOrDefault ( s = > s is SimpleTemplateSynchronizer ) ;
2026-06-11 15:09:46 +10:00
if ( simpleSync = = null )
{
_logger . LogError ( "[FAIL] SimpleTemplateSynchronizer не найден в DI" ) ;
return ;
}
2026-06-26 12:23:07 +10:00
var jobIds = new List < Guid >
2026-06-11 15:09:46 +10:00
{
2026-06-26 12:23:07 +10:00
//Guid.Parse("cfb0d2dd-192a-4ed5-a29c-25f0abf61895"),//11010
//Guid.Parse("79976eaf-be7b-42a0-a4e3-a89d7f68a18e"),//17
2026-07-28 16:34:04 +10:00
Guid . Parse ( "055ac0cc-10f7-4f96-baf6-9c8145b1332a" ) //318
2026-06-26 12:23:07 +10:00
} ;
2026-06-11 15:09:46 +10:00
2026-06-26 12:23:07 +10:00
if ( ! jobIds . Any ( ) )
2026-06-11 15:09:46 +10:00
{
2026-06-26 12:23:07 +10:00
_logger . LogWarning ( "Список JobId пуст. Подставьте ID в код метода SimpleSyncTest." ) ;
2026-06-11 15:09:46 +10:00
return ;
}
2026-06-26 12:23:07 +10:00
_logger . LogInformation ( "=== Тестовая синхронизация SimpleTemplateSynchronizer ({Count} Job) ===" , jobIds . Count ) ;
2026-06-11 15:09:46 +10:00
2026-06-26 12:23:07 +10:00
int passed = 0 ;
int failed = 0 ;
foreach ( var jobId in jobIds )
2026-06-11 15:09:46 +10:00
{
2026-06-26 12:23:07 +10:00
try
2026-06-11 15:09:46 +10:00
{
2026-06-26 12:23:07 +10:00
var sw = Stopwatch . StartNew ( ) ;
await simpleSync . SyncTemplatesForJobAsync ( jobId , new HistoryInitiator
{
InitiatorIp = "127.0.0.1" ,
InitiatorParrComponentId = ParrComponentsEnum . Master ,
InitiatorComment = "Тестовая синхронизация SimpleTemplateSynchronizer"
} ) ;
sw . Stop ( ) ;
passed + + ;
_logger . LogInformation ( "[OK] Job {JobId}: синхронизация завершена за {ElapsedMs} мс" ,
jobId , sw . ElapsedMilliseconds ) ;
}
catch ( Exception ex )
{
failed + + ;
_logger . LogError ( ex , "[FAIL] Job {JobId}: исключение при синхронизации" , jobId ) ;
}
2026-06-11 15:09:46 +10:00
}
2026-06-26 12:23:07 +10:00
_logger . LogInformation ( "=== Итого: {Passed} OK, {Failed} FAIL из {Total} ===" ,
passed , failed , jobIds . Count ) ;
2026-06-11 15:09:46 +10:00
}
#endregion
2024-04-11 09:05:16 +10:00
2026-06-04 14:14:10 +10:00
#region TemplateMatcher
private async Task TemplateMatcherTest ( )
{
await using var scope = serviceProvider . CreateAsyncScope ( ) ;
var templateMatcher = scope . ServiceProvider . GetRequiredService < ITemplateMatcher > ( ) ;
var groupRepository = scope . ServiceProvider . GetRequiredService < IJobGroupRepository > ( ) ;
2023-11-30 09:11:07 +10:00
2026-07-28 16:34:04 +10:00
await templateMatcher . SyncTemplatesForJob ( Guid . Parse ( "055ac0cc-10f7-4f96-baf6-9c8145b1332a" ) ,
new HistoryInitiator
{
InitiatorIp = "10.99.246.156" ,
InitiatorParrComponentId = ParrComponentsEnum . Master ,
InitiatorComment = "Тестовый проект. Синхронизация Группированых работ"
2023-11-30 09:11:07 +10:00
2026-07-28 16:34:04 +10:00
}
) ;
2026-06-04 14:14:10 +10:00
2026-07-28 16:34:04 +10:00
//var groups = await groupRepository.Get().AsNoTracking()
// .Where(t => t.GroupType != null && t.GroupType.Code == JobGroupTypesEnum.Group)
// .Select(t => t.Id).ToHashSetAsync();
//foreach (var groupId in groups)
//{
// await templateMatcher.SyncTemplatesForJobGroup(groupId,
// new HistoryInitiator
// {
// InitiatorIp = "10.99.246.156",
// InitiatorParrComponentId = ParrComponentsEnum.Master,
// InitiatorComment = "Тестовый проект. Синхронизация Группированых работ"
// }
// );
//}
2023-10-19 15:59:57 +10:00
2026-06-04 14:14:10 +10:00
return ;
2023-10-19 15:59:57 +10:00
}
2026-06-04 14:14:10 +10:00
#endregion
private async Task NextRunTest ( )
{
using ( var scope = serviceProvider . CreateScope ( ) )
{
var service = scope . ServiceProvider . GetService < NextRunTest > ( ) ;
2023-10-19 15:59:57 +10:00
2026-06-04 14:14:10 +10:00
await service ! . Test ( ) ;
}
}
2023-10-19 15:59:57 +10:00
private async Task TestEsppApi ( )
{
2023-10-27 16:39:59 +10:00
//var result = await esppApiService.FindOrdersAsync(new FindOrdersQuery { DescriptionContains = "Полное", GenerateDateStart = new DateTime(2023, 10, 10) , GenerateDateEnd = new DateTime(2023, 10, 24) });
2024-02-05 16:05:02 +10:00
var recordId = "Н А Р 24-00009262" ;
2023-10-20 09:24:27 +10:00
2023-10-27 16:39:59 +10:00
var result = await esppApiService . FindOrderByRecordIdAsync ( recordId ) ;
if ( result . IsSuccess & & ( result . Data ! = null & & result . Data . Number . Any ( ) ) )
{
//var orders = result.Data;
2023-12-07 11:19:08 +10:00
//в работу
2024-02-01 16:49:18 +10:00
var inWorkResult = await esppApiService . SetStatusInWorkAsync ( recordId , "Регламентные работы в автоматическом режиме созданы и выполнены;" ) ; //"Решение...\nС новой строки"
2023-10-27 16:39:59 +10:00
if ( ! inWorkResult . IsSuccess )
{
2023-12-08 08:48:34 +10:00
_logger . LogError ( inWorkResult . Exception , $"Н е удалось взять в работу наряд {recordId}" ) ;
2023-10-27 16:39:59 +10:00
return ;
}
var tnk = new AddMtnkQuery { RecordId = recordId , JobOperation = "Н е учтена в перечне Т Н К " , Time = "00:05" } ;
2023-11-20 12:26:33 +10:00
var addMtnkResult = await esppApiService . AddMTnkAsync ( tnk ) ;
2023-10-27 16:39:59 +10:00
if ( ! addMtnkResult . IsSuccess )
{
_logger . LogError ( addMtnkResult . Exception , $"Н е удалось списать трудозатраты наряда {recordId}" ) ;
return ;
}
2023-12-07 11:19:08 +10:00
//выполнить
2024-02-01 16:49:18 +10:00
var resFinish = await esppApiService . SetStatusIsDoneAsync ( recordId , "Регламентные работы в автоматическом режиме созданы и выполнены;" , EsppOrderClosingCodeEnum . Auto ) ;
2023-10-27 16:39:59 +10:00
if ( ! resFinish . IsSuccess )
{
_logger . LogError ( resFinish . Exception , $"Н е удалось обновить статус наряда {recordId}" ) ;
return ;
}
}
else
2023-10-20 09:24:27 +10:00
{
2023-10-27 16:39:59 +10:00
_logger . LogWarning ( $"не найден наряд {recordId}" ) ;
2023-10-20 09:24:27 +10:00
}
2023-10-19 15:59:57 +10:00
}
2024-02-28 15:40:24 +10:00
private async Task StopDiscontinuedOrdersInEspp ( )
{
const string ResultMsg = "Сформирован ошибочно" ;
var searchQuery = new FindOrdersQuery
{
DescriptionContains = "ЭИТИ-ПТК-ПАРР" ,
StatusIs = "1-Направлен в группу" ,
GenerateDateStart = new DateTime ( 2024 , 02 , 26 , 0 , 0 , 0 ) ,
GenerateDateEnd = new DateTime ( 2024 , 02 , 29 , 0 , 0 , 0 )
} ;
var result = await esppApiService . FindOrdersAsync ( searchQuery ) ;
if ( result . IsSuccess & & result . Data ! = null )
{
foreach ( var item in result . Data )
{
2024-02-29 13:41:44 +10:00
if ( item . StatusEnum = = OrderStatusEnum . New )
2024-02-28 15:40:24 +10:00
{
await esppApiService . SetStatusInWorkAsync ( item . Number , ResultMsg ) ;
}
var newItem = await esppApiService . FindOrderByRecordIdAsync ( item . Number ) ;
if ( newItem . IsSuccess & & newItem . Data ! = null & & newItem . Data . StatusEnum = = OrderStatusEnum . InWork )
{
var tnk = new AddMtnkQuery { RecordId = newItem . Data . Number , JobOperation = "Прочее(наряды)" , Time = "00:01" } ;
await esppApiService . AddMTnkAsync ( tnk ) ;
await esppApiService . SetStatusIsDoneAsync ( newItem . Data . Number , ResultMsg , EsppOrderClosingCodeEnum . Breake ) ;
}
}
}
}
2023-10-19 15:59:57 +10:00
}
2023-10-20 11:00:46 +10:00
}