feat(esppScheduleSync, esppSync): вынесена логика сравнения nextRun из EsppSync в EsppScheduleSync. Рефакторинг EsppScheduleSync - логика проверки имени шаблона
This commit is contained in:
@@ -1,14 +1,12 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using PARR.BLL.Helpers;
|
||||
using PARR.Constants;
|
||||
using PARR.DAL.Contracts;
|
||||
using PARR.DAL.DomainServices.Shortcodes;
|
||||
using PARR.DAL.Models;
|
||||
using PARR.DAL.NextRunServices;
|
||||
using PARR.DAL.Services.Interfaces;
|
||||
using PARR.EsppSync.Domain;
|
||||
using PARR.EsppSync.Helpers;
|
||||
using System.Reflection;
|
||||
|
||||
namespace PARR.EsppSync
|
||||
@@ -30,8 +28,10 @@ namespace PARR.EsppSync
|
||||
|
||||
public async Task SyncEsppObjectAsync(
|
||||
string str,
|
||||
ParserHandlerDelegate<EsppObject> parser,
|
||||
ConvertDbObjToComparisonObjHandlerDelegate<EsppObject> converterToEsppObject
|
||||
ParseStringToEsppObject<EsppObject> parseStringToEsppObject,
|
||||
ConvertDbToEsppObject<EsppObject> converterDbToEsppObject,
|
||||
CustomComparisionCheckAsync<EsppObject>? customComparisionAsync = null,
|
||||
AfterParseStringToEsppObjectAsync<EsppObject>? afterParseStringToEsppObjectAsync = null
|
||||
)
|
||||
{
|
||||
logger.LogDebug("Получил строку. Начинаю работать. Строка: {String}", str);
|
||||
@@ -42,7 +42,7 @@ namespace PARR.EsppSync
|
||||
return;
|
||||
}
|
||||
|
||||
var esppObject = parser.Invoke(str);
|
||||
var esppObject = parseStringToEsppObject.Invoke(str);
|
||||
|
||||
if (esppObject == null)
|
||||
{
|
||||
@@ -50,12 +50,16 @@ namespace PARR.EsppSync
|
||||
return;
|
||||
}
|
||||
|
||||
// Вызовем кастомный метод, если он есть
|
||||
if (afterParseStringToEsppObjectAsync != null)
|
||||
await afterParseStringToEsppObjectAsync.Invoke(esppObject);
|
||||
|
||||
|
||||
using (var scope = serviceProvider.CreateScope())
|
||||
{
|
||||
var templateService = GetServiceInScope<ITemplateService>(scope);
|
||||
var robotConfigurationService = GetServiceInScope<IRobotConfigurationService>(scope);
|
||||
var shortcodesService = GetServiceInScope<IShortcodesService>(scope);
|
||||
var nextRunService = GetServiceInScope<INextRunServiceV2>(scope);
|
||||
|
||||
try
|
||||
{
|
||||
@@ -92,7 +96,7 @@ namespace PARR.EsppSync
|
||||
return;
|
||||
}
|
||||
|
||||
var dbObjectInEsppObject = converterToEsppObject.Invoke(template);
|
||||
var dbObjectInEsppObject = converterDbToEsppObject.Invoke(template);
|
||||
|
||||
await ApplyShortcodesAsync(dbObjectInEsppObject, template, shortcodesService);
|
||||
|
||||
@@ -113,14 +117,28 @@ namespace PARR.EsppSync
|
||||
logger.LogDebug("Объект активирован в ПАРР. Сравниваем все поля. {TemplateName}", esppObject.TemplateName);
|
||||
isChanged = IsChanged(esppObject, dbObjectInEsppObject, esppObject.TemplateName);
|
||||
|
||||
// если это сравнение расписаний, рассчитать nextRun, и сравнить все три nextRun, БД - ЕСПП - Расчитанное
|
||||
// будем считать, только если НЕТ изменений в остальных полях, если изменения есть, зачем лишний раз напрягать, потом в контроллере все пересчитается
|
||||
if (!isChanged && dbObjectInEsppObject is EsppObjectSchedule dbValues && esppObject is EsppObjectSchedule esppValues)
|
||||
// выполняем кастомную дополнительную проверку (только если isChanged==false, чтоб лишний раз не гонять)
|
||||
if (!isChanged)
|
||||
{
|
||||
var isEqualNextRun = await IsEqualNextRunAsync(nextRunService, dbValues, esppValues, template.Id);
|
||||
|
||||
if (isEqualNextRun == false)
|
||||
isChanged = true;
|
||||
if (customComparisionAsync != null)
|
||||
{
|
||||
// добавлена дополнительная проверка
|
||||
var isCustomComparision = await customComparisionAsync.Invoke(esppObject, dbObjectInEsppObject, template.Id);
|
||||
if (isCustomComparision)
|
||||
{
|
||||
logger.LogDebug("Дополнительная проверка прошла.");
|
||||
}
|
||||
else
|
||||
{
|
||||
// если дополнительная проверка не прошла, то говорим что есть изменения
|
||||
isChanged = true;
|
||||
logger.LogDebug("Дополнительная проверка не прошла, ставим статус isChanged: {isChanged}", isChanged);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogDebug("Дополнительная проверка отсутствует");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,8 +270,8 @@ namespace PARR.EsppSync
|
||||
continue;
|
||||
|
||||
//Replace("\r","").Replace("\n","") - в подробном описании могут быть переносы строк, в Rabbit прилетает без переносов. Убираем переносы для стравнения
|
||||
var dbValueStr = Normalize(dbValue!.ToString()!);
|
||||
var esppValueStr = Normalize(esppValue!.ToString()!);
|
||||
var dbValueStr = EsppSyncHelpers.Normalize(dbValue!.ToString());
|
||||
var esppValueStr = EsppSyncHelpers.Normalize(esppValue!.ToString());
|
||||
|
||||
if (dbValueStr != esppValueStr)
|
||||
{
|
||||
@@ -266,87 +284,5 @@ namespace PARR.EsppSync
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Удаляет ненужные символы из строки
|
||||
/// </summary>
|
||||
/// <param name="str"></param>
|
||||
/// <returns></returns>
|
||||
private string Normalize(string str)
|
||||
{
|
||||
str = str.Replace("\r", string.Empty);
|
||||
str = str.Replace("\n", string.Empty);
|
||||
str = str.Replace(" ", string.Empty);
|
||||
|
||||
return str.ToLower();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Рассчитать nextRun в часовом поясе УЗ робота
|
||||
/// </summary>
|
||||
/// <param name="nextRunService"></param>
|
||||
/// <param name="templateId"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<DateTimeOffset?> CalcNextRunAsync(INextRunServiceV2 nextRunService, Guid templateId)
|
||||
{
|
||||
var nextRun = await nextRunService.GetNextRunForTemplateAsync(templateId, isNew: false);
|
||||
|
||||
if (nextRun.HasValue)
|
||||
{
|
||||
var nextRunWithEsppAccountTz = nextRun.Value.Add(nextRunService.GetEsppAccountOffset());
|
||||
logger.LogDebug("Расчитанный nextRun для шаблона {templateId}, UTC: {nextRun}, EsppAccountTz: {nextRunWithEsppAccountTz}", templateId, nextRun, nextRunWithEsppAccountTz);
|
||||
|
||||
return nextRunWithEsppAccountTz;
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogError("При расчете nextRun для templateId: {templateId} верунлся null", templateId);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Сравнить NextRun из БД, ЕСПП, рассчитанный
|
||||
/// </summary>
|
||||
/// <param name="dbValues"></param>
|
||||
/// <param name="esppValues"></param>
|
||||
/// <param name="templateId"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<bool> IsEqualNextRunAsync(INextRunServiceV2 nextRunService, EsppObjectSchedule dbValues, EsppObjectSchedule esppValues, Guid templateId)
|
||||
{
|
||||
// в часовой зоне робота
|
||||
var calculatedNextRun = await CalcNextRunAsync(nextRunService, templateId);
|
||||
if (calculatedNextRun == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var scheduledCalculated = EsppScheduleHelpers.GetNextRun(calculatedNextRun.Value);
|
||||
var basisTimeCalculated = EsppScheduleHelpers.GetGenerationTime(calculatedNextRun.Value);
|
||||
|
||||
logger.LogDebug("Рассчитанные значения для шаблона '{templateName}', {templateId}, следующее срабатывание {scheduledCalculated}, время создания наряда: {basisTimeCalculated}",
|
||||
dbValues.TemplateName, templateId, scheduledCalculated, basisTimeCalculated);
|
||||
|
||||
if (Normalize(dbValues.Scheduled) != Normalize(esppValues.Scheduled) || Normalize(dbValues.Scheduled) != scheduledCalculated || Normalize(esppValues.Scheduled) != scheduledCalculated)
|
||||
{
|
||||
logger.LogInformation("Не совпадают поля ({propName}), dbValueStr: {dbValueStr}, esppValueStr: {esppValueStr}, scheduledCalculated: {scheduledCalculated}. Имя шаблона: {templateName}",
|
||||
nameof(dbValues.Scheduled), dbValues.Scheduled, esppValues.Scheduled, scheduledCalculated, dbValues.TemplateName);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Normalize(dbValues.BasisTime) != Normalize(esppValues.BasisTime) || Normalize(dbValues.BasisTime) != basisTimeCalculated || Normalize(esppValues.BasisTime) != basisTimeCalculated)
|
||||
{
|
||||
logger.LogInformation("Не совпадают поля ({propName}), dbValueStr: {dbValueStr}, esppValueStr: {esppValueStr}, basisTimeCalculated: {basisTimeCalculated}. Имя шаблона: {templateName}",
|
||||
nameof(dbValues.BasisTime), dbValues.BasisTime, esppValues.BasisTime, basisTimeCalculated, dbValues.TemplateName);
|
||||
return false;
|
||||
}
|
||||
|
||||
logger.LogDebug("Значения nextRun в БД, ЕСПП, расчитанное, все совпадают. Scheduled: {scheduled}, basisTime: {basisTime}", scheduledCalculated, basisTimeCalculated);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user