Пример #1
0
        /// <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();
        }