예제 #1
0
        /// <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>
        /// <returns>SQL-запрос</returns>
        public string GetGroups()
        {
            string result = string.Empty;

            //Список группы рассылки
            DBList deviringList = this.Site.RootWeb.GetList(Consts.DeliveringGroups.ListName, true);

            //список «WSSC_Доступ к группам рассылки»
            DBWeb  web        = this.Site.GetWeb("dms", true);
            DBList accessList = web.GetList(Consts.Lists.AccessOfDelivering.ListName, true);

            //поля в которых нужно проверять текущего юзера
            DBFieldLookupMulti fieldGroups    = accessList.GetField <DBFieldLookupMulti>(Consts.Lists.AccessOfDelivering.Fields.UsersGroups, true);
            DBFieldLookupMulti fieldUsers     = accessList.GetField <DBFieldLookupMulti>(Consts.Lists.AccessOfDelivering.Fields.Users, true);
            DBFieldLookupMulti fieldDevGroups = accessList.GetField <DBFieldLookupMulti>(Consts.Lists.AccessOfDelivering.Fields.DeliverinGroups, true);

            //текущий юзер
            DBUser currentUser = this.Context.CurrentUser;

            //группы текущего юзера
            IEnumerable <int> currentUsersGroups = currentUser.AllGroups.Select(group => group.ID);

            List <string> devGroupsID = new List <string>();

            foreach (DBItem accessItem in accessList.GetItems($"{fieldUsers.GetSelectCondition(currentUser.ID)} OR {fieldGroups.GetSelectCondition(currentUsersGroups)}"))
            {
                devGroupsID.AddRange(accessItem.GetLookupValues(Consts.Lists.AccessOfDelivering.Fields.DeliverinGroups).Select(lv => lv.LookupID.ToString()));
            }

            string devGroupsIDStr = string.Join(",", devGroupsID.Distinct().ToArray());
            string condition      = devGroupsIDStr.Length > 0 ? $"OR[ID] IN({ devGroupsIDStr})" : string.Empty;


            result = $@"
[ID] IN (
        SELECT [ID] FROM {deviringList.TableName} WITH(NOLOCK)
        WHERE ([{Consts.DeliveringGroups.AccessRestriction}] = 0 OR [{Consts.DeliveringGroups.AccessRestriction}] IS NULL)
              {condition}
              )
";

            //throw new Exception(result);
            return(result);
        }
예제 #3
0
        /// <summary>
        /// Находим все карточки которые необходимо восстановить
        /// </summary>
        private DBItemCollection FindItems(Settings settings)
        {
            //Получаем данные для восстановления
            DBList list = settings.List.List;

            DBConnection connection   = list.Site.DataAdapter.Connection;
            string       versionTable = list.TableInfo.VersionsTable.GetQueryName(connection, DBPartitionDataType.All);
            string       mainTable    = list.TableInfo.GetQueryName(connection, DBPartitionDataType.All);

            //настройки восстановления
            string   field      = settings.RestoreSettings.Field;
            string   wrongValue = settings.RestoreSettings.WrongValue;
            bool     itsInteger = settings.RestoreSettings.IntegerValue;
            DateTime dateAt     = settings.RestoreSettings.DateAt;
            DateTime dateTo     = settings.RestoreSettings.DateTo;

            //Получаем все карточки с полем field =  wrongValue в диапазоне дат [dateAt; dateTo]
            StringBuilder query = new StringBuilder();

            //Если это число - можно ускорить заброс
            if (itsInteger)
            {
                query.Append($" [{field}] = {wrongValue} ");
            }
            else
            {
                query.Append($" [{field}] = '{wrongValue}' ");
            }

            query.Append($" AND [TimeModified] >= @dateAt AND [TimeModified] <= @dateTo AND [TimeCreated] < @dateAt ");
            query.Append($" AND [ID] IN (SELECT DISTINCT [ID] FROM {versionTable} AS InstructionsVersionsTable WITH(NOLOCK) ");
            query.Append($" WHERE InstructionsVersionsTable.[ID] = {mainTable}.[ID] AND (");

            if (itsInteger)
            {
                query.Append($" InstructionsVersionsTable.[{field}] <> {wrongValue} ");
            }
            else
            {
                query.Append($" InstructionsVersionsTable.[{field}] <> '{wrongValue}' ");
            }

            query.Append($" OR InstructionsVersionsTable.[{field}] IS NULL ) ");
            query.Append($" AND InstructionsVersionsTable.[TimeModified] <= @dateAt )");

            SqlParameter[] sqlParameters = new SqlParameter[]
            {
                new SqlParameter
                {
                    SqlDbType     = System.Data.SqlDbType.DateTime,
                    ParameterName = "@dateAt",
                    Value         = dateAt,
                },
                new SqlParameter
                {
                    SqlDbType     = System.Data.SqlDbType.DateTime,
                    ParameterName = "@dateTo",
                    Value         = dateTo,
                }
            };

            Console.WriteLine("Поиск карточек для восстановления");

            return(list.GetItems(query.ToString(), sqlParameters));
        }