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(); } public void Reload() => _entries = _persistence.Load(); // Назначает декларационные коды всем позициям в списке. 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); // Эвристика: если у позиции есть рег. номер — предпочесть 9000 if (!string.IsNullOrEmpty(item.RegNumber) && entry.Codes.Contains("9000")) { item.DeclarationCode = "9000"; item.Confidence = ConfidenceLevel.Auto; } else { 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; }