/// <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); }
/// <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)); }