using System.Collections.Generic; using System.Linq; using DeclarationAutomatization.Models; namespace DeclarationAutomatization.Services; public class CodeLookupService { private readonly RulesPersistenceService _persistence; private List _entries; public CodeLookupService(RulesPersistenceService persistence) { _persistence = persistence; _entries = _persistence.Load(); } // Загружает коды из внешнего xlsx-справочника (заменяет текущие записи) public void LoadFromEntries(List entries) { _entries = entries; } public bool HasEntries => _entries.Count > 0; // Назначает декларационные коды всем позициям в списке public void AssignCodes(IEnumerable items) { foreach (var item in items) AssignCode(item); } private void AssignCode(DeclarationItem item) { var entry = _entries.FirstOrDefault(e => e.TnVed == item.TnVed); if (entry == null || entry.Codes.Count == 0) { item.DeclarationCode = ""; item.Confidence = ConfidenceLevel.Missing; item.CandidateCodes = new List(); return; } if (entry.Codes.Count == 1) { item.DeclarationCode = entry.Codes[0]; item.Confidence = ConfidenceLevel.Auto; item.CandidateCodes = new List(entry.Codes); return; } // Несколько кодов — неоднозначность item.CandidateCodes = new List(entry.Codes); item.DeclarationCode = entry.Codes[0]; item.Confidence = ConfidenceLevel.Review; } // Фиксирует ручной выбор кода декларантом public void LearnFromManualEdit(string tnVed, string chosenCode) { _persistence.LearnCode(_entries, tnVed, chosenCode); } public List GetAllEntries() => _entries; }