/// <summary> /// Процесс восстановления /// </summary> internal void Restore() { this.Loger.AutoFlush = true; Settings settings = new Settings(); //поле и значение по которым определяем нужно ли восстанавливать карточку string field = settings.RestoreSettings.Field; string wrongValue = settings.RestoreSettings.WrongValue; //Получаем поле и проверяем его наличие и версионность DBField dbfield = settings.List.List.GetField(field, true); if (!dbfield.Versioned) { throw new Exception($"Поле '{field}' не является версионным"); } //Находим карточки которые необходимо восстановить, если таких нет - выходим DBItemCollection items = this.FindItems(settings); //Записываем о них инфу this.WriteLogInfo(items, settings.List.List); //если таких нет - у нас записана вся инфа и выходим if (items.Count == 0) { return; } //счётчик для прогресс бара int completed = 0; //Восстанавливаем ближайшую версию каждой карточки foreach (DBItem item in items) { //Переворачиваем массив чтобы первый элемент был самый новый //и находим самый первый элемент где значение было не wrongValue DBItemVersion correctVersion = item.Versions.Reverse().FirstOrDefault(version => { //Получаем значение поля в этой версии string value = string.Empty; if (dbfield.IsTypeOfLookupSingle()) { DBFieldLookupValue lookup = version.GetValue <DBFieldLookupValue>(field); if (lookup != null) { value = lookup.LookupID.ToString(); } } else if (dbfield.IsTypeOfLookupMulti()) { DBFieldLookupValueCollection lookup = version.GetValue <DBFieldLookupValueCollection>(field); if (lookup.Count > 0) { value = string.Join(";", lookup.Select(l => l.LookupID.ToString()).ToArray()); } } else { object val = version.GetValue(field); if (val != null) { value = val.ToString(); } } return(!string.Equals(wrongValue, value, StringComparison.OrdinalIgnoreCase)); }); if (correctVersion == null) { throw new Exception($"Для карточки '{item.ID}' не удалось получить версию для восстановления"); } //восстанавливаем correctVersion.Restore(); //инфа в прогерсс бар Console.Write($"Восстановлено: {++completed} из {items.Count}"); Console.CursorLeft = 0; //инфа в лог this.Loger.WriteLine($"Дата {DateTime.Now.ToString()} карточка ID='{item.ID}' восстановлена на версию='{correctVersion.VersionNumber}'"); } Console.WriteLine(); }