using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.DAL.Context; using PARR.DAL.Models.Unit; using PARR.DAL.Services.Interfaces.Unit; namespace PARR.DAL.Services.Implementations.Unit { internal class UnitInValueService : IUnitInValueService { private readonly ILogger logger; private readonly DataContext dataContext; public UnitInValueService( ILogger logger, DataContext dataContext ) { this.logger = logger; this.dataContext = dataContext; } public async Task> GetByUnitIdAsync(Guid unitId) { return await dataContext.UnitInValues.AsNoTracking() .Include(t => t.Value) .Where(uv => uv.UnitId == unitId) .ToListAsync(); } public async Task> GetByUnitIdsAsync(IEnumerable unitIds) { return await dataContext.UnitInValues.AsNoTracking() .Include(t => t.Value) .Where(uv => unitIds.Contains(uv.UnitId)) .ToListAsync(); } public async Task> GetFieldValuesAsync(Guid unitId, IReadOnlyCollection aihitNames) { if (aihitNames == null || aihitNames.Count == 0) return new Dictionary(StringComparer.OrdinalIgnoreCase); var result = await dataContext.UnitInValues .AsNoTracking() .AsSplitQuery() .Where(uiv => uiv.UnitId == unitId && uiv.Field != null && uiv.Value != null && aihitNames.Contains(uiv.Field.AihitName.ToUpper())) .ToDictionaryAsync( uiv => uiv.Field!.AihitName.ToUpper(), uiv => uiv.Value!.Value ?? "", StringComparer.OrdinalIgnoreCase); // Журналируем если не нашли поля var missing = aihitNames .Where(name => !result.ContainsKey(name.ToUpper())) .ToList(); if (missing.Any()) { logger.LogDebug("UnitInValueService: поля не найдены для unitId={UnitId}: {Fields}", unitId, string.Join(", ", missing)); } return result; } } }