/// <summary> /// Записываем в лог инфу о найденых карточках. Пишем ИД карточки и её рег номер /// </summary> private void WriteLogInfo(DBItemCollection items, DBList list) { Console.WriteLine($"{Environment.NewLine}Найдено карточек: {items.Count}"); this.Loger.WriteLine($"{Environment.NewLine}Дата {DateTime.Now.ToString()} найдено карточек: {items.Count}{Environment.NewLine}Информация о найденых карточках:"); if (items.Count == 0) { return; } //устанавливаем load type DBField field = list.GetField(Consts.Fields.RegNumber, true); field.ValueLoadingType = DBFieldValueIOType.Directly; //собираем всю инфу (ИД карточки и её рег номер) и потом записываем разом в лог StringBuilder itemsinfo = new StringBuilder(); foreach (DBItem item in items) { itemsinfo.AppendLine($"ItemID = '{item.ID}' Регистрационный номер: '{item.GetStringValue(Consts.Fields.RegNumber)}'"); } this.Loger.WriteLine(itemsinfo.ToString()); }
/// <summary> /// Ищет родительские подразделения. /// </summary> /// <returns></returns> private List <DBItem> GetChildren(List <DBItem> level, DBList depList) { if (level == null) { throw new ArgumentNullException(nameof(level)); } if (depList == null) { throw new ArgumentNullException(nameof(depList)); } List <DBItem> result = new List <DBItem>(); string parentsIDs = ""; foreach (DBItem item in level) { parentsIDs += item.ID + ","; } parentsIDs = parentsIDs.TrimEnd(','); string selectCondition = $"[Родительское подразделение] IN ({parentsIDs})"; DBItemCollection collection = depList.GetItems(selectCondition); result.AddRange(collection); return(result); }
/// <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(); }