feat(dal,templateMatcher): Shortcodes добавлены %МАКС:ИМЯ АТРИБУТА%, %ГР_ПОЛЕ-ПН%, %БУКВЫ:ИМЯ АТРИБУТА%, исправлена фильтрация в UnitFilter, TemplateMatcher отдельные классы для типов работ, Shortcodes теперь работает по своим моделям Dto
This commit is contained in:
@@ -76,7 +76,7 @@ namespace PARR.DAL.Services.Implementations.Unit
|
||||
|
||||
return await dataContext.UnitInValues
|
||||
.AsNoTracking()
|
||||
.Include(uv => uv.Value) // UnitFieldValue
|
||||
.Include(uv => uv.Value)
|
||||
.Where(uv => unitIdSet.Contains(uv.UnitId) && fieldIdSet.Contains(uv.FieldId))
|
||||
.ToListAsync();
|
||||
}
|
||||
@@ -85,5 +85,48 @@ namespace PARR.DAL.Services.Implementations.Unit
|
||||
{
|
||||
return dataContext.UnitInValues;
|
||||
}
|
||||
|
||||
public async Task<string?> GetMostFrequentValueForFieldAsync(List<Guid> unitIds, string fieldName)
|
||||
{
|
||||
if (unitIds == null || !unitIds.Any() || string.IsNullOrWhiteSpace(fieldName))
|
||||
{
|
||||
logger.LogDebug("GetMostFrequentValueForFieldAsync: пустой список юнитов или имя поля. unitIds count: {Count}, fieldName: {FieldName}", unitIds?.Count ?? 0, fieldName);
|
||||
return null;
|
||||
}
|
||||
|
||||
logger.LogDebug("Поиск наиболее частого значения для поля '{FieldName}' среди {Count} юнитов.", fieldName, unitIds.Count);
|
||||
|
||||
var result = await dataContext.UnitInValues
|
||||
.AsNoTracking()
|
||||
.Where(uv =>
|
||||
unitIds.Contains(uv.UnitId)
|
||||
)
|
||||
.Join(
|
||||
dataContext.UnitFields,
|
||||
uv => uv.FieldId,
|
||||
f => f.Id,
|
||||
(uv, f) => new { uv, f }
|
||||
)
|
||||
.Where(x =>
|
||||
EF.Functions.ILike(x.f.AihitName, fieldName)
|
||||
)
|
||||
.Join(
|
||||
dataContext.UnitFieldValues,
|
||||
x => x.uv.ValueId,
|
||||
v => v.Id,
|
||||
(x, v) => new { x.uv.UnitId, v.Value }
|
||||
)
|
||||
.Where(x => !string.IsNullOrWhiteSpace(x.Value))
|
||||
.GroupBy(x => x.Value)
|
||||
.Select(g => new { Value = g.Key, Count = g.Count() })
|
||||
.OrderByDescending(x => x.Count)
|
||||
.ThenBy(x => x.Value)
|
||||
.FirstOrDefaultAsync();
|
||||
|
||||
var mostFrequentValue = result?.Value;
|
||||
logger.LogDebug("Наиболее частое значение для поля '{FieldName}': {Value}", fieldName, mostFrequentValue);
|
||||
return mostFrequentValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,13 +5,24 @@ namespace PARR.DAL.Services.Interfaces.Unit
|
||||
public interface IUnitInValueService
|
||||
{
|
||||
Task<List<UnitInValue>> GetByUnitIdsAsync(IEnumerable<Guid> unitIds);
|
||||
|
||||
Task<List<UnitInValue>> GetByUnitIdAsync(Guid unitId);
|
||||
|
||||
Task<List<(string FieldName, string? Value)>> GetFieldValuesAsync(Guid unitId, IReadOnlyCollection<string> aihitNames);
|
||||
|
||||
/// <summary>
|
||||
/// Получает UnitInValue (с Value) для заданных UnitId и FieldId.
|
||||
/// </summary>
|
||||
Task<List<UnitInValue>> GetByUnitIdsAndFieldIdsAsync(IEnumerable<Guid> unitIds, IEnumerable<Guid> fieldIds);
|
||||
|
||||
/// <summary>
|
||||
/// Находит наиболее часто встречающееся непустое значение указанного поля среди переданных юнитов.
|
||||
/// </summary>
|
||||
/// <param name="unitIds">Список Id юнитов для анализа.</param>
|
||||
/// <param name="fieldName">Имя поля (AihitName) для поиска значения.</param>
|
||||
/// <returns>Наиболее частое значение поля или null, если не найдено.</returns>
|
||||
Task<string?> GetMostFrequentValueForFieldAsync(List<Guid> unitIds, string fieldName);
|
||||
|
||||
IQueryable<UnitInValue> Get();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user