public override void Deleting(Sungero.Domain.DeletingEventArgs e) { var ruleItems = DocumentGrantRightsQueueItems.GetAll(q => Equals(q.AccessRightsRule, _obj)).ToList(); foreach (var item in ruleItems) { DocumentGrantRightsQueueItems.Delete(item); } }
/// <summary> /// Автоматическая выдача прав на документы. /// </summary> public virtual void GrantAccessRightsToDocuments() { // Отключение ФП для проверки тестов. if (PublicFunctions.Module.GetGrantRightMode() != Constants.Module.GrantRightsModeByJob) { return; } var startDate = Calendar.Now; var lastStartDate = PublicFunctions.Module.GetLastAgentRunDate(Constants.Module.LastAccessRightsUpdateDate); var allRules = AccessRightsRules.GetAll(s => s.Status == Docflow.AccessRightsRule.Status.Active).ToList(); if (!allRules.Any()) { PublicFunctions.Module.UpdateLastAgentRunDate(Constants.Module.LastAccessRightsUpdateDate, startDate); return; } var hasRuleWithLeadingDocuments = allRules.Any(s => s.GrantRightsOnLeadingDocument == true); // Измененные документы. var queue = new List <Structures.DocumentGrantRightsQueueItem.ProxyQueueItem>(); var changedDocumentIds = OfficialDocuments.GetAll(d => d.Modified >= lastStartDate && d.Modified <= startDate).Select(d => d.Id); foreach (var documentId in changedDocumentIds) { var document = OfficialDocuments.GetAll(d => d.Id == documentId).FirstOrDefault(); if (document == null) { continue; } var documentRules = GetAvailableRules(document, allRules); foreach (var documentRule in documentRules) { queue.Add(CreateAccessRightsQueueItem(documentId, documentRule, Docflow.DocumentGrantRightsQueueItem.ChangedEntityType.Document)); } // Проверить наличие правил для ведущих документов, если есть хотя бы одно такое правило. if (hasRuleWithLeadingDocuments) { var leadingDocumentIds = GetLeadingDocuments(document); foreach (var leadingDocumentId in leadingDocumentIds) { var leadingDocument = OfficialDocuments.GetAll(d => d.Id == leadingDocumentId).FirstOrDefault(); var leadDocumentRules = GetAvailableRules(leadingDocument, allRules); foreach (var leadDocumentRule in leadDocumentRules) { queue.Add(CreateAccessRightsQueueItem(leadingDocument.Id, leadDocumentRule, Docflow.DocumentGrantRightsQueueItem.ChangedEntityType.Document)); } leadingDocument = leadingDocument.LeadingDocument; } } } // Измененные настройки. var changedRules = allRules.Where(s => s.Modified >= lastStartDate && s.Modified <= startDate && s.GrantRightsOnExistingDocuments == true); foreach (var changedRule in changedRules) { foreach (var ruleDocument in GetDocumentsByRule(changedRule)) { queue.Add(CreateAccessRightsQueueItem(ruleDocument, changedRule, Docflow.DocumentGrantRightsQueueItem.ChangedEntityType.Rule)); } } var table = DocumentGrantRightsQueueItems.Info.DBTableName; var ids = Sungero.Domain.IdentifierGenerator.GenerateIdentifiers(table, queue.Count).ToList(); for (int i = 0; i < queue.Count; i++) { queue[i].Id = ids[i]; } Docflow.PublicFunctions.Module.WriteStructuresToTable(table, queue); Logger.DebugFormat("GrantAccessRightsToDocuments: Added to queue {0} documents.", queue.Count); // Обновить дату запуска агента в базе. PublicFunctions.Module.UpdateLastAgentRunDate(Constants.Module.LastAccessRightsUpdateDate, startDate); // Выдать права на документы. var step = 5; var error = 0; var isEmpty = false; for (int i = 0; i < 10000; i = i + step) { // Если элементов больше нет - заканчиваем. if (isEmpty) { break; } var result = Transactions.Execute( () => { Logger.DebugFormat("GrantAccessRightsToDocuments: Start process queue from {0}.", i); // Т.к. в конце транзакции элементы удаляются, в Take берем просто N новых элементов. var queueItemPart = DocumentGrantRightsQueueItems.GetAll().Skip(error).Take(step).ToList(); if (!queueItemPart.Any()) { // Завершаем транзакцию, если больше нечего обрабатывать. isEmpty = true; return; } var accessRightsGranted = queueItemPart .Where(q => this.GrantRightsToDocumentByRules(q, allRules)) .ToList(); if (accessRightsGranted.Any()) { Functions.Module.FastDeleteQueueItems(accessRightsGranted.Select(a => a.Id).ToList()); } error += queueItemPart.Count - accessRightsGranted.Count; }); if (!result) { error += step; } } }