2025-08-01 14:45:36 +10:00
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
|
using PARR.DAL.Contracts;
|
2025-08-12 11:50:29 +10:00
|
|
|
|
using PARR.DAL.DomainServices.Interfaces;
|
2025-08-01 14:45:36 +10:00
|
|
|
|
using PARR.DAL.Services.Interfaces.Job;
|
|
|
|
|
|
using PARR.DAL.Services.Interfaces.Unit;
|
|
|
|
|
|
using System.Text.RegularExpressions;
|
2025-08-01 09:02:01 +10:00
|
|
|
|
|
2025-08-12 11:50:29 +10:00
|
|
|
|
namespace PARR.DAL.DomainServices.Implementations
|
2025-08-01 09:02:01 +10:00
|
|
|
|
{
|
|
|
|
|
|
internal class ShortcodesService : IShortcodesService
|
|
|
|
|
|
{
|
2025-08-06 10:33:55 +10:00
|
|
|
|
private const string shortcodePattern = "%[^%\\s]+%";
|
2025-08-01 14:45:36 +10:00
|
|
|
|
private readonly SettingsFromDb settingsFromDb;
|
|
|
|
|
|
private readonly IJobService jobService;
|
|
|
|
|
|
private readonly IUnitService unitService;
|
|
|
|
|
|
|
|
|
|
|
|
public ShortcodesService(
|
|
|
|
|
|
SettingsFromDb settingsFromDb,
|
|
|
|
|
|
IJobService jobService,
|
|
|
|
|
|
IUnitService unitService
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.settingsFromDb = settingsFromDb;
|
|
|
|
|
|
this.jobService = jobService;
|
|
|
|
|
|
this.unitService = unitService;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public async Task<string> ApplyShortcodesAsync(string str, Guid unitId, Guid jobId)
|
2025-08-01 09:02:01 +10:00
|
|
|
|
{
|
|
|
|
|
|
//TODO удалить старый в GeneralExtesions, связанные с ним Enum и написать метод. делов...
|
2025-08-01 14:45:36 +10:00
|
|
|
|
|
|
|
|
|
|
var nameConstants = settingsFromDb.TemplateNameConstantPartsList;
|
|
|
|
|
|
|
2025-08-15 12:16:24 +10:00
|
|
|
|
var job = await jobService
|
|
|
|
|
|
.Get().AsNoTracking()
|
|
|
|
|
|
.Include(t=>t.Tnk)
|
2025-08-21 12:23:26 +10:00
|
|
|
|
.Include(t=>t.Group)
|
2025-08-15 12:16:24 +10:00
|
|
|
|
.FirstOrDefaultAsync(t => t.Id == jobId);
|
|
|
|
|
|
|
2025-08-01 14:45:36 +10:00
|
|
|
|
var unit = await unitService.Get().AsNoTracking().FirstOrDefaultAsync(t => t.Id == unitId);
|
|
|
|
|
|
|
|
|
|
|
|
if (job != null && unit != null && job.TemplateNameMask != null)
|
|
|
|
|
|
{
|
2025-08-06 10:33:55 +10:00
|
|
|
|
var resultName = str;
|
2025-08-01 14:45:36 +10:00
|
|
|
|
|
|
|
|
|
|
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 "";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-06 10:33:55 +10:00
|
|
|
|
public bool isAnyShortcodes(string str)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Regex.IsMatch(str, shortcodePattern);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-01 14:45:36 +10:00
|
|
|
|
private async Task<string> ReplaceFieldValues(Guid unitId, string resultName, List<Match> 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<Match> shortcodesInMask)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (shortcodesInMask.Any(x => x.Value == "%ЭК%"))
|
|
|
|
|
|
resultName = resultName.Replace("%ЭК%", unit.Name);
|
2025-08-15 12:16:24 +10:00
|
|
|
|
|
2025-08-21 12:23:26 +10:00
|
|
|
|
if (shortcodesInMask.Any(x => x.Value == "%ГРУППА_РАБОТ%"))
|
|
|
|
|
|
resultName = resultName.Replace("%ГРУППА_РАБОТ%", job.Group!.GroupName);
|
|
|
|
|
|
|
|
|
|
|
|
if (shortcodesInMask.Any(x => x.Value == "%РАБОТА%"))
|
|
|
|
|
|
resultName = resultName.Replace("%РАБОТА%", job.WorkName);
|
|
|
|
|
|
|
2025-08-15 12:16:24 +10:00
|
|
|
|
if (shortcodesInMask.Any(x => x.Value == "%ТНК%"))
|
|
|
|
|
|
resultName = resultName.Replace("%ТНК%", job.Tnk!.Name);
|
|
|
|
|
|
|
2025-08-01 14:45:36 +10:00
|
|
|
|
return resultName;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static string ReplaceConstants(List<BLL.Domain.TemplateNameConstantPart> nameConstants, string resultName)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var item in nameConstants)
|
|
|
|
|
|
{
|
|
|
|
|
|
resultName = resultName.Replace($"%{item.Name}%", item.Value);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return resultName;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static List<Match> GetShortCodes(string resultName)
|
|
|
|
|
|
{
|
|
|
|
|
|
var shortcodesInMask = Regex.Matches(resultName, shortcodePattern).ToList();
|
|
|
|
|
|
return shortcodesInMask;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private List<string> GetShortcodesNames()
|
|
|
|
|
|
{
|
|
|
|
|
|
var result = new List<string> {
|
|
|
|
|
|
"%ЭК%",
|
2025-08-21 12:23:26 +10:00
|
|
|
|
"%ГРУППА_РАБОТ%",
|
2025-08-15 12:16:24 +10:00
|
|
|
|
"%РАБОТА%",
|
|
|
|
|
|
"%ТНК%"
|
2025-08-01 14:45:36 +10:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return result;
|
2025-08-01 09:02:01 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|