Example #1
0
        /// <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);
        }
Example #3
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();
        }