using Microsoft.EntityFrameworkCore; using PARR.DAL.Contracts; using PARR.DAL.DomainServices.Interfaces; using PARR.DAL.Services.Interfaces.Job; using PARR.DAL.Services.Interfaces.Unit; using System.Text.RegularExpressions; namespace PARR.DAL.DomainServices.Implementations { internal class TemplateNameGeneratorService : ITemplateNameGeneratorService { private readonly SettingsFromDb settingsFromDb; private readonly IJobService jobService; private readonly IUnitService unitService; public TemplateNameGeneratorService( SettingsFromDb settingsFromDb, IJobService jobService, IUnitService unitService ) { this.settingsFromDb = settingsFromDb; this.jobService = jobService; this.unitService = unitService; } public async Task GetTemplateNameAsync(Guid jobId, Guid unitId) { var nameConstants = settingsFromDb.TemplateNameConstantPartsList; var job = await jobService.Get().AsNoTracking().FirstOrDefaultAsync(t => t.Id == jobId); var unit = await unitService.Get().AsNoTracking().FirstOrDefaultAsync(t => t.Id == unitId); if (job != null && unit != null && job.TemplateNameMask != null) { var resultName = job.TemplateNameMask; var shortcodesInMask = GetShortCodes(resultName); //Проверяем и меняем наличие статичных частей в маске имени шаблона if (shortcodesInMask.Any(x => nameConstants.Select(x => "%" + x.Name + "%").ToList().Contains(x.Value))) { resultName = ReplaceConstants(nameConstants, resultName); } //Проверяем и меняем Shortcodes в маске имени шаблона var shortCodes = GetShortcodesNames(); if (shortcodesInMask.Any(x => shortCodes.Select(x => x).ToList().Contains(x.Value))) { resultName = ReplaceShortcodes(job, unit, resultName, shortcodesInMask); } //Если остались %переменные% проверяем совпадение по имени поля shortcodesInMask = GetShortCodes(resultName); if (shortcodesInMask.Count > 0) { resultName = await ReplaceFieldValues(unitId, resultName, shortcodesInMask); } return resultName; } return ""; } private async Task ReplaceFieldValues(Guid unitId, string resultName, List shortcodesInMask) { var unitWithFields = await unitService.Get() .AsNoTracking() .Include(u => u.UnitValues) .ThenInclude(uv => uv.Field) .Include(u => u.UnitValues) .ThenInclude(uv => uv.Value) .FirstOrDefaultAsync(t => t.Id == unitId); foreach (var item in shortcodesInMask) { var fieldName = item.Value.Replace("%", "").ToUpper(); var value = unitWithFields!.UnitValues!.FirstOrDefault(t => t.Field!.AihitName!.ToUpper() == fieldName!); if (value != null) resultName = resultName.Replace(item.Value, value!.Value!.Value); } return resultName; } private static string ReplaceShortcodes(Models.Job.Job job, Models.Unit.Unit unit, string resultName, List shortcodesInMask) { if (shortcodesInMask.Any(x => x.Value == "%РАБОТА%")) resultName = resultName.Replace("%РАБОТА%", job.WorkName); if (shortcodesInMask.Any(x => x.Value == "%ЭК%")) resultName = resultName.Replace("%ЭК%", unit.Name); return resultName; } private static string ReplaceConstants(List nameConstants, string resultName) { foreach (var item in nameConstants) { resultName = resultName.Replace($"%{item.Name}%", item.Value); } return resultName; } private static List GetShortCodes(string resultName) { var shortcodePattern = "%[^%\\s]+%"; var shortcodesInMask = Regex.Matches(resultName, shortcodePattern).ToList(); return shortcodesInMask; } private List GetShortcodesNames() { var result = new List { "%ЭК%", "%ЗО%", "%РАБОТА%" }; return result; } } }